U .e*@sdZddlmZddlZddlmZddlZddlZddlZddl m Z m Z ddl m Z mZmZddlmZdd lmZmZdd lmZmZeeZGd d d e ZGd dde ZGddde ZGddde ZdddgZdZ dZ!e"dZ#e"dZ$dZ%dZ&dZ'dZ(dZ)dZ*d Z+e*d!Z,d"Z-e.Z/e/0e%e/0e&e/0e(e/0e*e/0e,e"d#Z1d$d%Z2d&d'Z3d(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dd?d@dAdBdCdDdEdFZ4dGZ5dHZ6dIZ7dJZ8dKZ9dLZ:dMZ;e<Z=e"dNZ>dXdPdQZ?GdRdSdSe<Z@dTZAdUZBdVZCGdWdde<ZDdS)YzImplementation of the Metadata for Python packages PEPs. Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental). )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@/usr/lib/python3.8/site-packages/pip/_vendor/distlib/metadata.pyrsrc@seZdZdZdS)MetadataConflictErrorz>Attempt to read or write metadata fields that are conflictual.Nrrrrrr src@seZdZdZdS) MetadataUnrecognizedVersionErrorz Unknown metadata version number.Nrrrrrr$src@seZdZdZdS)MetadataInvalidErrorzA metadata value is invalidNrrrrrr(srMetadataPKG_INFO_ENCODINGPKG_INFO_PREFERRED_VERSIONutf-81.1z \| ) Metadata-VersionNameVersionPlatformSummary DescriptionKeywords Home-pageAuthor Author-emailLicense)r r!r"r#Supported-Platformr$r%r&r'r(r)r* Classifier Download-URL ObsoletesProvidesRequires)r.r/r0r,r-)r r!r"r#r+r$r%r&r'r(r) MaintainerMaintainer-emailr*r,r-Obsoletes-Dist Project-URL Provides-Dist Requires-DistRequires-PythonRequires-External)r5r6r7r3r8r1r2r4)r r!r"r#r+r$r%r&r'r(r)r1r2r*r,r-r3r4r5r6r7r8Private-Version Obsoleted-BySetup-Requires-Dist ExtensionProvides-Extra)r9r=r:r;r<)Description-Content-Typer0r/)r>z"extra\s*==\s*("([^"]+)"|'([^']+)')cCsL|dkr tS|dkrtS|dkr$tS|dkr4ttS|dkr@tSt|dS)N1.0r1.2)1.32.12.0) _241_FIELDS _314_FIELDS _345_FIELDS _566_FIELDS _426_FIELDSr)versionrrr_version2fieldlistpsrJc CsBdd}g}|D]"\}}|gddfkr,q||qddddd d g}|D]}|tkrvd|krv|dtd ||tkrd|kr|dtd ||tkrd|kr|dtd ||tkrd|kr|dtd||tkrd |kr|dkr|d td||t krLd |krL|d td|qLt |dkrZ|dSt |dkr|td|t dd|ko||t }d|ko||t }d |ko||t}d |ko||t} t|t|t|t| dkrt d|s |s |s | s t|kr tS|r*dS|r4dS|r>d Sd S)z5Detect the best version depending on the fields used.cSs|D]}||krdSqdS)NTFr)keysmarkersmarkerrrr _has_markersz"_best_version.._has_markerUNKNOWNNr?rr@rArCrBzRemoved 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)itemsappendrDremoveloggerdebugrErFrGrHlenr _314_MARKERS _345_MARKERS _566_MARKERS _426_MARKERSintr) fieldsrNrKkeyvalueZpossible_versionsZis_1_1Zis_1_2Zis_2_1Zis_2_0rrr _best_version~s`              & r^r r!r"r#r+r$r%r&r'r(r)r1r2r*r,r-r3r5r6r;r7r8r0r/r.r4r9r:r<r=)metadata_versionnamerIplatformZsupported_platformsummary descriptionkeywords home_pageauthor author_email maintainermaintainer_emaillicense classifier download_urlobsoletes_dist provides_dist requires_distsetup_requires_distrequires_pythonrequires_externalrequiresprovides obsoletes project_urlZprivate_versionZ obsoleted_by extensionZprovides_extra)r6r3r5)r7)r")r#r,r.r0r/r3r5r6r8r4r+r;r=r<)r4)r&)r(r1r$r%z[^A-Za-z0-9.]+FcCs0|r$td|}td|dd}d||fS)zhReturn the distribution name with version. If for_filename is true, return a filename-escaped form.- .z%s-%s) _FILESAFEsubreplace)r`rIZ for_filenamerrr_get_name_and_versions r~c@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)FLegacyMetadataaaThe legacy metadata of a release. Supports versions 1.0, 1.1 and 1.2 (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|||gddkrtdi|_g|_d|_||_|dk rH||n.|dk r\||n|dk rv||| dS)N'path, fileobj and mapping are exclusive) count TypeError_fieldsZrequires_filesZ _dependenciesschemeread read_fileupdateset_metadata_version)selfpathfileobjmappingrrrr__init__s   zLegacyMetadata.__init__cCst|j|jd<dSNr )r^rrrrrr"sz#LegacyMetadata.set_metadata_versioncCs|d||fdS)Nz%s: %s )write)rrr`r]rrr _write_field%szLegacyMetadata._write_fieldcCs ||SN)getrr`rrr __getitem__(szLegacyMetadata.__getitem__cCs |||Sr)set)rr`r]rrr __setitem__+szLegacyMetadata.__setitem__cCs8||}z |j|=Wntk r2t|YnXdSr) _convert_namerKeyError)rr` field_namerrr __delitem__.s   zLegacyMetadata.__delitem__cCs||jkp|||jkSr)rrrrrr __contains__5s zLegacyMetadata.__contains__cCs(|tkr |S|dd}t||S)Nrx_) _ALL_FIELDSr}lower _ATTR2FIELDrrrrrr9szLegacyMetadata._convert_namecCs|tks|tkrgSdS)NrO) _LISTFIELDS_ELEMENTSFIELDrrrr_default_value?szLegacyMetadata._default_valuecCs&|jdkrtd|Std|SdS)Nr?r )r__LINE_PREFIX_PRE_1_2r|_LINE_PREFIX_1_2rr]rrr_remove_line_prefixDs  z"LegacyMetadata._remove_line_prefixcCs|tkr||St|dSr)rAttributeErrorrrrr __getattr__JszLegacyMetadata.__getattr__FcCst|d|d|S)zhReturn the distribution name with version. If filesafe is true, return a filename-escaped form.r!r")r~)rZfilesaferrr get_fullnameUszLegacyMetadata.get_fullnamecCs||}|tkS)z+return True if name is a valid metadata key)rrrrrris_field[s zLegacyMetadata.is_fieldcCs||}|tkSr)rrrrrris_multi_field`s zLegacyMetadata.is_multi_fieldcCs.tj|ddd}z||W5|XdS)z*Read the metadata values from a file path.rrencodingN)codecsopencloser)rfilepathfprrrrdszLegacyMetadata.readcCst|}|d|jd<tD]p}||kr(q|tkrf||}|tkrX|dk rXdd|D}|||q||}|dk r|dkr|||qdS)z,Read the metadata values from a file object.zmetadata-versionr NcSsg|]}t|dqS,)tuplesplit.0r]rrr ysz,LegacyMetadata.read_file..rO)rrrrZget_all_LISTTUPLEFIELDSr)rZfileobmsgfieldvaluesr]rrrrls zLegacyMetadata.read_filecCs0tj|ddd}z|||W5|XdS)z&Write the metadata fields to filepath.wrrN)rrr write_file)rr skip_unknownrrrrrszLegacyMetadata.writecCs|t|dD]}||}|r8|dgdgfkr8q|tkrV|||d|q|tkr|dkr|jdkr~|dd}n |dd}|g}|t krd d |D}|D]}||||qqd S) z0Write the PKG-INFO format data to a file object.r rOrr%rrrz |cSsg|]}d|qSrjoinrrrrrsz-LegacyMetadata.write_file..N) rrJrrrrrr_r}r)rZ fileobjectrrrr]rrrrs$   zLegacyMetadata.write_filec svfdd}|sn@t|dr:|D]}||||q$n|D]\}}|||q>|rr|D]\}}|||q^dS)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|r||dSr)rrr)r\r]rrr_sets z#LegacyMetadata.update.._setrKN)hasattrrKrP)rotherkwargsrkvrrrrs     zLegacyMetadata.updatecCsh||}|tks|dkrNt|ttfsNt|trHdd|dD}qzg}n,|tkrzt|ttfszt|trv|g}ng}t t j r<|d}t |j }|tkr|dk r|D](}||ddstd |||qnb|tkr |dk r ||s.rr!N;rz$'%s': '%s' is not valid (field '%s')z.'%s': '%s' is not a valid version (field '%s')r%)rr isinstancelistrrrrrSZ isEnabledForloggingZWARNINGr r_PREDICATE_FIELDSis_valid_matcherwarning_VERSIONS_FIELDSis_valid_constraint_list_VERSION_FIELDSis_valid_version_UNICODEFIELDSrr)rr`r]Z project_namerrrrrrsV           zLegacyMetadata.setcCs||}||jkr*|tkr&||}|S|tkr@|j|}|S|tkr|j|}|dkr^gSg}|D].}|tkr~||qf||d|dfqf|S|tkr|j|}t |t r| dS|j|S)zGet a metadata field.Nrrr) rr_MISSINGrrrrrQrrrr)rr`rr]resvalrrrrs.         zLegacyMetadata.getc s|gg}}dD]}||kr||q|rP|gkrPdd|}t|dD]}||krT||qT|ddkr||fSt|jfdd}t|ftjft j ffD]@\}}|D]2} | | d } | d k r|| s|d | | fqq||fS) zkCheck if the metadata is compliant. If strict is True then raise if no Name or Version are provided)r!r"zmissing required metadata: %s, )r'r(r r@cs(|D]}|ddsdSqdS)NrrFT)rr)r]rrrrare_valid_constraints#sz3LegacyMetadata.check..are_valid_constraintsNzWrong value for '%s': %s) rrQrrr rrrrrrr) rstrictmissingwarningsattrrrr[Z controllerrr]rrrcheck s8         zLegacyMetadata.checkcCs|d}i}|D]"\}}|r*||jkr||||<q|ddkrd}|D]B\}}|rb||jkrL|dkrx||||<qLdd||D||<qLn8|ddkrd }|D]"\}}|r||jkr||||<q|S) zReturn 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). ) )r_r )r`r!)rIr")rbr$)rer')rfr()rgr))rjr*)rcr%)rdr&)rar#) classifiersr,)rlr-r r@))ror6)rqr7)rrr8)rnr5)rmr3)rvr4)rhr1)rir2rvcSsg|]}d|qSrr)rurrrrbsz)LegacyMetadata.todict..r))rtr/)rsr0)rur.)rr)rZ skip_missingZ mapping_1_0datar\rZ mapping_1_2Z mapping_1_1rrrtodict5s&     zLegacyMetadata.todictcCs8|ddkr$dD]}||kr||=q|d|7<dS)Nr r)r.r0r/r6r)r requirementsrrrradd_requirementsps  zLegacyMetadata.add_requirementscCstt|dSr)rrJrrrrrK{szLegacyMetadata.keysccs|D] }|VqdSrrK)rr\rrr__iter__~s zLegacyMetadata.__iter__csfddDS)Ncsg|] }|qSrrrr\rrrrsz)LegacyMetadata.values..rrrrrrszLegacyMetadata.valuescsfddDS)Ncsg|]}||fqSrrrrrrrsz(LegacyMetadata.items..rrrrrrPszLegacyMetadata.itemscCsd|jj|j|jfS)Nz <%s %s %s>) __class__rr`rIrrrr__repr__s zLegacyMetadata.__repr__)NNNr)F)F)F)N)F)F)"rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrKrrrPrrrrrrs@      ,  , ; rz pydist.jsonz metadata.jsonZMETADATAc@seZdZdZedZedejZe Z edZ dZ de Zdddd Zd Zd Zedfedfe dfe dfd Zd ZdDddZedZdefZdefZdefdefeeedefeeeedefddd Z[[ddZdEddZddZed d!Z ed"d#Z!e!j"d$d#Z!dFd%d&Z#ed'd(Z$ed)d*Z%e%j"d+d*Z%d,d-Z&d.d/Z'd0d1Z(d2d3Z)d4d5d6d7d8dd9Z*d:d;Z+dGd>d?Z,d@dAZ-dBdCZ.dS)Hrz 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}rCz distlib (%s)r)legacy)r`rIrbzqname 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)r_r`rIrb)_legacy_datarNrc Cs0|||gddkrtdd|_d|_||_|dk rzz|||||_Wn*tk rvt||d|_|YnXnd}|rt |d}| }W5QRXn |r| }|dkr|j |j d|_ndt |ts|d}zt||_||j|Wn0tk r*tt||d|_|YnXdS)Nrr)rrrbr_ generatorr)rr)rrrrr_validate_mappingrrvalidaterrMETADATA_VERSION GENERATORrr decodejsonloads ValueErrorr)rrrrrrfrrrrs@       zMetadata.__init__)r`rIrjrdrbr6r;r=r,)r-N)r N) run_requiresbuild_requires dev_requiresZ test_requires meta_requiresextrasmodules namespacesexportscommandsrZ source_urlr_c CsXt|d}t|d}||kr||\}}|jr^|dkrP|dkrHdn|}n |j|}n|dkrjdn|}|dkr|j||}nt}|}|jd} | r |dkr| d|}nP|dkr| d} | r| ||}n,| d } | s|jd } | r | ||}||krT|}n:||kr2t||}n"|jrH|j|}n |j|}|S) N common_keys mapped_keysr rrrr extensionsr python.commandsrpython.detailspython.exports)object__getattribute__rrr) rr\commonmappedlkZmakerresultr]sentineldrrrrsD            zMetadata.__getattribute__cCsH||jkrD|j|\}}|p |j|krD||}|sDtd||fdS)Nz.'%s' is an invalid value for the '%s' property)SYNTAX_VALIDATORSrmatchr)rr\r]rpattern exclusionsmrrr_validate_value+s  zMetadata._validate_valuecCs*|||t|d}t|d}||kr||\}}|jrV|dkrJt||j|<nf|dkrj||j|<nR|jdi}|dkr||d<n2|dkr|di}|||<n|d i}|||<nh||krt|||nP|d krt|t r| }|r| }ng}|jr||j|<n ||j|<dS) Nr r r r r rrrrrd) rrrrNotImplementedErrorr setdefault __setattr__rrrr)rr\r]rrrrrrrrr!5s<               zMetadata.__setattr__cCst|j|jdSNT)r~r`rIrrrrname_and_version\szMetadata.name_and_versioncCsF|jr|jd}n|jdg}d|j|jf}||krB|||S)Nr5rtz%s (%s))rrr r`rIrQ)rrsrrrrt`s  zMetadata.providescCs |jr||jd<n ||jd<dS)Nr5rt)rrrrrrrtks c Cs|jr |}ng}t|pg|j}|D]d}d|kr>d|kr>d}n8d|krLd}n|d|k}|rv|d}|rvt||}|r$||dq$dD]F}d|} | |kr|| |jd|g}||j|||dq|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 environmentTrs)ZbuildZdevZtestz:%s:z %s_requires)renv) rr rrr extendrRrget_requirements) rreqtsrr'rrZincluderMr\errrr)rs2      zMetadata.get_requirementscCs|jr|S|jSr)r _from_legacyrrrrr dictionaryszMetadata.dictionarycCs|jr tnt|j|jSdSr)rrr rDEPENDENCY_KEYSrrrr dependenciesszMetadata.dependenciescCs|jr tn |j|dSr)rrrrrrrrr/sc Cs|d|jkrtg}|jD]"\}}||kr$||kr$||q$|rbdd|}t||D]\}}||||qjdS)Nr_zMissing metadata items: %sr) rrrMANDATORY_KEYSrPrQrrr) rrrrr\rrrrrrrrs zMetadata._validate_mappingcCsB|jr.|jd\}}|s|r>td||n||j|jdS)NTz#Metadata: missing: %s, warnings: %s)rrrSrrrr)rrrrrrrszMetadata.validatecCs(|jr|jdSt|j|j}|SdSr")rrr r INDEX_KEYS)rrrrrrs zMetadata.todictc Cs|j|jd}|jd}dD]*}||kr|dkr8d}n|}||||<q|dg}|dgkrdg}||d<d }|D]*\}}||krt||rtd ||ig||<qt|j|d <i}i} |S) NrT)r`rIrjrbrcrkrkrr&rd))ror)rprrsrt)rrrrrrt) rrZlmdrnkkwrKokrfrhrrrr,s,     zMetadata._from_legacyr!r"r*r$r%)r`rIrjrbrcrcCsdd}t}|j}|jD]\}}||kr||||<q||j|j}||j|j}|jrpt |j|d<t ||d<t ||d<|S)NcSst}|D]|}|d}|d}|d}|D]V}|sF|sF||q.d}|rVd|}|rp|rld||f}n|}|d||fq.q |S)Nr%r&rsr2z extra == "%s"z (%s) and %sr)rraddr)entriesr*r+r%r'ZrlistrrMrrrprocess_entriess"   z,Metadata._to_legacy..process_entriesr=r6r;) rrLEGACY_MAPPINGrPrrrrrsorted)rr8rZnmdr3r5Zr1Zr2rrr _to_legacys  zMetadata._to_legacyFTc Cs||gddkrtd||r`|jr4|j}n|}|rP|j||dq|j||dn^|jrp|}n|j}|rt j ||ddddn.t |dd}t j ||ddddW5QRXdS) Nrz)Exactly one of path and fileobj is needed)rTr)Z ensure_asciiindentZ sort_keysrr) rrrrr;rrr,rrdumprr)rrrrrZ legacy_mdrrrrrrs*   zMetadata.writecCs|jr|j|nr|jdg}d}|D]}d|kr*d|kr*|}qHq*|dkrfd|i}|d|n t|dt|B}t||d<dS)Nrr&r%rsr)rrrr insertrr:)rrralwaysentryZrsetrrrr3szMetadata.add_requirementscCs*|jpd}|jpd}d|jj|j||fS)Nz (no name)z no versionz<%s %s %s (%s)>)r`rIrrr_)rr`rIrrrrDs  zMetadata.__repr__)NNNr)N)NN)NNFT)/rrrrrecompileZMETADATA_VERSION_MATCHERIZ NAME_MATCHERrZVERSION_MATCHERZSUMMARY_MATCHERrrrr0r1r.r __slots__rrr rZ none_listdictZ none_dictr rrr!propertyr#rtsetterr)r-r/rrrr,r9r;rrrrrrrrs   -+ '    *     % )F)ErZ __future__rrZemailrrrrAr2rrcompatrrr rLr utilr r rIr rZ getLoggerrrSrrrr__all__rrrBrrrDrErVrFrWrHrYrGrXrrrZEXTRA_RErJr^rrrrrrrrrrr{r~rZMETADATA_FILENAMEZWHEEL_METADATA_FILENAMEZLEGACY_METADATA_FILENAMErrrrrs              H!