o FP`Ř@sdZddlmZddlZddlmZddlZddlZddlZddl m Z m Z ddl m Z mZmZddlmZdd lmZmZdd lmZmZeeZGd d d e ZGd dde ZGddde ZGddde ZgdZdZ dZ!e"dZ#e"dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+e*dZ,d Z-e.Z/e/0e%e/0e&e/0e(e/0e*e/0e,e"d!Z1d"d#Z2d$d%Z3d&d'e/DZ4d(d'e45DZ6d)Z7d*Z8d+Z9d,Z:d-Z;d.ZZ?e"d0Z@d;d2d3ZAGd4d5d5e>ZBd6ZCd7ZDd8ZEGd9d:d:e>ZFdS)Attempt to read or write metadata fields that are conflictual.Nrrrrrr rrc@r) MetadataUnrecognizedVersionErrorz Unknown metadata version number.Nrrrrrr$rrc@r)MetadataInvalidErrorzA metadata value is invalidNrrrrrr(rr)MetadataPKG_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)r0r1r2r.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)r7r8r9r5r:r3r4r6)r"r#r$r%r-r&r'r(r)r*r+r3r4r,r.r/r5r6r7r8r9r:Private-Version Obsoleted-BySetup-Requires-Dist ExtensionProvides-Extra)r;r?r<r=r>)Description-Content-Typer2r1r0)r@z"extra\s*==\s*("([^"]+)"|'([^']+)')cCsV|dkrtS|dkr tS|dkrtS|dvr!ttddtDS|dkr'tSt|)N1.0r 1.2)1.32.1css|] }|tvr|VqdSN) _345_FIELDS).0frrr zsz%_version2fieldlist..2.0) _241_FIELDS _314_FIELDSrFtuple _566_FIELDS _426_FIELDSr)versionrrr_version2fieldlistqsrQc Csdd}g}|D]\}}|gddfvrq ||q gd}|D]x}|tvr7d|vr7|dtd||tvrJd|vrJ|dtd ||tvr]d |vr]|d td ||tvrpd |vrp|d td ||tvrd|vr|dkr|dtd||t vrd|vr|dtd|q"t |dkr|dSt |dkrtd|t dd|vo||t }d |vo||t }d|vo||t}d|vo||t} t|t|t|t| dkrt d|s|s|s| st|vrtS|rdS|rd S|r dSdS)z5Detect the best version depending on the fields used.cSs|D] }||vr dSqdS)NTFr)keysmarkersmarkerrrr _has_markers z"_best_version.._has_markerUNKNOWNN)rAr rBrCrJrDrAzRemoved 1.0 due to %sr zRemoved 1.1 due to %srBzRemoved 1.2 due to %srCzRemoved 1.3 due to %srDr'zRemoved 2.1 due to %srJzRemoved 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)itemsappendrKremoveloggerdebugrLrFrNrOlenr _314_MARKERS _345_MARKERS _566_MARKERS _426_MARKERSintr) fieldsrUrRkeyvaluepossible_versionsis_1_1is_1_2is_2_1is_2_0rrr _best_versionsb                $rjcCsi|] }|dd|qS)-_)lowerreplace)rGnamerrr srpcCsi|]\}}||qSrr)rGattrfieldrrrrp)r8r5r7)r9)r$)r%r.r0r2r1r5r7r8r:r6r-r=r?r>)r6)r()r*r3r&r'z[^A-Za-z0-9.]+FcCs0|rtd|}td|dd}d||fS)zhReturn the distribution name with version. If for_filename is true, return a filename-escaped form.rk .z%s-%s) _FILESAFEsubrn)rorP for_filenamerrr_get_name_and_versions  ryc@seZdZdZ  d?ddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZd@ddZddZdd Zd!d"Zd#d$Zd@d%d&Zd@d'd(ZdAd)d*Zd+d,Zefd-d.Zd@d/d0Zd@d1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Z d=d>Z!dS)BLegacyMetadataaoThe 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 NdefaultcCs|||gddkrtdi|_g|_d|_||_|dur%||dS|dur0||dS|dur?||| dSdS)N'path, fileobj and mapping are exclusive) count TypeError_fieldsrequires_files _dependenciesschemeread read_fileupdateset_metadata_version)selfpathfileobjmappingrrrr__init__s  zLegacyMetadata.__init__cCst|j|jd<dSNr")rjrrrrrr sz#LegacyMetadata.set_metadata_versioncCs|d||fdS)Nz%s: %s )write)rrrordrrr _write_field zLegacyMetadata._write_fieldcCs ||SrE)getrrorrr __getitem__s zLegacyMetadata.__getitem__cCs |||SrE)set)rrordrrr __setitem__s zLegacyMetadata.__setitem__cCs0||}z|j|=WdStyt|wrE) _convert_namerKeyError)rro field_namerrr __delitem__s  zLegacyMetadata.__delitem__cCs||jvp |||jvSrE)rrrrrr __contains__s zLegacyMetadata.__contains__cCs(|tvr|S|dd}t||S)Nrkrl) _ALL_FIELDSrnrm _ATTR2FIELDrrrrrr!s zLegacyMetadata._convert_namecCs|tvs|tvr gSdS)NrV) _LISTFIELDS_ELEMENTSFIELDrrrr_default_value'szLegacyMetadata._default_valuecCs"|jdvr td|Std|S)NrAr  )metadata_version_LINE_PREFIX_PRE_1_2rw_LINE_PREFIX_1_2rrdrrr_remove_line_prefix,s   z"LegacyMetadata._remove_line_prefixcCs|tvr||St|rE)rAttributeErrorrrrr __getattr__2szLegacyMetadata.__getattr__FcCst|d|d|S)zhReturn the distribution name with version. If filesafe is true, return a filename-escaped form.r#r$)ry)rfilesaferrr get_fullname=szLegacyMetadata.get_fullnamecC||}|tvS)z+return True if name is a valid metadata key)rrrrrris_fieldCs zLegacyMetadata.is_fieldcCrrE)rrrrrris_multi_fieldHs zLegacyMetadata.is_multi_fieldcCs4tj|ddd}z ||W|dS|w)z*Read the metadata values from a file path.rrencodingN)codecsopenrclose)rfilepathfprrrrLs zLegacyMetadata.readcCst|}|d|jd<tD]8}||vrq |tvr3||}|tvr,|dur,dd|D}|||q ||}|durE|dkrE|||q |}|rN|n|d|d<dS)z,Read the metadata values from a file object.zmetadata-versionr"NcSsg|] }t|dqS,)rMsplitrGrdrrr asz,LegacyMetadata.read_file..rVr')rrrrget_all_LISTTUPLEFIELDSr get_payload)rfileobmsgrrvaluesrdbodyrrrrTs   zLegacyMetadata.read_filecCs6tj|ddd}z |||W|dS|w)z&Write the metadata fields to filepath.wrrN)rr write_filer)rr skip_unknownrrrrrpszLegacyMetadata.writecCs|t|dD]U}||}|r|dgdgfvrq |tvr+|||d|q |tvrH|dkrE|jdvr?|dd}n|dd}|g}|t vrSd d |D}|D] }||||qUq d S) z0Write the PKG-INFO format data to a file object.r"rVrr'rrr!z |cSg|]}d|qSrjoinrrrrrrsz-LegacyMetadata.write_file..N) rrQrrrrrrrnr)r fileobjectrrrrrdrrrrxs(   zLegacyMetadata.write_filec szfdd}|s n t|dr|D] }||||qn |D] \}}|||q|r9|D] \}}|||q/dSdS)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*|tvr|r||dSdSdSrE)rrr)rcrdrrr_sets z#LegacyMetadata.update.._setrRN)hasattrrRrW)rotherkwargsrkvrrrrs      zLegacyMetadata.updatecCsV||}|tvs |dkr't|ttfs't|tr$dd|dD}ng}n|tvr=t|ttfs=t|tr;|g}ng}t t j r|d}t |j }|tvrl|durl|D]}||ddsjtd |||qVn+|tvr|dur||std |||n|tvr|dur||std ||||tvr|d kr||}||j|<dS) z"Control then set a metadata field.r%cSsg|]}|qSr)strip)rGrrrrrz&LegacyMetadata.set..rr#N;rz$'%s': '%s' is not valid (field '%s')z.'%s': '%s' is not a valid version (field '%s')r')rr isinstancelistrMrrrrZ isEnabledForloggingWARNINGr r_PREDICATE_FIELDSis_valid_matcherwarning_VERSIONS_FIELDSis_valid_constraint_list_VERSION_FIELDSis_valid_version_UNICODEFIELDSrr)rrord project_namerrrrrrsP          zLegacyMetadata.setcCs||}||jvr|tur||}|S|tvr |j|}|S|tvrM|j|}|dur/gSg}|D]}|tvr?||q3||d|dfq3|S|tvr`|j|}t |t r`| dS|j|S)zGet a metadata field.Nrrr) rr_MISSINGrrrrrXrrrr)rror{rdresvalrrrrs.          zLegacyMetadata.getc s|gg}}dD] }||vr||q |r(|gkr(dd|}t|dD] }||vr5||q*|ddkr@||fSt|jfdd}t|ftjft j ffD] \}}|D]} | | d } | d urw|| sw|d | | fq^qX||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"rBcs(|D]}|ddsdSqdS)NrrFT)rr)rdrrrrare_valid_constraintss z3LegacyMetadata.check..are_valid_constraintsNzWrong value for '%s': %s) rrXrrr rrrrrrr) rstrictmissingwarningsrqrrrb controllerrrrdrrrchecks@         zLegacyMetadata.checkcCsh|t|d}i}|D]#}|r||jvr1t|}|dkr&||||<qdd||D||<q|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. r" project_urlcSrrr)rGurrrr5rsz)LegacyMetadata.todict..)rrQr _FIELD2ATTR)r skip_missingrbdatarrcrrrtodict"s zLegacyMetadata.todictcCs8|ddkrdD] }||vr||=q|d|7<dS)Nr"r )r0r2r1r8r)r requirementsrrrrradd_requirements9s zLegacyMetadata.add_requirementscCstt|dSr)rrQrrrrrRDszLegacyMetadata.keysccs|D]}|VqdSrErR)rrcrrr__iter__Gs zLegacyMetadata.__iter__cfddDS)Ncsg|]}|qSrrrGrcrrrrLrz)LegacyMetadata.values..rrrrrrKrzLegacyMetadata.valuescr)Ncsg|]}||fqSrrrrrrrOsz(LegacyMetadata.items..rrrrrrWNrzLegacyMetadata.itemscCsd|jj|j|jfS)Nz <%s %s %s>) __class__rrorPrrrr__repr__Qs zLegacyMetadata.__repr__NNNr{FrE)"rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrRrrrWrrrrrrzsB       ,  ,  rzz pydist.jsonz metadata.jsonMETADATAc@seZdZdZedZedejZe Z edZ dZ de Zdddd Zd Zd Zedfedfe dfe dfd Zd Z  dHddZedZdefZdefZdefdefeeedefeeeedefddd Z[[ddZdIddZddZed d!Z ed"d#Z!e!j"d$d#Z!dJd%d&Z#ed'd(Z$ed)d*Z%e%j"d+d*Z%d,d-Z&d.d/Z'd0d1Z(d2d3Z)d4d5d6d7d8d9d:d;dd?Z+dKdBdCZ,dDdEZ-dFdGZ.dS)Lrz 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}rJz distlib (%s)r)legacy)rorPsummaryzqname 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)rrorPr)_legacy_datarNr{cCsB|||gddkrtdd|_d|_||_|dur=z |||||_WdSty<t||d|_|YdSwd}|r[t |d }| }Wdn1sUwYn|ra| }|duro|j |j d|_dSt |tsy|d}zt||_||j|WdStytt||d|_|YdSw)Nr|r})rrrbr generatorr)rr)r~rrrr_validate_mappingrrzvalidaterrMETADATA_VERSION GENERATORrr decodejsonloads ValueErrorr)rrrrrrrHrrrrsH         zMetadata.__init__)rorPlicensekeywordsrr8r=r?r.)r/N)r"N) run_requiresbuild_requires dev_requires test_requires meta_requiresextrasmodules namespacesexportscommands classifiers source_urlrc CsXt|d}t|d}||vr||\}}|jr0|dur(|dur#dn|}|S|j|}|S|dur6dn|}|dvrF|j||}|St}|}|jd} | r|dkr^| d|}n'|dkrp| d} | ro| ||}n| d } | s}|jd } | r| ||}||ur|}|S||vrt||}|S|jr|j|}|S|j|}|S) N common_keys mapped_keysrrrrr extensionsrpython.commandsrpython.detailspython.exports)object__getattribute__rrr) rrccommonmappedlkmakerresultrdsentineldrrrr"sR   "           zMetadata.__getattribute__cCsP||jvr"|j|\}}|p|j|vr$||}|s&td||fdSdSdS)Nz.'%s' is an invalid value for the '%s' property)SYNTAX_VALIDATORSrmatchr)rrcrdrpattern exclusionsmrrr_validate_values  zMetadata._validate_valuecCs0|||t|d}t|d}||vrd||\}}|jr,|dur%t||j|<dS|dvr7||j|<dS|jdi}|dkrH||d<dS|dkrX|di}|||<dS|d i}|||<dS||vrqt|||dS|d krt|t r| }|r| }ng}|jr||j|<dS||j|<dS) Nrrrrrrrrr r ) r/r!r"rNotImplementedErrorr setdefault __setattr__rrrr)rrcrdr#r$r%rlr)rrrr2s<           zMetadata.__setattr__cCst|j|jdSNT)ryrorPrrrrname_and_version%szMetadata.name_and_versioncCsF|jr |jd}n|jdg}d|j|jf}||vr!|||S)Nr7providesz%s (%s))rrr1rorPrX)rr'srrrr5)s  zMetadata.providescCs"|jr ||jd<dS||jd<dS)Nr7r5)rrrrrrr54sc Cs|jr|}|Sg}t|p g|j}|D]2}d|vr d|vr d}nd|vr'd}n|d|v}|r<|d}|r}|d}|d}|d}|D]+}|s#|s#||qd}|r+d|}|r8|r6d||f}n|}|d||fqq|S)Nr7r8r9rKz extra == "%s"z (%s) and %sr)rraddr)entriesr@rBr7r=rlistrrTrrrprocess_entriess$    z,Metadata._to_legacy..process_entriesTFr?r8r=)rrrzLEGACY_MAPPINGrWrrMr IndexErrorrrrrrsorted) rr\r'nmdrOrQr)foundrr1r2rrr _to_legacys8     zMetadata._to_legacyFTcCs||gddkr td||r2|jr|j}n|}|r)|j||ddS|j||ddS|jr:|}n|j}|rKt j ||dddddSt |dd}t j ||ddddWddS1shwYdS) Nrz)Exactly one of path and fileobj is needed)rTr|) ensure_asciiindent sort_keysrr) r~r rrrdrrrCrr dumprr)rrrrr legacy_mdr)rHrrrrs,    "zMetadata.writecCs|jr |j|dS|jdg}d}|D]}d|vr$d|vr$|}nq|dur5d|i}|d|dSt|dt|B}t||d<dS)Nrr8r7r9r)rrrr1insertrr_)rrralwaysentryrsetrrrr szMetadata.add_requirementscCs*|jpd}|jp d}d|jj|j||fS)Nz (no name)z no versionz<%s %s %s (%s)>)rorPrrr)rrorPrrrrs  zMetadata.__repr__rrE)NN)NNFT)/rrrrrecompileMETADATA_VERSION_MATCHERI NAME_MATCHERrVERSION_MATCHERSUMMARY_MATCHERrrrrGrHrEr* __slots__rrrr none_listdict none_dictrr"r/r2propertyr4r5setterr?rDrFrrrrCr]rdrrrrrrrr[s   - + '    *     2 rr)Gr __future__rrrXrr rrnrKrrcompatrrr rSr utilr r rPr r getLoggerrrZrrrr__all__rrrorrrKrLr]rFr^rOr`rNr_rrrEXTRA_RErQrjrrWrrrrrrrrr!rrvryrzMETADATA_FILENAMEWHEEL_METADATA_FILENAMELEGACY_METADATA_FILENAMErrrrrsz             I   j