B -_@sdddlZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z m Z m Z mZddlmZddlmZmZmZmZmZmZmZddlmZdZejdkrddlZedd d krdd lm Z qd ZdZ ndZd dddddgZ!e e efZ"dZ#ddZ$ddZ%Gddde&Z'Gddde'Z(Gddde'Z)e(Z*e)Z+GdddZ,Gd d!d!e,Z-e-Z.d"d#Z/e0ed$re1e/Z/Gd%d&d&Z2Gd'd(d(Z3Gd)d*d*e2Z4Gd+d,d,e2Z5Gd-d.d.e2Z6Gd/d0d0e Z7Gd1d d e&Z8ej9:e8Gd2dde8Z;Gd3dde8ZGd6dde=e<Z?dS)7N)Sequence)EINVALENOENTENOTDIREBADF) attrgetter)S_ISDIRS_ISLNKS_ISREGS_ISSOCKS_ISBLKS_ISCHRS_ISFIFO)quote_from_bytesTnt)r)_getfinalpathnameFPurePath PurePosixPathPureWindowsPathPath PosixPath WindowsPath)cCs t|ddtkpt|ddtkS)NerrnoZwinerror)getattr_IGNORED_ERROS_IGNORED_WINERRORS)Z exceptionr/usr/lib/python3.7/pathlib.py _ignore_error,sr!cCsd|kpd|kpd|kS)N*?[r)patrrr _is_wildcard_pattern1sr&c@s(eZdZdZddZddZddZdS) _FlavourzPA flavour implements a particular (platform-specific) set of path semantics.cCs|jj|_dS)N)sepjoin)selfrrr __init__;sz_Flavour.__init__c Csg}|j}|j}d}}t|}x|D]}|s0q&|r@|||}||\}}} || krxPt| |D] } | rh| dkrh|t| qhWn| r| dkr|t| |s|r&|sx6|D].}|sq|r|||}||d}|rPqWPq&W|s|r |||| |||fS)N.r) r(altsepreversedreplace splitrootsplitappendsysinternreverse) r*partsZparsedr(r.drvrootitpartZrelxrrr parse_parts>s@       z_Flavour.parse_partscCsz|r*|sp|rp||||g|ddfSnF|rb||ksJ||||krp||||ddfSn||||fS|||fS)z Join the two paths represented by the respective (drive, root, parts) tuples. Return a new (drive, root, parts) tuple. N)casefold)r*r8r9r7Zdrv2Zroot2Zparts2rrr join_parsed_partsdsz_Flavour.join_parsed_partsN)__name__ __module__ __qualname____doc__r+r=r@rrrr r'7s&r'c@seZdZdZdZdZeZej dkZ e dZ dZ ddd d hd d ed dDBdd ed dDBZefddZddZddZd$ddZe fddZddZddZdd Zd!d"Zd#S)%_WindowsFlavour\/TrZ4abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZz\\?\ZCONZPRNZAUXZNULcCsh|] }d|qS)zCOM%dr).0irrr sz_WindowsFlavour.r> cCsh|] }d|qS)zLPT%dr)rHrIrrr rJsc Cs\|dd}|dd}||krP||krP||\}}|dd}|dd}nd}|dd}||kr||kr||kr||d}|dkr|||d}||dkr|dkrt|}|r||d||||ddfS|d||||ddfSd} } |dkr6||jkr6|dd} |dd}|}||krN|} ||}|| | |fS)Nrr>rr,:)_split_extended_pathfindlen drive_letterslstrip) r*r;r(firstsecondprefixZthirdindexZindex2r8r9rrr r1s6      "    z_WindowsFlavour.splitrootcCs|S)N)lower)r*srrr r?sz_WindowsFlavour.casefoldcCsdd|DS)NcSsg|] }|qSr)rX)rHprrr sz2_WindowsFlavour.casefold_parts..r)r*r7rrr casefold_partssz_WindowsFlavour.casefold_partsFcCst|}|stSd}tdk r|r2|t|Sg}xly|t|}Wn>tk r|}tj|\}}||||kr|SYq8Xtjj |ft |Sq8WdS)N) strosgetcwdr_ext_to_normalFileNotFoundErrorpathr2r3r)r/)r*rbstrictrYZ previous_sZ tail_partstailrrr resolves&  z_WindowsFlavour.resolvecCsXd}||rP|dd}|dd}|drP||dd7}d|dd}||fS)Nr,zUNC\rLrF) startswith)r*rYZ ext_prefixrVrrr rOs    z$_WindowsFlavour._split_extended_pathcCs||dS)Nr>)rO)r*rYrrr r`sz_WindowsFlavour._ext_to_normalcCs6|sdS|ddrdS|ddd|jkS)NFrz\\rMr-)rg partitionupperreserved_names)r*r7rrr is_reserveds z_WindowsFlavour.is_reservedcCsd|j}t|dkrJ|ddkrJ|ddd}d|t|dfSdt|dSdS)Nrr>rNrGz file:///%s/%szutf-8zfile:)driverQas_posixrSurlquote_from_bytesencode)r*rbrlrestrrr make_uris z_WindowsFlavour.make_uricCsdtjkrtjd}n`dtjkr,tjd}nJdtjkrnytjd}Wntk r\d}YnX|tjd}ntd|rtjd|kr||f\}}}|dtjdkrtd |||d<|s|r||||d d}n ||}|S) NHOMEZ USERPROFILEZHOMEPATHZ HOMEDRIVEr,zCan't determine home directoryZUSERNAMErMz%Can't determine home directory for %rr>)r^environKeyError RuntimeErrorr=r))r*usernameuserhomer8r9r7rrr gethomedirs,       z_WindowsFlavour.gethomedirN)F)rArBrCr(r.has_drvntpathpathmodr^name is_supportedsetrRZext_namespace_prefixrangerjr1r?r\rerOr`rkrqrxrrrr rEvs$  '    rEc@sdeZdZdZdZdZeZej dkZ efddZ ddZ d d Z dd d Zd dZddZddZdS) _PosixFlavourrGr,FrcCsV|rH|d|krH||}t|t|dkr._resolver,)r( _accessor is_absoluter^r_r])r*rbrcbaser)rrrr(rcr re7s &z_PosixFlavour.resolvecCsdS)NFr)r*r7rrr rkdsz_PosixFlavour.is_reservedcCst|}dt|S)Nzfile://)bytesrn)r*rbZbpathrrr rqgsz_PosixFlavour.make_uricCst|s:y tjdStk r6ddl}|tjSXn6ddl}y ||jStk rntd|YnXdS)Nrrrz%Can't determine home directory for %r) r^rsrtpwdgetpwuidgetuidpw_dirgetpwnamru)r*rvrrrr rxms  z_PosixFlavour.gethomedirN)F)rArBrCr(r.ry posixpathr{r^r|r}r1r?r\rerkrqrxrrrr rs   -rc@seZdZdZdS) _AccessorzjAn accessor implements a particular (system-specific or not) way of accessing paths on the filesystem.N)rArBrCrDrrrr rsrc@seZdZejZejZejZejZejZej Z e edr>ej Z nddZ ej Z ej Z ejZejZejZer~ertejZqddZn eddZejZddZd S) _NormalAccessorlchmodcCs tddS)Nz%lchmod() not available on this system)NotImplementedError)r*Zpathobjmoderrr rsz_NormalAccessor.lchmodcCs tddS)Nz&symlink() not available on this system)r)abtarget_is_directoryrrr symlinksz_NormalAccessor.symlinkcCs t||S)N)r^r)rrrrrr rscCs t|S)N)r^r)r*rbrrr rsz_NormalAccessor.readlinkN)rArBrCr^statlstatopenlistdirscandirchmodhasattrrmkdirunlinkrmdirrenamer0rsupports_symlinksr staticmethodutimerrrrr rs*   rcCsP|d}|dd}|dkr"t}n$d|kr4tdnt|rBt}nt}|||S)Nrr>z**z:Invalid pattern: '**' can only be an entire path component)_RecursiveWildcardSelector ValueErrorr&_WildcardSelector_PreciseSelector) pattern_partsr% child_partsclsrrr _make_selectors  r lru_cachec@s eZdZdZddZddZdS) _SelectorzYA selector matches a specific glob pattern part against the children of a given path.cCs.||_|rt||_d|_nt|_d|_dS)NTF)rr successordironly_TerminatingSelector)r*rrrr r+s  z_Selector.__init__cCs<t|}|j}|j}|jj}||s,tgS|||||S)zuIterate over all child paths of `parent_path` matched by this selector. This can contain parent_path itself.)typeis_direxistsrriter _select_from)r* parent_pathZpath_clsrrrrrr select_fromsz_Selector.select_fromN)rArBrCrDr+rrrrr rs rc@seZdZddZdS)rccs |VdS)Nr)r*rrrrrrr rsz!_TerminatingSelector._select_fromN)rArBrCrrrrr rsrc@seZdZddZddZdS)rcCs||_t||dS)N)r|rr+)r*r|rrrr r+sz_PreciseSelector.__init__ccs^yD||j}|jr|n||rBx |j||||D] }|Vq4WWntk rXdSXdS)N)_make_child_relpathr|rrrPermissionError)r*rrrrrbrZrrr rs z_PreciseSelector._select_fromN)rArBrCr+rrrrr rsrc@seZdZddZddZdS)rcCs"tt||_t||dS)N)recompilefnmatch translater%rr+)r*r%rrrr r+sz_WildcardSelector.__init__c csyz|jj}t||}x`|D]X}|jr.|r|j}||} |j| r||} x |j | |||D] } | VqfWqWWnt k rdSXdS)N) _flavourr?listrrr|r%matchrrrr) r*rrrrcfentriesentryr|Z casefoldedrbrZrrr rs    z_WildcardSelector._select_fromN)rArBrCr+rrrrr rsrc@s$eZdZddZddZddZdS)rcCst||dS)N)rr+)r*r%rrrr r+sz#_RecursiveWildcardSelector.__init__c cs|Vyt||}x|D]x}d}y |}Wn,tk rZ}zt|sJWdd}~XYnX|r|s||j}x||||D] } | VqWqWWntk rdSXdS)NF) rrrr! is_symlinkrr|_iterate_directoriesr) r*rrrrrZ entry_is_dirrrbrZrrr rs      z/_RecursiveWildcardSelector._iterate_directoriesc csyjt}zT|jj}xF||||D]4}x.|||||D]}||kr6|V||q6Wq"WWd|XWntk r~dSXdS)N)r~rrraddclearr) r*rrrrZyieldedZsuccessor_selectZstarting_pointrZrrr r,sz'_RecursiveWildcardSelector._select_fromN)rArBrCr+rrrrrr rsrc@s4eZdZdZdZddZddZddZd d Zd S) _PathParentszvThis object provides sequence-like access to the logical ancestors of a path. Don't try to construct it yourself.)_pathcls_drv_root_partscCs&t||_|j|_|j|_|j|_dS)N)rrrrr)r*rbrrr r+Es z_PathParents.__init__cCs(|js |jrt|jdSt|jSdS)Nr>)rrrQr)r*rrr __len__Ls z_PathParents.__len__cCs@|dks|t|krt||j|j|j|jd| dS)Nrr>)rQ IndexErrorr_from_parsed_partsrrr)r*idxrrr __getitem__Rsz_PathParents.__getitem__cCsd|jjS)Nz <{}.parents>)formatrrA)r*rrr __repr__Xsz_PathParents.__repr__N) rArBrCrD __slots__r+rrrrrrr r@s rc@seZdZdZdZddZddZeddZedVd d Z edWd d Z eddZ ddZ ddZ ddZddZddZddZddZddZed d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zeed.d/d0Zeed1d2d0Zed3d4Zed5d6Z ed7d8Z!ed9d:Z"ed;d<Z#d=d>Z$d?d@Z%dAdBZ&edCdDZ'dEdFZ(dGdHZ)dIdJZ*edKdLZ+edMdNZ,dOdPZ-dQdRZ.dSdTZ/dUS)Xra|Base class for manipulating paths without I/O. PurePath represents a filesystem path and offers operations which don't imply any actual filesystem I/O. Depending on your system, instantiating a PurePath will return either a PurePosixPath or a PureWindowsPath object. You can also instantiate either of these classes directly, regardless of your system. )rrr_str_hash_pparts_cached_cpartscGs$|tkrtjdkrtnt}||S)zConstruct a PurePath from one or several strings and or existing PurePath objects. The strings and path objects are combined so as to yield a canonicalized path, which is incorporated into the new PurePath object. r)rr^r|rr _from_parts)rargsrrr __new__jszPurePath.__new__cCs|jt|jfS)N) __class__tupler)r*rrr __reduce__tszPurePath.__reduce__cCshg}xV|D]N}t|tr$||j7}q t|}t|trH|t|q tdt|q W|j |S)NzNargument should be a str object or an os.PathLike object returning str, not %r) isinstancerrr^fspathr]r3 TypeErrorrrr=)rrr7rrrr _parse_argsys     zPurePath._parse_argsTcCs<t|}||\}}}||_||_||_|r8||S)N)objectrrrrr_init)rrinitr*r8r9r7rrr rs zPurePath._from_partscCs,t|}||_||_||_|r(||S)N)rrrrrr)rr8r9r7rr*rrr rs zPurePath._from_parsed_partscCs4|s|r$|||j|ddS|j|SdS)Nr>)rr))rr8r9r7rrr _format_parsed_partsszPurePath._format_parsed_partscCsdS)Nr)r*rrr rszPurePath._initcCs@||\}}}|j|j|j|j|||\}}}||||S)N)rrr@rrrr)r*rr8r9r7rrr _make_childszPurePath._make_childcCs<y|jStk r6||j|j|jp,d|_|jSXdS)z[Return the string representation of the path, suitable for passing to system calls.r-N)rAttributeErrorrrrr)r*rrr __str__s  zPurePath.__str__cCst|S)N)r])r*rrr __fspath__szPurePath.__fspath__cCs|j}t||jdS)zNReturn the string representation of the path with forward (/) slashes.rG)rr]r0r()r*frrr rmszPurePath.as_posixcCs t|S)zaReturn the bytes representation of the path. This is only recommended to use under Unix.)r^fsencode)r*rrr __bytes__szPurePath.__bytes__cCsd|jj|S)Nz{}({!r}))rrrArm)r*rrr rszPurePath.__repr__cCs|std|j|S)z Return the path as a 'file' URI.z.relative path can't be expressed as a file URI)rrrrq)r*rrr as_uriszPurePath.as_uricCs2y|jStk r,|j|j|_|jSXdS)N)rrrr\r)r*rrr _cpartss zPurePath._cpartscCs&t|tstS|j|jko$|j|jkS)N)rrNotImplementedrr)r*otherrrr __eq__s zPurePath.__eq__cCs2y|jStk r,tt|j|_|jSXdS)N)rrhashrr)r*rrr __hash__s zPurePath.__hash__cCs&t|tr|j|jk rtS|j|jkS)N)rrrrr)r*rrrr __lt__szPurePath.__lt__cCs&t|tr|j|jk rtS|j|jkS)N)rrrrr)r*rrrr __le__szPurePath.__le__cCs&t|tr|j|jk rtS|j|jkS)N)rrrrr)r*rrrr __gt__szPurePath.__gt__cCs&t|tr|j|jk rtS|j|jkS)N)rrrrr)r*rrrr __ge__szPurePath.__ge__rz.The drive prefix (letter or UNC path), if any.)docrzThe root of the path, if any.cCs|j|j}|S)z/The concatenation of the drive and root, or ''.)rr)r*anchorrrr rs zPurePath.anchorcCs.|j}t||js|jrdndkr&dS|dS)z!The final path component, if any.r>rr,rM)rrQrr)r*r7rrr r| sz PurePath.namecCsD|j}|d}d|kr,t|dkrNr,)r|rfindrQ)r*r|rIrrr suffixs    zPurePath.suffixcCs:|j}|drgS|d}dd|dddDS)z1A list of the final component's suffixes, if any.r-cSsg|] }d|qS)r-r)rHrrrr r[$sz%PurePath.suffixes..r>N)r|endswithrSr2)r*r|rrr suffixess   zPurePath.suffixescCsD|j}|d}d|kr,t|dkrN)r|rrQ)r*r|rIrrr stem&s    z PurePath.stemcCs|jstd|f|j|f\}}}|rX|d|jj|jjgksX|sX|sXt|dkrdtd|||j|j |j dd|gS)z-Return a new path with the file name changed.z%r has an empty namerMr>zInvalid name %rN) r|rrr=r(r.rQrrrr)r*r|r8r9r7rrr with_name0s  zPurePath.with_namecCs|j}|j|ks |jr.|j|kr.td|f|r<|drD|dkrPtd||j}|shtd|f|j}|s|||}n|dt| |}||j |j |j dd|gS)zReturn a new path with the file suffix changed. If the path has no suffix, add given suffix. If the given suffix is an empty string, remove the suffix from the path. zInvalid suffix %rr-z%r has an empty nameNrM) rr(r.rrgr|rrQrrrr)r*rrr|Z old_suffixrrr with_suffix;s   zPurePath.with_suffixc Gs|s td|j}|j}|j}|r8||g|dd}n|}||\}}}|rf||g|dd} n|} t| } |jj} | dkr|s|rn| |d| | | kr||||} t d t |t | | d| dkr|nd|| dS)zReturn the relative path to another path identified by the passed arguments. If the operation is not possible (because this is not a subpath of the other path), raise ValueError. zneed at least one argumentr>Nrz{!r} does not start with {!r}r,) rrrrrrQrr\rrrr]r) r*rr7r8r9Z abs_partsZto_drvZto_rootZto_partsZ to_abs_partsnrZ formattedrrr relative_toPs( *zPurePath.relative_tocCs.y|jStk r(t|j|_|jSXdS)zZAn object providing sequence-like access to the components in the filesystem path.N)rrrr)r*rrr r7ps  zPurePath.partscGs ||S)zCombine this path with one or several arguments, and return a new path representing either a subpath (if all arguments are relative paths) or a totally different path (if one of the arguments is anchored). )r)r*rrrr joinpath|szPurePath.joinpathcCs ||fS)N)r)r*keyrrr __truediv__szPurePath.__truediv__cCs||g|jS)N)rr)r*r rrr __rtruediv__szPurePath.__rtruediv__cCs@|j}|j}|j}t|dkr*|s&|r*|S||||ddS)zThe logical parent of the path.r>NrM)rrrrQr)r*r8r9r7rrr parents zPurePath.parentcCst|S)z*A sequence of this path's logical parents.)r)r*rrr parentsszPurePath.parentscCs|js dS|jj pt|jS)zSTrue if the path is absolute (has both a root and, if applicable, a drive).F)rrryboolr)r*rrr rszPurePath.is_absolutecCs|j|jS)zaReturn True if the path contains one of the special names reserved by the system, if any.)rrkr)r*rrr rkszPurePath.is_reservedc Cs|jj}||}|j|f\}}}|s0td|rF|||jkrFdS|r\|||jkr\dS|j}|sj|rt|t|kr~dS|dd}nt|t|krdSx.tt |t |D]\}}t ||sdSqWdS)zE Return True if this path matches the given pattern. z empty patternFr>NT) rr?r=rrrrrQzipr/rZ fnmatchcase) r*Z path_patternrr8r9Z pat_partsr7r;r%rrr rs( zPurePath.matchN)T)T)0rArBrCrDrrr classmethodrrrrrrrrrmrrrpropertyrrrrrrrrrlr9rr|rrrrr r r7r rrrrrrkrrrrr r\s\            c@seZdZdZeZdZdS)rzPurePath subclass for non-Windows systems. On a POSIX system, instantiating a PurePath should return this object. However, you can also instantiate it directly on any system. rN)rArBrCrD_posix_flavourrrrrrr rsc@seZdZdZeZdZdS)rzPurePath subclass for Windows systems. On a Windows system, instantiating a PurePath should return this object. However, you can also instantiate it directly on any system. rN)rArBrCrD_windows_flavourrrrrrr rsc@seZdZdZdZddZdbddZdd Zd d Zd d Z ddZ dcddZ ddddZ e ddZe ddZddZddZddZd d!Zd"d#Zded%d&Zd'd(Zd)d*Zd+d,Zdfd/d0Zd1d2Zdgd3d4Zd5d6Zdhd7d8Zdid:d;Zdjdd?Z d@dAZ!dBdCZ"dDdEZ#dFdGZ$dHdIZ%dJdKZ&dkdLdMZ'dNdOZ(dPdQZ)dRdSZ*dTdUZ+dVdWZ,dXdYZ-dZd[Z.d\d]Z/d^d_Z0d`daZ1dS)lraPurePath subclass that can make system calls. Path represents a filesystem path but unlike PurePath, also offers methods to do system calls on path objects. Depending on your system, instantiating a Path will return either a PosixPath or a WindowsPath object. You can also instantiate a PosixPath or WindowsPath directly, but cannot instantiate a WindowsPath on a POSIX system or vice versa. )r_closedcOsL|tkrtjdkrtnt}|j|dd}|jjs@td|j f| |S)NrF)rz$cannot instantiate %r on your system) rr^r|rrrrr}rrAr)rrkwargsr*rrr rs z Path.__new__NcCs"d|_|dk r|j|_nt|_dS)NF)rr_normal_accessor)r*templaterrr rs z Path._initcCs|j|g}||j|j|S)N)rrrr)r*r;r7rrr rs zPath._make_child_relpathcCs|jr||S)N)r _raise_closed)r*rrr __enter__szPath.__enter__cCs d|_dS)NT)r)r*tvtbrrr __exit__sz Path.__exit__cCs tddS)NzI/O operation on closed path)r)r*rrr r szPath._raise_closedcCs|j|||S)N)rr)r*r|flagsrrrr _opener sz Path._openercCs|jr||j|||S)zm Open the file pointed by this path and return a file descriptor, as os.open() does. )rrrr)r*r#rrrr _raw_openszPath._raw_opencCs |tS)zjReturn a new path pointing to the current working directory (as returned by os.getcwd()). )r^r_)rrrr cwdszPath.cwdcCs||jdS)zrReturn a new path pointing to the user's home directory (as returned by os.path.expanduser('~')). N)rrx)rrrr home#sz Path.homecCsB|}y |}Wntk r2t|}YnXtj||S)zoReturn whether other_path is the same or not as this file (as returned by os.path.samefile()). )rrr^rbsamestat)r*Z other_pathstZother_strrr samefile*s  z Path.samefileccsL|jr|x8|j|D](}|dkr*q||V|jr|qWdS)zyIterate over the files in this directory. Does not yield any result for the special paths '.' and '..'. >r-..N)rrrrr)r*r|rrr iterdir5s z Path.iterdirccsl|std||j|}|j|f\}}}|s:|rBtdtt|}x||D] }|VqZWdS)zIterate over this subtree and yield all existing files (of any kind, including directories) matching the given relative pattern. zUnacceptable pattern: {!r}z%Non-relative patterns are unsupportedN) rrrr?r=rrrr)r*patternr8r9rselectorrZrrr globCs  z Path.globccs^|j|}|j|f\}}}|s(|r0tdtdt|}x||D] }|VqLWdS)zRecursively yield all existing files (of any kind, including directories) matching the given relative pattern, anywhere in this subtree. z%Non-relative patterns are unsupported)z**N)rr?r=rrrr)r*r.r8r9rr/rZrrr rglobQs z Path.rglobcCsD|jr||r|S|jtg|jdd}|j|d|S)aReturn an absolute version of this path. This function works even if the path doesn't point to anything. No normalization is done, i.e. all '.' and '..' will be kept along. Use resolve() to get the canonical path to a file. F)r)r)rrrrr^r_rr)r*objrrr absolute^s z Path.absoluteFcCsh|jr||jj||d}|dkr:|t|}|jj|}|j |fdd}|j |d|S)z Make the path absolute, resolving all symlinks on the way and also normalizing it (for example turning slashes into backslashes under Windows). )rcNF)r)r) rrrrerr]r3r{normpathrr)r*rcrYZnormedr2rrr reps  z Path.resolvecCs |j|S)zh Return the result of the stat() system call on this path, like os.stat() does. )rr)r*rrr rsz Path.statcCsddl}||jjS)z: Return the login name of the file owner. rN)rrrst_uidZpw_name)r*rrrr ownersz Path.ownercCsddl}||jjS)z8 Return the group name of the file gid. rN)grpZgetgrgidrst_gidZgr_name)r*r7rrr groupsz Path.grouprrMc Cs(|jr|tj|||||||jdS)z| Open the file pointed by this path and return a file object, as the built-in open() function does. )opener)rriorr$)r*r bufferingencodingerrorsnewlinerrr rsz Path.openc Cs |jdd }|SQRXdS)zK Open the file in bytes mode, read it, and close the file. rb)rN)rread)r*rrrr read_bytesszPath.read_bytesc Cs$|jd||d }|SQRXdS)zJ Open the file in text mode, read it, and close the file. r:)rr>r?N)rrB)r*r>r?rrrr read_textszPath.read_textc Cs*t|}|jdd }||SQRXdS)zO Open the file in bytes mode, write to it, and close the file. wb)rN) memoryviewrwrite)r*dataZviewrrrr write_bytesszPath.write_bytesc Cs@t|tstd|jj|jd||d }||SQRXdS)zN Open the file in text mode, write to it, and close the file. zdata must be str, not %sw)rr>r?N)rr]rrrArrG)r*rHr>r?rrrr write_texts   zPath.write_textTcCsr|jr||r>y|j|dWntk r8YnXdStjtjB}|sX|tjO}| ||}t |dS)zS Create this file with the given access mode, if it doesn't exist. N) rrrrrr^O_CREATO_WRONLYO_EXCLr&close)r*rexist_okr#fdrrr touchs   z Path.touchcCs|jr|y|j||Wndtk rd|r>|j|kr@|jjddd|j|d|dYn"tk r|r~|sYnXdS)z< Create a new directory at this given path. T)rrPFN)rrrrrarrr)r*rrrPrrr rs z Path.mkdircCs |jr||j||dS)zF Change the permissions of the path, like os.chmod(). N)rrrr)r*rrrr rsz Path.chmodcCs |jr||j||dS)z Like chmod(), except if the path points to a symlink, the symlink's permissions are changed, rather than its target's. N)rrrr)r*rrrr rsz Path.lchmodcCs|jr||j|dS)zd Remove this file or link. If the path is a directory, use rmdir() instead. N)rrrr)r*rrr rsz Path.unlinkcCs|jr||j|dS)zF Remove this directory. The directory must be empty. N)rrrr)r*rrr r sz Path.rmdircCs|jr||j|S)z Like stat(), except if the path points to a symlink, the symlink's status information is returned, rather than its target's. )rrrr)r*rrr rsz Path.lstatcCs |jr||j||dS)z5 Rename this path to the given path. N)rrrr)r*rrrr rsz Path.renamecCs |jr||j||dS)zo Rename this path to the given path, clobbering the existing destination if it exists. N)rrrr0)r*rrrr r0"sz Path.replacecCs"|jr||j|||dS)z Make this path a symlink pointing to the given path. Note the order of arguments (self, target) is the reverse of os.symlink's. N)rrrr)r*rrrrr symlink_to+szPath.symlink_toc Cs>y |Wn,tk r8}zt|s(dSd}~XYnXdS)z+ Whether this path exists. FNT)rrr!)r*rrrr r6s z Path.existsc Cs@yt|jStk r:}zt|s*dSd}~XYnXdS)z3 Whether this path is a directory. FN)rrst_moderr!)r*rrrr rBs z Path.is_dirc Cs@yt|jStk r:}zt|s*dSd}~XYnXdS)zq Whether this path is a regular file (also True for symlinks pointing to regular files). FN)r rrTrr!)r*rrrr is_fileOs z Path.is_filecCst|r|sdSt|j}y|j}Wntk r@dSX|j}||krXdS|j}|j}||kS)z; Check if this path is a POSIX mount point FT)rrrrrst_devrst_ino)r*rZ parent_devZdevZinoZ parent_inorrr is_mount]s    z Path.is_mountc Cs@yt|jStk r:}zt|s*dSd}~XYnXdS)z7 Whether this path is a symbolic link. FN)r rrTrr!)r*rrrr rrs zPath.is_symlinkc Cs@yt|jStk r:}zt|s*dSd}~XYnXdS)z6 Whether this path is a block device. FN)r rrTrr!)r*rrrr is_block_device~s zPath.is_block_devicec Cs@yt|jStk r:}zt|s*dSd}~XYnXdS)z: Whether this path is a character device. FN)r rrTrr!)r*rrrr is_char_devices zPath.is_char_devicec Cs@yt|jStk r:}zt|s*dSd}~XYnXdS)z. Whether this path is a FIFO. FN)rrrTrr!)r*rrrr is_fifos z Path.is_fifoc Cs@yt|jStk r:}zt|s*dSd}~XYnXdS)z0 Whether this path is a socket. FN)r rrTrr!)r*rrrr is_sockets zPath.is_socketcCs`|js\|js\|jr\|jddddkr\|j|jddd}||g|jddS|S)zl Return a new path with expanded ~ and ~user constructs (as returned by os.path.expanduser) rNr>~)rrrrrxr)r*Zhomedirrrr expandusers  zPath.expanduser)N)r")r%)F)r:rMNNN)NN)NN)r"T)r%FF)F)2rArBrCrDrrrrrr!rr$r&rr'r(r+r-r0r1r3rerr6r9rrCrDrIrKrRrrrrrrrr0rSrrrUrXrrYrZr[r\r^rrrr rs^                      c@seZdZdZdZdS)rzsPath subclass for non-Windows systems. On a POSIX system, instantiating a Path should return this object. rN)rArBrCrDrrrrr rsc@s,eZdZdZdZddZddZddZd S) rzqPath subclass for Windows systems. On a Windows system, instantiating a Path should return this object. rcCs tddS)Nz*Path.owner() is unsupported on this system)r)r*rrr r6szWindowsPath.ownercCs tddS)Nz*Path.group() is unsupported on this system)r)r*rrr r9szWindowsPath.groupcCs tddS)Nz-Path.is_mount() is unsupported on this system)r)r*rrr rXszWindowsPath.is_mountN)rArBrCrDrr6r9rXrrrr rs )@r functoolsr<rzr^rrr4_collections_abcrrrrrroperatorrrrr r r r r rZ urllib.parserrnrr|rZgetwindowsversionr__all__rrr!r&rr'rErrrrrrrrrrrrrrrrPathLikeregisterrrrrrrrrr sp  $    ?%c1  +f   g