
    "g!.                        d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZ ddlmZ ddlmZ dgZd Zd	 Zej(                  Z	 d
 Z G d d      Z G d dee	j0                        Z G d de      ZddZ G d d      Zy)z
A Path-like interface for zipfiles.

This codebase is shared between zipfile.Path in the stdlib
and zipp in PyPI. See
https://github.com/python/importlib_metadata/wiki/Development-Methodology
for more detail.
    N   )text_encoding)
Translator)save_method_argsPathc                 B    t        j                  t        |       dd      S )a2  
    Given a path with elements separated by
    posixpath.sep, generate all parents of that path.

    >>> list(_parents('b/d'))
    ['b']
    >>> list(_parents('/b/d/'))
    ['/b']
    >>> list(_parents('b/d/f/'))
    ['b/d', 'b']
    >>> list(_parents('b'))
    []
    >>> list(_parents(''))
    []
    r   N)	itertoolsislice	_ancestry)paths    B/var/www/openai/venv/lib/python3.12/site-packages/zipp/__init__.py_parentsr      s      IdOQ55    c              #     K   | j                  t        j                        } | j                  t        j                        r=|  t        j                  |       \  } }| j                  t        j                        r<yyw)a  
    Given a path with elements separated by
    posixpath.sep, generate all elements of that path.

    >>> list(_ancestry('b/d'))
    ['b/d', 'b']
    >>> list(_ancestry('/b/d/'))
    ['/b/d', '/b']
    >>> list(_ancestry('b/d/f/'))
    ['b/d/f', 'b/d', 'b']
    >>> list(_ancestry('b'))
    ['b']
    >>> list(_ancestry(''))
    []

    Multiple separators are treated like a single.

    >>> list(_ancestry('//b//d///f//'))
    ['//b//d///f', '//b//d', '//b']
    N)rstrip	posixpathsepsplit)r   tails     r   r   r   0   sS     * ;;y}}%D
++imm
$
__T*
d ++imm
$s   A:A?=A?c                 T    t        j                  t        |      j                  |       S )zZ
    Return items in minuend not in subtrahend, retaining order
    with O(1) lookup.
    )r	   filterfalseset__contains__)minuend
subtrahends     r   _differencer   O   s!    
   Z!=!=wGGr   c                   <     e Zd ZdZe fd       Zd Z fdZ xZS )InitializedStatez?
    Mix-in to save the initialization state for pickling.
    c                 $    t        |   |i | y Nsuper__init__)selfargskwargs	__class__s      r   r#   zInitializedState.__init__\   s    $)&)r   c                 Z    | j                   j                  | j                   j                  fS r    )_saved___init__r%   r&   r$   s    r   __getstate__zInitializedState.__getstate__`   s%    ##(($*>*>*E*EEEr   c                 .    |\  }}t        |   |i | y r    r!   )r$   stater%   r&   r'   s       r   __setstate__zInitializedState.__setstate__c   s    f$)&)r   )	__name__
