
    daf(                         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gZ	d Z
d Zej                  Z	 d Z G d d	      Z G d
 deej"                        Z G d de      ZddZ G d d      Zy)    N   )	translate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    1/root/Python-3.12.4/Lib/zipfile/_path/__init__.py_parentsr      s      IdOQ55    c              #      K   | j                  t        j                        } | rH| t        j                  k7  r4|  t        j                  |       \  } }| r| t        j                  k7  r2yyyyw)aR  
    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(''))
    []
    N)rstrip	posixpathsepsplit)r
   tails     r   r	   r	   "   sV       ;;y}}%D
49==(
__T*
d 49==($($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   <   s!    
   Z!=!=wGGr   c                   2     e Zd ZdZ 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)_InitializedState__args_InitializedState__kwargssuper__init__)selfargskwargs	__class__s      r   r"   zInitializedState.__init__I   s#    $)&)r   c                 2    | j                   | j                  fS r   )r   r    r#   s    r   __getstate__zInitializedState.__getstate__N   s    {{DMM))r   c                 .    |\  }}t        |   |i | y r   )r!   r"   )r#   stater$   r%   r&   s       r   __setstate__zInitializedState.__setstate__Q   s    f$)&)r   )__name__
__module____qualname____doc__r"   r)   r,   __classcell__r&   s   @r   r   r   D   s    *
** *r   r   c                   X     e Zd ZdZed        Z fdZd Zd Z fdZ	e
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>d   s     61y}}$6s   )r   chainfrom_iterablemapr   _deduper   )namesparentsas_dirss      r   _implied_dirszCompleteDirs._implied_dirsa   s9    ////He0DE6g6{7E233r   c                 Z    t         |          }|t        | j                  |            z   S r   )r!   namelistlistrA   )r#   r>   r&   s     r   rC   zCompleteDirs.namelistg   s+     "tD..u5666r   c                 4    t        | j                               S r   )r   rC   r(   s    r   	_name_setzCompleteDirs._name_setk   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).
        /)rF   )r#   namer>   dirname	dir_matchs        r   resolve_dirzCompleteDirs.resolve_dirn   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.
        rH   )filename)r!   getinfoKeyErrorendswithrF   zipfileZipInfo)r#   rI   r&   s     r   rO   zCompleteDirs.getinfox   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)
isinstancer4   rR   ZipFilemoder&   )clssources     r   makezCompleteDirs.make   sK     fl+M&'//2v; fkk!Cr   )r-   r.   r/   r0   staticmethodrA   rC   rF   rL   rO   classmethodr[   r1   r2   s   @r   r4   r4   V   sD     4 4
7$.	2  r   r4   c                   ,     e Zd ZdZ fdZ fdZ xZS )
FastLookupzV
    ZipFile subclass to ensure implicit
    dirs exist and are resolved rapidly.
    c                     t        j                  t              5  | j                  cd d d        S # 1 sw Y   nxY wt        |          | _        | j                  S r   )
contextlibsuppressAttributeError_FastLookup__namesr!   rC   r#   r&   s    r   rC   zFastLookup.namelist   sF      0 	 <<	  	  	 w')||   1:c                     t        j                  t              5  | j                  cd d d        S # 1 sw Y   nxY wt        |          | _        | j                  S r   )ra   rb   rc   _FastLookup__lookupr!   rF   re   s    r   rF   zFastLookup._name_set   sF      0 	!==	! 	! 	!)+}}rf   )r-   r.   r/   r0   rC   rF   r1   r2   s   @r   r_   r_      s    
 r   r_   c                 4    t        j                  | d      ||fS )N   )iotext_encoding)encodingr$   r%   s      r   _extract_text_encodingrn      s    Ha($66r   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 pathlib-compatible interface for zip files.

    Consider a zip file with this structure::

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

    >>> data = io.BytesIO()
    >>> zf = 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

    >>> root = Path(zf)

    From there, several path operations are available.

    Directory iteration (including the zip file itself):

    >>> a, b = root.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. Note these attributes are not
    valid and will raise a ``ValueError`` if the zipfile
    has no filename.

    >>> root.name
    'abcde.zip'
    >>> str(root.filename).replace(os.sep, posixpath.sep)
    'mem/abcde.zip'
    >>> str(root.parent)
    'mem'
    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)r_   r[   rootat)r#   rq   rr   s      r   r"   zPath.__init__   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&   NotImplementedrq   rr   )r#   others     r   __eq__zPath.__eq__  s?    
 >>0!!		477#

