a  zeŘ@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 src@seZdZdZdS) MetadataUnrecognizedVersionErrorz Unknown metadata version number.Nrrrrrr$src@seZdZdZdS)MetadataInvalidErrorzA metadata value is invalidNrrrrrr(sr)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)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.)r>z"extra\s*==\s*("([^"]+)"|'([^']+)')cCsZ|dkr tS|dkrtS|dkr$tS|dvrBttddtDS|dkrNtSt|dS)N1.0r1.2)1.32.1css|]}|tvr|VqdSN) _345_FIELDS).0frrr zz%_version2fieldlist..2.0) _241_FIELDS _314_FIELDSrDtuple _566_FIELDS _426_FIELDSr)versionrrr_version2fieldlistqsrPc Cs:dd}g}|D]"\}}|gddfvr,q||qgd}|D]}|tvrnd|vrn|dtd||tvrd|vr|dtd ||tvrd |vr|d td ||tvrd |vr|d td ||tvrd|vr|dkr|dtd||t vrDd|vrD|dtd|qDt |dkrR|dSt |dkrttd|t dd|vo||t }d |vo||t }d|vo||t}d|vo||t} t|t|t|t| dkrt d|s|s|s| st|vrtS|r"dS|r,d S|r6dSdS)z5Detect the best version depending on the fields used.cSs|D]}||vrdSqdS)NTFr)keysmarkersmarkerrrr _has_markersz"_best_version.._has_markerUNKNOWNN)r?rr@rArIrBr?zRemoved 1.0 due to %srzRemoved 1.1 due to %sr@zRemoved 1.2 due to %srAzRemoved 1.3 due to %srBr%zRemoved 2.1 due to %srIzRemoved 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)itemsappendrJremoveloggerdebugrKrDrMrNlenr _314_MARKERS _345_MARKERS _566_MARKERS _426_MARKERSintr) fieldsrTrQkeyvalueZpossible_versionsZis_1_1Zis_1_2Zis_2_1Zis_2_0rrr _best_versions`              & rdcCsi|]}|dd|qS)-_)lowerreplace)rEnamerrr srjcCsi|]\}}||qSrr)rEattrfieldrrrrjrH)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.re .z%s-%s) _FILESAFEsubrh)rirOZ for_filenamerrr_get_name_and_versions rqc@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|||gddkrtdi|_g|_d|_||_|durH||n.|dur\||n|durv||| dS)N'path, fileobj and mapping are exclusive) count TypeError_fieldsZrequires_filesZ _dependenciesschemeread read_fileupdateset_metadata_version)selfpathfileobjmappingryrrr__init__s   zLegacyMetadata.__init__cCst|j|jd<dSNr )rdrxr~rrrr} sz#LegacyMetadata.set_metadata_versioncCs|d||fdS)Nz%s: %s )write)r~rrircrrr _write_field szLegacyMetadata._write_fieldcCs ||SrC)getr~rirrr __getitem__szLegacyMetadata.__getitem__cCs |||SrC)set)r~rircrrr __setitem__szLegacyMetadata.__setitem__cCs6||}z |j|=Wnty0t|Yn0dSrC) _convert_namerxKeyError)r~ri field_namerrr __delitem__s    zLegacyMetadata.__delitem__cCs||jvp|||jvSrC)rxrrrrr __contains__s zLegacyMetadata.__contains__cCs(|tvr |S|dd}t||S)Nrerf) _ALL_FIELDSrhrg _ATTR2FIELDrrrrrr!szLegacyMetadata._convert_namecCs|tvs|tvrgSdS)NrU) _LISTFIELDS_ELEMENTSFIELDrrrr_default_value'szLegacyMetadata._default_valuecCs&|jdvrtd|Std|SdS)Nr?r )metadata_version_LINE_PREFIX_PRE_1_2rp_LINE_PREFIX_1_2r~rcrrr_remove_line_prefix,s  z"LegacyMetadata._remove_line_prefixcCs|tvr||St|dSrC)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")rq)r~Zfilesaferrr get_fullname=szLegacyMetadata.get_fullnamecCs||}|tvS)z+return True if name is a valid metadata key)rrrrrris_fieldCs zLegacyMetadata.is_fieldcCs||}|tvSrC)rrrrrris_multi_fieldHs zLegacyMetadata.is_multi_fieldcCs6tj|ddd}z||W|n |0dS)z*Read the metadata values from a file path.rrencodingN)codecsopenr{close)r~filepathfprrrrzLs zLegacyMetadata.readcCst|}|d|jd<tD]p}||vr(q|tvrf||}|tvrX|durXdd|D}|||q||}|dur|dkr|||q|}|r|n|d|d<dS)z,Read the metadata values from a file object.zmetadata-versionr NcSsg|]}t|dqS,)rLsplitrErcrrr arHz,LegacyMetadata.read_file..rUr%)rrxrrget_all_LISTTUPLEFIELDSr get_payload)r~Zfileobmsgrlvaluesrcbodyrrrr{Ts zLegacyMetadata.read_filecCs8tj|ddd}z|||W|n |0dS)z&Write the metadata fields to filepath.wrrN)rr write_filer)r~r skip_unknownrrrrrpszLegacyMetadata.writecCs|t|dD]}||}|r8|dgdgfvr8q|tvrV|||d|q|tvr|dkr|jdvr~|dd}n |dd}|g}|t vrd d |D}|D]}||||qqd S) z0Write the PKG-INFO format data to a file object.r rUrr%rrrz |cSsg|]}d|qSrjoinrrrrrrHz-LegacyMetadata.write_file..N) r}rPrrrrrrrhr)r~ fileobjectrrlrrcrrrrxs$   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"|tvr|r||dSrC)rrr)rbrcrrr_sets z#LegacyMetadata.update.._setrQN)hasattrrQrV)r~otherkwargsrkvrrrr|s     zLegacyMetadata.updatecCsh||}|tvs|dkrNt|ttfsNt|trHdd|dD}qzg}n,|tvrzt|ttfszt|trv|g}ng}t t j r<|d}t |j }|tvr|dur|D](}||ddstd |||qnb|tvr |dur ||s.rr!N;rz$'%s': '%s' is not valid (field '%s')z.'%s': '%s' is not a valid version (field '%s')r%)rr isinstancelistrLrrrrY isEnabledForloggingWARNINGr ry_PREDICATE_FIELDSis_valid_matcherwarning_VERSIONS_FIELDSis_valid_constraint_list_VERSION_FIELDSis_valid_version_UNICODEFIELDSrrx)r~rirc project_nameryrrrrrsJ           zLegacyMetadata.setcCs||}||jvr*|tur&||}|S|tvr@|j|}|S|tvr|j|}|dur^gSg}|D].}|tvr~||qf||d|dfqf|S|tvr|j|}t |t r| dS|j|S)zGet a metadata field.Nrrr) rrx_MISSINGrrrrrWrrrr)r~rirsrcresvalrrrrs.         zLegacyMetadata.getc s|gg}}dD]}||vr||q|rP|gkrPdd|}t|dD]}||vrT||qT|ddkr||fSt|jfdd}t|ftjft j ffD]@\}}|D]2} | | d } | d ur|| 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)rcrryrrare_valid_constraintssz3LegacyMetadata.check..are_valid_constraintsNzWrong value for '%s': %s) r}rWrrr ryrrrrrr) r~strictmissingwarningsrkrrra controllerrlrcrrrchecks8         zLegacyMetadata.checkcCsh|t|d}i}|D]F}|r.||jvrt|}|dkrL||||<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_urlcSsg|]}d|qSrr)rEurrrr5rHz)LegacyMetadata.todict..)r}rPrx _FIELD2ATTR)r~Z skip_missingradatarrbrrrtodict"s zLegacyMetadata.todictcCs8|ddkr$dD]}||vr||=q|d|7<dS)Nr r)r.r0r/r6r)r~ requirementsrlrrradd_requirements9s  zLegacyMetadata.add_requirementscCstt|dSr)rrPrrrrrQDszLegacyMetadata.keysccs|D] }|VqdSrCrQ)r~rbrrr__iter__Gs zLegacyMetadata.__iter__csfddDS)Ncsg|] }|qSrrrErbrrrrLrHz)LegacyMetadata.values..rrrrrrKszLegacyMetadata.valuescsfddDS)Ncsg|]}||fqSrrrrrrrOrHz(LegacyMetadata.items..rrrrrrVNszLegacyMetadata.itemscCsd|jj|j|jfS)Nz <%s %s %s>) __class__rrirOrrrr__repr__Qs zLegacyMetadata.__repr__)NNNrs)F)F)F)N)F)F)"rrrrrr}rrrrrrrrrrrrrzr{rrr|rrrrrrrQrrrVrrrrrrrs@      ,  ,  rrz pydist.jsonz metadata.jsonMETADATAc@seZdZdZedZedejZe Z edZ dZ de Zdddd Zd Zd Zedfedfe dfe dfd Zd ZdHddZedZdefZdefZdefdefeeedefeeeedefddd 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}rIz distlib (%s)r)legacy)rirOsummaryzqname 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)rrirOr)_legacy_dataryNrscCs@|||gddkrtdd|_d|_||_|durxz|||||_Wn(tytt||d|_|Yn0nd}|rt |d}| }Wdq1s0Yn |r| }|dur|j |j d|_nbt |ts|d}zt||_||j|Wn.ty:tt||d|_|Yn0dS)Nrtru)rryrbr generatorr)rry)rvrwrrry_validate_mappingrrrvalidaterrzMETADATA_VERSION GENERATORrr decodejsonloads ValueErrorr)r~rrrryrrFrrrrs@    (    zMetadata.__init__)rirOlicensekeywordsrr6r;r=r,)r-N)r N) run_requiresbuild_requires dev_requiresZ test_requires meta_requiresextrasmodules namespacesexportscommands classifiers source_urlrc CsXt|d}t|d}||vr||\}}|jr^|durP|durHdn|}n |j|}n|durjdn|}|dvr|j||}nt}|}|jd} | r |dkr| d|}nP|dkr| d} | r| ||}n,| d } | s|jd } | r | ||}||urT|}n:||vr2t||}n"|jrH|j|}n |j|}|S) N common_keys mapped_keysrrrrr extensionsrpython.commandsrpython.detailspython.exports)object__getattribute__rrr) r~rbcommonmappedlkmakerresultrcsentineldrrrr sD            zMetadata.__getattribute__cCsH||jvrD|j|\}}|p |j|vrD||}|sDtd||fdS)Nz.'%s' is an invalid value for the '%s' property)SYNTAX_VALIDATORSrymatchr)r~rbrcrypattern exclusionsmrrr_validate_values  zMetadata._validate_valuecCs*|||t|d}t|d}||vr||\}}|jrV|durJt||j|<nf|dvrj||j|<nR|jdi}|dkr||d<n2|dkr|di}|||<n|d i}|||<nh||vrt|||nP|d krt|t r| }|r| }ng}|jr||j|<n ||j|<dS) Nrrrrrr rr r r) rr r rNotImplementedErrorr setdefault __setattr__rrrr)r~rbrcrrrrfrrrrrs<               zMetadata.__setattr__cCst|j|jdSNT)rqrirOrrrrname_and_version%szMetadata.name_and_versioncCsF|jr|jd}n|jdg}d|j|jf}||vrB|||S)Nr5providesz%s (%s))rrrrirOrW)r~rsrrrr )s  zMetadata.providescCs |jr||jd<n ||jd<dS)Nr5r )rrrrrrr 4s c Cs|jr |}ng}t|pg|j}|D]d}d|vr>d|vr>d}n8d|vrLd}n|d|v}|rv|d}|rvt||}|r$||dq$dD]F}d|} | |vr|| |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 environmentTrequires)builddevtestz:%s:z %s_requires)renv) rr rrr extendrXrget_requirements) r~reqtsrr(rrincluderSrberrrr*;s2      zMetadata.get_requirementscCs|jr|S|jSrC)r _from_legacyrrrrr dictionaryeszMetadata.dictionarycCs|jr tnt|j|jSdSrC)rrr rDEPENDENCY_KEYSrrrr dependencieskszMetadata.dependenciescCs|jr tn |j|dSrC)rrrr|rrrrr1rsc Cs|d|jkrtg}|jD]"\}}||vr$||vr$||q$|rbdd|}t||D]\}}||||qjdS)NrzMissing metadata items: %sr) rrrMANDATORY_KEYSrVrWrrr) r~rryrrbrrrrrrrrys zMetadata._validate_mappingcCsB|jr.|jd\}}|s|r>td||n||j|jdS)NTz#Metadata: missing: %s, warnings: %s)rrrYrrrry)r~rrrrrrszMetadata.validatecCs(|jr|jdSt|j|j}|SdSr)rrr r INDEX_KEYS)r~rrrrrs zMetadata.todictc Cs|jr |jrJ|j|jd}|jd}dD]*}||vr.|dkrHd}n|}||||<q.|dg}|dgkrtg}||d<d }|D]*\}}||vr||rd ||ig||<q|j|d <i}i} |S) NrT)rirOrr description classifierr5rr&r))Z requires_distr)Zsetup_requires_distrr$r )rrrrrrr ) r~rZlmdrnkkwrQokauthor maintainerrrrr.s.     zMetadata._from_legacyr!r"r*r$r%r'r(r)r-) rirO)rr rrr4)rpython.projectZ project_urlsZHome)rr<contactsrri)rr<r=remailr)rr rc Csdd}|jr|jrJt}|j}|jD]t\}}t|tsV||vr||||<q.|}d}|D]2}z ||}Wqbttfyd}YqYqb0qb|r.|||<q.||j |j } ||j |j } |j rt|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#r$r6z extra == "%s"z (%s) and %sr)rraddr)entriesr+r-r"r(ZrlistrrSrrrprocess_entriess"   z,Metadata._to_legacy..process_entriesTFr=r6r;)rrrrLEGACY_MAPPINGrVrrLr IndexErrorrrrrrsorted) r~rArZnmdr7r9rfoundrZr1Zr2rrr _to_legacys2     zMetadata._to_legacyFTcCs||gddkrtd||r`|jr4|j}n|}|rP|j||dq|j||dnr|jrp|}n|j}|rt j ||ddddnBt |dd$}t j ||ddddWdn1s0YdS) Nrz)Exactly one of path and fileobj is needed)rTrt) ensure_asciiindent sort_keysrr) rvrrrrFrrr.rrdumprr)r~rrrrZ legacy_mdrrFrrrrs*   zMetadata.writecCs|jr|j|nr|jdg}d}|D]}d|vr*d|vr*|}qHq*|durfd|i}|d|n t|dt|B}t||d<dS)Nrr#r"r$r)rrrrinsertrrD)r~rralwaysentryZrsetrrrr szMetadata.add_requirementscCs*|jpd}|jpd}d|jj|j||fS)Nz (no name)z no versionz<%s %s %s (%s)>)rirOrrr)r~rirOrrrrs   zMetadata.__repr__)NNNrs)N)NN)NNFT)/rrrrrecompileZMETADATA_VERSION_MATCHERIZ NAME_MATCHERrZVERSION_MATCHERZSUMMARY_MATCHERrrrr2r3r0r __slots__rrrrZ none_listdictZ none_dictrr rrpropertyrr setterr*r/r1rrrr.rBrFrrrrrrrr[s   -+ '    *     2 r)F)Gr __future__rrr>rrrrNr6rrcompatrrr rRr utilr r rOr r getLoggerrrYrrrr__all__rrrOrrrJrKr\rDr]rNr_rMr^rrr|ZEXTRA_RErPrdrrVrrrrrrrrr rrorqrrZMETADATA_FILENAMEZWHEEL_METADATA_FILENAMEZLEGACY_METADATA_FILENAMErrrrrsx             I  j