__module____qualname____doc__r   r#   r+   r.   __classcell__r'   s   @r   r   r   W   s,     * *F* *r   r   c                        e Zd ZdZed        Z fdZd Zd Z fdZ	e
d        Ze
dej                  d	ej                  fd
       Z xZS )CompleteDirsa8  
    A ZipFile subclass that ensures that implied directories
    are always included in the namelist.

    >>> list(CompleteDirs._implied_dirs(['foo/bar.txt', 'foo/bar/baz.txt']))
    ['foo/', 'foo/bar/']
    >>> list(CompleteDirs._implied_dirs(['foo/bar.txt', 'foo/bar/baz.txt', 'foo/bar/']))
    ['foo/']
    c                     t         j                  j                  t        t        |             }d |D        }t        t        ||             S )Nc              3   B   K   | ]  }|t         j                  z     y wr    )r   r   ).0ps     r   	<genexpr>z-CompleteDirs._implied_dirs.<locals>.<genexpr>v   s     6g1y}}$gs   )r	   chainfrom_iterablemapr   _deduper   )namesparentsas_dirss      r   _implied_dirszCompleteDirs._implied_dirss   s9    ////He0DE6g6{7E233r   c                 Z    t         |          }|t        | j                  |            z   S r    )r"   namelistlistrC   )r$   r@   r'   s     r   rE   zCompleteDirs.namelisty   s+     "tD..u5666r   c                 4    t        | j                               S r    )r   rE   r*   s    r   	_name_setzCompleteDirs._name_set}   s    4==?##r   c                 L    | j                         }|dz   }||vxr ||v }|r|S |S )zx
        If the name represents a directory, return that name
        as a directory (with the trailing slash).
        /)rH   )r$   namer@   dirname	dir_matchs        r   resolve_dirzCompleteDirs.resolve_dir   s:    
  *%:'U*:	#w--r   c                     	 t         |   |      S # t        $ r= |j                  d      r|| j	                         vr t        j                  |      cY S w xY w)z6
        Supplement getinfo for implied dirs.
        rJ   )filename)r"   getinfoKeyErrorendswithrH   zipfileZipInfo)r$   rK   r'   s     r   rQ   zCompleteDirs.getinfo   sR    	27?4(( 	2==%T^^5E)E??D11	2s    AAAc                     t        |t              r|S t        |t        j                        s | |      S d|j                  vrt        } | |_        |S )zl
        Given a source (filename or zipfile), return an
        appropriate CompleteDirs subclass.
        r)
isinstancer6   rT   ZipFilemoder'   )clssources     r   makezCompleteDirs.make   sK     fl+M&'//2v; fkk!Cr   zfreturnc                 r    | j                  |j                               D ]  }|j                  |d        |S )z
        Given a writable zip file zf, inject directory entries for
        any directories implied by the presence of children.
        r   )rC   rE   writestr)r[   r^   rK   s      r   injectzCompleteDirs.inject   s2     %%bkkm4DKKc" 5	r   )r/   r0   r1   r2   staticmethodrC   rE   rH   rN   rQ   classmethodr]   rT   rY   rb   r3   r4   s   @r   r6   r6   h   sn     4 4
7$.	2  $  GOO  r   r6   c                   t     e Zd ZdZd Zej                   fd       Zd Zej                   fd       Z	 xZ
S )
FastLookupzV
    ZipFile subclass to ensure implicit
    dirs exist and are resolved rapidly.
    c                     | j                   S r    )	_namelistr*   s    r   rE   zFastLookup.namelist   s    ~~r   c                      t         |          S r    )r"   rE   r$   r'   s    r   rh   zFastLookup._namelist   s    w!!r   c                     | j                   S r    )_name_set_propr*   s    r   rH   zFastLookup._name_set   s    """r   c                      t         |          S r    )r"   rH   rj   s    r   rl   zFastLookup._name_set_prop   s    w ""r   )r/   r0   r1   r2   rE   	functoolscached_propertyrh   rH   rl   r3   r4   s   @r   rf   rf      sF    
 " "# # #r   rf   c                 d    t         j                  j                  dk(  }d|z   }t        | |      ||fS )Npypy   )sysimplementationrK   r   )encodingr%   r&   is_pypystack_levels        r   _extract_text_encodingrx      s5      %%/Gg+K;/v==r   c                       e Zd ZdZdZd dZd Zd Zd!dddZd	 Z	e
d
        Ze