EHH'===r   c                 D    t        | j                  | j                  f      S r   )hashrq   rr   r(   s    r   __hash__zPath.__hash__  s    TYY())r   Npwdc                N   | j                         rt        |       |d   }| j                         s|dk(  r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   rU   rz   bz*encoding args invalid for binary operation)is_dirIsADirectoryErrorexistsFileNotFoundErrorrq   openrr   
ValueErrorrn   rk   TextIOWrapper)r#   rX   r{   r$   r%   zip_modestreamrm   s           r   r   z	Path.open  s     ;;=#D))7{{}S#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PurePosixPathrr   rq   rN   r(   s    r   _basez
Path._base,  s&    $$TWW%B		0B0BCCr   c                 6    | j                         j                  S r   )r   rI   r(   s    r   rI   z	Path.name/      zz|   r   c                 6    | j                         j                  S r   )r   suffixr(   s    r   r   zPath.suffix3  s    zz|"""r   c                 6    | j                         j                  S r   )r   suffixesr(   s    r   r   zPath.suffixes7  s    zz|$$$r   c                 6    | j                         j                  S r   )r   stemr(   s    r   r   z	Path.stem;  r   r   c                     t        j                  | j                  j                        j	                  | j
                        S r   )r   r   rq   rN   joinpathrr   r(   s    r   rN   zPath.filename?  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)NrU   )rn   r   read)r#   r$   r%   rm   strms        r   	read_textzPath.read_textC  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_bytesH  s-    YYt_ 	99;	 	 	s   ,5c                     t        j                  |j                  j                  d            | j                  j                  d      k(  S NrH   )r   rJ   rr   r   )r#   r
   s     r   	_is_childzPath._is_childL  s2      !459LLLr   c                 :    | j                  | j                  |      S r   )r&   rq   )r#   rr   s     r   _nextz
Path._nextO  s    ~~dii,,r   c                 V    | j                    xs | j                   j                  d      S r   )rr   rQ   r(   s    r   r~   zPath.is_dirR  s"    77{3dgg..s33r   c                 H    | j                         xr | j                          S r   )r   r~   r(   s    r   is_filezPath.is_fileU  s    {{}2T[[]!22r   c                 N    | j                   | j                  j                         v S r   )rr   rq   rF   r(   s    r   r   zPath.existsX  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   rq   rC   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   rr   match)r#   path_patterns     r   r   z
Path.matcha  s"    $$TWW-33LAAr   c                      y)z]
        Return whether this path is a symlink. Always false (python/cpython#82102).
        F r(   s    r   
is_symlinkzPath.is_symlinkd  s     r   c                 &   |st        d|      t        j                  | j                        }t        j                  |t        |      z         j                  }t        | j                  t        || j                  j                                     S )NzUnacceptable pattern: )r   reescaperr   compiler   	fullmatchr<   r   r   rq   rC   )r#   patternprefixmatchess       r   globz	Path.globj  sm    5g[ABB477#**Vi&889CC4::vgtyy/A/A/CDEEr   c                 *    | j                  d|       S )Nz**/)r   )r#   r   s     r   rglobz
Path.rglobr  s    yy3wi))r   c                 l    t        j                  t        |       t         |j                  |             S r   )r   relpathstrr   )r#   ru   extras      r   relative_tozPath.relative_tou  s)      TC0F,GHHr   c                 j    t        j                  | j                  j                  | j                        S r   )r   joinrq   rN   rr   r(   s    r   __str__zPath.__str__x  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   rr   r   rq   rL   )r#   ru   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   )rr   rN   parentr   rJ   r   r   )r#   	parent_ats     r   r   zPath.parent  sR    ww=='''%%dggnnS&9:	Izz)$$r   ) )rU   )"r-   r.   r/   r0   r   r"   rv   ry   r   r   propertyrI   r   r   r   rN   r   r   r   r   r~   r   r   r   r   r   r   r   r   r   r   r   __truediv__r   r   r   r   r   r      s   KZ NF>*C C(D ! ! # # % % ! ! B B
M-430,BF*I;-7 K% %r   r   )rk   r   rR   r   ra   r   r   r   r   __all__r   r	   dictfromkeysr=   r   r   rW   r4   r_   rn   r   r   r   r   <module>r      s    	      	  (6&+, -- /H* *$>#W__ >B &7
\% \%r   