U oÏ aÅéã@s¸ddlZddlmZddlZddlZddlmZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZz ddlZWnek rŒdZYnXddlZddlZddlZddlZddlZz ddlZWnek rÞddlZYnXddlZddlmZddlmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0e  1e2¡Z3e  4d¡Z5e  4d¡Z6e  4d ¡Z7e  4d ¡Z8e  4d ¡Z9e  4d ¡Z:e  4d ¡Z;e  4d¡Zdd„Z?dd„Z@dd„ZAdˆdd„ZBdd„ZCdd„ZDdd „ZEejFd!d"„ƒZGejFd#d$„ƒZHejFd‰d&d'„ƒZIGd(d)„d)eJƒZKd*d+„ZLGd,d-„d-eJƒZMd.d/„ZNGd0d1„d1eJƒZOe  4d2e jP¡ZQd3d4„ZRdŠd5d6„ZSd7d8„ZTd9d:„ZUd;d<„ZVd=d>„ZWd?d@„ZXe  4dAe jY¡ZZe  4dB¡Z[d‹dCdD„Z\e  4dE¡Z]dFdG„Z^dHdI„Z_dJdK„Z`dLZadMdN„ZbdOdP„ZcGdQdR„dReJƒZdGdSdT„dTeJƒZeGdUdV„dVeJƒZfdWZgdŒdYdZ„Zhd[d\„Zid]ZjGd^d_„d_eJƒZke  4d`¡Zle  4da¡Zme  4db¡Zndcdd„Zdedf„ZoerÖddglmpZqmrZrmsZsGdhdi„die$jtƒZtGdjdk„dkeqƒZpGdldm„dmepe'ƒZuejvddn…ZwewdokrGdpdq„dqe$jxƒZxerGdrds„dse$jyƒZyGdtdu„due%jzƒZzerBGdvdw„dwe%j{ƒZ{Gdxdy„dye%j|ƒZ|dzd{„Z}Gd|d}„d}eJƒZ~Gd~d„de~ƒZGd€d„de~ƒZ€Gd‚dƒ„dƒe(ƒZGd„d…„d…eJƒZ‚d†d‡„ZƒdS)éN)Údeque)Úiglobé)ÚDistlibException)Ú string_typesÚ text_typeÚshutilÚ raw_inputÚStringIOÚcache_from_sourceÚurlopenÚurljoinÚhttplibÚ xmlrpclibÚ splittypeÚ HTTPHandlerÚBaseConfiguratorÚ valid_identÚ ContainerÚ configparserÚURLErrorÚZipFileÚfsdecodeÚunquoteÚurlparsez^([\w\.-]+)\s*z^([\w\.*+-]+)\s*z^(<=?|>=?|={2,3}|[~!]=)\s*z*^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*z^or\b\s*z ^and\b\s*z(\S+)\s*z(([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)cs6dd„‰‡‡fdd„‰‡fdd„‰‡fdd„‰ˆ|ƒS) ae Parse a marker string and return a dictionary containing a marker expression. The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in the expression grammar, or strings. A string contained in quotes is to be interpreted as a literal string, and a string not contained in quotes is a variable (such as os_name). cSs.t |¡}|r,| ¡d}|| ¡d…}nú|s:tdƒ‚nì|d}|dkrVtd|ƒ‚d |d¡}|dd…}|g}|rì|d|krŠqqt|d|kr®| |¡|dd…}qtt |¡}|sÈtd|ƒ‚| | ¡d¡|| ¡d…}qtd |¡}td|ƒ‚| |¡d |¡}|dd…  ¡}||fS) Nrzunexpected end of inputz'"zinvalid expression: %sÚrzerror in string literal: %szunterminated string: %s) Ú IDENTIFIERÚmatchÚgroupsÚendÚ SyntaxErrorÚreplaceÚappendÚ STRING_CHUNKÚjoinÚlstrip)Ú remainingÚmÚresultÚqÚoqÚpartsÚs©r-úYC:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-6mt8ur68\pip\_vendor\distlib\util.pyÚ marker_varAs:               z parse_marker..marker_varcs´|rR|ddkrRˆ|dd… ¡ƒ\}}|ddkr@td|ƒ‚|dd… ¡}nZˆ|ƒ\}}|r¨t |¡}|srq¨| ¡d}|| ¡d…}ˆ|ƒ\}}|||dœ}q^|}||fS)Nrú(rú)úunterminated parenthesis: %s©ÚopÚlhsÚrhs)r%r Ú MARKER_OPrrr)r&r(r5r'r4r6)Úmarkerr/r-r.Ú marker_expres       z!parse_marker..marker_exprcsRˆ|ƒ\}}|rJt |¡}|s qJ|| ¡d…}ˆ|ƒ\}}d||dœ}q ||fS)NÚandr3)ÚANDrr©r&r5r'r6)r9r-r.Ú marker_andxs   z parse_marker..marker_andcsRˆ|ƒ\}}|rJt |¡}|s qJ|| ¡d…}ˆ|ƒ\}}d||dœ}q ||fS)NÚorr3)ÚORrrr<)r=r-r.r8ƒs   zparse_marker..markerr-)Ú marker_stringr-)r8r=r9r/r.Ú parse_marker8s $ rAcCs0| ¡}|r| d¡rdSt |¡}|s4td|ƒ‚| ¡d}|| ¡d…}d}}}}|r:|ddkr:| dd¡}|dkr”td|ƒ‚|d|…} ||dd… ¡}g}| r0t | ¡}|sØtd | ƒ‚|  | ¡d¡| | ¡d…} | sq0| dd krtd | ƒ‚| dd… ¡} q¸|s:d}|r˜|dd krÀ|dd… ¡}t  |¡}|sztd |ƒ‚| ¡d}t |ƒ} | j rž| j sªtd|ƒ‚|| ¡d… ¡}nØdd„} |ddkrä| |ƒ\}}n´| dd¡}|dkrtd|ƒ‚|d|…} ||dd… ¡}t | ¡r@| | ƒ\}} nXt | ¡}|s\td| ƒ‚| ¡d} | | ¡d… ¡} | rŽtd| ƒ‚d| fg}|rÔ|ddkr¸td|ƒ‚|dd… ¡}t|ƒ\}}|rô|ddkrôtd|ƒ‚|s|}nd|d dd„|Dƒ¡f}t||||||dS)zŠ Parse a requirement passed in as a string. Return a Container whose attributes contain the various parts of the requirement. ú#Nzname expected: %srú[ú]rzunterminated extra: %szmalformed extra: %sú,zcomma expected in extras: %sú@zinvalid URI: %szInvalid URL: %scSsÄt |¡}d}|r¼g}| ¡d}|| ¡d…}t |¡}|sLtd|ƒ‚| ¡d}| ||f¡|| ¡d…}|r´|ddkrˆq´|dd… ¡}t |¡}|std|ƒ‚q|s¼d}||fS)z| Return a list of operator, version tuples if any are specified, else None. Nrzinvalid version: %srErúinvalid constraint: %s)Ú COMPARE_OPrrrÚVERSION_IDENTIFIERr r"r%)Ú ver_remainingr'Úversionsr4Úvr-r-r.Ú get_versionsÅs*      z'parse_requirement..get_versionsr0r1r2rGz~=ú;zinvalid requirement: %szunexpected trailing data: %sú%s %sú, cSsg|] }d|‘qS)rOr-)Ú.0Úconr-r-r.Ú sz%parse_requirement..)ÚnameÚextrasÚ constraintsr8ÚurlÚ requirement)ÚstripÚ startswithrrr rrÚfindr%r"Ú NON_SPACErÚschemeÚnetlocrHrIrAr$r)Úreqr&r'ÚdistnamerUÚ mark_exprrKÚuriÚir,ÚtrMÚ_rLÚrsr-r-r.Úparse_requirement‘s’                          ÿrgcCs¨dd„}i}|D]’\}}}tj ||¡}t|ƒD]p}tj ||¡} t| ƒD]T} ||| ƒ} |dkrn| | d¡qJ||| ƒ} | tjjd¡ d¡} | d| || <qJq0q|S)z%Find destinations for resources filescSsD| tjjd¡}| tjjd¡}| |¡s.t‚|t|ƒd… d¡S©Nú/)r!ÚosÚpathÚseprZÚAssertionErrorÚlenr%)Úrootrkr-r-r.Ú get_rel_path sz)get_resources_dests..get_rel_pathNri)rjrkr$rÚpopr!rlÚrstrip)Úresources_rootÚrulesrpÚ destinationsÚbaseÚsuffixÚdestÚprefixÚabs_baseÚabs_globÚabs_pathÚ resource_fileÚrel_pathÚrel_destr-r-r.Úget_resources_dests s    r€cCs(ttdƒrd}ntjttdtjƒk}|S)NÚ real_prefixTÚ base_prefix)ÚhasattrÚsysryÚgetattr©r(r-r-r.Úin_venv$s r‡cCs$tj tj¡}t|tƒs t|ƒ}|S©N)rjrkÚnormcaser„Ú executableÚ isinstancerrr†r-r-r.Úget_executable.s  rŒcCsN|}t|ƒ}|}|s|r|}|r|d ¡}||kr6qJ|rd|||f}q|S)Nrz %c: %s %s)r Úlower)ÚpromptÚ allowed_charsÚ error_promptÚdefaultÚpr,Úcr-r-r.Úproceed>s r”cCs8t|tƒr| ¡}i}|D]}||kr||||<q|Srˆ)r‹rÚsplit)ÚdÚkeysr(Úkeyr-r-r.Úextract_by_keyNs r™cCsztjddkrt d¡|ƒ}| ¡}t|ƒ}zlt |¡}|ddd}| ¡D]B\}}| ¡D]0\}}d||f}t |ƒ} | dk sˆt ‚| ||<q`qP|WSt k r¸|  dd¡YnXdd „} t  ¡} z| | |ƒWn<t jk r| ¡t |¡}t|ƒ}| | |ƒYnXi}|  ¡D]R} i|| <}|  | ¡D]4\} }d| |f}t |ƒ} | dk sft ‚| || <q<q"|S) Nréúutf-8Ú extensionszpython.exportsÚexportsz%s = %scSs$t|dƒr| |¡n | |¡dS)NÚ read_file)rƒržÚreadfp)ÚcpÚstreamr-r-r.Ú read_streamks  z!read_exports..read_stream)r„Ú version_infoÚcodecsÚ getreaderÚreadr ÚjsonÚloadÚitemsÚget_export_entryrmÚ ExceptionÚseekrÚ ConfigParserÚMissingSectionHeaderErrorÚcloseÚtextwrapÚdedentÚsections)r¡ÚdataÚjdatar(ÚgroupÚentriesÚkrLr,Úentryr¢r r˜rTÚvaluer-r-r.Ú read_exportsWsD        rºcCs¨tjddkrt d¡|ƒ}t ¡}| ¡D]l\}}| |¡| ¡D]P}|j dkr\|j }nd|j |j f}|j r†d|d  |j ¡f}|  ||j|¡qFq,| |¡dS)Nrršr›z%s:%sz%s [%s]rP)r„r£r¤Ú getwriterrr­r©Ú add_sectionÚvaluesrwryÚflagsr$ÚsetrTÚwrite)rr¡r r·rLr¸r,r-r-r.Ú write_exports†s   rÁc cs$t ¡}z |VW5t |¡XdSrˆ)ÚtempfileÚmkdtemprÚrmtree)Útdr-r-r.Útempdir™s rÆc cs.t ¡}zt |¡dVW5t |¡XdSrˆ)rjÚgetcwdÚchdir)r–Úcwdr-r-r.rÈ¡s   rÈéc cs.t ¡}zt |¡dVW5t |¡XdSrˆ)ÚsocketÚgetdefaulttimeoutÚsetdefaulttimeout)ÚsecondsÚctor-r-r.Úsocket_timeout«s   rÐc@seZdZdd„Zddd„ZdS)Úcached_propertycCs ||_dSrˆ)Úfunc)ÚselfrÒr-r-r.Ú__init__¶szcached_property.__init__NcCs,|dkr |S| |¡}t ||jj|¡|Srˆ)rÒÚobjectÚ __setattr__Ú__name__)rÓÚobjÚclsr¹r-r-r.Ú__get__»s  zcached_property.__get__)N)r×Ú __module__Ú __qualname__rÔrÚr-r-r-r.rѵsrÑcCs~tjdkr|S|s|S|ddkr.td|ƒ‚|ddkrFtd|ƒ‚| d¡}tj|krh| tj¡qP|srtjStjj|ŽS)aÐReturn 'pathname' as a name that will work on the native filesystem. The path is split on '/' and put back together again using the current directory separator. Needed because filenames in the setup script are always supplied in Unix style, and have to be converted to the local convention before we can actually use them in the filesystem. Raises ValueError on non-Unix-ish systems if 'pathname' either starts or ends with a slash. rirzpath '%s' cannot be absoluteéÿÿÿÿzpath '%s' cannot end with '/')rjrlÚ ValueErrorr•ÚcurdirÚremoverkr$)ÚpathnameÚpathsr-r-r.Ú convert_pathÃs       rãc@s”eZdZd$dd„Zdd„Zdd„Zdd „Zd%d d „Zd&dd„Zdd„Z dd„Z dd„Z dd„Z dd„Z d'dd„Zdd„Zdd„Zd d!„Zd"d#„Zd S)(Ú FileOperatorFcCs||_tƒ|_| ¡dSrˆ)Údry_runr¿ÚensuredÚ _init_record)rÓrår-r-r.rÔßszFileOperator.__init__cCsd|_tƒ|_tƒ|_dS©NF)Úrecordr¿Ú files_writtenÚ dirs_created©rÓr-r-r.rçäszFileOperator._init_recordcCs|jr|j |¡dSrˆ)rérêÚadd)rÓrkr-r-r.Úrecord_as_writtenészFileOperator.record_as_writtencCsHtj |¡s tdtj |¡ƒ‚tj |¡s0dSt |¡jt |¡jkS)aÎTell if the target is newer than the source. Returns true if 'source' exists and is more recently modified than 'target', or if 'source' exists and 'target' doesn't. Returns false if both exist and 'target' is the same age or younger than 'source'. Raise PackagingFileError if 'source' does not exist. Note that this test is not very accurate: files created in the same second will have the same "age". zfile '%r' does not existT)rjrkÚexistsrÚabspathÚstatÚst_mtime)rÓÚsourceÚtargetr-r-r.Únewerís  ÿ zFileOperator.newerTcCsŽ| tj |¡¡t d||¡|js€d}|rdtj |¡rDd|}n tj |¡rdtj  |¡sdd|}|rtt |dƒ‚t   ||¡|  |¡dS)z8Copy a file respecting dry-run and force flags. zCopying %s to %sNz%s is a symlinkz%s is a non-regular filez which would be overwritten)Ú ensure_dirrjrkÚdirnameÚloggerÚinforåÚislinkrïÚisfilerÞrÚcopyfilerî)rÓÚinfileÚoutfileÚcheckÚmsgr-r-r.Ú copy_files    zFileOperator.copy_fileNcCs„tj |¡rt‚| tj |¡¡t d||¡|jsv|dkrJt |dƒ}nt j |d|d}zt   ||¡W5|  ¡X| |¡dS)NzCopying stream %s to %sÚwbÚw©Úencoding)rjrkÚisdirrmrör÷rørùråÚopenr¤r¯rÚ copyfileobjrî)rÓÚinstreamrþrÚ outstreamr-r-r.Ú copy_streams  zFileOperator.copy_streamc Cs\| tj |¡¡|jsNtj |¡r.t |¡t|dƒ}| |¡W5QRX|  |¡dS)Nr) rörjrkr÷rårïràrrÀrî)rÓrkr³Úfr-r-r.Úwrite_binary_file!s   zFileOperator.write_binary_filecCs| || |¡¡dSrˆ)r Úencode)rÓrkr³rr-r-r.Úwrite_text_file*szFileOperator.write_text_filecCsntjdkstjdkrjtjdkrj|D]F}|jr:t d|¡q"t |¡j|B|@}t d||¡t ||¡q"dS)NÚposixÚjavazchanging mode of %szchanging mode of %s to %o) rjrTÚ_namerårørùrñÚst_modeÚchmod)rÓÚbitsÚmaskÚfilesr Úmoder-r-r.Úset_mode-szFileOperator.set_modecCs| dd|¡S)Nimiÿ)r)r,r r-r-r.Ú9ózFileOperator.cCs|tj |¡}||jkrxtj |¡sx|j |¡tj |¡\}}| |¡t  d|¡|j sft  |¡|j rx|j  |¡dS)Nz Creating %s)rjrkrðrærïrír•rörørùråÚmkdirrérë)rÓrkr–r r-r-r.rö;s    zFileOperator.ensure_dirc Cs˜t|| ƒ}t d||¡|jsŠ|s0| ||¡rX|s:d}n| |¡sHt‚|t|ƒd…}i}|rvtt dƒrvt j j |d<t j |||df|Ž|  |¡|S)NzByte-compiling %s to %sÚPycInvalidationModeÚinvalidation_modeT)r rørùrårõrZrmrnrƒÚ py_compilerÚ CHECKED_HASHÚcompilerî) rÓrkÚoptimizeÚforceryÚhashed_invalidationÚdpathÚdiagpathÚcompile_kwargsr-r-r.Ú byte_compileGs   zFileOperator.byte_compilecCs²tj |¡r®tj |¡r^tj |¡s^t d|¡|js@t  |¡|j r®||j kr®|j   |¡nPtj |¡rpd}nd}t d||¡|js’t  |¡|j r®||j kr®|j   |¡dS)NzRemoving directory tree at %sÚlinkÚfilezRemoving %s %s)rjrkrïrrúrøÚdebugrårrÄrérëràrê)rÓrkr,r-r-r.Úensure_removedXs"       zFileOperator.ensure_removedcCsDd}|s@tj |¡r$t |tj¡}q@tj |¡}||kr:q@|}q|Srè)rjrkrïÚaccessÚW_OKr÷)rÓrkr(Úparentr-r-r.Ú is_writablems  zFileOperator.is_writablecCs"|js t‚|j|jf}| ¡|S)zV Commit recorded changes, turn off recording, return changes. )rérmrêrërç)rÓr(r-r-r.Úcommitys  zFileOperator.commitcCs’|js†t|jƒD]}tj |¡rt |¡qt|jdd}|D]F}t  |¡}|rz|dgks^t ‚tj  ||d¡}t  |¡t  |¡q>|  ¡dS)NT)ÚreverseÚ __pycache__r)råÚlistrêrjrkrïràÚsortedrëÚlistdirrmr$Úrmdirrç)rÓr Údirsr–ÚflistÚsdr-r-r.Úrollbackƒs     zFileOperator.rollback)F)T)N)FFNF)r×rÛrÜrÔrçrîrõrr r rrÚset_executable_moderör(r,r0r1r;r-r-r-r.räÞs         räcCs^|tjkrtj|}nt|ƒ}|dkr,|}n.| d¡}t|| d¡ƒ}|D]}t||ƒ}qJ|S)NÚ.r)r„ÚmodulesÚ __import__r•r…rq)Ú module_nameÚ dotted_pathÚmodr(r+r’r-r-r.Úresolve•s    rCc@s6eZdZdd„Zedd„ƒZdd„Zdd„Zej Z d S) Ú ExportEntrycCs||_||_||_||_dSrˆ©rTryrwr¾)rÓrTryrwr¾r-r-r.rÔ¥szExportEntry.__init__cCst|j|jƒSrˆ)rCryrwrìr-r-r.r¹«szExportEntry.valuecCsd|j|j|j|jfS)NzrErìr-r-r.Ú__repr__¯s ÿzExportEntry.__repr__cCsDt|tƒsd}n0|j|jko>|j|jko>|j|jko>|j|jk}|Srè)r‹rDrTryrwr¾)rÓÚotherr(r-r-r.Ú__eq__³s   ÿ þ ýzExportEntry.__eq__N) r×rÛrÜrÔrÑr¹rFrHrÕÚ__hash__r-r-r-r.rD¤s   rDz¸(?P(\w|[-.+])+) \s*=\s*(?P(\w+)([:\.]\w+)*) \s*(\[\s*(?P[\w-]+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? c Csàt |¡}|s0d}d|ks"d|krÜtd|ƒ‚n¬| ¡}|d}|d}| d¡}|dkrf|d}}n"|dkrztd|ƒ‚| d¡\}}|d } | dkrºd|ks¨d|kr´td|ƒ‚g} nd d „|  d ¡Dƒ} t|||| ƒ}|S) NrCrDzInvalid specification '%s'rTÚcallableú:rrr¾cSsg|] }| ¡‘qSr-)rY)rQr r-r-r.rSßsz$get_export_entry..rE)ÚENTRY_REÚsearchrÚ groupdictÚcountr•rD) Ú specificationr'r(r–rTrkÚcolonsryrwr¾r-r-r.rªÅs8 ÿ  ÿÿrªcCsÈ|dkr d}tjdkr.dtjkr.tj d¡}n tj d¡}tj |¡rft |tj¡}|s¢t   d|¡n| dd¡\}}d|kr.|}n| dd¡\}}|rJt|ƒ}|rVt|ƒ}|||fS)NrFrrK)Úrsplitr•r)r^ÚusernameÚpasswordryr-r-r.Úparse_credentials$srecCst d¡}t |¡|S)Né)rjÚumaskr†r-r-r.Úget_process_umask3s  rhcCs<d}d}t|ƒD]\}}t|tƒsd}q,q|dk s8t‚|S)NTF)Ú enumerater‹rrm)Úseqr(rcr,r-r-r.Úis_string_sequence8s  rkz3([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-([a-z0-9_.+-]+)z -py(\d\.?\d?)cCsÈd}d}t|ƒ dd¡}t |¡}|r@| d¡}|d| ¡…}|r˜t|ƒt|ƒdkr˜t t  |¡d|¡}|r˜|  ¡}|d|…||dd…|f}|dkrÄt  |¡}|rÄ| d¡| d¡|f}|S)zw Extract name, version, python version from a filename (no extension) Return name, version, pyver or None Nú ú-rz\brš) rr!ÚPYTHON_VERSIONrMrµÚstartrnÚrerÚescaperÚPROJECT_NAME_AND_VERSION)ÚfilenameÚ project_namer(Úpyverr'Únr-r-r.Úsplit_filenameGs"   rwz-(?P[\w .-]+)\s*\(\s*(?P[^\s)]+)\)$cCs:t |¡}|std|ƒ‚| ¡}|d ¡ ¡|dfS)zÇ A utility method used to get name and version from a string. From e.g. a Provides-Dist value. :param p: A value in a form 'foo (1.0)' :return: The name and version as a tuple. z$Ill-formed name/version string: '%s'rTÚver)ÚNAME_VERSION_RErrrNrYr)r’r'r–r-r-r.Úparse_name_and_versioncs  rzcCsºtƒ}t|pgƒ}t|pgƒ}d|kr8| d¡||O}|D]x}|dkrT| |¡q<| d¡r”|dd…}||kr€t d|¡||kr´| |¡q<||krªt d|¡| |¡q<|S)NÚ*rmrzundeclared extra: %s)r¿ràrírZrørY)Ú requestedÚ availabler(ÚrÚunwantedr-r-r.Ú get_extrasrs&        r€c Csˆi}zNt|ƒ}| ¡}| d¡}| d¡s8t d|¡nt d¡|ƒ}t  |¡}Wn0t k r‚}zt  d||¡W5d}~XYnX|S)Nz Content-Typezapplication/jsonz(Unexpected response for JSON request: %sr›z&Failed to get external data for %s: %s) r rùÚgetrZrør+r¤r¥r§r¨r«Ú exception)rWr(ÚrespÚheadersÚctÚreaderÚer-r-r.Ú_get_external_data‹s   rˆz'https://www.red-dove.com/pypi/projects/cCs*d|d ¡|f}tt|ƒ}t|ƒ}|S)Nz%s/%s/project.jsonr©Úupperr Ú_external_data_base_urlrˆ)rTrWr(r-r-r.Úget_project_data¡s rŒcCs(d|d ¡||f}tt|ƒ}t|ƒS)Nz%s/%s/package-%s.jsonrr‰)rTÚversionrWr-r-r.Úget_package_data§s rŽc@s(eZdZdZdd„Zdd„Zdd„ZdS) ÚCachezæ A class implementing a cache for resources that need to live in the file system e.g. shared libraries. This class was moved from resources to here because it could be used by other modules, e.g. the wheel module. cCsPtj |¡st |¡t |¡jd@dkr6t d|¡tj tj  |¡¡|_ dS)zu Initialise an instance. :param base: The base directory where the cache should be located. é?rzDirectory '%s' is not privateN) rjrkrrZrñrrørYrðÚnormpathrv)rÓrvr-r-r.rÔ´s    zCache.__init__cCst|ƒS)zN Converts a resource prefix to a directory name in the cache. )r_)rÓryr-r-r.Ú prefix_to_dirÂszCache.prefix_to_dirc Csˆg}t |j¡D]r}tj |j|¡}z>tj |¡s>tj |¡rJt |¡ntj |¡r`t   |¡Wqt k r€|  |¡YqXq|S)z" Clear the cache. ) rjr6rvrkr$rúrûràrrrÄr«r")rÓÚ not_removedÚfnr-r-r.ÚclearÈs  z Cache.clearN)r×rÛrÜÚ__doc__rÔr’r•r-r-r-r.r­src@s:eZdZdZdd„Zddd„Zdd„Zd d „Zd d „Zd S)Ú EventMixinz1 A very simple publish/subscribe system. cCs i|_dSrˆ)Ú _subscribersrìr-r-r.rÔÝszEventMixin.__init__TcCsD|j}||krt|gƒ||<n"||}|r6| |¡n | |¡dS)a` Add a subscriber for an event. :param event: The name of an event. :param subscriber: The subscriber to be added (and called when the event is published). :param append: Whether to append or prepend the subscriber to an existing subscriber list for the event. N)r˜rr"Ú appendleft)rÓÚeventÚ subscriberr"ÚsubsÚsqr-r-r.ríàs  zEventMixin.addcCs,|j}||krtd|ƒ‚|| |¡dS)z™ Remove a subscriber for an event. :param event: The name of an event. :param subscriber: The subscriber to be removed. zNo subscribers: %rN)r˜rÞrà)rÓršr›rœr-r-r.ràôs zEventMixin.removecCst|j |d¡ƒS)z Return an iterator for the subscribers for an event. :param event: The event to return subscribers for. r-)Úiterr˜r)rÓršr-r-r.Úget_subscribersszEventMixin.get_subscribersc Oslg}| |¡D]F}z||f|ž|Ž}Wn"tk rHt d¡d}YnX| |¡qt d||||¡|S)a^ Publish a event and return a list of values returned by its subscribers. :param event: The event to publish. :param args: The positional arguments to pass to the event's subscribers. :param kwargs: The keyword arguments to pass to the event's subscribers. z"Exception during event publicationNz/publish %s: args = %s, kwargs = %s, result = %s)rŸr«rør‚r"r+)rÓršÚargsÚkwargsr(r›r¹r-r-r.Úpublishs    ÿzEventMixin.publishN)T) r×rÛrÜr–rÔríràrŸr¢r-r-r-r.r—Ùs   r—c@s^eZdZdd„Zdd„Zddd„Zdd „Zd d „Zd d „Zdd„Z e dd„ƒZ e dd„ƒZ dS)Ú SequencercCsi|_i|_tƒ|_dSrˆ)Ú_predsÚ_succsr¿Ú_nodesrìr-r-r.rÔ"szSequencer.__init__cCs|j |¡dSrˆ)r¦rí©rÓÚnoder-r-r.Úadd_node'szSequencer.add_nodeFcCs®||jkr|j |¡|rªt|j |d¡ƒD]}| ||¡q,t|j |d¡ƒD]}| ||¡qPt|j ¡ƒD]\}}|sp|j|=qpt|j ¡ƒD]\}}|s”|j|=q”dS)Nr-)r¦ràr¿r¤rr¥r4r©)rÓr¨Úedgesr’r,r·rLr-r-r.Ú remove_node*s   zSequencer.remove_nodecCs<||ks t‚|j |tƒ¡ |¡|j |tƒ¡ |¡dSrˆ)rmr¤Ú setdefaultr¿rír¥)rÓÚpredÚsuccr-r-r.rí:s z Sequencer.addcCsˆ||ks t‚z|j|}|j|}Wn tk rDtd|ƒ‚YnXz| |¡| |¡Wn$tk r‚td||fƒ‚YnXdS)Nz%r not a successor of anythingz%r not a successor of %r)rmr¤r¥ÚKeyErrorrÞrà)rÓr­r®ÚpredsÚsuccsr-r-r.rà?s   zSequencer.removecCs||jkp||jkp||jkSrˆ)r¤r¥r¦)rÓÚstepr-r-r.Úis_stepLsÿzSequencer.is_stepcCs˜| |¡std|ƒ‚g}g}tƒ}| |¡|r| d¡}||krb||krŽ| |¡| |¡q.| |¡| |¡|j |d¡}|  |¡q.t |ƒS)Nz Unknown: %rrr-) r³rÞr¿r"rqràrír¤rÚextendÚreversed)rÓÚfinalr(ÚtodoÚseenr²r°r-r-r.Ú get_stepsPs"         zSequencer.get_stepscsRdg‰g‰i‰i‰g‰|j‰‡‡‡‡‡‡‡fdd„‰ˆD]}|ˆkr8ˆ|ƒq8ˆS)Nrcsðˆdˆ|<ˆdˆ|<ˆdd7<ˆ |¡z ˆ|}Wntk rVg}YnX|D]J}|ˆkrˆˆ|ƒtˆ|ˆ|ƒˆ|<q\|ˆkr\tˆ|ˆ|ƒˆ|<q\ˆ|ˆ|krìg}ˆ ¡}| |¡||kr¼qÚq¼t|ƒ}ˆ |¡dS)Nrr)r"r«ÚminrqÚtuple)r¨Ú successorsÚ successorÚconnected_componentÚ component©ÚgraphÚindexÚ index_counterÚlowlinksr(ÚstackÚ strongconnectr-r.rÆts,      z3Sequencer.strong_connections..strongconnect)r¥r§r-rÀr.Ústrong_connectionsis" zSequencer.strong_connectionscCsfdg}|jD]*}|j|}|D]}| d||f¡qq |jD]}| d|¡q>| d¡d |¡S)Nz digraph G {z %s -> %s;z %s;Ú}Ú )r¤r"r¦r$)rÓr(r®r°r­r¨r-r-r.Údotœs    z Sequencer.dotN)F) r×rÛrÜrÔr©r«ríràr³r¹ÚpropertyrÇrÊr-r-r-r.r£!s   2r£)ú.tar.gzú.tar.bz2ú.tarú.zipú.tgzú.tbzú.whlTc sL‡‡fdd„}tj ˆ¡‰tˆƒ‰d}|dkr†| d¡r>d}nH| d¡rRd}d}n4| d¡rfd }d }n | d ¡rzd }d }n td|ƒ‚z°|dkrºt|d ƒ}|rä| ¡}|D] }||ƒqªn*t   ||¡}|rä|  ¡}|D] }||ƒqÖ|dkr*t j ddkr*| ¡D]"} t| jtƒs| j d¡| _q| ˆ¡W5|rF| ¡XdS)NcsRt|tƒs| d¡}tj tj ˆ|¡¡}| ˆ¡rB|ˆtjkrNt d|ƒ‚dS)Nr›zpath outside destination: %r) r‹rÚdecoderjrkrðr$rZrlrÞ)rkr’©Údest_dirÚplenr-r.Ú check_path±s   zunarchive..check_path)rÏrÒÚzip)rÌrÐÚtgzzr:gz)rÍrÑÚtbzzr:bz2rÎÚtarr~zUnknown format for %rrršr›)rjrkrðrnr`rÞr¯rÚnamelistÚtarfilerÚgetnamesr„r£Ú getmembersr‹rTrrÓÚ extractall) Úarchive_filenamerÕÚformatrÿr×ÚarchiverÚnamesrTÚtarinfor-rÔr.Ú unarchive¯sH           ræc Cs~t ¡}t|ƒ}t|dƒZ}t |¡D]H\}}}|D]8}tj ||¡}||d…} tj | |¡} | || ¡q4q&W5QRX|S)z*zip a directory tree into a BytesIO objectrN) ÚioÚBytesIOrnrrjÚwalkrkr$rÀ) Ú directoryr(ÚdlenÚzfror8rrTÚfullÚrelrxr-r-r.Úzip_dirås  rï)rÚKÚMÚGÚTÚPc@sreZdZdZddd„Zdd„Zdd „Zd d „Zd d „Ze dd„ƒZ e dd„ƒZ dd„Z e dd„ƒZ e dd„ƒZdS)ÚProgressÚUNKNOWNrédcCs<|dks||kst‚||_|_||_d|_d|_d|_dS)NrF)rmrºÚcurÚmaxÚstartedÚelapsedÚdone)rÓÚminvalÚmaxvalr-r-r.rÔüs  zProgress.__init__cCsV|j|kst‚|jdks&||jks&t‚||_t ¡}|jdkrF||_n ||j|_dSrˆ)rºrmrùrøÚtimerúrû)rÓÚcurvalÚnowr-r-r.Úupdates zProgress.updatecCs |dks t‚| |j|¡dS©Nr)rmrrø)rÓÚincrr-r-r.Ú increments zProgress.incrementcCs| |j¡|Srˆ)rrºrìr-r-r.ros zProgress.startcCs |jdk r| |j¡d|_dS)NT)rùrrürìr-r-r.Ústops  z Progress.stopcCs|jdkr|jS|jSrˆ)rùÚunknownrìr-r-r.ÚmaximumszProgress.maximumcCsD|jr d}n4|jdkrd}n$d|j|j|j|j}d|}|S)Nz100 %z ?? %gY@z%3d %%)rürùrørº)rÓr(rLr-r-r.Ú percentages zProgress.percentagecCs:|dkr|jdks|j|jkr$d}nt dt |¡¡}|S)Nrz??:??:??z%H:%M:%S)rùrørºrÿÚstrftimeÚgmtime)rÓÚdurationr(r-r-r.Úformat_duration*szProgress.format_durationcCs‚|jrd}|j}n^d}|jdkr&d}nJ|jdks<|j|jkrBd}n.t|j|jƒ}||j|j}|d|j}d|| |¡fS)NÚDonezETA rÝrrz%s: %s)rürûrùrørºÚfloatr )rÓryrdr-r-r.ÚETA3s z Progress.ETAcCsL|jdkrd}n|j|j|j}tD]}|dkr6q@|d}q&d||fS)Nrgièg@@z%d %sB/s)rûrørºÚUNITS)rÓr(Úunitr-r-r.ÚspeedFs  zProgress.speedN)rr÷)r×rÛrÜrrÔrrrorrËrr r rrr-r-r-r.rõùs      rõz \{([^}]*)\}z[^/\\,{]\*\*|\*\*[^/\\,}]z^[^{]*\}|\{[^}]*$cCs<t |¡rd}t||ƒ‚t |¡r4d}t||ƒ‚t|ƒS)zAExtended globbing function that supports ** and {opt1,opt2,opt3}.z7invalid glob %r: recursive glob "**" must be used alonez2invalid glob %r: mismatching set marker '{' or '}')Ú_CHECK_RECURSIVE_GLOBrMrÞÚ_CHECK_MISMATCH_SETÚ_iglob)Ú path_globrr-r-r.r[s    rc cst |d¡}t|ƒdkrht|ƒdks,t|ƒ‚|\}}}| d¡D]$}td |||f¡ƒD] }|VqXq@nœd|kr†t|ƒD] }|Vqxn~| dd¡\}}|dkr¢d}|dkr°d}n| d¡}| d ¡}t  |¡D]4\}}} tj   |¡}ttj  ||¡ƒD] } | VqöqÎdS) NrršrErz**r=r{riú\) Ú RICH_GLOBr•rnrmrr$Ú std_iglobr%rjrérkr‘) rÚrich_path_globryr¿rwÚitemrkÚradicalÚdirrr”r-r-r.rfs*         r)Ú HTTPSHandlerÚmatch_hostnameÚCertificateErrorc@seZdZdZdZdd„ZdS)ÚHTTPSConnectionNTcCs\t |j|jf|j¡}t|ddƒr0||_| ¡tt dƒsp|j rHt j }nt j }t j ||j|j|t j|j d|_n‚t  t j¡}tt dƒr–|jt jO_|jr¬| |j|j¡i}|j rât j |_|j|j dtt ddƒrâ|j|d<|j |f|Ž|_|j rX|jrXz$t|j ¡|jƒt d |j¡Wn0tk rV|j tj¡|j ¡‚YnXdS) NÚ _tunnel_hostFÚ SSLContext)Ú cert_reqsÚ ssl_versionÚca_certsÚ OP_NO_SSLv2)ÚcafileÚHAS_SNIÚserver_hostnamezHost verified: %s) rËÚcreate_connectionÚhostÚportÚtimeoutr…ÚsockÚ_tunnelrƒÚsslr'Ú CERT_REQUIREDÚ CERT_NONEÚ wrap_socketÚkey_fileÚ cert_fileÚPROTOCOL_SSLv23r$Úoptionsr(Úload_cert_chainÚ verify_modeÚload_verify_locationsÚ check_domainr Ú getpeercertrør+r!ÚshutdownÚ SHUT_RDWRr¯)rÓr0r%Úcontextr¡r-r-r.ÚconnectsB  ý      zHTTPSConnection.connect)r×rÛrÜr'r=rBr-r-r-r.r"Šsr"c@s&eZdZd dd„Zdd„Zdd„ZdS) rTcCst |¡||_||_dSrˆ)ÚBaseHTTPSHandlerrÔr'r=)rÓr'r=r-r-r.rÔ¶s zHTTPSHandler.__init__cOs$t||Ž}|jr |j|_|j|_|S)a This is called to create a connection instance. Normally you'd pass a connection class to do_open, but it doesn't actually check for a class, and just expects a callable. As long as we behave just as a constructor would have, we should be OK. If it ever changes so that we *must* pass a class, we'll create an UnsafeHTTPSConnection class which just sets check_domain to False in the class definition, and choose which one to pass to do_open. )r"r'r=)rÓr r¡r(r-r-r.Ú _conn_maker»s zHTTPSHandler._conn_makerc CsXz| |j|¡WStk rR}z$dt|jƒkr@td|jƒ‚n‚W5d}~XYnXdS)Nzcertificate verify failedz*Unable to verify server certificate for %s)Údo_openrDrÚstrÚreasonr!r-)rÓr_r‡r-r-r.Ú https_openËsÿzHTTPSHandler.https_openN)T)r×rÛrÜrÔrDrHr-r-r-r.rµs rc@seZdZdd„ZdS)ÚHTTPSOnlyHandlercCstd|ƒ‚dS)NzAUnexpected HTTP request on what should be a secure connection: %s)r)rÓr_r-r-r.Ú http_openßsÿzHTTPSOnlyHandler.http_openN)r×rÛrÜrJr-r-r-r.rIÞsrIé©rKéc@seZdZddd„ZdS)ÚHTTPrNcKs&|dkr d}| |j||f|Ž¡dSr©Ú_setupZ_connection_class©rÓr-r.r¡r-r-r.rÔësz HTTP.__init__)rN©r×rÛrÜrÔr-r-r-r.rNêsrNc@seZdZddd„ZdS)ÚHTTPSrNcKs&|dkr d}| |j||f|Ž¡dSrrOrQr-r-r.rÔószHTTPS.__init__)rNrRr-r-r-r.rSòsrSc@seZdZddd„Zdd„ZdS)Ú TransportrcCs||_tj ||¡dSrˆ)r/rrTrÔ©rÓr/Ú use_datetimer-r-r.rÔúszTransport.__init__cCs`| |¡\}}}tdkr(t||jd}n4|jr<||jdkrR||_|t |¡f|_|jd}|S)NrL)r/rr)Ú get_host_infoÚ _ver_inforNr/Ú _connectionÚ_extra_headersrÚHTTPConnection)rÓr-ÚhÚehÚx509r(r-r-r.Úmake_connectionþs zTransport.make_connectionN)r©r×rÛrÜrÔr_r-r-r-r.rTùs rTc@seZdZddd„Zdd„ZdS)Ú SafeTransportrcCs||_tj ||¡dSrˆ)r/rrarÔrUr-r-r.rÔ szSafeTransport.__init__cCsx| |¡\}}}|si}|j|d<tdkr:t|df|Ž}n:|jrN||jdkrj||_|tj|df|Žf|_|jd}|S)Nr/rLrr)rWr/rXrSrYrZrr")rÓr-r\r]r¡r(r-r-r.r_s  ÿ zSafeTransport.make_connectionN)rr`r-r-r-r.ra s rac@seZdZdd„ZdS)Ú ServerProxyc Kst| dd¡|_}|dk r^t|ƒ\}}| dd¡}|dkr@t}nt}|||d|d<}||_tjj ||f|ŽdS)Nr/rVrÚhttps)rVÚ transport) rqr/rrrarTrdrrbrÔ) rÓrbr¡r/r]rerVÚtclsrdr-r-r.rÔ s  zServerProxy.__init__NrRr-r-r-r.rbsrbcKs6tjddkr|d7}nd|d<d|d<t||f|ŽS)NrršÚbrÚnewliner›r)r„r£r)r”rr¡r-r-r.Ú _csv_open4s  rhc@s4eZdZedƒedƒedƒdœZdd„Zdd„Zd S) ÚCSVBaserEú"rÉ)Ú delimiterÚ quotecharÚlineterminatorcCs|Srˆr-rìr-r-r.Ú __enter__FszCSVBase.__enter__cGs|j ¡dSrˆ)r¡r¯)rÓrUr-r-r.Ú__exit__IszCSVBase.__exit__N)r×rÛrÜrFÚdefaultsrnror-r-r-r.ri?s ýric@s(eZdZdd„Zdd„Zdd„ZeZdS)Ú CSVReadercKs\d|kr4|d}tjddkr,t d¡|ƒ}||_nt|ddƒ|_tj|jf|jŽ|_dS)Nr¡rršr›rkr~) r„r£r¤r¥r¡rhÚcsvr†rp)rÓr¡r¡r-r-r.rÔNszCSVReader.__init__cCs|Srˆr-rìr-r-r.Ú__iter__YszCSVReader.__iter__cCsFt|jƒ}tjddkrBt|ƒD] \}}t|tƒs | d¡||<q |S©Nrršr›)Únextr†r„r£rir‹rrÓ)rÓr(rcrr-r-r.ru\s   zCSVReader.nextN)r×rÛrÜrÔrsruÚ__next__r-r-r-r.rqMs rqc@seZdZdd„Zdd„ZdS)Ú CSVWritercKs$t|dƒ|_tj|jf|jŽ|_dS)Nr)rhr¡rrÚwriterrp)rÓr”r¡r-r-r.rÔgs zCSVWriter.__init__cCsNtjddkr>g}|D]"}t|tƒr.| d¡}| |¡q|}|j |¡dSrt)r„r£r‹rrr"rxÚwriterow)rÓÚrowr~rr-r-r.ryks   zCSVWriter.writerowN)r×rÛrÜrÔryr-r-r-r.rwfsrwcsHeZdZeejƒZded<d ‡fdd„ Zdd„Zdd „Zd d „Z ‡Z S) Ú ConfiguratorÚ inc_convertÚincNcs"tt|ƒ |¡|pt ¡|_dSrˆ)Úsuperr{rÔrjrÇrv)rÓÚconfigrv©Ú __class__r-r.rÔ~szConfigurator.__init__c s¬‡‡fdd„‰ˆ d¡}t|ƒs*ˆ |¡}ˆ dd¡}ˆ dd¡}|r\t‡fdd„|Dƒƒ}‡‡fd d„ˆDƒ}t|ƒ}|||Ž}|r¨| ¡D]\}} t||ˆ| ƒƒqŽ|S) Ncsvt|ttfƒr*t|ƒ‡fdd„|Dƒƒ}nHt|tƒrhd|krHˆ |¡}qri}|D]}ˆ||ƒ||<qPn ˆ |¡}|S)Ncsg|] }ˆ|ƒ‘qSr-r-)rQrc©Úconvertr-r.rS…szBConfigurator.configure_custom..convert..ú())r‹r4r»ÚtypeÚdictÚconfigure_customrƒ)Úor(r·)rƒrÓr-r.rƒƒs   z.Configurator.configure_custom..convertr„r=z[]r-csg|] }ˆ|ƒ‘qSr-r-)rQrˆr‚r-r.rS˜sz1Configurator.configure_custom..cs$g|]}t|ƒr|ˆˆ|ƒf‘qSr-)r)rQr·)rrƒr-r.rS™s)rqrJrCr»r†r©Úsetattr) rÓrr“Úpropsr r©r¡r(rvrLr-)rrƒrÓr.r‡‚s     zConfigurator.configure_customcCs4|j|}t|tƒr0d|kr0| |¡|j|<}|S)Nr„)rr‹r†r‡)rÓr˜r(r-r-r.Ú __getitem__¡s zConfigurator.__getitem__c CsFtj |¡stj |j|¡}tj|ddd}t |¡}W5QRX|S)z*Default converter for the inc:// protocol.r~r›r) rjrkÚisabsr$rvr¤rr§r¨)rÓr¹r r(r-r-r.r|§s  zConfigurator.inc_convert)N) r×rÛrÜr†rÚvalue_convertersrÔr‡r‹r|Ú __classcell__r-r-r€r.r{ys  r{c@s*eZdZdZd dd„Zdd„Zdd „ZdS) ÚSubprocessMixinzC Mixin for running subprocesses and capturing their output FNcCs||_||_dSrˆ)ÚverboseÚprogress)rÓrr‘r-r-r.rÔ´szSubprocessMixin.__init__cCsj|j}|j}| ¡}|sq^|dk r.|||ƒq |s@tj d¡ntj | d¡¡tj ¡q | ¡dS)z¨ Read lines from a subprocess' output stream and either pass to a progress callable (if specified) or write progress information to sys.stderr. Nr=r›) r‘rÚreadliner„ÚstderrrÀrÓÚflushr¯)rÓr¡rAr‘rr,r-r-r.r†¸s  zSubprocessMixin.readercKsžtj|ftjtjdœ|—Ž}tj|j|jdfd}| ¡tj|j|jdfd}| ¡|  ¡|  ¡|  ¡|j dk rˆ|  dd¡n|j ršt j d¡|S)N)Ústdoutr“r•)rôr r“zdone.Úmainzdone. )Ú subprocessÚPopenÚPIPEÚ threadingÚThreadr†r•ror“Úwaitr$r‘rr„rÀ)rÓÚcmdr¡r’Út1Út2r-r-r.Ú run_commandÍs" ÿÿ  zSubprocessMixin.run_command)FN)r×rÛrÜr–rÔr†r r-r-r-r.r°s rcCst dd|¡ ¡S)z,Normalize a python package name a la PEP 503z[-_.]+rm)rpÚsubr)rTr-r-r.Únormalize_nameÞsr¢)NN)rÊ)N)N)NT)„r¤Ú collectionsrÚ contextlibrrÚglobrrrçr§ÚloggingrjrrprËr2Ú ImportErrorr—r„rÝrÂr°ršZdummy_threadingrÿrrÚcompatrrrr r r r r rrrrrrrrrrrrrÚ getLoggerr×rør!rrIrHr7r?r;r\r#rArgr€r‡rŒr”r™rºrÁÚcontextmanagerrÆrÈrÐrÕrÑrãrärCrDÚVERBOSErLrªr]r_rarerhrkÚIrrrnrwryrzr€rˆr‹rŒrŽrr—r£ÚARCHIVE_EXTENSIONSrærïrrõrrrrrrCr r!r"rIr£rXrNrSrTrarbrhrirqrwr{rr¢r-r-r-r.Úsä      \         Yy   /   8ý ) ÿ   ,H  6]    +)   7.