3 igŘ@sdZddlmZddlZddlmZddlZddlZddlZddl m Z m Z ddl m Z mZmZddlmZdd lmZmZdd lmZmZejeZGd d d e ZGd dde ZGddde ZGddde ZdddgZdZ dZ!ej"dZ#ej"dZ$dKZ%dLZ&dMZ'dNZ(dOZ)dPZ*dQZ+e*dRZ,dSZ-e.Z/e/j0e%e/j0e&e/j0e(e/j0e*e/j0e,ej"d9Z1d:d;Z2dd?e/DZ4d@d?e4j5DZ6dTZ7dUZ8dVZ9dWZ:dXZ;dYZZ?ej"dAZ@d[dCdDZAGdEdFdFe>ZBdGZCdHZDdIZEGdJdde>ZFdS)\zImplementation of the Metadata for Python packages PEPs. Supports all metadata formats (1.0, 1.1, 1.2, 1.3/2.1 and withdrawn 2.0). )unicode_literalsN)message_from_file)DistlibException __version__)StringIO string_types text_type) interpret)extract_by_key get_extras) get_schemePEP440_VERSION_REc@seZdZdZdS)MetadataMissingErrorzA required metadata is missingN)__name__ __module__ __qualname____doc__rr;/tmp/pip-build-88gy_88q/pip/pip/_vendor/distlib/metadata.pyrsrc@seZdZdZdS)MetadataConflictErrorz>Attempt to read or write metadata fields that are conflictual.N)rrrrrrrrr src@seZdZdZdS) MetadataUnrecognizedVersionErrorz Unknown metadata version number.N)rrrrrrrrr$src@seZdZdZdS)MetadataInvalidErrorzA metadata value is invalidN)rrrrrrrrr(srMetadataPKG_INFO_ENCODINGPKG_INFO_PREFERRED_VERSIONzutf-8z1.1z \|z Metadata-VersionNameVersionPlatformSummary DescriptionKeywords Home-pageAuthor Author-emailLicenseSupported-Platform Classifier Download-URL ObsoletesProvidesRequires MaintainerMaintainer-emailObsoletes-Dist Project-URL Provides-Dist Requires-DistRequires-PythonRequires-ExternalPrivate-Version Obsoleted-BySetup-Requires-Dist ExtensionProvides-ExtraDescription-Content-Typez"extra\s*==\s*("([^"]+)"|'([^']+)')cCsZ|dkr tS|dkrtS|dkr$tS|d krBttddtDS|dkrNtSt|dS) Nz1.0z1.1z1.21.32.1css|]}|tkr|VqdS)N) _345_FIELDS).0frrr zsz%_version2fieldlist..z2.0)r;r<) _241_FIELDS _314_FIELDSr=tuple _566_FIELDS _426_FIELDSr)versionrrr_version2fieldlistqsrGc CsRdd}g}x.|jD]"\}}|gddfkr.q|j|qWddddd d g}x|D]}|tkr~d|kr~|jdtjd ||tkrd|kr|jdtjd ||tkrd|kr|jdtjd ||tkrd|kr|jdtjd||tkod |kr"|dkr"|jd tjd||t krTd |krT|jd tjd|qTWt |dkrb|dSt |dkrtjd|t dd|ko||t }d|ko||t }d |ko||t}d |ko||t} t|t|t|t| dkrt d| r0| r0| r0| r0t|kr0tS|r:dS|rDdS|rNd Sd S)z5Detect the best version depending on the fields used.cSsx|D]}||krdSqWdS)NTFr)keysmarkersmarkerrrr _has_markers z"_best_version.._has_markerUNKNOWNNz1.0z1.1z1.2z1.3z2.0z2.1zRemoved 1.0 due to %szRemoved 1.1 due to %szRemoved 1.2 due to %szRemoved 1.3 due to %sr!zRemoved 2.1 due to %szRemoved 2.0 due to %srrz)Out of options - unknown metadata set: %szUnknown metadata setz,You used incompatible 1.1/1.2/2.0/2.1 fields)itemsappendrAremoveloggerdebugrBr=rDrElenr _314_MARKERS _345_MARKERS _566_MARKERS _426_MARKERSintr) fieldsrKrHkeyvalueZpossible_versionsZis_1_1Zis_1_2Zis_2_1Zis_2_0rrr _best_versions`              &  r[cCsi|]}||jjddqS)-_)lowerreplace)r>namerrr sracCsi|]\}}||qSrr)r>attrfieldrrrrasz[^A-Za-z0-9.]+FcCs0|r$tjd|}tjd|jdd}d||fS)zhReturn the distribution name with version. If for_filename is true, return a filename-escaped form.r\ .z%s-%s) _FILESAFEsubr_)r`rFZ for_filenamerrr_get_name_and_versions rhc@s eZdZdZd?ddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZd@ddZddZdd Zd!d"Zd#d$ZdAd%d&ZdBd'd(ZdCd)d*Zd+d,Zefd-d.ZdDd/d0ZdEd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Z d=d>Z!dS)FLegacyMetadataaoThe legacy metadata of a release. Supports versions 1.0, 1.1, 1.2, 2.0 and 1.3/2.1 (auto-detected). You can instantiate the class with one of these arguments (or none): - *path*, the path to a metadata file - *fileobj* give a file-like object with metadata as content - *mapping* is a dict-like object - *scheme* is a version scheme name NdefaultcCsz|||gjddkrtdi|_g|_d|_||_|dk rH|j|n.|dk r\|j|n|dk rv|j||j dS)Nz'path, fileobj and mapping are exclusive) count TypeError_fieldsZrequires_files _dependenciesschemeread read_fileupdateset_metadata_version)selfpathfileobjmappingrprrr__init__s   zLegacyMetadata.__init__cCst|j|jd<dS)NzMetadata-Version)r[rn)rurrrrt sz#LegacyMetadata.set_metadata_versioncCs|jd||fdS)Nz%s: %s )write)rurwr`rZrrr _write_field szLegacyMetadata._write_fieldcCs |j|S)N)get)rur`rrr __getitem__szLegacyMetadata.__getitem__cCs |j||S)N)set)rur`rZrrr __setitem__szLegacyMetadata.__setitem__c Cs8|j|}y |j|=Wntk r2t|YnXdS)N) _convert_namernKeyError)rur` field_namerrr __delitem__s   zLegacyMetadata.__delitem__cCs||jkp|j||jkS)N)rnr)rur`rrr __contains__s zLegacyMetadata.__contains__cCs(|tkr |S|jddj}tj||S)Nr\r]) _ALL_FIELDSr_r^ _ATTR2FIELDr|)rur`rrrr!szLegacyMetadata._convert_namecCs|tks|tkrgSdS)NrL) _LISTFIELDS_ELEMENTSFIELD)rur`rrr_default_value'szLegacyMetadata._default_valuecCs&|jdkrtjd|Stjd|SdS)N1.01.1 )rr)metadata_version_LINE_PREFIX_PRE_1_2rg_LINE_PREFIX_1_2)rurZrrr_remove_line_prefix,s  z"LegacyMetadata._remove_line_prefixcCs|tkr||St|dS)N)rAttributeError)rur`rrr __getattr__2szLegacyMetadata.__getattr__FcCst|d|d|S)zhReturn the distribution name with version. If filesafe is true, return a filename-escaped form.rr)rh)ruZfilesaferrr get_fullname=szLegacyMetadata.get_fullnamecCs|j|}|tkS)z+return True if name is a valid metadata key)rr)rur`rrris_fieldCs zLegacyMetadata.is_fieldcCs|j|}|tkS)N)rr)rur`rrris_multi_fieldHs zLegacyMetadata.is_multi_fieldc Cs.tj|ddd}z|j|Wd|jXdS)z*Read the metadata values from a file path.rzutf-8)encodingN)codecsopenrrclose)rufilepathfprrrrqLszLegacyMetadata.readcCst|}|d|jd<xxtD]p}||kr*q|tkrh|j|}|tkrZ|dk rZdd|D}|j||q||}|dk r|dkr|j||qW|j}|r|n|d|d<dS)z,Read the metadata values from a file object.zmetadata-versionzMetadata-VersionNcSsg|]}t|jdqS),)rCsplit)r>rZrrr asz,LegacyMetadata.read_file..rLr!)rrnrrget_all_LISTTUPLEFIELDSr~ get_payload)ruZfileobmsgrcvaluesrZbodyrrrrrTs  zLegacyMetadata.read_filec Cs0tj|ddd}z|j||Wd|jXdS)z&Write the metadata fields to filepath.wzutf-8)rN)rr write_filer)rur skip_unknownrrrrrzpszLegacyMetadata.writecCs|jxt|dD]}|j|}|r:|dgdgfkr:q|tkrX|j||dj|q|tkr|dkr|jd kr|jdd}n |jdd }|g}|t krd d |D}x|D]}|j|||qWqWd S)z0Write the PKG-INFO format data to a file object.zMetadata-VersionrLrr!1.01.1rz z |cSsg|]}dj|qS)r)join)r>rZrrrrsz-LegacyMetadata.write_file..N)rr) rtrGr|rr{rrrr_r)ru fileobjectrrcrrZrrrrxs$    zLegacyMetadata.write_filec sfdd}|snHt|dr>x<|jD]}||||q&Wnx|D]\}}|||qDW|r~x|jD]\}}|||qhWdS)aSet metadata values from the given iterable `other` and kwargs. Behavior is like `dict.update`: If `other` has a ``keys`` method, they are looped over and ``self[key]`` is assigned ``other[key]``. Else, ``other`` is an iterable of ``(key, value)`` iterables. Keys that don't match a metadata field or that have an empty value are dropped. cs"|tkr|rjj||dS)N)rr~r)rYrZ)rurr_sets z#LegacyMetadata.update.._setrHN)hasattrrHrM)ruotherkwargsrkvr)rurrss  zLegacyMetadata.updatecCsn|j|}|tks|dkrPt|ttf rPt|trJdd|jdD}q~g}n.|tkr~t|ttf r~t|trz|g}ng}tj t j rB|d}t |j }|tkr|dk rx|D](}|j|jddstjd |||qWn`|tko|dk r|j|sBtjd |||n0|tkrB|dk rB|j|sBtjd ||||tkr`|d kr`|j|}||j|<dS) z"Control then set a metadata field.rcSsg|] }|jqSr)strip)r>rrrrrsz&LegacyMetadata.set..rrN;rz$'%s': '%s' is not valid (field '%s')z.'%s': '%s' is not a valid version (field '%s')r!)rr isinstancelistrCrrrrP isEnabledForloggingWARNINGr rp_PREDICATE_FIELDSis_valid_matcherwarning_VERSIONS_FIELDSis_valid_constraint_list_VERSION_FIELDSis_valid_version_UNICODEFIELDSrrn)rur`rZ project_namerprrrrr~s@            zLegacyMetadata.setcCs|j|}||jkr*|tkr&|j|}|S|tkr@|j|}|S|tkr|j|}|dkr^gSg}x6|D].}|tkr|j|qh|j|d|dfqhW|S|tkr|j|}t |t r|j dS|j|S)zGet a metadata field.Nrrr) rrn_MISSINGrrrrrNrrrr)rur`rjrZresvalrrrr|s.          zLegacyMetadata.getc s |jgg}}xd D]}||kr|j|qW|rT|gkrTddj|}t|xdD]}||krZ|j|qZW|ddkr||fSt|jfd d }xdt|ftjft j ffD]F\}}x<|D]4} |j | d } | d k o||  r|jd | | fqWqW||fS)zkCheck if the metadata is compliant. If strict is True then raise if no Name or Version are providedrrzmissing required metadata: %sz, Home-pager$zMetadata-Versionz1.2cs*x$|D]}j|jddsdSqWdS)NrrFT)rr)rZr)rprrare_valid_constraintss z3LegacyMetadata.check..are_valid_constraintsNzWrong value for '%s': %s)rr)rr$) rtrNrrr rprrrrrr|) rustrictmissingwarningsrbrrrX controllerrcrZr)rprchecks2         zLegacyMetadata.checkcCsn|jt|d}i}xP|D]H}| s2||jkrt|}|dkrP||||<qdd||D||<qW|S)aReturn fields as a dict. Field names will be converted to use the underscore-lowercase style instead of hyphen-mixed case (i.e. home_page instead of Home-page). This is as per https://www.python.org/dev/peps/pep-0566/#id17. zMetadata-VersionZ project_urlcSsg|]}dj|qS)r)r)r>urrrr5sz)LegacyMetadata.todict..)rtrGrn _FIELD2ATTR)ruZ skip_missingrXdatarrYrrrtodict"s  zLegacyMetadata.todictcCs<|ddkr(xdD]}||kr||=qW|d|7<dS)NzMetadata-Versionz1.1r*r,r+z Requires-Dist)r*r,r+r)ru requirementsrcrrradd_requirements9s    zLegacyMetadata.add_requirementscCstt|dS)NzMetadata-Version)rrG)rurrrrHDszLegacyMetadata.keysccsx|jD] }|Vq WdS)N)rH)rurYrrr__iter__GszLegacyMetadata.__iter__csfddjDS)Ncsg|] }|qSrr)r>rY)rurrrLsz)LegacyMetadata.values..)rH)rur)rurrKszLegacyMetadata.valuescsfddjDS)Ncsg|]}||fqSrr)r>rY)rurrrOsz(LegacyMetadata.items..)rH)rur)rurrMNszLegacyMetadata.itemscCsd|jj|j|jfS)Nz <%s %s %s>) __class__rr`rF)rurrr__repr__Qs zLegacyMetadata.__repr__)NNNrj)F)F)F)N)F)F)"rrrrryrtr{r}rrrrrrrrrrrqrrrzrrsr~rr|rrrrHrrrMrrrrrris>      ,  ,  riz pydist.jsonz metadata.jsonMETADATAc@seZdZdZejdZejdejZe Z ejdZ dZ de ZffdVdZd Zd ZeffedWfe dXfe dYfd ZdZZd[ddZed\ZdefZdefZdefdefeeedefeeeedefd]d^d Z[[dd Zd_d!d"Zd#d$Zed%d&Z ed'd(Z!e!j"d)d(Z!d`d*d+Z#ed,d-Z$ed.d/Z%e%j"d0d/Z%d1d2Z&d3d4Z'd5d6Z(d7d8Z)dd9dd:dad=dd>d?d@dbdDdcdGdddIdJddedi Z*dLdMZ+dfdPdQZ,dRdSZ-dTdUZ.dS)grz The metadata of a release. This implementation uses 2.0 (JSON) metadata where possible. If not possible, it wraps a LegacyMetadata instance which handles the key-value metadata format. z ^\d+(\.\d+)*$z!^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$z .{1,2047}z2.0z distlib (%s)legacy)r`rFsummaryzqname version license summary description author author_email keywords platform home_page classifiers download_urlzwextras run_requires test_requires build_requires dev_requires provides meta_requires obsoleted_by supports_environments)rr`rFr_legacy_datarpNrjcCs0|||gjddkrtdd|_d|_||_|dk rzy|j||||_Wn*tk rvt||d|_|jYnXnd}|rt |d}|j }WdQRXn |r|j }|dkr|j |j d|_ndt |ts|jd}ytj||_|j|j|Wn0tk r*tt||d|_|jYnXdS)Nrkz'path, fileobj and mapping are exclusive)rxrprb)r generatorzutf-8)rwrp)rlrmrrrp_validate_mappingrrivalidaterrqMETADATA_VERSION GENERATORrr decodejsonloads ValueErrorr)rurvrwrxrprr?rrrrys<       zMetadata.__init__r`rFlicensekeywordsrz Requires-DistzSetup-Requires-DistzProvides-Extrar( Download-URLMetadata-Version) run_requiresbuild_requires dev_requiresZ test_requires meta_requiresextrasmodules namespacesexportscommands classifiers source_urlrc CsZtj|d}tj|d}||kr||\}}|jr^|dkrP|dkrHdn|}n |jj|}n|dkrjdn|}|d kr|jj||}nt}|}|jjd} | r |dkr| jd |}nR|dkr| jd } | r| j||}n.| jd } | s|jjd } | r | j||}||krV|}n:||kr4tj||}n"|jrJ|jj|}n |jj|}|S) N common_keys mapped_keysrrrrr extensionszpython.commandszpython.detailszpython.exports)rrrrr)object__getattribute__rr|r) rurYcommonmappedlkmakerresultrZsentineldrrrrsF            zMetadata.__getattribute__cCsH||jkrD|j|\}}|p |j|krD|j|}|sDtd||fdS)Nz.'%s' is an invalid value for the '%s' property)SYNTAX_VALIDATORSrpmatchr)rurYrZrppattern exclusionsmrrr_validate_values  zMetadata._validate_valuecCs*|j||tj|d}tj|d}||kr||\}}|jrV|dkrJt||j|<nf|d krj||j|<nR|jjdi}|dkr||d <n2|dkr|jd i}|||<n|jd i}|||<nh||krtj|||nP|d krt|t r|j }|r|j }ng}|jr||j|<n ||j|<dS)Nrrrrrrrrzpython.commandszpython.detailszpython.exportsr)rrrrr) rrrrNotImplementedErrorr setdefault __setattr__rrrr)rurYrZrrrr]rrrrrs>               zMetadata.__setattr__cCst|j|jdS)NT)rhr`rF)rurrrname_and_version%szMetadata.name_and_versioncCsF|jr|jd}n|jjdg}d|j|jf}||krB|j||S)Nz Provides-Distprovidesz%s (%s))rrrr`rFrN)rursrrrr )s  zMetadata.providescCs |jr||jd<n ||jd<dS)Nz Provides-Distr )rr)rurZrrrr 4s c Cs|jr |}ng}t|pg|j}xl|D]d}d|kr@d|kr@d}n8d|krNd}n|jd|k}|rx|jd}|rxt||}|r&|j|dq&WxNd D]F}d|} | |kr|j| |jjd |g}|j|j|||d qW|S) a Base method to get dependencies, given a set of extras to satisfy and an optional environment context. :param reqts: A list of sometimes-wanted dependencies, perhaps dependent on extras and environment. :param extras: A list of optional components being requested. :param env: An optional environment for marker evaluation. extra environmentTrequiresbuilddevtestz:%s:z %s_requires)renv)rrr) rr rr|r extendrOrget_requirements) rureqtsrrrrincluderJrYerrrr;s0       zMetadata.get_requirementscCs|jr|jS|jS)N)r _from_legacyr)rurrr dictionaryeszMetadata.dictionarycCs|jr tnt|j|jSdS)N)rrr rDEPENDENCY_KEYS)rurrr dependencieskszMetadata.dependenciescCs|jr tn |jj|dS)N)rrrrs)rurZrrrrrsc Cs|jd|jkrtg}x0|jjD]"\}}||kr&||kr&|j|q&W|rfddj|}t|x"|jD]\}}|j|||qpWdS)NrzMissing metadata items: %sz, ) r|rrMANDATORY_KEYSrMrNrrr) rurxrprrYrrrrrrrryszMetadata._validate_mappingcCsB|jr.|jjd\}}|s|r>tjd||n|j|j|jdS)NTz#Metadata: missing: %s, warnings: %s)rrrPrrrrp)rurrrrrrs  zMetadata.validatecCs(|jr|jjdSt|j|j}|SdS)NT)rrr r INDEX_KEYS)rurrrrrs zMetadata.todictc Cs|jr|j st|j|jd}|jjd}x2dD]*}||kr2|dkrLd }n|}||||<q2W|jd g}|d gkrzg}||d <d}x2|D]*\}}||kr||rd||ig||<qW|j|d<i}i} |S)N)rrTr`rFrr description classifierrr"r requires_distrsetup_requires_distrrr )r`rFrrrrr!rr"r)r#r$)rrAssertionErrorrrrr|r ) rurZlmdrnkkwrHokauthor maintainerrrrrs0     zMetadata._from_legacyrrrpython.detailsr&r rr!python.project project_urlsHomez Home-pagecontactsrr$emailz Author-emailrrc Csdd}|jr|j stt}|j}x|jjD]v\}}t|tsZ||kr||||<q2|}d}x8|D]0}y ||}Wqhtt fk rd}PYqhXqhW|r2|||<q2W||j |j } ||j |j } |jrt|j|d<t| |d<t| |d<|S)NcSst}x|D]}|jd}|jd}|d}xb|D]Z}| rN| rN|j|q2d}|r^d|}|rx|rtd||f}n|}|jdj||fq2Wq W|S)Nr r rr z extra == "%s"z (%s) and %sr)r~r|addr)entriesrrr rZrlistrrJrrrprocess_entriess"      z,Metadata._to_legacy..process_entriesTFzProvides-Extraz Requires-DistzSetup-Requires-Dist)rrr%riLEGACY_MAPPINGrMrrCr IndexErrorrrrrrsorted) rur3rZnmdr&r(rfoundrZr1Zr2rrr _to_legacys2       zMetadata._to_legacyFTcCs||gjddkrtd|j|r`|jr4|j}n|j}|rP|j||dq|j||dn^|jrp|j}n|j}|rt j ||ddddn.t j |dd}t j ||ddddWdQRXdS) Nrz)Exactly one of path and fileobj is needed)rTrk) ensure_asciiindent sort_keysrzutf-8) rlrrrr8rzrrrrdumprr)rurvrwrrZ legacy_mdrr?rrrrzs&    zMetadata.writecCs|jr|jj|nt|jjdg}d}x"|D]}d|kr,d|kr,|}Pq,W|dkrhd|i}|jd|n t|dt|B}t||d<dS)Nrr r rr)rrrrinsertr~r6)rurralwaysentryZrsetrrrr s zMetadata.add_requirementscCs*|jpd}|jpd}d|jj|j||fS)Nz (no name)z no versionz<%s %s %s (%s)>)r`rFrrr)rur`rFrrrrs  zMetadata.__repr__)r)r)r)r)rrrp)NNNrj)r`rFrrr)rN)rN)N)NN)rr+r)rr,r-r.)rr,r/rr`)rr,r/rr0)rr+r)NNFT)/rrrrrecompileZMETADATA_VERSION_MATCHERIZ NAME_MATCHERrZVERSION_MATCHERZSUMMARY_MATCHERrrrrrrr __slots__ryr~rrZ none_listdictZ none_dictrrrrpropertyr r setterrrrrrrrr4r8rzrrrrrrr[s    ,+ '   *   2 ) rrrrr r!r"r#r$r%r&)rrrrr'r r!r"r#r$r%r&r(r)r*r+r,)r*r+r,r(r))rrrrr'r r!r"r#r$r%r-r.r&r(r)r/r0r1r2r3r4)r1r2r3r/r4r-r.r0)rrrrr'r r!r"r#r$r%r-r.r&r(r)r/r0r1r2r3r4r5r6r7r8r9)r5r9r6r7r8)r:r,r+r*)r:)r2r/r1)r3)r)rr(r*r,r+r/r1r2r4r0r'r7r9r8)r0)r")r$r-r r!)F)Gr __future__rrr0rrrr@r rrcompatrrr rIr utilr r rFr r getLoggerrrPrrrr__all__rrrArrrArBrSr=rTrErVrDrUr~rrsZEXTRA_RErGr[rrMrrrrrrrrrrrfrhriZMETADATA_FILENAMEZWHEEL_METADATA_FILENAMEZLEGACY_METADATA_FILENAMErrrrr s             I  j