B :—°a¿§ã@sœddlmZddlZddlZddlZddlmZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlmZmZddlmZmZmZmZmZddlmZddlmZmZm Z m!Z!dd l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,dd l-m.Z.m/Z/e  0e1¡Z2da3e4ed ƒr8d Z5n*ej6 7d ¡rLdZ5nej6dkr^dZ5ndZ5e 8d¡Z9e9s„dej:dd…Z9de9Z;e5e9Ze 8d¡Z?e?rÞe? 7d¡rÞe? =dd¡ @d¡dZ?ndd„ZAeAƒZ?[Ae  Bde jCe jDB¡ZEe  Bde jCe jDB¡ZFe  Bd¡ZGe  Bd ¡ZHd!ZId"ZJe jKd#krHd$d%„ZLnd&d%„ZLGd'd(„d(eMƒZNeNƒZOGd)d*„d*eMƒZPd+d,„ZQd-d.„ZReRƒZS[Rd1d/d0„ZTdS)2é)Úunicode_literalsN)Úmessage_from_fileé)Ú __version__ÚDistlibException)Ú sysconfigÚZipFileÚfsdecodeÚ text_typeÚfilter)ÚInstalledDistribution)ÚMetadataÚMETADATA_FILENAMEÚWHEEL_METADATA_FILENAMEÚLEGACY_METADATA_FILENAME) Ú FileOperatorÚ convert_pathÚ CSVReaderÚ CSVWriterÚCacheÚcached_propertyÚget_cache_baseÚ read_exportsÚtempdirÚ get_platform)ÚNormalizedVersionÚUnsupportedVersionErrorZpypy_version_infoÚppÚjavaZjyZcliZipÚcpÚpy_version_nodotz%s%séÚpyú-Ú_Ú.ÚSOABIzcpython-cCsRdtg}t d¡r| d¡t d¡r0| d¡t d¡dkrH| d¡d  |¡S) NrÚPy_DEBUGÚdÚ WITH_PYMALLOCÚmZPy_UNICODE_SIZEéÚuÚ)Ú VER_SUFFIXrÚget_config_varÚappendÚjoin)Úparts©r3ú>/opt/alt/python37/lib/python3.7/site-packages/distlib/wheel.pyÚ _derive_abi<s     r5zz (?P[^-]+) -(?P\d+[^-]*) (-(?P\d+[^-]*))? -(?P\w+\d+(\.\w+\d+)*) -(?P\w+) -(?P\w+(\.\w+)*) \.whl$ z7 (?P[^-]+) -(?P\d+[^-]*) (-(?P\d+[^-]*))?$ s \s*#![^\r\n]*s^(\s*#!("[^"]+"|\S+))\s+(.*)$s#!pythons #!pythonwú/cCs|S)Nr3)Úor3r3r4Ú^ór8cCs| tjd¡S)Nr6)ÚreplaceÚosÚsep)r7r3r3r4r8`r9c@s6eZdZdd„Zdd„Zdd„Zd dd „Zd d „ZdS) ÚMountercCsi|_i|_dS)N)Ú impure_wheelsÚlibs)Úselfr3r3r4Ú__init__dszMounter.__init__cCs||j|<|j |¡dS)N)r>r?Úupdate)r@ÚpathnameÚ extensionsr3r3r4Úaddhs z Mounter.addcCs4|j |¡}x"|D]\}}||jkr|j|=qWdS)N)r>Úpopr?)r@rCrDÚkÚvr3r3r4Úremovels  zMounter.removeNcCs||jkr|}nd}|S)N)r?)r@ÚfullnameÚpathÚresultr3r3r4Ú find_modulers zMounter.find_modulecCsj|tjkrtj|}nP||jkr,td|ƒ‚t ||j|¡}||_| dd¡}t|ƒdkrf|d|_ |S)Nzunable to find extension for %sr%rr) ÚsysÚmodulesr?Ú ImportErrorÚimpZ load_dynamicÚ __loader__ÚrsplitÚlenÚ __package__)r@rJrLr2r3r3r4Ú load_moduleys       zMounter.load_module)N)Ú__name__Ú __module__Ú __qualname__rArErIrMrVr3r3r3r4r=cs  r=c@sîeZdZdZdZdZd4dd„Zedd „ƒZed d „ƒZ ed d „ƒZ e dd„ƒZ dd„Z e dd„ƒZdd„Zd5dd„Zdd„Zdd„Zdd„Zd6dd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd7d,d-„Zd.d/„Zd0d1„Zd8d2d3„ZdS)9ÚWheelz@ Class to build and install from Wheel files (PEP 427). )rrZsha256NFcCs8||_||_d|_tg|_dg|_dg|_t ¡|_ |dkrRd|_ d|_ |j |_ nât |¡}|rš| d¡}|d|_ |d d d ¡|_ |d |_|j |_ nštj |¡\}}t |¡}|sÄtd |ƒ‚|rÖtj |¡|_ ||_ | d¡}|d|_ |d|_ |d |_|d  d¡|_|d d¡|_|d d¡|_dS)zB Initialise an instance using a (valid) filename. r-ÚnoneÚanyNZdummyz0.1ÚnmZvnr$r#ZbnzInvalid name or filename: %rr"r%ZbiÚar)ÚsignZ should_verifyÚbuildverÚPYVERÚpyverÚabiÚarchr;ÚgetcwdÚdirnameÚnameÚversionÚfilenameZ _filenameÚNAME_VERSION_REÚmatchÚ groupdictr:rKÚsplitÚ FILENAME_RErÚabspath)r@rir_Úverifyr*Úinforfr3r3r4rA‘sB            zWheel.__init__cCs^|jrd|j}nd}d |j¡}d |j¡}d |j¡}|j dd¡}d|j|||||fS)zJ Build and return a filename from the various components. r#r-r%r$z%s-%s%s-%s-%s-%s.whl)r`r1rbrcrdrhr:rg)r@r`rbrcrdrhr3r3r4riºs     zWheel.filenamecCstj |j|j¡}tj |¡S)N)r;rKr1rfriÚisfile)r@rKr3r3r4ÚexistsËsz Wheel.existsccs@x:|jD]0}x*|jD] }x|jD]}|||fVq WqWqWdS)N)rbrcrd)r@rbrcrdr3r3r4ÚtagsÐs   z Wheel.tagsc Csþtj |j|j¡}d|j|jf}d|}t d¡}t |dƒ¶}|  |¡}|d  dd¡}t dd „|Dƒƒ}t tg} d} x`| D]X} y>t || ¡} | | ¡} || ƒ}t|d } | r´PWdQRXWq~tk rÔYq~Xq~W| sðtd d  | ¡ƒ‚WdQRX| S) Nz%s-%sz %s.dist-infozutf-8Úrz Wheel-Versionr%rcSsg|] }t|ƒ‘qSr3)Úint)Ú.0Úir3r3r4ú àsz"Wheel.metadata..)Úfileobjz8Invalid wheel, because metadata is missing: looked in %sz, )r;rKr1rfrirgrhÚcodecsÚ getreaderrÚget_wheel_metadatarmÚtuplerrÚ posixpathÚopenr ÚKeyErrorÚ ValueError)r@rCÚname_verÚinfo_dirÚwrapperÚzfÚwheel_metadataÚwvÚ file_versionZfnsrLÚfnÚmetadata_filenameÚbfÚwfr3r3r4Úmetadata×s0        zWheel.metadatac CsXd|j|jf}d|}t |d¡}| |¡}t d¡|ƒ}t|ƒ}WdQRXt|ƒS)Nz%s-%sz %s.dist-infoÚWHEELzutf-8) rgrhrr1r€r{r|rÚdict)r@r†rƒr„r‹rŒrÚmessager3r3r4r}÷s  zWheel.get_wheel_metadatac Cs6tj |j|j¡}t|dƒ}| |¡}WdQRX|S)Nru)r;rKr1rfrirr})r@rCr†rLr3r3r4rqs z Wheel.infoc CsÔt |¡}|r|| ¡}|d|…||d…}}d| ¡krBt}nt}t |¡}|rfd| ¡d}nd}||}||}nT| d¡}| d¡} |dks || kr¦d} n|||d…d krÀd } nd} t| |}|S) Nspythonwó éÿÿÿÿr9ó ó rr!s ) Ú SHEBANG_RErkÚendÚlowerÚSHEBANG_PYTHONWÚSHEBANG_PYTHONÚSHEBANG_DETAIL_REÚgroupsÚfind) r@Údatar*r—ZshebangZdata_after_shebangZshebang_pythonÚargsZcrZlfZtermr3r3r4Úprocess_shebangs,       zWheel.process_shebangcCsh|dkr|j}ytt|ƒ}Wn tk r<td|ƒ‚YnX||ƒ ¡}t |¡ d¡  d¡}||fS)NzUnsupported hash algorithm: %ró=Úascii) Ú hash_kindÚgetattrÚhashlibÚAttributeErrorrÚdigestÚbase64Zurlsafe_b64encodeÚrstripÚdecode)r@ržr£ÚhasherrLr3r3r4Úget_hash%s zWheel.get_hashc CsZt|ƒ}ttj ||¡ƒ}| |ddf¡t|ƒ}x|D]}| |¡q:WWdQRXdS)Nr-)ÚlistÚto_posixr;rKÚrelpathr0rZwriterow)r@ÚrecordsZ record_pathÚbaseÚpÚwriterÚrowr3r3r4Ú write_record0s   zWheel.write_recordc Cs²g}|\}}tt|jƒ}xX|D]P\}} t| dƒ} |  ¡} WdQRXd| | ¡} tj | ¡} |  || | f¡qWtj  |d¡} |  || |¡t tj  |d¡ƒ}|  || f¡dS)NÚrbz%s=%sÚRECORD) r¤r¥r£r€Úreadr¬r;rKÚgetsizer0r1rµr®)r@rqÚlibdirÚ archive_pathsr°Údistinfor„r«Úapr²Úfržr§Úsizer3r3r4Ú write_records8s   zWheel.write_recordsc CsJt|dtjƒ2}x*|D]"\}}t d||¡| ||¡qWWdQRXdS)NÚwzWrote %s to %s in wheel)rÚzipfileÚ ZIP_DEFLATEDÚloggerÚdebugÚwrite)r@rCr»r†r½r²r3r3r4Ú build_zipHszWheel.build_zipc" s®|dkr i}tt‡fdd„dƒƒd}|dkrFd}tg}tg}tg}nd}tg}d g}d g}| d |¡|_| d |¡|_| d |¡|_ ˆ|} d|j |j f} d| } d| } g} xîdD]æ}|ˆkrÆq¸ˆ|}t j  |¡r¸xÂt  |¡D]´\}}}x¨|D] }tt j  ||¡ƒ}t j  ||¡}tt j  | ||¡ƒ}|  ||f¡|dkrö| d¡söt|dƒ}| ¡}WdQRX| |¡}t|dƒ}| |¡WdQRXqöWqæWq¸W| }d}xÆt  |¡D]¸\}}}||krx@t|ƒD]4\}}t|ƒ}| d¡rÔt j  ||¡}||=PqÔW|stdƒ‚xP|D]H}t|ƒ d¡r8q t j  ||¡}tt j  ||¡ƒ}|  ||f¡q Wq¶Wt  |¡}xJ|D]B}|dkr‚tt j  ||¡ƒ}tt j  | |¡ƒ}|  ||f¡q‚Wd|pÔ|jdtd|g}x*|jD] \}}}| d|||f¡qîWt j  |d¡}t|dƒ}| d  |¡¡WdQRXtt j  | d¡ƒ}|  ||f¡d!d"„} t | | d#} | !|| f| | ¡t j  |j"|j#¡}!| $|!| ¡|!S)$z‰ Build a wheel from files in specified paths, and use any specified tags when determining the name of the wheel. Ncs|ˆkS)Nr3)r7)Úpathsr3r4r8Vr9zWheel.build..)ÚpurelibÚplatlibrrÊÚfalseÚtruer[r\rbrcrdz%s-%sz%s.dataz %s.dist-info)ržÚheadersÚscriptsrÎz.exer¶Úwbz .dist-infoz(.dist-info directory expected, not found)z.pycz.pyo)r·Z INSTALLERZSHAREDrzWheel-Version: %d.%dzGenerator: distlib %szRoot-Is-Purelib: %sz Tag: %s-%s-%srrÁÚ cSs*|d}| d¡}d|kr"|d7}||fS)Nrr6z .dist-infoi')Úcount)Útr½Únr3r3r4Úsorter²s  zWheel.build..sorter)Úkey)%r­r ÚIMPVERÚABIÚARCHraÚgetrbrcrdrgrhr;rKÚisdirÚwalkr r1r¯r®r0Úendswithr€r¸r rÆÚ enumerateÚAssertionErrorÚlistdirÚ wheel_versionrrtÚsortedrÀrfrirÇ)"r@rÈrtràZlibkeyÚis_pureZ default_pyverZ default_abiZ default_archrºrƒÚdata_dirr„r»rÕrKÚrootÚdirsÚfilesrŠr²Úrpr½r¾ržr¼rxÚdnr‡rbrcrdrÔrCr3)rÈr4ÚbuildNs˜                 z Wheel.buildcCs | d¡S)zl Determine whether an archive entry should be skipped when verifying or installing. )r6z /RECORD.jws)rÜ)r@Úarcnamer3r3r4Ú skip_entryÂszWheel.skip_entrycC Ks–|j}| d¡}| dd¡}| dd¡}tj |j|j¡}d|j|jf} d| } d| } t  | t ¡} t  | d¡} t  | d ¡}t   d ¡}t |d ƒø}| | ¡}||ƒ}t|ƒ}Wd QRX|d  dd¡}tdd„|Dƒƒ}||jkrø|rø||j|ƒ|ddkr|d}n|d}i}| |¡<}t|d&}x|D]}|d}|||<q:WWd QRXWd QRXt  | d¡}t  | d¡}t  | dd¡}t|d}d|_tj } g}!t ¡}"|"|_d |_zºyˆxä| ¡D]Ö}#|#j}$t|$tƒrð|$}%n |$ d ¡}%|  |%¡r qÒ||%}|dr|6 d:i¡}?|>sB|?rê| dd¡}@tj >|@¡sdt?d;ƒ‚|@|_x6|> @¡D]*\}:}<|5 C||¡}|r8|! .|¡|5 D|!|d?|¡|5St0k rvt' Ed@¡| F¡‚YnXWd tG H|"¡XWd QRXd S)Aa~ Install a wheel to the specified paths. If kwarg ``warner`` is specified, it should be a callable, which will be called with two tuples indicating the wheel version of this software and the wheel version in the file, if there is a discrepancy in the versions. This can be used to issue any warnings to raise any exceptions. If kwarg ``lib_only`` is True, only the purelib/platlib files are installed, and the headers, scripts, data and dist-info metadata are not written. If kwarg ``bytecode_hashed_invalidation`` is True, written bytecode will try to use file-hash based invalidation (PEP-552) on supported interpreter versions (CPython 2.7+). The return value is a :class:`InstalledDistribution` instance unless ``options.lib_only`` is True, in which case the return value is ``None``. ÚwarnerÚlib_onlyFZbytecode_hashed_invalidationz%s-%sz%s.dataz %s.dist-inforr·zutf-8ruNz Wheel-Versionr%rcSsg|] }t|ƒ‘qSr3)rv)rwrxr3r3r4ryøsz!Wheel.install..zRoot-Is-PurelibrÌrÉrÊ)Ústreamrr-rÎ)Údry_runTr!zsize mismatch for %sú=zdigest mismatch for %szlib_only: skipping %sz.exer6Úposixéiÿr¶zdigest mismatch on write for %sz.py)Zhashed_invalidationzByte-compilation failed)Úexc_infozlib_only: returning Nonez1.0zentry_points.txt)ZconsoleÚguiz %s_scriptszwrap_%sz%s:%sz [%s]ú,zAUnable to read legacy script metadata, so cannot generate scriptsrDzpython.commandsz8Unable to read JSON metadata, so cannot generate scriptsZ wrap_consoleZwrap_guizValid script path not specifiedz%s = %srôÚlibÚprefixzinstallation failed.)IrïrÙr;rKr1rfrirgrhrrr{r|rr€rrmr~ràrrÚrecordrNÚdont_write_bytecodeÚtempfileZmkdtempZ source_dirZ target_dirÚinfolistÚ isinstancer rªrëÚstrÚ file_sizerr¸r¬Ú startswithrÄrÅrÜrZ copy_streamÚchmodÚ external_attrr0Ú byte_compileÚ ExceptionÚwarningÚbasenameZmakeZset_executable_modeÚextendrqrÚvaluesr÷ÚsuffixÚflagsÚjsonÚloadrÚr‚Úitemsr rZwrite_shared_locationsZwrite_installed_filesÚ exceptionZrollbackÚshutilÚrmtree)Cr@rÈZmakerÚkwargsrïrìríZbc_hashed_invalidationrCrƒrãr„Ú metadata_nameÚwheel_metadata_nameÚ record_namer…r†Úbwfrr‘rˆr‰rºr°rŒÚreaderr´r²Zdata_pfxZinfo_pfxZ script_pfxZfileopZbcÚoutfilesÚworkdirÚzinforêÚ u_arcnameÚkindÚvalueržr$r§Z is_scriptÚwhererçÚoutfileZ newdigestZpycrŠZworknamerèÚ filenamesÚdistÚcommandsZepZepdatarÕrGr(rHÚsZconsole_scriptsZ gui_scriptsZ script_dirÚscriptÚoptionsr3r3r4ÚinstallÒsJ             "                                          z Wheel.installcCs8tdkr4tj tƒtdƒdtjdd…¡}t|ƒatS)Nz dylib-cachez%s.%sr!) Úcacher;rKr1rrýrNÚ version_infor)r@r±r3r3r4Ú_get_dylib_cache¿s zWheel._get_dylib_cachec Csltj |j|j¡}d|j|jf}d|}t |d¡}t  d¡}g}t |dƒ}yô|  |¡à}||ƒ} t   | ¡} | ¡} |  |¡} tj | j| ¡} tj | ¡sªt | ¡xŽ|  ¡D]‚\}}tj | t|ƒ¡}tj |¡sàd}n6t |¡j}tj |¡}| |¡}tj|jŽ}||k}|r(| || ¡| ||f¡q´WWdQRXWntk r\YnXWdQRX|S)Nz%s-%sz %s.dist-infoZ EXTENSIONSzutf-8ruT)r;rKr1rfrirgrhrr{r|rr€r r r'Z prefix_to_dirr±rÚÚmakedirsr rrsÚstatÚst_mtimeÚdatetimeZ fromtimestampÚgetinfoÚ date_timeÚextractr0r)r@rCrƒr„rêr…rLr†rŒrrDr%r÷Z cache_basergr¯Údestr.Z file_timerqZ wheel_timer3r3r4Ú_get_extensionsÈs>              zWheel._get_extensionscCst|ƒS)zM Determine if a wheel is compatible with the running system. )Ú is_compatible)r@r3r3r4r1êszWheel.is_compatiblecCsdS)zP Determine if a wheel is asserted as mountable by its metadata. Tr3)r@r3r3r4Ú is_mountableðszWheel.is_mountablecCs´tj tj |j|j¡¡}| ¡s2d|}t|ƒ‚| ¡sJd|}t|ƒ‚|t jkrbt   d|¡nN|rtt j  |¡nt j  d|¡| ¡}|r°tt jkr¤t j  t¡t ||¡dS)Nz)Wheel %s not compatible with this Python.z$Wheel %s is marked as not mountable.z%s already in pathr)r;rKror1rfrir1rr2rNrÄrÅr0Úinsertr0Ú_hookÚ meta_pathrE)r@r0rCÚmsgrDr3r3r4Úmountös"   z Wheel.mountcCsrtj tj |j|j¡¡}|tjkr2t d|¡nr5)r@rCr3r3r4Úunmount s     z Wheel.unmountc Cs tj |j|j¡}d|j|jf}d|}d|}t |t¡}t |d¡}t |d¡}t   d¡}t |dƒ–} |   |¡} || ƒ} t | ƒ} WdQRX| d d d ¡} td d „| Dƒƒ}i}|   |¡:}t|d $}x|D]}|d}|||<qØWWdQRXWdQRXxø|  ¡D]ì}|j}t|tƒr*|}n | d¡}| d¡}d|krTtd|ƒ‚| |¡rdq||}|dr–t|jƒ|dkr–td|ƒ‚|d r|d  dd ¡\}}|   |¡}| ¡}WdQRX| ||¡\}}||krtd|ƒ‚qWWdQRXdS)Nz%s-%sz%s.dataz %s.dist-inforr·zutf-8ruz Wheel-Versionr%rcSsg|] }t|ƒ‘qSr3)rv)rwrxr3r3r4ry(sz Wheel.verify..)rîrr6z..zinvalid entry in wheel: %rr!zsize mismatch for %srðzdigest mismatch for %s)r;rKr1rfrirgrhrrr{r|rr€rrmr~rrûrür rªrrërýrþr¸r¬)r@rCrƒrãr„rrrr…r†rrr‘rˆr‰r°rŒrr´r²rrêrrrržr$r§r3r3r4rpsV                 z Wheel.verifyc KsÜdd„}dd„}tj |j|j¡}d|j|jf}d|}t |d¡} tƒ„} t |dƒ€} i} xt|   ¡D]h} | j}t |t ƒr„|}n |  d ¡}|| kr˜qjd |kr¬td |ƒ‚|  | | ¡tj | t|ƒ¡}|| |<qjWWd QRX|| |ƒ\}}|| f|Ž}|rÎ|| |ƒ\}}|r(||kr(|||ƒ|d krRtjd d| d\}}t |¡n*tj |¡sltd|ƒ‚tj ||j¡}t|  ¡ƒ}tj | |¡}||f}| || |¡| ||¡|d krÎt ||¡Wd QRX|S)a‘ Update the contents of a wheel in a generic way. The modifier should be a callable which expects a dictionary argument: its keys are archive-entry paths, and its values are absolute filesystem paths where the contents the corresponding archive entries can be found. The modifier is free to change the contents of the files pointed to, add new entries and remove entries, before returning. This method will extract the entire contents of the wheel to a temporary location, call the modifier, and then use the passed (and possibly updated) dictionary to write a new wheel. If ``dest_dir`` is specified, the new wheel is written there -- otherwise, the original wheel is overwritten. The modifier should return True if it updated the wheel, else False. This method returns the same value the modifier returns. cSsHd}}d|tf}||kr$d|}||kr@||}t|dj}||fS)Nz%s/%sz %s/PKG-INFO)rK)rr rh)Úpath_mapr„rhrKrÕr3r3r4Ú get_version`s  z!Wheel.update..get_versioncSsàd}y|t|ƒ}| d¡}|dkr*d|}nTdd„||dd… d¡Dƒ}|dd7<d |d|…d d d „|Dƒ¡f}Wn tk r t d |¡YnX|rÜt|d }||_|  t ¡}|j ||dt d||¡dS)Nr#rz%s+1cSsg|] }t|ƒ‘qSr3)rv)rwr!r3r3r4ryrsz8Wheel.update..update_version..rr%r“z%s+%scss|]}t|ƒVqdS)N)rý)rwrxr3r3r4ú usz7Wheel.update..update_version..z0Cannot update non-compliant (PEP-440) version %r)rK)rKÚlegacyzVersion updated from %r to %r) rrrmr1rrÄrÅr rhrÜrrÆ)rhrKÚupdatedrHrxr2Zmdr<r3r3r4Úupdate_versionjs(       z$Wheel.update..update_versionz%s-%sz %s.dist-infor·ruzutf-8z..zinvalid entry in wheel: %rNz.whlz wheel-update-)rr÷ÚdirzNot a directory: %r)r;rKr1rfrirgrhrrrrûrür rªrr.rrúÚmkstempÚcloserÚr­r rÀrÇrÚcopyfile)r@ÚmodifierZdest_dirrr:r>rCrƒr„rrr†r9rrêrrKZoriginal_versionr$ÚmodifiedZcurrent_versionÚfdÚnewpathr»r¼rqr3r3r4rBOsX                z Wheel.update)NFF)N)NN)F)N)rWrXrYÚ__doc__ràr£rAÚpropertyrirsrtrrŽr}rqr r¬rµrÀrÇrérër$r'r0r1r2r7r8rprBr3r3r3r4rZ‰s6 )       tn "  8rZcCs^ddl}| ¡}g}|ddkrZx0|d d¡D]}| | ¡rHt|ƒnd¡q0Wt|ƒ}|S)NrZglibcrr%)ÚplatformZlibc_verrmr0Úisdigitrvr~)rIÚverrLr!r3r3r4Ú_get_glibc_version´s rLc CsŽtg}td}x6ttjddddƒD]}| d |t|ƒg¡¡q&Wg}x6t ¡D]*\}}}|  d¡rT| |  dd¡d¡qTW|  ¡t dkrž|  dt ¡| d¡g}tg}tjd kr t d t¡}|r | ¡\} }}} t|ƒ}| g} | d kr|  d ¡| d kr|  d¡| dkr*|  d¡| dkr>|  d¡| dkrR|  d¡xL|dkržx2| D]*} d| ||| f} | tkrd| | ¡qdW|d8}qTWx.|D]$}x|D]} | d t|df¡|| f¡|dkr¶tj  d¡r¶|  dd¡} tƒ}t|ƒdkr¶|dkr>| d t|df¡|d| f¡|dkrj| d t|df¡|d| f¡|dkr–| d t|df¡|d| f¡| d t|df¡|d|d|d| ff¡q¶Wq¨WxXt|ƒD]L\}}| d t|f¡ddf¡|dkrÜ| d t|df¡ddf¡qÜWxXt|ƒD]L\}}| d d |f¡ddf¡|dkr6| d d |df¡ddf¡q6Wt|ƒS)!zG Return (pyver, abi, arch) tuples compatible with this Python. rrr“r-z.abir%r!r[Údarwinz(\w+)_(\d+)_(\d+)_(\w+)$)Úi386ÚppcZfat)rNrOÚx86_64Zfat3)Úppc64rPZfat64)rNrPÚintel)rNrPrRrOrQÚ universalz %s_%s_%s_%sÚlinuxZlinux_)r!éz manylinux1_%s)r!é zmanylinux2010_%s)r!ézmanylinux2014_%szmanylinux_%s_%s_%sr\r")r.ÚrangerNr&r0r1rýrQZ get_suffixesrÿrmÚsortr×r3rØrIÚrerkrœrvÚ IMP_PREFIXr:rLrTrÝÚset)ZversionsÚmajorÚminorZabisrr$rLZarchesr*rgrdZmatchesrkr!rcr2rxrhr3r3r4Úcompatible_tags¾s€                          $ $r_cCs^t|tƒst|ƒ}d}|dkr"t}x6|D].\}}}||jkr(||jkr(||jkr(d}Pq(W|S)NFT)rürZÚCOMPATIBLE_TAGSrbrcrd)ZwheelrtrLrKrcrdr3r3r4r1s r1)N)UZ __future__rr¨r{r+Úemailrr¥rQr Úloggingr;rrZrrNrúrÂr-rrÚcompatrrr r r Zdatabaser rŽr rrrÚutilrrrrrrrrrrrhrrÚ getLoggerrWrÄr%Úhasattrr[rIrÿr/r.r&rarÖr:rØr×rmr5ÚcompileÚ IGNORECASEÚVERBOSErnrjr–r›ršr™r<r®Úobjectr=r4rZrLr_r`r1r3r3r3r4Ús†   0          #1 P