U 淀g˫@sddlmZddlZddlZddlZddlmZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlmZmZddlmZmZmZmZmZddlmZddlmZmZmZdd 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 .e/Z0da1e2ed r,d Z3n*ej45d r@dZ3nej4dkrRdZ3ndZ3e6dZ7e7sxdej8ddZ7de7Z9e3e7Z:e*;dd;ddZddZ=nddZ?e?Z=[?e @de jAe jBBZCe @de jAe jBBZDe @dZEe @d ZFd!ZGd"ZHe jId#kr[^-]+) -(?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|SNr?or?r?r@frFcCs|tjdS)NrB)replaceosseprDr?r?r@rFhrGr,cCs"trddtDStjjSdS)NcSsg|] }|dqS)rr?.0sr?r?r@ tsz!_get_suffixes..)impZ get_suffixes importlib machineryEXTENSION_SUFFIXESr?r?r?r@ _get_suffixesrsrScCsHtrt||Stj||}tj|}|tj|<|j ||SdSrC) rOZ load_dynamicrPutilspec_from_file_locationmodule_from_specr8modulesloader exec_module)namepathspecmoduler?r?r@ _load_dynamicys    r^c@s6eZdZddZddZddZd dd Zd d ZdS) MountercCsi|_i|_dSrC) impure_wheelslibsselfr?r?r@__init__szMounter.__init__cCs||j|<|j|dSrC)r`raupdate)rcpathname extensionsr?r?r@adds z Mounter.addcCs0|j|}|D]\}}||jkr|j|=qdSrC)r`popra)rcrfrgkvr?r?r@removes   zMounter.removeNcCs||jkr|}nd}|SrC)ra)rcfullnamer[resultr?r?r@ find_modules zMounter.find_modulecCsh|tjkrtj|}nN||jkr,td|t||j|}||_|dd}t|dkrd|d|_|S)Nzunable to find extension for %sr(rr) r8rWra ImportErrorr^ __loader__rsplitlen __package__)rcrmrnr<r?r?r@ load_modules       zMounter.load_module)N)__name__ __module__ __qualname__rdrhrlrorur?r?r?r@r_s  r_c@seZdZdZdZdZd4ddZedd Zed d Z ed d Z e ddZ ddZ e ddZddZd5ddZddZddZddZd6ddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd7d,d-Zd.d/Zd0d1Zd8d2d3ZdS)9Wheelz@ Class to build and install from Wheel files (PEP 427). )rrsha256NFcCs8||_||_d|_tg|_dg|_dg|_t|_ |dkrRd|_ d|_ |j |_ nt|}|r|d}|d|_ |dd d |_ |d |_|j |_ ntj|\}}t|}|std ||rtj||_ ||_ |d}|d|_ |d|_ |d |_|d d|_|dd|_|dd|_dS)zB Initialise an instance using a (valid) filename. r3noneanyNdummyz0.1nmZvnr'r&ZbnzInvalid name or filename: %rr%r(Zbiar)signZ should_verifybuildverPYVERpyverabiarchrIgetcwddirnamerZversionfilename _filenameNAME_VERSION_REmatch groupdictrHr[split FILENAME_RErabspath)rcrrverifyr/inforr?r?r@rdsD            zWheel.__init__cCs^|jrd|j}nd}d|j}d|j}d|j}|jdd}d|j|||||fS)zJ Build and return a filename from the various components. r&r3r(r'z%s-%s%s-%s-%s-%s.whl)rr;rrrrrHrZ)rcrrrrrr?r?r@rs    zWheel.filenamecCstj|j|j}tj|SrC)rIr[r;rrisfile)rcr[r?r?r@existssz Wheel.existsccs4|jD](}|jD]}|jD]}|||fVqqqdSrC)rrr)rcrrrr?r?r@tagss   z Wheel.tagsc Cstj|j|j}d|j|jf}d|}td}t |d}| |t t g}d}|D]f}zLt ||} || ,} || } t| d}|rW5QRWqW5QRXWqZtk rYqZXqZ|stdd|W5QRX|S)N%s-%s %s.dist-infoutf-8r)fileobjz8Invalid wheel, because metadata is missing: looked in %sz, )rIr[r;rrrZrcodecs getreaderrget_wheel_metadatarr posixpathopenr KeyError ValueError) rcrfname_verinfo_dirwrapperzfZfnsrnfnmetadata_filenamebfwfr?r?r@metadatas.      zWheel.metadatac CsXd|j|jf}d|}t|d}||}td|}t|}W5QRXt|S)NrrWHEELr) rZrrr;rrrrdict)rcrrrrrrmessager?r?r@rs  zWheel.get_wheel_metadatac Cs6tj|j|j}t|d}||}W5QRX|S)Nr)rIr[r;rrrr)rcrfrrnr?r?r@r#s z Wheel.infoc Cst|}|r||}|d|||d}}d|krBt}nt}t|}|rfd|d}nd}||}||}nT|d}|d} |dks|| krd} n|||dd krd } nd} t| |}|S) Nspythonw rG  rr$s ) SHEBANG_RErendlowerSHEBANG_PYTHONWSHEBANG_PYTHONSHEBANG_DETAIL_REgroupsfind) rcdatar/rshebangZdata_after_shebangZshebang_pythonargscrlftermr?r?r@process_shebang*s,       zWheel.process_shebangcCsh|dkr|j}ztt|}Wn tk r<td|YnX||}t|d d}||fS)NzUnsupported hash algorithm: %r=ascii) hash_kindgetattrhashlibAttributeErrorrdigestbase64urlsafe_b64encoderstripdecode)rcrrZhasherrnr?r?r@get_hashHs zWheel.get_hashc CsDt|}||ddft|}|D]}||q&W5QRXdSNr3)listr6rwriterow)rcrecords record_pathZarchive_record_pathwriterrowr?r?r@ write_recordSs  zWheel.write_recordc Csg}|\}}|D]P\}}t|d} | } W5QRXd|| } tj|} ||| | fqtj|d}ttj|d}| ||||||fdS)Nrbz%s=%sRECORD) rreadrrIr[getsizer6r;to_posixr) rcrlibdir archive_pathsrdistinforappfrrsizer?r?r@ write_recordsZs   zWheel.write_recordsc CsFt|dtj.}|D]"\}}td|||||qW5QRXdS)NwzWrote %s to %s in wheel)rzipfile ZIP_DEFLATEDloggerdebugwrite)rcrfrrrrr?r?r@ build_zipjs zWheel.build_zipc" s|dkr i}ttfdddd}|dkrFd}tg}tg}tg}nd}tg}d g}d g}|d ||_|d ||_|d ||_ |} d|j |j f} d| } d| } g} dD]}|krq|}t j |rt |D]\}}}|D]}tt j ||}t j ||}tt j | ||}| ||f|dkr|dst|d}|}W5QRX||}t|d}||W5QRXqqq| }d}t |D]\}}}||kr t|D]8\}}t|}|drt j ||}||=qq|s td|D]H}t|dr(qt j ||}tt j ||}| ||fqqt |}|D]B}|dkrltt j ||}tt j | |}| ||fqld|p|jdtd|g}|jD] \}}}|d|||fqt j |d}t|d}|d |W5QRXtt j | d}| ||fd!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|kSrCr?rDpathsr?r@rFxrGzWheel.build..)purelibplatlibrrfalsetruer{r|rrrr%s.datar)rheadersscriptsr.exerwb .dist-infoz(.dist-info directory expected, not found)z.pycz.pyo)r INSTALLERZSHAREDrzWheel-Version: %d.%dzGenerator: distlib %szRoot-Is-Purelib: %sz Tag: %s-%s-%srr cSs*|d}|d}d|kr"|d7}||fS)NrrBri')count)trnr?r?r@sorters  zWheel.build..sorter)key)%rr IMPVERABIARCHrgetrrrrZrrIr[isdirwalkr r;relpathrr6endswithrrrr enumerateAssertionErrorlistdir wheel_versionrrsortedrrrr)"rcrrrZlibkeyis_pureZ default_pyverZ default_abiZ default_archrrdata_dirrrrr[rootdirsfilesrrrprrrridnwheel_metadatarrrrrfr?rr@buildps            z Wheel.buildcCs |dS)zl Determine whether an archive entry should be skipped when verifying or installing. )rBz /RECORD.jws)r)rcarcnamer?r?r@ skip_entryszWheel.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|}W5QRX|d d d}tdd|D}||jkr|r||j||ddkr|d}n|d}i}||8}t|d"}|D]}|d}|||<q8W5QRXW5QRXt | d}t | d}t | dd}t|d}d|_tj } g}!t}"|"|_d|_zz|D]}#|#j}$t|$t r|$}%n |$!d }%|"|%rq||%}|dr4t#|#j$|dkr4t%d|%|dr|ddd\}&}'||$}|&}(W5QRX|'|(|&\})}*|*|'krt%d|$|r|%(||frt)*d |%q|%(|o|%+d! }+|%(|r |%d"d\})},}-tj||,t,|-}.n$|%| |fkrqtj|t,|%}.|+s,||$}|-||.W5QRXtjd#krxt.|.|#j/d$?d%@|!0|.|s|drt|.d&4}|&}(|'|(|&\})}/|/|*krt%d'|.W5QRX| r|.+d(rz|j1|.|d)}0|!0|0Wn$t2k r(t)j3d*dd+YnXnttj4t,|$}1tj|"|1}2||$}|-||2W5QRXtj|.\}3}1|3|_|5|1}4|6|4|!7|4q|rt)*d,d}5ntd}6|j8d }|d-krt | d.}7z||7}t9|}8W5QRXi}6d/D]r}9d0|9}:|:|8kri|6d1|9<};|8|::D]<}?|d6}6|6r|6d7}6W5QRXWn t2k rt)3d8YnX|6r|6d9i}>|6d:i}?|>s0|?r|dd}@tj@|@sRtAd;|@|_|>BD]*\}:}<|5E||}|r|!0||5F|!|d?||5WW.zRoot-Is-Purelibrrrstreamrr3r)dry_runTNr$size mismatch for %s=digest mismatch for %szlib_only: skipping %srrBposixirzdigest mismatch on write for %sz.py)hashed_invalidationzByte-compilation failed)exc_infozlib_only: returning Nonez1.0zentry_points.txt)consoleguiz %s_scriptszwrap_%sz%s:%sz [%s],zAUnable to read legacy script metadata, so cannot generate scriptsrgzpython.commandsz8Unable to read JSON metadata, so cannot generate scriptsZ wrap_consoleZwrap_guizValid script path not specifiedz%s = %sr%libprefixzinstallation failed.)IrrrIr[r;rrrZrrrrrrrrrtuplerrrrecordr8dont_write_bytecodetempfilemkdtemp source_dir target_dirshutilrmtreeinfolist isinstancer rrstr file_sizerrr startswithrrrr copy_streamchmod external_attrr6 byte_compile Exceptionwarningbasenamemakeset_executable_modeextendrrvaluesr(suffixflagsjsonloadrritemsr rZwrite_shared_locationsZwrite_installed_files exceptionrollback)CrcrmakerkwargsrrrZbc_hashed_invalidationrfrr r metadata_namewheel_metadata_name record_namerrbwfrrZwvZ file_versionrrrreaderrrZdata_pfxZinfo_pfxZ script_pfxfileopbcZoutfilesworkdirzinfor u_arcnamekindvaluerr'rZ is_scriptwhereroutfileZ newdigestZpycrZworknamer filenamesdistcommandsepZepdatarrjr+rkrMconsole_scripts gui_scriptsZ script_dirscriptoptionsr?r?r@installsH                                                   z Wheel.installcCs8tdkr4tjttddtjdd}t|atS)Nz dylib-cachez%s.%sr$) cacherIr[r;rr4r8r9r)rcbaser?r?r@_get_dylib_caches$zWheel._get_dylib_cachec Csntj|j|j}d|j|jf}d|}t|d}t d}g}t |d}z| |}||} t | } |} | j|jdd} tj| j| } tj| st| | D]\}}tj| t|}tj|sd}n6t|j}tj|}||}tj|j}||k}|r,||| |||fqW5QRXWntk r^YnXW5QRX|S) NrrZ EXTENSIONSrrF)Z use_abspathT)rIr[r;rrrZrrrrrrrDrErd prefix_to_dirrcrmakedirsrFrrstatst_mtimedatetime fromtimestampgetinfo date_timeextractr6r)rcrfrrrrrnrrrrgrbr(Z cache_baserZrdestrmZ file_timerZ wheel_timer?r?r@_get_extensionss>            zWheel._get_extensionscCst|S)zM Determine if a wheel is compatible with the running system. ) is_compatiblerbr?r?r@rpszWheel.is_compatiblecCsdS)zP Determine if a wheel is asserted as mountable by its metadata. Tr?rbr?r?r@ is_mountableszWheel.is_mountablecCstjtj|j|j}|s2d|}t||sJd|}t||t jkrbt d|nN|rtt j |nt j d||}|rtt jkrt j tt||dS)Nz)Wheel %s not compatible with this Python.z$Wheel %s is marked as not mountable.z%s already in pathr)rIr[rr;rrrprrqr8rrr6insertro_hook meta_pathrh)rcr6rfmsgrgr?r?r@mounts"   z Wheel.mountcCsrtjtj|j|j}|tjkr2td|n.get_versioncSsd}z|t||d}|dkr*d|}nTdd||dddD}|dd7<d |d|dd d |Df}Wn tk rtd |YnX|rt|d }||_| t }|j ||dtd||dS)Nr&rz%s+1cSsg|] }t|qSr?rrKr?r?r@rNsz8Wheel.update..update_version..rr(rz%s+%scss|]}t|VqdSrC)r4rr?r?r@ sz7Wheel.update..update_version..z0Cannot update non-compliant (PEP-440) version %rrz)r[legacyzVersion updated from %r to %r) rrrr;rrrr rrrr)rr[updatedrr<mdr~r?r?r@update_versions&   (   z$Wheel.update..update_versionrrrrrrxryNz.whlz wheel-update-)rBr(dirzNot a directory: %r)rIr[r;rrrZrrrrr2r3r rrrmrr,mkstempcloserrrFrrr0copyfile)rcmodifierdest_dirrJr|rrfrrrMrRrr{rSrrTr[Zoriginal_versionr'modifiedcurrent_versionfdnewpathrrrr?r?r@remsV                z Wheel.update)NFF)N)NN)F)N)rvrwrx__doc__rrrdpropertyrrrrrrrrrrrrrrrardrorprqrvrwrrer?r?r?r@rys@ )        uj"  8rycCsZddl}|}g}|ddkrV|ddD]}||rFt|ndq.t|}|S)Nrglibcrr()platformlibc_verrr6isdigitrr))rverrnrMr?r?r@_get_glibc_versions rc sGdddfddttjjddD}g}tD]$}|dr6||ddd q6|t d krx| d t |d g}t g}tj d krlt d t }|rl|\}}}} t|}| g} | dkr| d| dkr| d| dkr| d| dkr| d| dkr&| d|d krl| D]*} d|||| f} | t kr4|| q4|d 8}q&t|D]l\} }t|}g}| d kr|}tdkr|jdkrdt|j}||kr|||D]}|D]} |dt|f|| f|d krtj dr| dd} t}t|dkr|dkr\|dt|f|d | f|d!kr|dt|f|d"| f|d#kr|dt|f|d$| f|dt|f|d%|d |d | ffqސqԐqtt|D]T\} }t|}|dt|fd d&f| d kr|dt|d fd d&fqt|D]T\} }t|}|dd'|fd d&f| d krJ|dd'|d fd d&fqJt|S)(zG Return (pyver, abi, arch) tuples compatible with this Python. c@seZdZddZddZdS)z!compatible_tags.._VersioncSs,||_||f|_dt|t|f|_dSr)major major_minorr;r4string)rcrminorr?r?r@rds z*compatible_tags.._Version.__init__cSs|jSrC)rrbr?r?r@__str__sz)compatible_tags.._Version.__str__N)rvrwrxrdrr?r?r?r@_Versionsrcsg|]}tjj|qSr?)r8r9r)rL minor_versionrr?r@rNsz#compatible_tags..rz.abir(r$rr{rdarwinz(\w+)_(\d+)_(\d+)_(\w+)$)i386ppcfat)rrx86_64Zfat3)ppc64rfat64)rrintel)rrrrr universalz %s_%s_%s_%sr")r,r$rr3linuxlinux_)r$z manylinux1_%s)r$ zmanylinux2010_%s)r$zmanylinux2014_%szmanylinux_%s_%s_%sr|r%)ranger8r9rrSr6r6rsortrrrrrrerrrrr4r7rrr;rHrrsset)versionsabisrBrnarchesr/rZrrrmatchesrrMrZversion_objectrZadd_abisZlimited_api_abirr<r?rr@compatible_tagss                          " "rcCs\t|tst|}d}|dkr"t}|D]0\}}}||jkr&||jkr&||jkr&d}qXq&|S)NFT)r3ryCOMPATIBLE_TAGSrrr)wheelrrnrrrr?r?r@rpBs rp)N)Y __future__rrrriemailrrrDloggingrIrrr0r8r,rr3rrcompatrrr r r Zdatabaser rr rrrTrrrrrrrrrrrrr getLoggerrvrrbhasattrr7rr6r5r4r9rrrHrrrrAcompile IGNORECASEVERBOSErrrrrrrJrrOZimportlib.machineryrPimportlib.utilrSr^objectr_rsryrrrrpr?r?r?r@s   0              %( c