a oe @sddlZddlZddlZddlZddlZddlZddlZejdkrPddlm Z ne Z dgZ ddZ ddZ e jZd d ZGd d d ejZGd ddeZddZGdddZdS)N)) OrderedDictPathcCstt|ddS)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('')) [] N) itertoolsislice _ancestrypathr 8C:\Program Files\Certbot\pkgs\setuptools\_vendor\zipp.py_parentssrccs4|tj}|r0|tjkr0|Vt|\}}q dS)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 posixpathsepsplit)r tailr r r r %s r cCstt|j|S)zZ Return items in minuend not in subtrahend, retaining order with O(1) lookup. )r filterfalseset __contains__)ZminuendZ subtrahendr r r _difference?srcsHeZdZdZeddZfddZddZdd Ze d d Z Z S) CompleteDirszk A ZipFile subclass that ensures that implied directories are always included in the namelist. cCs.tjtt|}dd|D}tt||S)Ncss|]}|tjVqdSN)rr).0pr r r Pz-CompleteDirs._implied_dirs..)rchain from_iterablemapr_deduper)namesparentsZas_dirsr r r _implied_dirsMszCompleteDirs._implied_dirscs tt|}|t||Sr)superrnamelistlistr$)selfr" __class__r r r&SszCompleteDirs.namelistcCs t|Sr)rr&r(r r r _name_setWszCompleteDirs._name_setcCs,|}|d}||vo||v}|r(|S|S)zx If the name represents a directory, return that name as a directory (with the trailing slash). /)r,)r(namer"dirnameZ dir_matchr r r resolve_dirZszCompleteDirs.resolve_dircCs>t|tr|St|tjs&|t|Sd|jvr4t}||_|S)zl Given a source (filename or zipfile), return an appropriate CompleteDirs subclass. r) isinstancerzipfileZipFile_pathlib_compatmoder*)clssourcer r r makeds    zCompleteDirs.make) __name__ __module__ __qualname____doc__ staticmethodr$r&r,r0 classmethodr9 __classcell__r r r)r rGs   rcs,eZdZdZfddZfddZZS) FastLookupzV ZipFile subclass to ensure implicit dirs exist and are resolved rapidly. csFtt|jWdS1s&0Ytt||_|jSr) contextlibsuppressAttributeErrorZ_FastLookup__namesr%rAr&r+r)r r r&~s $zFastLookup.namelistcsFtt|jWdS1s&0Ytt||_|jSr)rBrCrDZ_FastLookup__lookupr%rAr,r+r)r r r,s $zFastLookup._name_set)r:r;r<r=r&r,r@r r r)r rAxs rAcCs*z |WSty$t|YS0dS)zi For path-like objects, convert to a filename for compatibility on Python 3.6.1 and earlier. N) __fspath__rDstrr r r r r5s  r5c@seZdZdZdZd-ddZd.ddd d Zed d Zed dZ eddZ eddZ eddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*ZeZed+d,ZdS)/ru4 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 >>> 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() '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})cCst||_||_dS)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)rAr9rootat)r(rHrIr r r __init__s z Path.__init__r1NpwdcOsx|rt||d}|s0|dkr0t||jj|j||d}d|vr`|sT|r\td|Stj |g|Ri|S)z Open this entry as text or binary following the semantics of ``pathlib.Path.open()`` by passing arguments through to io.TextIOWrapper(). rr1rKbz*encoding args invalid for binary operation) is_dirIsADirectoryErrorexistsFileNotFoundErrorrHopenrI ValueErrorio TextIOWrapper)r(r6rLargskwargsZzip_modestreamr r r rRsz Path.opencCst|jjp|jjSr)pathlibrrIr.filenamer+r r r r.sz Path.namecCst|jjp|jjSr)rYrrIsuffixrZr+r r r r[ sz Path.suffixcCst|jjp|jjSr)rYrrIsuffixesrZr+r r r r\ sz Path.suffixescCst|jjp|jjSr)rYrrIstemrZr+r r r r]sz Path.stemcCst|jj|jSr)rYrrHrZjoinpathrIr+r r r rZsz Path.filenamecOsD|jdg|Ri|}|WdS1s60YdS)Nr1rRread)r(rVrWstrmr r r read_textszPath.read_textcCs6|d}|WdS1s(0YdS)Nrbr_)r(rar r r read_bytess zPath.read_bytescCst|jd|jdkSNr-)rr/rIr)r(r r r r _is_child!szPath._is_childcCs||j|Sr)r*rH)r(rIr r r _next$sz Path._nextcCs|j p|jdSre)rIendswithr+r r r rN'sz Path.is_dircCs|o| Sr)rPrNr+r r r is_file*sz Path.is_filecCs|j|jvSr)rIrHr,r+r r r rP-sz Path.existscCs.|stdt|j|j}t|j|S)NzCan't listdir a file)rNrSr rgrHr&filterrf)r(Zsubsr r r iterdir0sz Path.iterdircCst|jj|jSr)rjoinrHrZrIr+r r r __str__6sz Path.__str__cCs|jj|dS)Nr+) _Path__reprformatr+r r r __repr__9sz Path.__repr__cGs,tj|jgtt|R}||j|Sr)rrlrIr r5rgrHr0)r(othernextr r r r^<sz Path.joinpathcCs6|js|jjSt|jd}|r,|d7}||Sre)rIrZparentrr/rrg)r(Z parent_atr r r rsBs z Path.parent)rG)r1)r:r;r<r=rnrJrRpropertyr.r[r\r]rZrbrdrfrgrNrirPrkrmrpr^ __truediv__rsr r r r rs8M      )rTrr3rrBsysrY version_info collectionsrdict__all__rr fromkeysr!rr4rrAr5rr r r r s$ 1