B mHa @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 _ancestry)pathr 5/opt/alt/python37/lib/python3.7/site-packages/zipp.py_parentssr ccs8|tj}x&|r2|tjkr2|Vt|\}}qWdS)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__)minuend 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|]}|tjVqdS)N)rr).0pr r r Psz-CompleteDirs._implied_dirs..)rchain from_iterablemapr _deduper)namesparentsas_dirsr r r _implied_dirsMszCompleteDirs._implied_dirscs tt|}|t||S)N)superrnamelistlistr$)selfr!) __class__r r r&SszCompleteDirs.namelistcCs t|S)N)rr&)r(r r r _name_setWszCompleteDirs._name_setcCs,|}|d}||ko||k}|r(|S|S)zx If the name represents a directory, return that name as a directory (with the trailing slash). /)r*)r(namer!dirname dir_matchr r r resolve_dirZszCompleteDirs.resolve_dircCs>t|tr|St|tjs&|t|Sd|jkr4t}||_|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*r/ classmethodr8 __classcell__r r )r)r rGs    rcs,eZdZdZfddZfddZZS) FastLookupzV ZipFile subclass to ensure implicit dirs exist and are resolved rapidly. c s.tt|jSQRXtt||_|jS)N) contextlibsuppressAttributeError_FastLookup__namesr%r@r&)r()r)r r r&~s  zFastLookup.namelistc s.tt|jSQRXtt||_|jS)N)rArBrC_FastLookup__lookupr%r@r*)r()r)r r r*s  zFastLookup._name_set)r9r:r;r<r&r*r?r r )r)r r@xs r@cCs&y|Stk r t|SXdS)zi For path-like objects, convert to a filename for compatibility on Python 3.6.1 and earlier. N) __fspath__rCstr)r r r r r4sr4c@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)r@r8rootat)r(rIrJr r r __init__s z Path.__init__r0N)pwdcOsr|rt||d}|s0|dkr0t||jj|j||d}d|kr`|sT|r\td|Stj |f||S)z Open this entry as text or binary following the semantics of ``pathlib.Path.open()`` by passing arguments through to io.TextIOWrapper(). rr0)rLbz*encoding args invalid for binary operation) is_dirIsADirectoryErrorexistsFileNotFoundErrorrIopenrJ ValueErrorio TextIOWrapper)r(r5rLargskwargszip_modestreamr r r rRsz Path.opencCst|jjp|jjS)N)pathlibrrJr,filename)r(r r r r,sz Path.namecCst|jjp|jjS)N)rZrrJsuffixr[)r(r r r r\ sz Path.suffixcCst|jjp|jjS)N)rZrrJsuffixesr[)r(r r r r] sz Path.suffixescCst|jjp|jjS)N)rZrrJstemr[)r(r r r r^sz Path.stemcCst|jj|jS)N)rZrrIr[joinpathrJ)r(r r r r[sz Path.filenamec Os$|jd|| }|SQRXdS)Nr0)r0)rRread)r(rVrWstrmr r r read_textszPath.read_textc Cs|d }|SQRXdS)Nrb)rRr`)r(rar r r read_bytess zPath.read_bytescCst|jd|jdkS)Nr+)rr-rJr)r(r r r r _is_child!szPath._is_childcCs||j|S)N)r)rI)r(rJr r r _next$sz Path._nextcCs|j p|jdS)Nr+)rJendswith)r(r r r rN'sz Path.is_dircCs|o| S)N)rPrN)r(r r r is_file*sz Path.is_filecCs|j|jkS)N)rJrIr*)r(r r r rP-sz Path.existscCs.|stdt|j|j}t|j|S)NzCan't listdir a file)rNrSrrfrIr&filterre)r(subsr r r iterdir0sz Path.iterdircCst|jj|jS)N)rjoinrIr[rJ)r(r r r __str__6sz Path.__str__cCs|jj|dS)N)r() _Path__reprformat)r(r r r __repr__9sz Path.__repr__cGs*tj|jftt|}||j|S)N)rrlrJrr4rfrIr/)r(othernextr r r r_<sz Path.joinpathcCs6|js|jjSt|jd}|r,|d7}||S)Nr+)rJr[parentrr-rrf)r( parent_atr r r rsBs z Path.parent)rH)r0)r9r:r;r<rnrKrRpropertyr,r\r]r^r[rbrdrerfrNrhrPrkrmrpr_ __truediv__rsr r r r rs,L      )rTrr2rrAsysrZ version_info collectionsrdict__all__r r fromkeysr rr3rr@r4rr r r r s$ 1