
    gu                     F    d Z ddlZddlZddlmZ ddlmZ  G d de      Zy)zGit LFS related utilities    N)AbstractContextManager)BinaryIOc                   |    e Zd ZdZdededefdZd Zd Zddefd	Z	d
efdZ
ej                  fdeded
efdZd Zy)SliceFileObja  
    Utility context manager to read a *slice* of a seekable file-like object as a seekable, file-like object.

    This is NOT thread safe

    Inspired by stackoverflow.com/a/29838711/593036

    Credits to @julien-c

    Args:
        fileobj (`BinaryIO`):
            A file-like object to slice. MUST implement `tell()` and `seek()` (and `read()` of course).
            `fileobj` will be reset to its original position when exiting the context manager.
        seek_from (`int`):
            The start of the slice (offset from position 0 in bytes).
        read_limit (`int`):
            The maximum number of bytes to read from the slice.

    Attributes:
        previous_position (`int`):
            The previous position

    Examples:

    Reading 200 bytes with an offset of 128 bytes from a file (ie bytes 128 to 327):
    ```python
    >>> with open("path/to/file", "rb") as file:
    ...     with SliceFileObj(file, seek_from=128, read_limit=200) as fslice:
    ...         fslice.read(...)
    ```

    Reading a file in chunks of 512 bytes
    ```python
    >>> import os
    >>> chunk_size = 512
    >>> file_size = os.getsize("path/to/file")
    >>> with open("path/to/file", "rb") as file:
    ...     for chunk_idx in range(ceil(file_size / chunk_size)):
    ...         with SliceFileObj(file, seek_from=chunk_idx * chunk_size, read_limit=chunk_size) as fslice:
    ...             chunk = fslice.read(...)

    ```
    fileobj	seek_from
read_limitc                 .    || _         || _        || _        y N)r   r   r	   )selfr   r   r	   s       O/var/www/openai/venv/lib/python3.12/site-packages/huggingface_hub/utils/_lfs.py__init__zSliceFileObj.__init__D   s    "$    c                 P   | j                   j                         | _        | j                   j                  dt        j
                        }t        | j                  || j                  z
        | _	        | j                   j                  | j                  t        j                         | S )Nr   )r   tell_previous_positionseekosSEEK_ENDminr	   r   _lenioSEEK_SET)r   end_of_streams     r   	__enter__zSliceFileObj.__enter__I   sm    "&,,"3"3"5))!R[[9)GH	$.."++6r   c                 l    | j                   j                  | j                  t        j                         y r   )r   r   r   r   r   )r   exc_type	exc_value	tracebacks       r   __exit__zSliceFileObj.__exit__Q   s     $112;;?r   nc                     | j                         }|| j                  k\  ry| j                  |z
  }| j                  j                  |dk  r|      }|S t	        ||            }|S )Nr   r   )r   r   r   readr   )r   r!   posremaining_amountdatas        r   r#   zSliceFileObj.readT   sc    iik$))99s?||  QU!1Y ADAGW@XYr   returnc                 P    | j                   j                         | j                  z
  S r   )r   r   r   r   s    r   r   zSliceFileObj.tell\   s    ||  "T^^33r   offsetwhencec                    | j                   }|| j                  z   }|t        j                  t        j                  fv rD|t        j                  k(  r||z   n||z   }t        |t        ||            }t        j                  }nY|t        j                  k(  r7| j                  j                         }t        ||z
  t        |||z
              }nt        d| d      | j                  j                  ||      | j                   z
  S )Nzwhence value z is not supported)r   r   r   r   r   maxr   SEEK_CURr   r   
ValueErrorr   )r   r*   r+   startendcur_poss         r   r   zSliceFileObj.seek_   s    diibkk2;;//'-'<UV^#,FFC 01F[[Fr{{"ll'')G#fcGm*DEF}VH4EFGG||  04>>AAr   c              #   4   K   | j                  d       y w)Ni  @ )r!   )r#   r)   s    r   __iter__zSliceFileObj.__iter__m   s     ii/i**s   N))__name__
__module____qualname____doc__r   intr   r   r    r#   r   r   r   r   r4    r   r   r   r      sq    *X% %S %c %
@c 4c 4 /1kk B3 B Bc B+r   r   )r9   r   r   
contextlibr   typingr   r   r;   r   r   <module>r>      s%      	 	 - W+) W+r   