d        Ze
d        Ze
d        Ze
d        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZeZ e
d        Z!y)"r   u$  
    A :class:`importlib.resources.abc.Traversable` interface for zip files.

    Implements many of the features users enjoy from
    :class:`pathlib.Path`.

    Consider a zip file with this structure::

        .
        ├── a.txt
        └── b
            ├── c.txt
            └── d
                └── e.txt

    >>> data = io.BytesIO()
    >>> zf = zipfile.ZipFile(data, 'w')
    >>> zf.writestr('a.txt', 'content of a')
    >>> zf.writestr('b/c.txt', 'content of c')
    >>> zf.writestr('b/d/e.txt', 'content of e')
    >>> zf.filename = 'mem/abcde.zip'

    Path accepts the zipfile object itself or a filename

    >>> path = Path(zf)

    From there, several path operations are available.

    Directory iteration (including the zip file itself):

    >>> a, b = path.iterdir()
    >>> a
    Path('mem/abcde.zip', 'a.txt')
    >>> b
    Path('mem/abcde.zip', 'b/')

    name property:

    >>> b.name
    'b'

    join with divide operator:

    >>> c = b / 'c.txt'
    >>> c
    Path('mem/abcde.zip', 'b/c.txt')
    >>> c.name
    'c.txt'

    Read text:

    >>> c.read_text(encoding='utf-8')
    'content of c'

    existence:

    >>> c.exists()
    True
    >>> (b / 'missing.txt').exists()
    False

    Coercion to string:

    >>> import os
    >>> str(c).replace(os.sep, posixpath.sep)
    'mem/abcde.zip/b/c.txt'

    At the root, ``name``, ``filename``, and ``parent``
    resolve to the zipfile.

    >>> str(path)
    'mem/abcde.zip/'
    >>> path.name
    'abcde.zip'
    >>> path.filename == pathlib.Path('mem/abcde.zip')
    True
    >>> str(path.parent)
    'mem'

    If the zipfile has no filename, such attributes are not
    valid and accessing them will raise an Exception.

    >>> zf.filename = None
    >>> path.name
    Traceback (most recent call last):
    ...
    TypeError: ...

    >>> path.filename
    Traceback (most recent call last):
    ...
    TypeError: ...

    >>> path.parent
    Traceback (most recent call last):
    ...
    TypeError: ...

    # workaround python/cpython#106763
    >>> pass
    z>{self.__class__.__name__}({self.root.filename!r}, {self.at!r})c                 F    t         j                  |      | _        || _        y)aX  
        Construct a Path from a ZipFile or filename.

        Note: When the source is an existing ZipFile object,
        its type (__class__) will be mutated to a
        specialized type. If the caller wishes to retain the
        original type, the caller should either create a
        separate ZipFile object or pass a filename.
        N)rf   r]   rootat)r$   r{   r|   s      r   r#   zPath.__init__8  s     OOD)	r   c                     | j                   |j                   urt        S | j                  | j                  f|j                  |j                  fk(  S )zU
        >>> Path(zipfile.ZipFile(io.BytesIO(), 'w')) == 'foo'
        False
        )r'   NotImplementedr{   r|   )r$   others     r   __eq__zPath.__eq__E  s?    
 >>0!!		477#

