3 ”ReÅéã@s¸ddlZddlmZddlZddlZddlmZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZy ddlZWnek rŒdZYnXddlZddlZddlZddlZddlZy 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 j1e2ƒZ3e j4dƒZ5e j4dƒZ6e j4d ƒZ7e j4d ƒZ8e j4d ƒZ9e j4d ƒZ:e j4d ƒZ;e j4dƒ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 j4d2e jPƒZQd3d4„ZRd•d5d6„ZSd7d8„ZTd9d:„ZUd;d<„ZVd=d>„ZWd?d@„ZXe j4dAe jYƒZZe j4dBƒZ[d–dCdD„Z\e j4dEƒZ]dFdG„Z^dHdI„Z_dJdK„Z`dLZadMdN„ZbdOdP„ZcGdQdR„dReJƒZdGdSdT„dTeJƒZeGdUdV„dVeJƒZfd—Zgd˜d_d`„Zhdadb„Zid™ZjGdidj„djeJƒZke j4dkƒZle j4dlƒZme j4dmƒZndndo„Zdpdq„Zoe�rÖddrlmpZqmrZrmsZsGdsdt„dte$jtƒZtGdudv„dveqƒZpGdwdx„dxepe'ƒZuejvddy…Zwewdšk�rGd{d|„d|e$jxƒZxe�rGd}d~„d~e$jyƒZyGdd€„d€e%jzƒZze�rBGd�d‚„d‚e%j{ƒZ{Gdƒd„„d„e%j|ƒZ|d…d†„Z}Gd‡dˆ„dˆeJƒZ~Gd‰dŠ„dŠe~ƒZGd‹dŒ„dŒe~ƒZ€Gd�dŽ„dŽe(ƒZ�Gd�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). cSs2tj|ƒ}|r.|jƒd}||jƒd…}�nü|s.marker_varcs¸|rR|ddkrRˆ|dd…jƒƒ\}}|ddkr@td|ƒ‚|dd…jƒ}n^ˆ|ƒ\}}xL|rªtj|ƒ}|stP|jƒd}||jƒd…}ˆ|ƒ\}}|||dœ}q`W|}||fS)Nrú(rú)zunterminated parenthesis: %s)ÚopÚlhsÚrhs)r%r Ú MARKER_OPrrr)r&r(r3r'r2r4)Úmarkerr/r-r.Ú marker_expres       z!parse_marker..marker_exprcsVˆ|ƒ\}}x@|rLtj|ƒ}|s"P||jƒd…}ˆ|ƒ\}}d||dœ}qW||fS)NÚand)r2r3r4)ÚANDrr)r&r3r'r4)r7r-r.Ú marker_andxs   z parse_marker..marker_andcsVˆ|ƒ\}}x@|rLtj|ƒ}|s"P||jƒd…}ˆ|ƒ\}}d||dœ}qW||fS)NÚor)r2r3r4)ÚORrr)r&r3r'r4)r:r-r.r6ƒs   zparse_marker..markerr-)Ú marker_stringr-)r6r:r7r/r.Ú parse_marker8s $ r>cCs2|jƒ}| s|jdƒrdStj|ƒ}|s6td|ƒ‚|jƒd}||jƒd…}d}}}}|op|ddk�r<|jddƒ}|dkr”td|ƒ‚|d|…} ||dd…jƒ}g}xx| �r0tj| ƒ}|sÚtd | ƒ‚|j |jƒdƒ| |jƒd…} | �sP| dd k�rtd | ƒ‚| dd…jƒ} qºW|�s.get_versionsr0r1zunterminated parenthesis: %szinvalid constraint: %sz~=ú;zinvalid requirement: %szunexpected trailing data: %sz%s %sz, cSsg|] }d|‘qS)z%s %sr-)Ú.0Úconr-r-r.ú sz%parse_requirement..)ÚnameÚextrasÚ constraintsr6ÚurlÚ requirement)ÚstripÚ startswithrrr rrÚfindr%r"Ú NON_SPACErÚschemeÚnetlocrDrEr>r$r)Úreqr&r'ÚdistnamerOÚ mark_exprrGÚuriÚir,ÚtrIÚ_rHÚrsr-r-r.Úparse_requirement‘sŒ                          racCs´dd„}i}x¢|D]š\}}}tjj||ƒ}x€t|ƒD]t}tjj||ƒ} x`t| ƒD]T} ||| ƒ} |dkrt|j| dƒqP||| ƒ} |jtjjdƒjdƒ} | d| || <qPWq4WqW|S)z%Find destinations for resources filescSsD|jtjjdƒ}|jtjjdƒ}|j|ƒs.t‚|t|ƒd…jdƒS)Nú/)r!ÚosÚpathÚseprTÚAssertionErrorÚlenr%)Úrootrdr-r-r.Ú get_rel_path sz)get_resources_dests..get_rel_pathNrb)rcrdr$rÚpopr!reÚrstrip)Úresources_rootÚrulesriÚ destinationsÚbaseÚsuffixÚdestÚprefixÚabs_baseÚabs_globÚabs_pathÚ resource_fileÚrel_pathÚrel_destr-r-r.Úget_resources_dests s  rycCs(ttdƒrd}ntjttdtjƒk}|S)NÚ real_prefixTÚ base_prefix)ÚhasattrÚsysrrÚgetattr)r(r-r-r.Úin_venv$s rcCs$tjjtjƒ}t|tƒs t|ƒ}|S)N)rcrdÚnormcaser}Ú executableÚ isinstancerr)r(r-r-r.Úget_executable.s  rƒcCsT|}xJt|ƒ}|}| r |r |}|r|djƒ}||kr:P|rd|||f}qW|S)Nrz %c: %s %s)r Úlower)ÚpromptÚ allowed_charsÚ error_promptÚdefaultÚpr,Úcr-r-r.Úproceed>s  r‹cCs<t|tƒr|jƒ}i}x |D]}||kr||||<qW|S)N)r‚rÚsplit)ÚdÚkeysr(Úkeyr-r-r.Úextract_by_keyNs  r�cCsˆtjddkrtjdƒ|ƒ}|jƒ}t|ƒ}yrtj|ƒ}|ddd}xR|jƒD]F\}}x<|jƒD]0\}}d||f}t |ƒ} | dk sŒt ‚| ||<qdWqRW|St k r¾|j ddƒYnXdd „} t jƒ} y| | |ƒWn<t jk �r|jƒtj|ƒ}t|ƒ}| | |ƒYnXi}xb| jƒD]V} i|| <}xB| j| ƒD]4\} }d| |f}t |ƒ} | dk �spt ‚| || <�qFW�q*W|S) Nrézutf-8Ú extensionszpython.exportsÚexportsz%s = %scSs$t|dƒr|j|ƒn |j|ƒ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_entryrfÚ ExceptionÚseekrÚ ConfigParserÚMissingSectionHeaderErrorÚcloseÚtextwrapÚdedentÚsections)r—ÚdataÚjdatar(ÚgroupÚentriesÚkrHr,Úentryr˜r–r�rNÚvaluer-r-r.Ú read_exportsWsD      r°cCs°tjddkrtjdƒ|ƒ}tjƒ}x||jƒD]p\}}|j|ƒx\|jƒD]P}|j dkr`|j }nd|j |j f}|j rŠd|dj |j ƒf}|j ||j|ƒqJWq.W|j|ƒdS)Nrr‘zutf-8z%s:%sz%s [%s]z, )r}r™ršÚ getwriterrr£rŸÚ add_sectionÚvaluesrprrÚflagsr$ÚsetrNÚwrite)r“r—r–r­rHr®r,r-r-r.Ú write_exports†s  r·c cs$tjƒ}z |VWdtj|ƒXdS)N)ÚtempfileÚmkdtemprÚrmtree)Útdr-r-r.Útempdir™s r¼c cs.tjƒ}ztj|ƒdVWdtj|ƒXdS)N)rcÚgetcwdÚchdir)r�Úcwdr-r-r.r¾¡s   r¾éc cs.tjƒ}ztj|ƒdVWdtj|ƒXdS)N)ÚsocketÚgetdefaulttimeoutÚsetdefaulttimeout)ÚsecondsÚctor-r-r.Úsocket_timeout«s   rÆc@seZdZdd„Zddd„ZdS)Úcached_propertycCs ||_dS)N)Úfunc)ÚselfrÈr-r-r.Ú__init__¶szcached_property.__init__NcCs,|dkr |S|j|ƒ}tj||jj|ƒ|S)N)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|ƒ‚|jdƒ}xtj|krj|jtjƒqRW|svtjStjj|Ž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. rbrzpath '%s' cannot be absoluterzpath '%s' cannot end with '/'éÿÿÿÿ)rcreÚ ValueErrorrŒÚcurdirÚremoverdr$)Ú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ƒ|_|jƒdS)N)Ú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|jj|ƒdS)N)rÞrßÚadd)rÉrdr-r-r.Úrecord_as_writtenészFileOperator.record_as_writtencCsHtjj|ƒs tdtjj|ƒƒ‚tjj|ƒs0dStj|ƒjtj|ƒ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)rcrdÚexistsrÚabspathÚstatÚst_mtime)rÉÚsourceÚtargetr-r-r.Únewerís  zFileOperator.newerTcCs�|jtjj|ƒƒtjd||ƒ|js‚d}|rftjj|ƒrDd|}n"tjj|ƒrftjj |ƒ rfd|}|rvt |dƒ‚t j ||ƒ|j |ƒ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_dirrcrdÚdirnameÚloggerÚinforÛÚislinkrãÚisfilerÔrÚcopyfilerâ)rÉÚinfileÚoutfileÚcheckÚmsgr-r-r.Ú copy_files    zFileOperator.copy_fileNc Cs†tjj|ƒ st‚|jtjj|ƒƒtjd||ƒ|jsx|dkrLt |dƒ}nt j |d|d�}zt j ||ƒWd|j ƒX|j|ƒdS)NzCopying stream %s to %sÚwbÚw)Úencoding)rcrdÚisdirrfrêrërìrírÛÚopenršrÚ copyfileobjr¥râ)rÉÚinstreamròrøÚ outstreamr-r-r.Ú copy_streams  zFileOperator.copy_streamc Cs\|jtjj|ƒƒ|jsNtjj|ƒr.tj|ƒt|dƒ�}|j|ƒWdQRX|j |ƒdS)Nrö) rêrcrdrërÛrãrÖrúr¶râ)rÉrdr©Úfr-r-r.Úwrite_binary_file!s   zFileOperator.write_binary_filecCs|j||j|ƒƒdS)N)rÚencode)rÉrdr©rør-r-r.Úwrite_text_file*szFileOperator.write_text_filecCsrtjdkstjdkrntjdkrnxN|D]F}|jr9szFileOperator.cCs~tjj|ƒ}||jkrztjj|ƒ rz|jj|ƒtjj|ƒ\}}|j|ƒtj d|ƒ|j shtj |ƒ|j rz|j j|ƒdS)Nz Creating %s)rcrdrärÜrãrárŒrêrìrírÛÚmkdirrÞrà)rÉrdr�rÿr-r-r.rê;s    zFileOperator.ensure_dirc Cs˜t|| ƒ}tjd||ƒ|jsŠ|s0|j||ƒrX|s:d}n|j|ƒsHt‚|t|ƒd…}i}|rvtt dƒrvt j j |d<t j |||df|Ž|j |ƒ|S)NzByte-compiling %s to %sÚPycInvalidationModeÚinvalidation_modeT)r rìrírÛrérTrfrgr|Ú py_compilerÚ CHECKED_HASHÚcompilerâ) rÉrdÚoptimizeÚforcerrÚhashed_invalidationÚdpathÚdiagpathÚcompile_kwargsr-r-r.Ú byte_compileGs   zFileOperator.byte_compilecCs´tjj|ƒr°tjj|ƒr`tjj|ƒ r`tjd|ƒ|jsBtj |ƒ|j r°||j kr°|j j |ƒnPtjj|ƒrrd}nd}tjd||ƒ|js”tj |ƒ|j r°||j kr°|j j |ƒdS)NzRemoving directory tree at %sÚlinkÚfilezRemoving %s %s)rcrdrãrùrîrìÚdebugrÛrrºrÞràrÖrß)rÉrdr,r-r-r.Úensure_removedXs"       zFileOperator.ensure_removedcCsHd}x>|sBtjj|ƒr&tj|tjƒ}Ptjj|ƒ}||kr)rNrrrpr´)rÉr-r-r.Ú__repr__¯s zExportEntry.__repr__cCsDt|tƒsd}n0|j|jko>|j|jko>|j|jko>|j|jk}|S)NF)r‚r6rNrrrpr´)rÉÚotherr(r-r-r.Ú__eq__³s     zExportEntry.__eq__N) rÍrÑrÒrÊrÇr¯r7r9rËÚ__hash__r-r-r-r.r6¤s   r6z¸(?P(\w|[-.+])+) \s*=\s*(?P(\w+)([:\.]\w+)*) \s*(\[\s*(?P[\w-]+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? c Csàtj|ƒ}|s0d}d|ks"d|krÜtd|ƒ‚n¬|jƒ}|d}|d}|jdƒ}|dkrf|d}}n"|dkrztd|ƒ‚|jdƒ\}}|d } | dkrºd|ks¨d|kr´td|ƒ‚g} nd d „| jd ƒDƒ} t|||| ƒ}|S) Nr@rAzInvalid specification '%s'rNÚcallableú:rrr´cSsg|] }|jƒ‘qSr-)rS)rKrÿr-r-r.rMßsz$get_export_entry..rB)ÚENTRY_REÚsearchrÚ groupdictÚcountrŒr6) Ú specificationr'r(r�rNrdÚcolonsrrrpr´r-r-r.r Ås2    r c CsÈ|dkr d}tjdkr.dtjkr.tjjdƒ}n tjjdƒ}tjj|ƒrftj|tjƒ}|s¢t j d|ƒn|jddƒ\}}d|kr.|}n|jddƒ\}}|rJt|ƒ}|rVt|ƒ}|||fS)NrCrr<)ÚrsplitrŒr)rXÚusernameÚpasswordrrr-r-r.Úparse_credentials$srVcCstjdƒ}tj|ƒ|S)Né)rcÚumask)r(r-r-r.Úget_process_umask3s  rYcCs>d}d}x$t|ƒD]\}}t|tƒsd}PqW|dk s:t‚|S)NTF)Ú enumerater‚rrf)Úseqr(r]r,r-r-r.Úis_string_sequence8s  r\z3([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-([a-z0-9_.+-]+)z -py(\d\.?\d?)cCsÈd}d}t|ƒjddƒ}tj|ƒ}|r@|jdƒ}|d|jƒ…}|r˜t|ƒt|ƒdkr˜tjtj |ƒd|ƒ}|r˜|j ƒ}|d|…||dd…|f}|dkrÄt j|ƒ}|rÄ|jdƒ|jdƒ|f}|S)zw Extract name, version, python version from a filename (no extension) Return name, version, pyver or None Nú ú-rz\br‘) rr!ÚPYTHON_VERSIONr>r«ÚstartrgÚrerÚescaperÚPROJECT_NAME_AND_VERSION)ÚfilenameÚ project_namer(Úpyverr'Únr-r-r.Úsplit_filenameGs"   rhz-(?P[\w .-]+)\s*\(\s*(?P[^\s)]+)\)$cCs:tj|ƒ}|std|ƒ‚|jƒ}|djƒjƒ|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'rNÚver)ÚNAME_VERSION_RErrr?rSr„)r‰r'r�r-r-r.Úparse_name_and_versioncs  rkcCs¾tƒ}t|pgƒ}t|pgƒ}d|kr8|jdƒ||O}x€|D]x}|dkrV|j|ƒq>|jdƒr–|dd…}||kr‚tjd|ƒ||kr¶|j|ƒq>||kr¬tjd|ƒ|j|ƒq>W|S)NÚ*r^rzundeclared extra: %s)rµrÖrárTrìrJ)Ú requestedÚ availabler(ÚrÚunwantedr-r-r.Ú get_extrasrs&        rqcCsˆi}yNt|ƒ}|jƒ}|jdƒ}|jdƒs8tjd|ƒntjdƒ|ƒ}tj |ƒ}Wn0t k r‚}ztj d||ƒWYdd}~XnX|S)Nz Content-Typezapplication/jsonz(Unexpected response for JSON request: %szutf-8z&Failed to get external data for %s: %s) r ríÚgetrTrìrršr›r�ržr¡Ú exception)rQr(ÚrespÚheadersÚctÚreaderÚer-r-r.Ú_get_external_data‹s   ryz'https://www.red-dove.com/pypi/projects/cCs*d|djƒ|f}tt|ƒ}t|ƒ}|S)Nz%s/%s/project.jsonr)Úupperr Ú_external_data_base_urlry)rNrQr(r-r-r.Úget_project_data¡s r|cCs(d|djƒ||f}tt|ƒ}t|ƒS)Nz%s/%s/package-%s.jsonr)rzr r{ry)rNÚversionrQr-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. cCsPtjj|ƒstj|ƒtj|ƒjd@dkr6tjd|ƒtjjtjj |ƒƒ|_ dS)zu Initialise an instance. :param base: The base directory where the cache should be located. é?rzDirectory '%s' is not privateN) rcrdrùrKrårrìrJräÚnormpathro)rÉror-r-r.rÊ´s    zCache.__init__cCst|ƒS)zN Converts a resource prefix to a directory name in the cache. )rP)rÉrrr-r-r.Ú prefix_to_dirÂszCache.prefix_to_dirc CsŒg}x‚tj|jƒD]r}tjj|j|ƒ}y>tjj|ƒs@tjj|ƒrLtj|ƒntjj|ƒrbt j |ƒWqt k r‚|j |ƒYqXqW|S)z" Clear the cache. ) rcr(rordr$rîrïrÖrùrrº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|_dS)N)Ú _subscribers)rÉr-r-r.rÊÝszEventMixin.__init__TcCsD|j}||krt|gƒ||<n"||}|r6|j|ƒn |j|ƒ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|ƒ‚||j|ƒ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|jj|fƒƒS)z� Return an iterator for the subscribers for an event. :param event: The event to return subscribers for. )Úiterrˆrr)rÉrŠr-r-r.Úget_subscribersszEventMixin.get_subscribersc Ospg}xT|j|ƒD]F}y||f|ž|Ž}Wn"tk rJtjdƒd}YnX|j|ƒqWtjd||||ƒ|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ìrsr"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ƒ|_dS)N)Ú_predsÚ_succsrµÚ_nodes)rÉr-r-r.rÊ"szSequencer.__init__cCs|jj|ƒdS)N)r–rá)rÉÚnoder-r-r.Úadd_node'szSequencer.add_nodeFcCs¾||jkr|jj|ƒ|rºx&t|jj|fƒƒD]}|j||ƒq.Wx&t|jj|fƒƒD]}|j||ƒqVWx&t|jjƒƒD]\}}|sz|j|=qzWx&t|jjƒƒD]\}}|s¢|j|=q¢WdS)N)r–rÖrµr”rrr•r&rŸ)rÉr—Úedgesr‰r,r­rHr-r-r.Ú remove_node*s   zSequencer.remove_nodecCs<||ks t‚|jj|tƒƒj|ƒ|jj|tƒƒj|ƒdS)N)rfr”Ú setdefaultrµrár•)rÉÚpredÚsuccr-r-r.rá:s z Sequencer.addcCsˆ||ks t‚y|j|}|j|}Wn tk rDtd|ƒ‚YnXy|j|ƒ|j|ƒWn$tk r‚td||fƒ‚YnXdS)Nz%r not a successor of anythingz%r not a successor of %r)rfr”r•ÚKeyErrorrÔrÖ)rÉrœr�ÚpredsÚsuccsr-r-r.rÖ?s   zSequencer.removecCs||jkp||jkp||jkS)N)r”r•r–)rÉÚstepr-r-r.Úis_stepLszSequencer.is_stepcCsœ|j|ƒstd|ƒ‚g}g}tƒ}|j|ƒxd|r’|jdƒ}||krd||kr�|j|ƒ|j|ƒq0|j|ƒ|j|ƒ|jj|fƒ}|j |ƒq0Wt |ƒS)Nz Unknown: %rr) r¢rÔrµr"rjrÖrár”rrÚextendÚreversed)rÉÚfinalr(ÚtodoÚseenr¡rŸr-r-r.Ú get_stepsPs"        zSequencer.get_stepscsVdg‰g‰i‰i‰g‰|j‰‡‡‡‡‡‡‡fdd„‰xˆD]}|ˆkr:ˆ|ƒq:WˆS)Nrc søˆdˆ|<ˆdˆ|<ˆdd7<ˆj|ƒy ˆ|}Wntk rVg}YnXxR|D]J}|ˆkrŠˆ|ƒtˆ|ˆ|ƒˆ|<q^|ˆkr^tˆ|ˆ|ƒˆ|<q^Wˆ|ˆ|krôg}x ˆjƒ}|j|ƒ||krÂPqÂWt|ƒ}ˆj|ƒdS)Nrr)r"r¡ÚminrjÚ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¯r°r±r²r(r³r´r.Ústrong_connectionsis"  zSequencer.strong_connectionscCsrdg}x8|jD].}|j|}x|D]}|jd||fƒq"WqWx|jD]}|jd|ƒqHW|jdƒdj|ƒ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   3r“ú.tar.gzú.tar.bz2ú.tarú.zipú.tgzú.tbzú.whlTc sX‡‡fdd„}tjjˆƒ‰tˆƒ‰d}|dkr†|jdƒr>d}nH|jdƒrRd}d }n4|jdƒrfd }d }n |jdƒrzd}d}n td|ƒ‚z¼|dkr¾t|dƒ}|rì|jƒ}xD|D] }||ƒq¬Wn.tj ||ƒ}|rì|j ƒ}x|D] }||ƒqÜW|dk�r6t j ddk�r6x.|j ƒD]"} t| jtƒ�s| jjdƒ| _�qW|jˆƒWd|�rR|jƒXdS)NcsTt|tƒs|jdƒ}tjjtjjˆ|ƒƒ}|jˆƒ sD|ˆtjkrPt d|ƒ‚dS)Nzutf-8zpath outside destination: %r) r‚rÚdecodercrdrär$rTrerÔ)rdr‰)Údest_dirÚplenr-r.Ú check_path±s   zunarchive..check_pathú.zipú.whlÚzipú.tar.gzú.tgzÚtgzzr:gzú.tar.bz2ú.tbzÚtbzzr:bz2z.tarÚtarrozUnknown format for %rrr‘zutf-8)rÅrÆ)rÈrÉ)rËrÌ)rcrdrärgrQrÔrÚnamelistÚtarfilerúÚgetnamesr}r™Ú getmembersr‚rNrrÁÚ extractallr¥) Úarchive_filenamerÂÚformatrórÄÚarchiver ÚnamesrNÚtarinfor-)rÂrÃr.Ú unarchive¯sH           rÙc Cs†tjƒ}t|ƒ}t|dƒ�b}xZtj|ƒD]L\}}}x@|D]8}tjj||ƒ}||d…} tjj| |ƒ} |j|| ƒq8Wq(WWdQRX|S)z*zip a directory tree into a BytesIO objectr÷N) ÚioÚBytesIOrgrrcÚwalkrdr$r¶) Ú directoryr(ÚdlenÚzfrhr*r rNÚfullÚrelrqr-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)rfr©ÚcurÚmaxÚstartedÚelapsedÚdone)rÉÚminvalÚmaxvalr-r-r.rÊüs  zProgress.__init__cCsV|j|kst‚|jdks&||jks&t‚||_tjƒ}|jdkrF||_n ||j|_dS)N)r©rfrìrëÚtimerírî)rÉÚcurvalÚnowr-r-r.Úupdates zProgress.updatecCs |dks t‚|j|j|ƒdS)Nr)rfrõrë)rÉÚincrr-r-r.Ú increments zProgress.incrementcCs|j|jƒ|S)N)rõr©)rÉr-r-r.r`s zProgress.startcCs |jdk r|j|jƒd|_dS)NT)rìrõrï)rÉr-r-r.Ústops  z Progress.stopcCs|jdkr|jS|jS)N)rìÚunknown)rÉ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(rHr-r-r.Ú percentages zProgress.percentagecCs:|dkr|jdks|j|jkr$d}ntjdtj|ƒƒ}|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||j|ƒfS)NÚDonezETA rrz%s: %srÓ)rïrîrìrër©Úfloatrÿ)rÉrrr^r-r-r.ÚETA3s z Progress.ETAcCsN|jdkrd}n|j|j|j}xtD]}|dkr6P|d}q(Wd||fS)Nrgièg@�@z%d %sB/s)rîrër©ÚUNITS)rÉr(Úunitr-r-r.ÚspeedFs   zProgress.speedN)rrê)rÍrÑrÒrùrÊrõr÷r`rør¹rúrûrÿrrr-r-r-r.rèùs     rèz \{([^}]*)\}z[^/\\,{]\*\*|\*\*[^/\\,}]z^[^{]*\}|\{[^}]*$cCs<tj|ƒrd}t||ƒ‚tj|ƒ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_GLOBr>rÔÚ_CHECK_MISMATCH_SETÚ_iglob)Ú path_globrôr-r-r.r[s    rc cstj|dƒ}t|ƒdkrpt|ƒdks,t|ƒ‚|\}}}xâ|jdƒD](}x"tdj|||fƒƒD] }|Vq\WqBWnªd|kr’x t|ƒD] }|Vq‚Wnˆ|jddƒ\}}|dkr®d}|dkr¼d}n|jdƒ}|jd ƒ}xHtj |ƒD]:\}}} tj j |ƒ}x"ttj j||ƒƒD] } | V�qWqÜWdS) Nrr‘rBrz**r/rlrbú\) Ú RICH_GLOBrŒrgrfrr$Ú std_iglobr%rcrÜrdr�) r Úrich_path_globrrrµrpÚitemrdÚradicalÚdirr r„r-r-r.rfs*       r)Ú HTTPSHandlerÚmatch_hostnameÚCertificateErrorc@seZdZdZdZdd„ZdS)ÚHTTPSConnectionNTc CsZtj|j|jf|jƒ}t|ddƒr0||_|jƒtt dƒsp|j rHt j }nt j }t j ||j|j|t j|j d�|_n‚t jt jƒ}tt dƒr–|jt jO_|jr¬|j|j|jƒi}|j rât j |_|j|j d�tt ddƒrâ|j|d<|j |f|Ž|_|j oü|j�rVy$t|jjƒ|jƒtjd |jƒWn0tk �rT|jjtjƒ|jjƒ‚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ìrrÚshutdownÚ SHUT_RDWRr¥)rÉr"rÚcontextr‘r-r-r.Úconnect�s@       zHTTPSConnection.connect)rÍrÑrÒrr/r4r-r-r-r.rŠsrc@s&eZdZd dd„Zdd„Zdd„ZdS) rTcCstj|ƒ||_||_dS)N)ÚBaseHTTPSHandlerrÊrr/)rÉrr/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. )rrr/)rÉr�r‘r(r-r-r.Ú _conn_maker»s zHTTPSHandler._conn_makercCsVy|j|j|ƒStk rP}z&dt|jƒkr>td|jƒ‚n‚WYdd}~XnXdS)Nzcertificate verify failedz*Unable to verify server certificate for %s)Údo_openr6rÚstrÚreasonrr)rÉrYrxr-r-r.Ú https_openËs zHTTPSHandler.https_openN)T)rÍrÑrÒrÊr6r:r-r-r-r.rµs rc@seZdZdd„ZdS)ÚHTTPSOnlyHandlercCstd|ƒ‚dS)NzAUnexpected HTTP request on what should be a secure connection: %s)r)rÉrYr-r-r.Ú http_openßszHTTPSOnlyHandler.http_openN)rÍrÑrÒr<r-r-r-r.r;Þsr;ééc@seZdZddd„ZdS)ÚHTTPrNcKs&|dkr d}|j|j||f|ŽƒdS)Nr)Ú_setupÚ_connection_class)rÉrr r‘r-r-r.rÊësz HTTP.__init__)rN)rÍrÑrÒrÊr-r-r-r.r?êsr?c@seZdZddd„ZdS)ÚHTTPSrNcKs&|dkr d}|j|j||f|ŽƒdS)Nr)r@rA)rÉrr r‘r-r-r.rÊószHTTPS.__init__)rN)rÍrÑrÒrÊr-r-r-r.rBòsrBc@seZdZddd„Zdd„ZdS)Ú TransportrcCs||_tjj||ƒdS)N)r!rrCrÊ)rÉr!Ú use_datetimer-r-r.rÊúszTransport.__init__cCsb|j|ƒ\}}}tdkr(t||jd�}n6|j s>||jdkrT||_|tj|ƒf|_|jd}|S)Nr=r>)r!rr)r=r>)Ú get_host_infoÚ _ver_infor?r!Ú _connectionÚ_extra_headersrÚHTTPConnection)rÉrÚhÚehÚx509r(r-r-r.Úmake_connectionþs zTransport.make_connectionN)r)rÍrÑrÒrÊrMr-r-r-r.rCùs rCc@seZdZddd„Zdd„ZdS)Ú SafeTransportrcCs||_tjj||ƒdS)N)r!rrNrÊ)rÉr!rDr-r-r.rÊ szSafeTransport.__init__cCsz|j|ƒ\}}}|si}|j|d<tdkr:t|df|Ž}n<|j sP||jdkrl||_|tj|df|Žf|_|jd}|S)Nr!r=r>rr)r=r>)rEr!rFrBrGrHrr)rÉrrJrKr‘r(r-r-r.rMs    zSafeTransport.make_connectionN)r)rÍrÑrÒrÊrMr-r-r-r.rN s rNc@seZdZdd„ZdS)Ú ServerProxyc Kst|jddƒ|_}|dk r^t|ƒ\}}|jddƒ}|dkr@t}nt}|||d�|d<}||_tjj ||f|ŽdS)Nr!rDrÚhttps)rDÚ transport) rjr!rrrrNrCrQrrOrÊ) rÉr\r‘r!rWr_rDÚtclsr^r-r-r.rÊ s  zServerProxy.__init__N)rÍrÑrÒrÊr-r-r-r.rOsrOcKs6tjddkr|d7}nd|d<d|d<t||f|ŽS)Nrr‘ÚbrÚnewlinezutf-8rø)r}r™rú)r„r r‘r-r-r.Ú _csv_open4s  rUc@s4eZdZedƒedƒedƒdœZdd„Zdd„Zd S) ÚCSVBaserBú"r·)Ú delimiterÚ quotecharÚlineterminatorcCs|S)Nr-)rÉr-r-r.Ú __enter__FszCSVBase.__enter__cGs|jjƒdS)N)r—r¥)rÉrFr-r-r.Ú__exit__IszCSVBase.__exit__N)rÍrÑrÒr8Údefaultsr[r\r-r-r-r.rV?s  rVc@s(eZdZdd„Zdd„Zdd„ZeZdS)Ú CSVReadercKs\d|kr4|d}tjddkr,tjdƒ|ƒ}||_nt|ddƒ|_tj|jf|jŽ|_dS)Nr—rr‘zutf-8rdro) r}r™ršr›r—rUÚcsvrwr])rÉr‘r—r-r-r.rÊNszCSVReader.__init__cCs|S)Nr-)rÉr-r-r.Ú__iter__YszCSVReader.__iter__cCsJt|jƒ}tjddkrFx,t|ƒD] \}}t|tƒs"|jdƒ||<q"W|S)Nrr‘zutf-8)Únextrwr}r™rZr‚rrÁ)rÉr(r]rr-r-r.ra\s   zCSVReader.nextN)rÍrÑrÒrÊr`raÚ__next__r-r-r-r.r^Ms r^c@seZdZdd„Zdd„ZdS)Ú CSVWritercKs$t|dƒ|_tj|jf|jŽ|_dS)Nr÷)rUr—r_Úwriterr])rÉr„r‘r-r-r.rÊgs zCSVWriter.__init__cCsRtjddkrBg}x*|D]"}t|tƒr0|jdƒ}|j|ƒqW|}|jj|ƒdS)Nrr‘zutf-8)r}r™r‚rrr"rdÚwriterow)rÉÚrowrorr-r-r.reks   zCSVWriter.writerowN)rÍrÑrÒrÊrer-r-r-r.rcfsrccsHeZdZeejƒZded<d ‡fdd„ Zdd„Zdd „Zd d „Z ‡Z S) Ú ConfiguratorÚ inc_convertÚincNcs"tt|ƒj|ƒ|ptjƒ|_dS)N)ÚsuperrgrÊrcr½ro)rÉÚconfigro)Ú __class__r-r.rÊ~szConfigurator.__init__c s°‡‡fdd„‰ˆjdƒ}t|ƒs*ˆj|ƒ}ˆjddƒ}ˆjdfƒ}|r\t‡fdd„|Dƒƒ}‡‡fdd„ˆDƒ}t|ƒ}|||Ž}|r¬x$|jƒD]\}} t||ˆ| ƒƒq�W|S) Ncszt|ttfƒr*t|ƒ‡fdd„|Dƒƒ}nLt|tƒrld|krHˆj|ƒ}qvi}x(|D]}ˆ||ƒ||<qRWn ˆj|ƒ}|S)Ncsg|] }ˆ|ƒ‘qSr-r-)rKr])Úconvertr-r.rM…szBConfigurator.configure_custom..convert..z())r‚r&rªÚtypeÚdictÚconfigure_customrm)Úor(r­)rmrÉr-r.rmƒs    z.Configurator.configure_custom..convertz()r/z[]csg|] }ˆ|ƒ‘qSr-r-)rKrq)rmr-r.rM˜sz1Configurator.configure_custom..cs$g|]}t|ƒr|ˆˆ|ƒf‘qSr-)r)rKr­)rkrmr-r.rM™s)rjr;r5rªrorŸÚsetattr) rÉrkrŠÚpropsr�rŸr‘r(rgrHr-)rkrmrÉr.rp‚s     zConfigurator.configure_customcCs4|j|}t|tƒr0d|kr0|j|ƒ|j|<}|S)Nz())rkr‚rorp)rÉr�r(r-r-r.Ú __getitem__¡s zConfigurator.__getitem__c CsFtjj|ƒstjj|j|ƒ}tj|ddd��}tj|ƒ}WdQRX|S)z*Default converter for the inc:// protocol.rozutf-8)røN) rcrdÚisabsr$roršrúr�rž)rÉr¯rÿr(r-r-r.rh§s  zConfigurator.inc_convert)N) rÍrÑrÒrorÚvalue_convertersrÊrprtrhÚ __classcell__r-r-)rlr.rgys  rgc@s*eZdZdZd dd„Zdd„Zdd „ZdS) ÚSubprocessMixinzC Mixin for running subprocesses and capturing their output FNcCs||_||_dS)N)ÚverboseÚprogress)rÉryrzr-r-r.rÊ´szSubprocessMixin.__init__cCsn|j}|j}xT|jƒ}|sP|dk r0|||ƒq|sBtjjdƒntjj|jdƒƒtjjƒqW|jƒ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/zutf-8) rzryÚreadliner}Ústderrr¶rÁÚflushr¥)rÉr—r3rzryr,r-r-r.rw¸s zSubprocessMixin.readercKsžtj|ftjtjdœ|—Ž}tj|j|jdfd�}|jƒtj|j|jdfd�}|jƒ|j ƒ|j ƒ|j ƒ|j dk rˆ|j ddƒn|j ršt jjdƒ|S)N)Ústdoutr|r~)rèr�r|zdone.Úmainzdone. )Ú subprocessÚPopenÚPIPEÚ threadingÚThreadrwr~r`r|Úwaitr$rzryr}r¶)rÉÚcmdr‘r‰Út1Út2r-r-r.Ú run_commandÍs   zSubprocessMixin.run_command)FN)rÍrÑrÒr†rÊrwr‰r-r-r-r.rx°s rxcCstjdd|ƒjƒS)z,Normalize a python package name a la PEP 503z[-_.]+r^)raÚsubr„)rNr-r-r.Únormalize_nameÞsr‹)NN)rÀ)N)N)rºr»r¼r½r¾r¿rÀ)NT)rrãrärårærç)r=r>)„ršÚ collectionsrÚ contextlibr_Úglobrr rÚr�ÚloggingrcrrarÁr$Ú ImportErrorr€r}rÐr¸r¦rƒÚdummy_threadingròrrÚcompatrrrr r r r r rrrrrrrrrrrrrÚ getLoggerrÍrìrrrErDr5r<r9rVr#r>raryrrƒr‹r�r°r·Úcontextmanagerr¼r¾rÆrËrÇrÙrÚr5r6ÚVERBOSEr=r rNrPrRrVrYr\ÚIrcr_rhrjrkrqryr{r|r~rr‡r“ÚARCHIVE_EXTENSIONSrÙrârrèr rrrrr5rrrr;r™rFr?rBrCrNrOrUrVr^rcrgrxr‹r-r-r-r.ÚsÞ      \         Yy   /  8  )    ,H  6]    +)   7.