
    AHj-                        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	m
Z
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   )none_assave_method_argstext_encoding)
Translator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    E/root/tools/cai/cai_env/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   -   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   L   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__Y   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__`   s    f$)&)r   )	__name__
__module____qualname____doc__r   r%   r-   r0   __classcell__r)   s   @r   r    r    T   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>s   s     61y}}$6s   )r   chainfrom_iterablemapr   _deduper   )namesparentsas_dirss      r   _implied_dirszCompleteDirs._implied_dirsp   s9    ////He0DE6g6{7E233r   c                 Z    t         |          }|t        | j                  |            z   S r"   )r$   namelistlistrE   )r&   rB   r)   s     r   rG   zCompleteDirs.namelistv   s+     "tD..u5666r   c                 4    t        | j                               S r"   )r   rG   r,   s    r   	_name_setzCompleteDirs._name_setz   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).
        /)rJ   )r&   namerB   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.
        rL   )filename)r$   getinfoKeyErrorendswithrJ   zipfileZipInfo)r&   rM   r)   s     r   rS   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)
isinstancer8   rV   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   )rE   rG   writestr)r]   r`   rM   s      r   injectzCompleteDirs.inject   s7     %%bkkm4 	#DKKc"	#	r   )r1   r2   r3   r4   staticmethodrE   rG   rJ   rP   rS   classmethodr_   rV   r[   rd   r5   r6   s   @r   r8   r8   e   sn     4 4
7$.	2  $  GOO  r   r8   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   rG   zFastLookup.namelist   s    ~~r   c                      t         |          S r"   )r$   rG   r&   r)   s    r   rj   zFastLookup._namelist   s    w!!r   c                     | j                   S r"   )_name_set_propr,   s    r   rJ   zFastLookup._name_set   s    """r   c                      t         |          S r"   )r$   rJ   rl   s    r   rn   zFastLookup._name_set_prop   s    w ""r   )r1   r2   r3   r4   rG   	functoolscached_propertyrj   rJ   rn   r5   r6   s   @r   rh   rh      sF    
 " "# # #r   rh   c                 $    d}t        | |      ||fS )N   r   )encodingr'   r(   stack_levels       r   _extract_text_encodingrv      s    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)rh   r_   rootat)r&   ry   rz   s      r   r%   zPath.__init__3  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)   NotImplementedry   rz   )r&   others     r   __eq__zPath.__eq__@  s?    
 >>0!!		477#

EHH'===r   c                 D    t        | j                  | j                  f      S r"   )hashry   rz   r,   s    r   __hash__zPath.__hash__I  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   rY   r   bz*encoding args invalid for binary operation)is_dirIsADirectoryErrorexistsFileNotFoundErrorry   openrz   
ValueErrorrv   ioTextIOWrapper)r&   r\   r   r'   r(   zip_modestreamrt   s           r   r   z	Path.openL  s     ;;=#D))7s?4;;=#D))s;$;v !MNNM!7!H!H$B4B6BBr   c                 p    | j                   rt        j                  | j                         S | j                  S r"   )rz   pathlibPurePosixPathrR   r,   s    r   _basez
Path._base`  s&    15w$$TWW-KdmmKr   c                 6    | j                         j                  S r"   )r   rM   r,   s    r   rM   z	Path.namec      zz|   r   c                 6    | j                         j                  S r"   )r   suffixr,   s    r   r   zPath.suffixg  s    zz|"""r   c                 6    | j                         j                  S r"   )r   suffixesr,   s    r   r   zPath.suffixesk  s    zz|$$$r   c                 6    | j                         j                  S r"   )r   stemr,   s    r   r   z	Path.stemo  r   r   c                     t        j                  | j                  j                        j	                  | j
                        S r"   )r   r	   ry   rR   joinpathrz   r,   s    r   rR   zPath.filenames  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)NrY   )rv   r   read)r&   r'   r(   rt   strms        r   	read_textzPath.read_textw  sR    !7!H!H$TYYsH6t6v6 	$99;	 	 	s   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 NrL   )r   rN   rz   r   )r&   r   s     r   	_is_childzPath._is_child  s2      !459LLLr   c                 :    | j                  | j                  |      S r"   )r)   ry   )r&   rz   s     r   _nextz
Path._next  s    ~~dii,,r   c                 V    | j                    xs | j                   j                  d      S r   )rz   rU   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"   )rz   ry   rJ   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   NotADirectoryErrorr@   r   ry   rG   filterr   )r&   subss     r   iterdirzPath.iterdir  sE    {{}$%;<<4::tyy1134dnnd++r   c                 ^    t        j                  | j                        j                  |      S r"   )r   r   rz   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.
           )ry   rS   rz   external_attrstatS_ISLNK)r&   infor\   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: rL   )seps)r   reescaperz   r   compile	translate	fullmatchr@   r   r   ry   rG   )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                     t        | j                  j                  d      }| j                  r t	        j
                  || j                        S |S )Nz	:zipfile:)r   ry   rR   rz   r   join)r&   ry   s     r   __str__zPath.__str__  s8    tyy));704y~~dDGG,ATAr   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   rz   r   ry   rP   )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   )rz   rR   parentr   rN   r   r   )r&   	parent_ats     r   r   zPath.parent  sR    ww=='''%%dggnnS&9:	Izz)$$r   ) )rY   )"r1   r2   r3   r4   r   r%   r~   r   r   r   propertyrM   r   r   r   rR   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(L ! ! # # % % ! ! B B
M-430,B"F*IB-7 K% %r   r"   )r4   rp   r   r   r   r   r   r   rV   
_functoolsr   r   compat.py310r   r   r   __all__r   r   dictfromkeysrA   r   r    r[   r8   rh   rv   r	   r   r   r   <module>r      s     	    	   1 ' (6&+6 -- /H* *"H#W__ HV# #*>
y% y%r   