EHH'===r   c                 D    t        | j                  | j                  f      S r    )hashr{   r|   r*   s    r   __hash__zPath.__hash__N  s    TYY())r   Npwdc                N   | j                         rt        |       |d   }|dk(  r| j                         st        |       | j                  j                  | j                  ||      }d|v r|s|rt        d      |S t        |i |\  }}}t        j                  ||g|i |S )z
        Open this entry as text or binary following the semantics
        of ``pathlib.Path.open()`` by passing arguments through
        to io.TextIOWrapper().
        r   rW   r   bz*encoding args invalid for binary operation)is_dirIsADirectoryErrorexistsFileNotFoundErrorr{   openr|   
ValueErrorrx   ioTextIOWrapper)r$   rZ   r   r%   r&   zip_modestreamru   s           r   r   z	Path.openQ  s     ;;=#D))7s?4;;=#D))s;$;v !MNNM!7!H!H$B4B6BBr   c                 p    t        j                  | j                  xs | j                  j                        S r    )pathlibPurePosixPathr|   r{   rP   r*   s    r   _basez
Path._basee  s&    $$TWW%B		0B0BCCr   c                 6    | j                         j                  S r    )r   rK   r*   s    r   rK   z	Path.nameh      zz|   r   c                 6    | j                         j                  S r    )r   suffixr*   s    r   r   zPath.suffixl  s    zz|"""r   c                 6    | j                         j                  S r    )r   suffixesr*   s    r   r   zPath.suffixesp  s    zz|$$$r   c                 6    | j                         j                  S r    )r   stemr*   s    r   r   z	Path.stemt  r   r   c                     t        j                  | j                  j                        j	                  | j
                        S r    )r   r   r{   rP   joinpathr|   r*   s    r   rP   zPath.filenamex  s*    ||DII../88AAr   c                     t        |i |\  }}} | j                  d|g|i |5 }|j                         cd d d        S # 1 sw Y   y xY w)NrW   )rx   r   read)r$   r%   r&   ru   strms        r   	read_textzPath.read_text|  sI    !7!H!H$TYYsH6t6v6$99; 766s   AA
c                 p    | j                  d      5 }|j                         cd d d        S # 1 sw Y   y xY w)Nrb)r   r   )r$   r   s     r   
read_byteszPath.read_bytes  s"    YYt_99; __s   ,5c                     t        j                  |j                  j                  d            | j                  j                  d      k(  S NrJ   )r   rL   r|   r   )r$   r   s     r   	_is_childzPath._is_child  s2      !459LLLr   c                 :    | j                  | j                  |      S r    )r'   r{   )r$   r|   s     r   _nextz
Path._next  s    ~~dii,,r   c                 V    | j                    xs | j                   j                  d      S r   )r|   rS   r*   s    r   r   zPath.is_dir  s"    77{3dgg..s33r   c                 H    | j                         xr | j                          S r    )r   r   r*   s    r   is_filezPath.is_file  s    {{}2T[[]!22r   c                 N    | j                   | j                  j                         v S r    )r|   r{   rH   r*   s    r   r   zPath.exists  s    ww$))--///r   c                     | j                         st        d      t        | j                  | j                  j                               }t        | j                  |      S )NzCan't listdir a file)r   r   r>   r   r{   rE   filterr   )r$   subss     r   iterdirzPath.iterdir  sE    {{}3444::tyy1134dnnd++r   c                 ^    t        j                  | j                        j                  |      S r    )r   r   r|   match)r$   path_patterns     r   r   z
Path.match  s"    $$TWW-33LAAr   c                     | j                   j                  | j                        }|j                  dz	  }t	        j
                  |      S )z8
        Return whether this path is a symlink.
           )r{   rQ   r|   external_attrstatS_ISLNK)r$   inforZ   s      r   
is_symlinkzPath.is_symlink  s;     yy  )!!R'||D!!r   c                 J   |st        d|      t        j                  | j                        }t	        d      }t        j
                  ||j                  |      z         j                  }t        | j                  t        || j                  j                                     S )NzUnacceptable pattern: rJ   )seps)r   reescaper|   r   compile	translate	fullmatchr>   r   r   r{   rE   )r$   patternprefixtrmatchess        r   globz	Path.glob  s{    5g[ABB477#S!**Vbll7&;;<FF4::vgtyy/A/A/CDEEr   c                 *    | j                  d|       S )Nz**/)r   )r$   r   s     r   rglobz
Path.rglob  s    yy3wi))r   c                 l    t        j                  t        |       t         |j                  |             S r    )r   relpathstrr   )r$   r   extras      r   relative_tozPath.relative_to  s)      TC0F,GHHr   c                 j    t        j                  | j                  j                  | j                        S r    )r   joinr{   rP   r|   r*   s    r   __str__zPath.__str__  s!    ~~dii00$''::r   c                 :    | j                   j                  |       S )Nr*   )_Path__reprformatr*   s    r   __repr__zPath.__repr__  s    {{!!t!,,r   c                     t        j                  | j                  g| }| j                  | j                  j                  |            S r    )r   r   r|   r   r{   rN   )r$   r   nexts      r   r   zPath.joinpath  s7    ~~dgg..zz$))//566r   c                     | j                   s| j                  j                  S t        j                  | j                   j                  d            }|r|dz  }| j                  |      S r   )r|   rP   parentr   rL   r   r   )r$   	parent_ats     r   r   zPath.parent  sR    ww=='''%%dggnnS&9:	Izz)$$r   ) )rW   )"r/   r0   r1   r2   r   r#   r   r   r   r   propertyrK   r   r   r   rP   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __truediv__r    r   r   r   r      s   dL NF>*C C(D ! ! # # % % ! ! B B
M-430,B"F*I;-7 K% %r   r    )r2   rn   r   r	   r   r   r   r   rs   rT   compat.py310r   r   r   
_functoolsr   __all__r   r   dictfromkeysr?   r   r   rY   r6   rf   rx   r   r   r   r   <module>r      s     	    	  
  '  ( (6&+6 -- /H* *"H#W__ HV# #*>x% x%r   