Ë [Y|¸9¬èãó—ddlZddlZddlZddlZddlZddlZddlZddlmZddl m Z dgZ d„Z d„Z ejZ d„ZGd „d «ZGd „d «ZGd „deeej(«ZGd„de«Zdd„ZGd„d«Zy)éNé©Ú text_encoding)Ú translateÚPathcóB—tjt|«dd«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('')) [] rN)Ú itertoolsÚisliceÚ _ancestry)Úpaths ú2/usr/lib/python3.12/site-packages/zipp/__init__.pyÚ_parentsrs€ô × Ñ œI d›O¨Q°Ó 5Ð5óc#óÞK—|jtj«}|rH|tjk7r4|–—tj|«\}}|r|tjk7rŒ2yyyy­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Ù �4œ9Ÿ=™=Ò(ØŠ Ü—_‘_ TÓ*‰ ˆˆdñ �4œ9Ÿ=™=Ô(ˆ$Ð(ˆ$ùs ‚A&A-Á)A-cóT—tjt|«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ÐGrcó2‡—eZdZdZˆfd„Zd„Zˆfd„ZˆxZS)Ú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$zInitializedState.__init__Js#ø€ØˆŒ ؈Œ Ü ‰Ñ˜$Ð) &Ó)rcó2—|j|jfSr )r!r"©r%s r Ú __getstate__zInitializedState.__getstate__Os€Ø�{‰{˜DŸM™MÐ)Ð)rcó.•—|\}}t‰|�|i|¤Žyr )r#r$)r%Ústater&r'r(s €r Ú __setstate__zInitializedState.__setstate__Rsø€Ø‰ ˆˆfÜ ‰Ñ˜$Ð) &Ó)r)Ú__name__Ú __module__Ú __qualname__Ú__doc__r$r+r.Ú __classcell__©r(s@r rrEsø„ñô*ò *÷*ð*rrcó2‡—eZdZdZˆfd„Zed„«ZˆxZS)ÚSanitizedNamesz7 ZipFile mix-in to ensure names are sanitized. cóZ•—tt|jt‰|�«««Sr )ÚlistÚmapÚ _sanitizer#Únamelist©r%r(s €r r;zSanitizedNames.namelist\s!ø€Ü”C˜Ÿ™¬©Ñ(8Ó(:Ó;Ó<Ð>> san = SanitizedNames._sanitize >>> san('/foo/bar') 'foo/bar' >>> san('//foo.txt') 'foo.txt' >>> san('foo/.././bar.txt') 'foo/bar.txt' >>> san('foo../.bar.txt') 'foo../.bar.txt' >>> san('\\foo\\bar.txt') 'foo/bar.txt' >>> san('D:\\foo.txt') 'D/foo.txt' >>> san('\\\\server\\share\\file.txt') 'server/share/file.txt' >>> san('\\\\?\\GLOBALROOT\\Volume3') '?/GLOBALROOT/Volume3' >>> san('\\\\.\\PhysicalDrive1\\root') 'PhysicalDrive1/root' Retain any trailing slash. >>> san('abc/') 'abc/' Raises a ValueError if the result is empty. >>> san('../..') Traceback (most recent call last): ... ValueError: Empty filename có—|xr|dvS)N>ú..Ú.©)Úparts r Úallowedz)SanitizedNames._sanitize..allowed‡s€ØÒ3˜D¨ Ð3Ð 3rz ^([A-Z]):z\1)ÚflagsÚ\Ú/zEmpty filename) ÚreÚsubÚ IGNORECASEÚreplacerÚjoinÚfilterÚ ValueErrorÚendswith)ÚnamerCÚbareÚcleanÚpartsÚjoineds r r:zSanitizedNames._sanitize_s}€òP 4ô �v‰v�k 5¨$´b·m±mÔDˆØ— ‘ ˜T 3Ó'ˆØ— ‘ ˜CÓ ˆØ—‘œ& ¨%Ó0Ó1ˆÙÜÐ-Ó.Ð .ؘ˜dŸm™m¨CÓ0Ñ0Ñ0Ð0r)r/r0r1r2r;Ú staticmethodr:r3r4s@r r6r6Ws!ø„ñô=ðñ21óô21rr6c󚇗eZdZdZed„«Zˆfd„Zd„Zd„Zˆfd„Z e d„«Z e de jd e jfd „«ZˆxZS) Ú 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ó˜—tjjtt|««}d„|D«}t t ||««S)Nc3óBK—|]}|tjz–—Œy­wr )rr)Ú.0Úps r Ú z-CompleteDirs._implied_dirs..£sèø€Ð6©g¨�1”y—}‘}Õ$©gùs‚)r ÚchainÚ from_iterabler9rÚ_deduper)ÚnamesÚparentsÚas_dirss r Ú _implied_dirszCompleteDirs._implied_dirs s9€ä—/‘/×/Ñ/´´H¸eÓ0DÓEˆÙ6©gÓ6ˆÜ”{ 7¨EÓ2Ó3Ð3rcóZ•—t‰|�«}|t|j|««zSr )r#r;r8rb)r%r_r(s €r r;zCompleteDirs.namelist¦s+ø€Ü‘Ñ Ó"ˆØ”t˜D×.Ñ.¨uÓ5Ó6Ñ6Ð6rcó4—t|j««Sr )rr;r*s r Ú _name_setzCompleteDirs._name_setªs€Ü�4—=‘=“?Ó#Ð#rcóL—|j«}|dz}||vxr||v}|r|S|S)zx If the name represents a directory, return that name as a directory (with the trailing slash). rF)re)r%rOr_ÚdirnameÚ dir_matchs r Ú resolve_dirzCompleteDirs.resolve_dir­s:€ð —‘Ó ˆØ˜‘*ˆØ Ð%Ò:¨'°UÐ*:ˆ Ù#ˆwÐ-¨Ð-rcó¶•— t‰|�|«S#t$r=|jd«r||j «vr‚t j |¬«cYSwxYw)z6 Supplement getinfo for implied dirs. rF)Úfilename)r#ÚgetinfoÚKeyErrorrNreÚzipfileÚZipInfo)r%rOr(s €r rlzCompleteDirs.getinfo·sRø€ð 2Ü‘7‘? 4Ó(Ð (øÜò 2Ø—=‘= Ô%¨°T·^±^Ó5EÑ)EØÜ—?‘?¨DÔ1Ò 1ð 2úsƒ’AAÁAcó¤—t|t«r|St|tj«s||«Sd|jvrt}||_|S)zl Given a source (filename or zipfile), return an appropriate CompleteDirs subclass. Úr)Ú isinstancerVrnÚZipFileÚmoder()ÚclsÚsources r ÚmakezCompleteDirs.makeÂsK€ô �fœlÔ +؈Mä˜&¤'§/¡/Ô2Ù�v“;Ð ð �f—k‘kÑ !܈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)rbr;Úwritestr)rurxrOs r ÚinjectzCompleteDirs.injectÕs2€ð ×%Ñ% b§k¡k£mÖ4ˆDØ �K‰K˜˜cÕ "ð5àˆ r)r/r0r1r2rTrbr;rerirlÚ classmethodrwrnrsr|r3r4s@r rVrV•snø„ñðñ4óð4ô 7ò$ò.ô 2ðñóðð$𘟙ð¨G¯O©OòóôrrVcó,‡—eZdZdZˆfd„Zˆfd„ZˆxZS)Ú FastLookupzV ZipFile subclass to ensure implicit dirs exist and are resolved rapidly. c󸕗tjt«5|jcddd«S#1swYnxYwt‰|�«|_|jSr )Ú contextlibÚsuppressÚAttributeErrorÚ_FastLookup__namesr#r;r<s €r r;zFastLookup.namelistæs=ø€Ü × Ñ ¤Õ 0Ø—<‘<÷1× 0Ò 0úä‘wÑ'Ó)ˆŒ Ø�|‰|Ðó› 1±:c󸕗tjt«5|jcddd«S#1swYnxYwt‰|�«|_|jSr )r�r‚rƒÚ_FastLookup__lookupr#rer<s €r rezFastLookup._name_setìs=ø€Ü × Ñ ¤Õ 0Ø—=‘=÷1× 0Ò 0úä™Ñ)Ó+ˆŒ Ø�}‰}Ðr…)r/r0r1r2r;rer3r4s@r rràsø„ñô ÷ ðrrcó —t|d«||fS)Nér)Úencodingr&r's r Ú_extract_text_encodingr‹ós€ä ˜ 1Ó % t¨VÐ 3Ð3rcó—eZdZdZdZd d„Zd„Zd„Zd!ddœd„Zd „Z e d „«Z e d „«Z e d „«Z e d „«Ze d„«Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„ZeZ e d„«Z!y)"ru¹ 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.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 attribtues 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—tj|«|_||_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)rrwÚrootÚat)r%rŽr�s r r$z Path.__init__^s€ô—O‘O DÓ)ˆŒ ؈�rcó —|j|jurtS|j|jf|j|jfk(S)zU >>> Path(zipfile.ZipFile(io.BytesIO(), 'w')) == 'foo' False )r(ÚNotImplementedrŽr�)r%Úothers r Ú__eq__z Path.__eq__ks?€ð �>‰> §¡Ñ 0Ü!Ð !Ø— ‘ ˜4Ÿ7™7Ð#¨¯ © °E·H±HÐ'=Ñ=Ð=rcóD—t|j|jf«Sr )ÚhashrŽr�r*s r Ú__hash__z Path.__hash__ts€Ü�T—Y‘Y §¡Ð(Ó)Ð)rN©ÚpwdcóN—|j«r t|«‚|d}|j«s|dk(r t|«‚|jj |j ||¬«}d|vr|s|r td«‚|St|i|¤Ž\}}}tj||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(). rrqr—Úbz*encoding args invalid for binary operation) Úis_dirÚIsADirectoryErrorÚexistsÚFileNotFoundErrorrŽÚopenr�rMr‹ÚioÚ TextIOWrapper)r%rtr˜r&r'Úzip_modeÚstreamrŠs r rŸz Path.openws§€ð �;‰;Œ=Ü# DÓ)Ð )ؘ‘7ˆØ�{‰{Œ} ¨S¢Ü# DÓ)Ð )Ø—‘—‘ §¡¨°s�Ó;ˆØ �$‰;Ù‘vÜ Ð!MÓNÐN؈Mä!7¸Ð!HÀÑ!Hш�$˜Ü×Ñ ¨ÐB°4ÒB¸6ÑBÐBrcóp—tj|jxs|jj«Sr )ÚpathlibÚ PurePosixPathr�rŽrkr*s r Ú_basez Path._base‹s&€Ü×$Ñ$ T§W¡WÒ%B°· ± ×0BÑ0BÓCÐCrcó6—|j«jSr )r§rOr*s r rOz Path.nameŽó€à�z‰z‹|× Ñ Ð rcó6—|j«jSr )r§Úsuffixr*s r r«z Path.suffix’s€à�z‰z‹|×"Ñ"Ð"rcó6—|j«jSr )r§Úsuffixesr*s r r­z Path.suffixes–s€à�z‰z‹|×$Ñ$Ð$rcó6—|j«jSr )r§Ústemr*s r r¯z Path.stemšr©rcó†—tj|jj«j |j «Sr )r¥rrŽrkÚjoinpathr�r*s r rkz Path.filenamežs*€ä�|‰|˜DŸI™I×.Ñ.Ó/×8Ñ8¸¿¹ÓAÐArcóš—t|i|¤Ž\}}}|jd|g|¢­i|¤Ž5}|j«cddd«S#1swYyxYw)Nrq)r‹rŸÚread)r%r&r'rŠÚstrms r Ú read_textzPath.read_text¢sI€Ü!7¸Ð!HÀÑ!Hш�$˜Ø ˆT�Y‰Y�s˜HÐ 6 tÒ 6¨vÒ 6¸$Ø—9‘9“;÷7× 6Ò 6ús §AÁA cóp—|jd«5}|j«cddd«S#1swYyxYw)NÚrb)rŸr³)r%r´s r Ú read_byteszPath.read_bytes§s"€Ø �Y‰Y�tŒ_ Ø—9‘9“;÷�_Š_ús’,¬5có–—tj|jjd««|jjd«k(S©NrF)rrgr�r)r%r s r Ú _is_childzPath._is_child«s2€Ü× Ñ  §¡§¡°Ó!4Ó5¸¿¹¿¹ÈÓ9LÑLÐLrcó:—|j|j|«Sr )r(rŽ)r%r�s r Ú_nextz Path._next®s€Ø�~‰~˜dŸi™i¨Ó,Ð,rcóV—|j xs|jjd«Srº)r�rNr*s r r›z Path.is_dir±s"€Ø—7‘7ˆ{Ò3˜dŸg™g×.Ñ.¨sÓ3Ð3rcóH—|j«xr|j« Sr )r�r›r*s r Úis_filez Path.is_file´s€Ø�{‰{‹}Ò2 T§[¡[£]Ð!2Ð2rcóN—|j|jj«vSr )r�rŽrer*s r r�z Path.exists·s€Ø�w‰w˜$Ÿ)™)×-Ñ-Ó/Ð/Ð/rcóÀ—|j«s td«‚t|j|jj ««}t |j|«S)NzCan't listdir a file)r›rMr9r½rŽr;rLr»)r%Úsubss r Úiterdirz Path.iterdirºsE€Ø�{‰{Œ}ÜÐ3Ó4Ð 4Ü�4—:‘:˜tŸy™y×1Ñ1Ó3Ó4ˆÜ�d—n‘n dÓ+Ð+rcó^—tj|j«j|«Sr )r¥r¦r�Úmatch)r%Ú path_patterns r rÆz Path.matchÀs"€Ü×$Ñ$ T§W¡WÓ-×3Ñ3°LÓAÐArcó—y)z] Return whether this path is a symlink. Always false (python/cpython#82102). FrAr*s r Ú is_symlinkzPath.is_symlinkÃs€ðrcó&—|std|›�«‚tj|j«}tj|t |«z«j }t|jt||jj«««S)NzUnacceptable pattern: ) rMrGÚescaper�ÚcompilerÚ fullmatchr9r½rLrŽr;)r%ÚpatternÚprefixÚmatchess r Úglobz Path.globÉsm€ÙÜÐ5°g°[ÐAÓBÐ Bä—‘˜4Ÿ7™7Ó#ˆÜ—*‘*˜V¤i°Ó&8Ñ8Ó9×CÑCˆÜ�4—:‘:œv g¨t¯y©y×/AÑ/AÓ/CÓDÓEÐErcó*—|jd|›�«S)Nz**/)rÑ)r%rÎs r Úrglobz Path.rglobÑs€Ø�y‰y˜3˜w˜i˜Ó)Ð)rcól—tjt|«t|j|Ž««Sr )rÚrelpathÚstrr±)r%r’Úextras r Ú relative_tozPath.relative_toÔs)€Ü× Ñ ¤ T£¬C°°·±ÀÐ0FÓ,GÓHÐHrcój—tj|jj|j«Sr )rrKrŽrkr�r*s r Ú__str__z Path.__str__×s!€Ü�~‰~˜dŸi™i×0Ñ0°$·'±'Ó:Ð:rcó:—|jj|¬«S)Nr*)Ú _Path__reprÚformatr*s r Ú__repr__z Path.__repr__Ús€Ø�{‰{×!Ñ! tÐ!Ó,Ð,rcó–—tj|jg|¢­Ž}|j|jj |««Sr )rrKr�r½rŽri)r%r’Únexts r r±z Path.joinpathÝs7€Ü�~‰~˜dŸg™gÐ.¨Ò.ˆØ�z‰z˜$Ÿ)™)×/Ñ/°Ó5Ó6Ð6rcóÒ—|js|jjStj|jj d««}|r|dz }|j |«Srº)r�rkÚparentrrgrr½)r%Ú parent_ats r râz Path.parentãsR€à�wŠwØ—=‘=×'Ñ'Ð 'Ü×%Ñ% d§g¡g§n¡n°SÓ&9Ó:ˆ Ù Ø ˜Ñ ˆIØ�z‰z˜)Ó$Ð$r)Ú)rq)"r/r0r1r2rÜr$r“r–rŸr§ÚpropertyrOr«r­r¯rkrµr¸r»r½r›rÀr�rÄrÆrÉrÑrÓrØrÚrÞr±Ú __truediv__rârArr rrøs„ñaðFN€Fó ò>ò*ðC¨ôCò(Dðñ!óð!ðñ#óð#ðñ%óð%ðñ!óð!ðñBóðBòò òMò-ò4ò3ò0ò,ò Bòò Fò*òIò;ò-ò7ð€Kà ñ%óñ%rr )r rrnr r�r¥rGÚ py310compatrrÑrÚ__all__rr ÚdictÚfromkeysr^rrr6rsrVrr‹rrArr Úrës‘ðÛ ÛÛÛÛÛÛ å&Ýð ˆ(€ò6ò&+ð, �-‰-€Ø/òH÷*ñ*÷$;1ñ;1ô|HÐ# ^°W·_±_ôHôV�ôó&4÷ r%òr%r