3 ig@sddlmZddlZddlZddlZddlmZddlZddlZddl 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 j0e1Z2da3e4ed r8d Z5n*ej6j7d rLdZ5nej6dkr^dZ5ndZ5ej8dZ9e9sdej:ddZ9de9Z;e5e9Zej8dZ?e?re?j7dre?j=ddj@ddZ?nddZAeAZ?[Ae jBde jCe jDBZEe jBde jCe jDBZFe jBdZGe jBd ZHd!ZId"ZJe jKd#krHd$d%ZLnd&d%ZLGd'd(d(eMZNeNZOGd)d*d*eMZPd+d,ZQd-d.ZReRZS[Rd1d/d0ZTdS)2)unicode_literalsN)message_from_file) __version__DistlibException) sysconfigZipFilefsdecode text_typefilter)InstalledDistribution)MetadataMETADATA_FILENAMEWHEEL_METADATA_FILENAMELEGACY_METADATA_FILENAME) FileOperator convert_path CSVReader CSVWriterCachecached_propertyget_cache_base read_exportstempdir get_platform)NormalizedVersionUnsupportedVersionErrorpypy_version_infoppjavajycliipcppy_version_nodotz%s%spy-_.SOABIzcpython-cCsRdtg}tjdr|jdtjdr0|jdtjddkrH|jdd j|S) Nr#Py_DEBUGd WITH_PYMALLOCmPy_UNICODE_SIZEu) VER_SUFFIXrget_config_varappendjoin)partsr88/tmp/pip-build-88gy_88q/pip/pip/_vendor/distlib/wheel.py _derive_abi<s     r:zz (?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)Nr8)or8r8r9^sr=cCs|jtjdS)Nr;)replaceossep)r<r8r8r9r=`sc@s6eZdZddZddZddZd dd Zd d ZdS) MountercCsi|_i|_dS)N) impure_wheelslibs)selfr8r8r9__init__dszMounter.__init__cCs||j|<|jj|dS)N)rBrCupdate)rDpathname extensionsr8r8r9addhs z Mounter.addcCs4|jj|}x"|D]\}}||jkr|j|=qWdS)N)rBpoprC)rDrGrHkvr8r8r9removels  zMounter.removeNcCs||jkr|}nd}|S)N)rC)rDfullnamepathresultr8r8r9 find_modulers zMounter.find_modulecCsj|tjkrtj|}nP||jkr,td|tj||j|}||_|jdd}t|dkrf|d|_ |S)Nzunable to find extension for %sr)rr) sysmodulesrC ImportErrorimp load_dynamic __loader__rsplitlen __package__)rDrNrPr7r8r8r9 load_moduleys       zMounter.load_module)N)__name__ __module__ __qualname__rErIrMrQr[r8r8r8r9rAcs  rAc@seZdZdZd4ZdZd5ddZedd Zed d Z ed d Z e ddZ ddZ e ddZddZd6ddZddZddZddZd7ddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd8d,d-Zd.d/Zd0d1Zd9d2d3ZdS):Wheelz@ Class to build and install from Wheel files (PEP 427). rsha256NFcCs8||_||_d|_tg|_dg|_dg|_tj|_ |dkrRd|_ d|_ |j |_ ntj|}|r|jd}|d|_ |djd d |_ |d |_|j |_ ntjj|\}}tj|}|std ||rtjj||_ ||_ |jd}|d|_ |d|_ |d |_|d jd|_|djd|_|djd|_dS)zB Initialise an instance using a (valid) filename. r2noneanyNdummyz0.1nmvnr(r'ZbnzInvalid name or filename: %rr&r)Zbiar)signZ should_verifybuildverPYVERpyverabiarchr?getcwddirnamenameversionfilename _filenameNAME_VERSION_REmatch groupdictr>rOsplit FILENAME_RErabspath)rDrqrgverifyr.infornr8r8r9rEsB            zWheel.__init__cCs^|jrd|j}nd}dj|j}dj|j}dj|j}|jjdd}d|j|||||fS)zJ Build and return a filename from the various components. r'r2r)r(z%s-%s%s-%s-%s-%s.whl)rhr6rjrkrlrpr>ro)rDrhrjrkrlrpr8r8r9rqs     zWheel.filenamecCstjj|j|j}tjj|S)N)r?rOr6rnrqisfile)rDrOr8r8r9existssz Wheel.existsccs@x:|jD]0}x*|jD] }x|jD]}|||fVq WqWqWdS)N)rjrkrl)rDrjrkrlr8r8r9tagss   z Wheel.tagscCstjj|j|j}d|j|jf}d|}tjd}t |d}|j |}|dj dd}t dd |D}t tg} d} x`| D]X} y>tj|| } |j| } || }t|d } | rPWdQRXWq~tk rYq~Xq~W| std d j| WdQRX| S) Nz%s-%sz %s.dist-infozutf-8rz Wheel-Versionr)rcSsg|] }t|qSr8)int).0ir8r8r9 sz"Wheel.metadata..)fileobjz8Invalid wheel, because metadata is missing: looked in %sz, )r?rOr6rnrqrorpcodecs getreaderrget_wheel_metadatarvtuplerr posixpathopenr KeyError ValueError)rDrGname_verinfo_dirwrapperzfwheel_metadatawv file_versionfnsrPfnmetadata_filenamebfwfr8r8r9metadatas0        zWheel.metadatac CsXd|j|jf}d|}tj|d}|j|}tjd|}t|}WdQRXt|S)Nz%s-%sz %s.dist-infoWHEELzutf-8) rorprr6rrrrdict)rDrrrrrrmessager8r8r9rs  zWheel.get_wheel_metadatac Cs6tjj|j|j}t|d}|j|}WdQRX|S)Nr~)r?rOr6rnrqrr)rDrGrrPr8r8r9rzs z Wheel.infoc Cstj|}|r||j}|d|||d}}d|jkrBt}nt}tj|}|rfd|jd }nd}||}||}nT|jd}|jd} |dks|| krd} n|||dd krd } nd} t| |}|S) Nspythonw r  rr%s ) SHEBANG_RErtendlowerSHEBANG_PYTHONWSHEBANG_PYTHONSHEBANG_DETAIL_REgroupsfind) rDdatar.rshebangZdata_after_shebangZshebang_pythonargscrlfZtermr8r8r9process_shebangs,       zWheel.process_shebangc Csh|dkr|j}ytt|}Wn tk r<td|YnX||j}tj|jdj d}||fS)NzUnsupported hash algorithm: %r=ascii) hash_kindgetattrhashlibAttributeErrorrdigestbase64urlsafe_b64encoderstripdecode)rDrrhasherrPr8r8r9get_hash%s zWheel.get_hashc CsZt|}ttjj||}|j|ddft|}x|D]}|j|q:WWdQRXdS)Nr2)listto_posixr?rOrelpathr5rwriterow)rDrecordsZ record_pathbasepwriterrowr8r8r9 write_record0s   zWheel.write_recordc Csg}|\}}tt|j}xX|D]P\}} t| d} | j} WdQRXd|j| } tjj| } |j || | fqWtjj |d} |j || |t tjj |d}|j || fdS)Nrbz%s=%sRECORD) rrrrreadrr?rOgetsizer5r6rr)rDrzlibdir archive_pathsrdistinforraprfrrsizer8r8r9 write_records8s   zWheel.write_recordsc CsJt|dtj2}x*|D]"\}}tjd|||j||qWWdQRXdS)NwzWrote %s to %s in wheel)rzipfile ZIP_DEFLATEDloggerdebugwrite)rDrGrrrrr8r8r9 build_zipHszWheel.build_zipc"s|dkr i}ttfddd(d}|dkrFd}tg}tg}tg}nd}tg}d g}d g}|jd ||_|jd ||_|jd ||_ |} d|j |j f} d| } d| } g} xd)D]}|krq|}t j j|rxt j|D]\}}}x|D]}tt j j||}t j j||}tt j j| ||}| j||f|dkr|jd rt|d}|j}WdQRX|j|}t|d}|j|WdQRXqWqWqW| }d}xt j|D]\}}}||kr"x@t|D]4\}}t|}|jdrt j j||}||=PqW|s"tdxP|D]H}t|jd*r@q(t j j||}tt j j||}| j||fq(WqWt j|}xJ|D]B}|d+krtt j j||}tt j j| |}| j||fqWd|p|jd td!|g}x*|jD] \}}}|jd"|||fqWt j j|d}t|d#}|jd$j|WdQRXtt j j| d}| j||fd%d&} t | | d'} |j!|| f| | t j j|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)Nr8)r<)pathsr8r9r=VszWheel.build..purelibplatlibrfalsetruerarbrjrkrlz%s-%sz%s.dataz %s.dist-inforheadersscriptsz.exerwbz .dist-infoz(.dist-info directory expected, not found.pyc.pyor INSTALLERSHAREDrzWheel-Version: %d.%dzGenerator: distlib %szRoot-Is-Purelib: %sz Tag: %s-%s-%sr cSs*|d}|jd}d|kr"|d7}||fS)Nrr;z .dist-infoi')count)trnr8r8r9sorters  zWheel.build..sorter)key)rr)rrr)rr)rrrr)%rr IMPVERABIARCHrigetrjrkrlrorpr?rOisdirwalkr r6rrr5endswithrrrr enumerateAssertionErrorlistdir wheel_versionrr}sortedrrnrqr)"rDrr}rZlibkeyis_pureZ default_pyverZ default_abiZ default_archrrdata_dirrrrrOrootdirsfilesrrrprrrrrdnrrjrkrlrrGr8)rr9buildNs      "          z Wheel.buildcCs |jdS)zl Determine whether an archive entry should be skipped when verifying or installing. r; /RECORD.jws)r;r)r)rDarcnamer8r8r9 skip_entryszWheel.skip_entrycCIKs|j}|jd}|jdd}|jdd}tjj|j|j}d|j|jf} d| } d| } t j| t } t j| d} t j| d }t j d }t |d }|j| }||}t|}Wd QRX|d jdd}tdd|D}||jkr|r||j||ddkr|d}n|d}i}|j|<}t|d&}x|D]}|d}|||<q:WWd QRXWd QRXt j| d}t j| d}t j| dd}t|d}d|_tj } g}!tj}"|"|_d |_zyx|jD]}#|#j}$t|$tr|$}%n |$jd }%|j |%r q||%}|dr|6jd;i}?|>sD|?r|jdd}@tjj>|@sft?d<|@|_x6|>j@D]*\}:}<|5jC||}|r:|!j.||5jD|!|d?||5St0k rxt'jEd@|jFYnXWd tGjH|"XWd QRXd S)Ba~ 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``. warnerlib_onlyFZbytecode_hashed_invalidationz%s-%sz%s.dataz %s.dist-inforrzutf-8r~Nz Wheel-Versionr)rcSsg|] }t|qSr8)r)rrr8r8r9rsz!Wheel.install..zRoot-Is-Purelibrrr)streamrr2r)dry_runTr%zsize mismatch for %s=zdigest mismatch for %szlib_only: skipping %sz.exer;posixirzdigest mismatch on write for %sz.py)Zhashed_invalidationzByte-compilation failed)exc_infozlib_only: returning Nonez1.0zentry_points.txtconsoleguiz %s_scriptszwrap_%sz%s:%sz [%s],zAUnable to read legacy script metadata, so cannot generate scriptsrHzpython.commandsz8Unable to read JSON metadata, so cannot generate scriptsZ wrap_consoleZwrap_guizValid script path not specifiedz%s = %slibprefixzinstallation failed.)r r )Irrr?rOr6rnrqrorprrrrrrrrvrrrrrecordrRdont_write_bytecodetempfilemkdtemp source_dir target_dirinfolist isinstancer rrstr file_sizerrr startswithrrrr copy_streamchmod external_attrr5 byte_compile Exceptionwarningbasenamemakeset_executable_modeextendrzrvaluesr suffixflagsjsonloadrritemsr rZwrite_shared_locationsZwrite_installed_files exceptionrollbackshutilrmtree)CrDrmakerkwargsrrrZbc_hashed_invalidationrGrrr metadata_namewheel_metadata_name record_namerrbwfrrrrrrrreaderrrZdata_pfxZinfo_pfxZ script_pfxfileopZbcoutfilesworkdirzinfor u_arcnamekindvaluerr(rZ is_scriptwhereroutfileZ newdigestZpycrZworknamer filenamesdistcommandsepZepdatarrKr,rLsconsole_scripts gui_scriptsZ script_dirscriptoptionsr8r8r9installsJ             "                                          z Wheel.installcCs8tdkr4tjjttddtjdd}t|atS)Nz dylib-cachez%s.%sr%) cacher?rOr6rrrR version_infor)rDrr8r8r9_get_dylib_caches zWheel._get_dylib_cachecCsltjj|j|j}d|j|jf}d|}tj|d}tj d}g}t |d}y|j |}||} t j | } |j} | j|} tjj| j| } tjj| stj| x| jD]\}}tjj| t|}tjj|sd}n6tj|j}tjj|}|j|}tj|j}||k}|r(|j|| |j||fqWWdQRXWntk r\YnXWdQRX|S)Nz%s-%sz %s.dist-infoZ EXTENSIONSzutf-8r~T)r?rOr6rnrqrorprrrrrr&r'rI prefix_to_dirrrmakedirsr(rr|statst_mtimedatetime fromtimestampgetinfo date_timeextractr5r)rDrGrrrrrPrrrrHrGr Z cache_baserordestrRZ file_timerzZ wheel_timer8r8r9_get_extensionss>              zWheel._get_extensionscCst|S)zM Determine if a wheel is compatible with the running system. ) is_compatible)rDr8r8r9rUszWheel.is_compatiblecCsdS)zP Determine if a wheel is asserted as mountable by its metadata. Tr8)rDr8r8r9 is_mountableszWheel.is_mountablecCstjjtjj|j|j}|js2d|}t||jsJd|}t||t jkrbt j d|nN|rtt jj |nt jj d||j}|rtt jkrt jj ttj||dS)Nz)Wheel %s not compatible with this Python.z$Wheel %s is marked as not mountable.z%s already in pathr)r?rOrxr6rnrqrUrrVrRrrr5insertrT_hook meta_pathrI)rDr5rGmsgrHr8r8r9mounts"   z Wheel.mountcCsrtjjtjj|j|j}|tjkr2tjd|n.)rrr;z..zinvalid entry in wheel: %rr%zsize mismatch for %srzdigest mismatch for %s)r?rOr6rnrqrorprrrrrrrrvrrrrr rrrrrrr)rDrGrrrr/r0r1rrr2rrrrrrr3rrr7rr8r9r:rr(rr8r8r9rysV                 z Wheel.verifycKsdd}dd}tjj|j|j}d|j|jf}d|}tj|d} t} t |d} i} xt| j D]h} | j}t |t r|}n |j d }|| krqjd |krtd || j| | tjj| t|}|| |<qjWWd QRX|| |\}}|| f|}|r|| |\}}|r(||kr(||||d krRtjd d| d\}}tj|n*tjj|sltd|tjj||j}t| j}tjj| |}||f}|j|| ||j|||d krtj||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)rO)rr rp)path_maprrprOrr8r8r9 get_version`s  z!Wheel.update..get_versionc Ssd}y|t|}|jd}|dkr*d|}nTdd||ddjdD}|dd7<d|d|djd d |Df}Wn tk rtjd |YnX|rt|d }||_|j t }|j ||d tjd||dS)Nr'rz%s+1cSsg|] }t|qSr8)r)rrAr8r8r9rrsz8Wheel.update..update_version..rr)z%s+%scss|]}t|VqdS)N)r)rrr8r8r9 usz7Wheel.update..update_version..z0Cannot update non-compliant (PEP-440) version %r)rO)rOlegacyzVersion updated from %r to %rr) rrrvr6rrrr rprrr)rprOupdatedrLrr7Zmdr`r8r8r9update_versionjs(       z$Wheel.update..update_versionz%s-%sz %s.dist-inforr~zutf-8z..zinvalid entry in wheel: %rNz.whlz wheel-update-)r$r dirzNot a directory: %r)r?rOr6rnrqrorprrrrrr rrrRrrmkstempcloserrr(rrr+copyfile)rDmodifierdest_dirr.r^rbrGrrr1r6rr]r7rr8rOZoriginal_versionr(modifiedZcurrent_versionfdnewpathrrrzr8r8r9rFOsX                z Wheel.update)rr)NFF)N)NN)F)N)r\r]r^__doc__rrrEpropertyrqr|r}rrrrzrrrrrrrrFrIrTrUrVr[r\ryrFr8r8r8r9r_s6 )       tn "  8r_cCs^ddl}|j}g}|ddkrZx0|djdD]}|j|jrHt|ndq0Wt|}|S)Nrglibcrr))platformlibc_verrvr5isdigitrr)roverrPrAr8r8r9_get_glibc_versions rsc Cstg}td}x6ttjdddd D]}|jdj|t|gq&Wg}x6tjD]*\}}}|j drT|j|j dddqTW|j t dkr|j dt |jdg}tg}tjdkrtjd t}|r|j\} }}} t|}| g} | d!kr| jd | d"kr| jd| d#kr*| jd| d$kr>| jd| d%krR| jdxL|dkrx2| D]*} d| ||| f} | tkrd|j| qdW|d8}qTWx.|D]$}x|D]} |jdjt|df|| f|dkrtjj dr| jdd} t}t|dkr|d&kr>|jdjt|df|d| f|d'krj|jdjt|df|d| f|d(kr|jdjt|df|d| f|jdjt|df|d|d|d| ffqWqWxXt|D]L\}}|jdjt|fddf|dkr|jdjt|dfddfqWxXt|D]L\}}|jdjd|fddf|dkr6|jdjd|dfddfq6Wt|S))zG Return (pyver, abi, arch) tuples compatible with this Python. rrr2z.abir)r%radarwinz(\w+)_(\d+)_(\d+)_(\w+)$i386ppcfatx86_64Zfat3ppc64fat64intel universalz %s_%s_%s_%slinuxZlinux_z manylinux1_%s zmanylinux2010_%szmanylinux2014_%szmanylinux_%s_%s_%srbr&rr)rurv)rurvrx)ryrx)rurx)rurxr{rvry)r%r~)r%r)r%r)r3rangerRrHr5r6rrU get_suffixesrrvsortrrWrrorertrr IMP_PREFIXr>rsrYrset)versionsmajorminorabisr$r(rParchesr.rorlmatchesrtrArkr7rrpr8r8r9compatible_tagss                          $ $rcCs^t|tst|}d}|dkr"t}x6|D].\}}}||jkr(||jkr(||jkr(d}Pq(W|S)NFT)rr_COMPATIBLE_TAGSrjrkrl)wheelr}rPrrrkrlr8r8r9rUs rU)N)U __future__rrrrNemailrrrUr&loggingr?rrr+rRrrr2rrcompatrrr r r Zdatabaser rr rrrutilrrrrrrrrrrrprr getLoggerr\rrGhasattrrrorr4r3rHrirr>rrrvr:compile IGNORECASEVERBOSErwrsrrrrr@robjectrArXr_rsrrrUr8r8r8r9s   0          #1 P