a *egD@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-d!Z.e,e.Z/e0Z1e12e%e12e&e12e(e12e*e12e,e12e/e"d"Z3d#d$Z4d%d&Z5d'd(e1DZ6d)d(e67DZ8d*Z9d+Z:d,Z;d-Zd0Z?e@ZAe"d1ZBdAttempt to read or write metadata fields that are conflictual.Nrrrrrrsrc@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>)ZDynamic License-Filez"extra\s*==\s*("([^"]+)"|'([^']+)')cCsl|dkr tS|dkrtS|dkr$tS|dvrBttddtDS|dkrTtdn |d kr`tSt|dS) N1.0r1.2)1.32.1css|]}|tvr|VqdSN) _345_FIELDS).0frrr pz%_version2fieldlist..2.0z+Metadata 2.0 is withdrawn and not supported2.2) _241_FIELDS _314_FIELDSrEtuple _566_FIELDS ValueError _643_FIELDSr)versionrrr_version2fieldlistgs rSc Csdd}dd|D}gd}|D]}|tvrPd|vrP|dtd||tvrvd|vrv|dtd ||tvrd |vr|d td ||tvrd |vr|d td ||tvrd|vr|dkr|dtd||tvr&d|vr&|dtd|q&t |dkr.|dSt |dkrPtd|t dd|vob||t }d |vov||t }d|vo||t }d|vo||t}t|t|t|t|dkrt d|s|s|s|st|vrtS|rdS|rd S|rdSdS)z5Detect the best version depending on the fields used.cstfdd|DS)Nc3s|]}|vVqdSrDr)rFmarkerkeysrrrH}rIz5_best_version.._has_marker..)any)rVmarkersrrUr _has_marker|sz"_best_version.._has_markercSs"g|]\}}|gddfvr|qS)UNKNOWNNr)rFkeyvaluerrr rIz!_best_version..)r@rrArBrCrKr@zRemoved 1.0 due to %srzRemoved 1.1 due to %srAzRemoved 1.2 due to %srBzRemoved 1.3 due to %srCr%zRemoved 2.1 due to %srKzRemoved 2.2 due to %srrz)Out of options - unknown metadata set: %szUnknown metadata setz,You used incompatible 1.1/1.2/2.1/2.2 fields)itemsrLremoveloggerdebugrMrErOrQlenr _314_MARKERS _345_MARKERS _566_MARKERS _643_MARKERSintr) fieldsrYrVZpossible_versionsr[Zis_1_1Zis_1_2Zis_2_1Zis_2_2rrr _best_versionysX            & ricCsi|]}|dd|qS)-_)lowerreplace)rFnamerrr rIrocCsi|]\}}||qSrr)rFattrfieldrrrrorI)r6r3r5)r7)r")r#r,r.r0r/r3r5r6r8r4r+r;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.rj .z%s-%s) _FILESAFEsubrm)rnrRZ for_filenamerrr_get_name_and_versions rvc@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)selfpathfileobjmappingr~rrr__init__s   zLegacyMetadata.__init__cCst|j|jd<dSNr )rir}rrrrrsz#LegacyMetadata.set_metadata_versioncCs|d||fdS)Nz%s: %s )write)rrrnr\rrr _write_fieldszLegacyMetadata._write_fieldcCs ||SrD)getrrnrrr __getitem__szLegacyMetadata.__getitem__cCs |||SrD)set)rrnr\rrr __setitem__ szLegacyMetadata.__setitem__cCs6||}z |j|=Wnty0t|Yn0dSrD) _convert_namer}KeyError)rrn field_namerrr __delitem__ s    zLegacyMetadata.__delitem__cCs||jvp|||jvSrD)r}rrrrr __contains__szLegacyMetadata.__contains__cCs(|tvr |S|dd}t||S)Nrjrk) _ALL_FIELDSrmrl _ATTR2FIELDrrrrrrszLegacyMetadata._convert_namecCs|tvs|tvrgSdS)NrZ) _LISTFIELDS_ELEMENTSFIELDrrrr_default_valueszLegacyMetadata._default_valuecCs&|jdvrtd|Std|SdS)Nr@r )metadata_version_LINE_PREFIX_PRE_1_2ru_LINE_PREFIX_1_2rr\rrr_remove_line_prefix!s  z"LegacyMetadata._remove_line_prefixcCs|tvr||St|dSrD)rAttributeErrorrrrr __getattr__'szLegacyMetadata.__getattr__FcCst|d|d|S)zz Return the distribution name with version. If filesafe is true, return a filename-escaped form. r!r")rv)rZfilesaferrr get_fullname0szLegacyMetadata.get_fullnamecCs||}|tvS)z+return True if name is a valid metadata key)rrrrrris_field8s zLegacyMetadata.is_fieldcCs||}|tvSrD)rrrrrris_multi_field=s zLegacyMetadata.is_multi_fieldcCs6tj|ddd}z||W|n |0dS)z*Read the metadata values from a file path.rrencodingN)codecsopenrclose)rfilepathfprrrrAs 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,)rNsplitrFr\rrrr]VrIz,LegacyMetadata.read_file..rZr%)rr}rrget_all_LISTTUPLEFIELDSr get_payload)rZfileobmsgrqvaluesr\bodyrrrrIs zLegacyMetadata.read_filecCs8tj|ddd}z|||W|n |0dS)z&Write the metadata fields to filepath.wrrN)rr write_filer)rr skip_unknownrrrrreszLegacyMetadata.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 rZrr%rrrz |cSsg|]}d|qSrjoinrrrrr]rIz-LegacyMetadata.write_file..N) rrSrrrrrrrmr)r fileobjectrrqrr\rrrrms$   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||dSrD)rrr)r[r\rrr_sets z#LegacyMetadata.update.._setrVN)hasattrrVr^)rotherkwargsrkvrrrrs     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 isinstancelistrNrrrr` isEnabledForloggingWARNINGr r~_PREDICATE_FIELDSis_valid_matcherwarning_VERSIONS_FIELDSis_valid_constraint_list_VERSION_FIELDSis_valid_version_UNICODEFIELDSrr})rrnr\ project_namer~rrrrrs4         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) rr}_MISSINGrrrrappendrrrr)rrnrxr\resvalrrrrs.         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 rAcs(|D]}|ddsdSqdS)NrrFT)rr)r\rr~rrare_valid_constraintssz3LegacyMetadata.check..are_valid_constraintsNzWrong value for '%s': %s) rrrrr r~rrrrrr) rstrictmissingwarningsrprrrh controllerrqr\rrrchecks2          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)rFurrrr]#rIz)LegacyMetadata.todict..)rrSr} _FIELD2ATTR)rZ skip_missingrhdatarr[rrrtodicts zLegacyMetadata.todictcCs8|ddkr$dD]}||vr||=q|d|7<dS)Nr r)r.r0r/r6r)r requirementsrqrrradd_requirements's  zLegacyMetadata.add_requirementscCstt|dSr)rrSrrrrrV2szLegacyMetadata.keysccs|D] }|VqdSrDrU)rr[rrr__iter__5s zLegacyMetadata.__iter__csfddDS)Ncsg|] }|qSrrrFr[rrrr]:rIz)LegacyMetadata.values..rUrrrrr9szLegacyMetadata.valuescsfddDS)Ncsg|]}||fqSrrrrrrr]=rIz(LegacyMetadata.items..rUrrrrr^<szLegacyMetadata.itemscCsd|jj|j|jfS)Nz <%s %s %s>) __class__rrnrRrrrr__repr__?szLegacyMetadata.__repr__)NNNrx)F)F)F)N)F)F)"rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrVrrr^rrrrrrws<     &  *  rwz pydist.jsonz metadata.jsonMETADATAc@seZdZdZedZedejZedejZ e Z edZ dZ deZddd d Zd Zd Zedfed fe d fe d fe d fd ZdZdIddZedZdefZdefZdefdefeeedefeeeedefddd Z[[ddZdJddZdd Ze d!d"Z!e d#d$Z"e"j#d%d$Z"dKd&d'Z$e d(d)Z%e d*d+Z&e&j#d,d+Z&d-d.Z'd/d0Z(d1d2Z)d3d4Z*d5d6d7d8d9d:d;d Z+d?d@Z,dLdCdDZ-dEdFZ.dGdHZ/dS)Mrz The metadata of a release. This implementation uses 2.1 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^[A-Z]([0-9A-Z-]*[0-9A-Z])?$z .{1,2047}rJz distlib (%s)r)legacy)rnrRsummaryzqname 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)rrnrRrZdynamic)_legacy_datar~NrxcCs@|||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)Nryrz)rr~rbr generatorr)rr~)r{r|rrr~_validate_mappingrrwvalidaterrMETADATA_VERSION GENERATORrr decodejsonloadsrPr)rrrrr~rrGrrrrus<    (    zMetadata.__init__)rnrRlicensekeywordsrr6r;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) rr[commonmappedlkmakerresultr\sentineldrrrrsD            zMetadata.__getattribute__cCsH||jvrD|j|\}}|p |j|vrD||}|sDtd||fdS)Nz.'%s' is an invalid value for the '%s' property)SYNTAX_VALIDATORSr~matchr)rr[r\r~pattern 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) Nrr r r rr rr rr) rrrrNotImplementedErrorr setdefault __setattr__rrrr)rr[r\rrrrkrrrrr s<               zMetadata.__setattr__cCst|j|jdSNT)rvrnrRrrrrname_and_versionszMetadata.name_and_versioncCsF|jr|jd}n|jdg}d|j|jf}||vrB|||S)Nr5providesz%s (%s))rrrrnrRr)rrsrrrr#s  zMetadata.providescCs |jr||jd<n ||jd<dS)Nr5r#)rrrrrrr#s 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 extendr_rget_requirements) rreqtsrr+rrincluderTr[errrr-&s.    zMetadata.get_requirementscCs|jr|S|jSrD)r _from_legacyrrrrr dictionaryOszMetadata.dictionarycCs|jr tnt|j|jSdSrD)rrr rDEPENDENCY_KEYSrrrr dependenciesUszMetadata.dependenciescCs|jr tn |j|dSrD)rrrrrrrrr4\sc Cs|d|jkrtg}|jD]"\}}||vr$||vr$||q$|rbdd|}t||D]\}}||||qjdS)NrzMissing metadata items: %sr) rrrMANDATORY_KEYSr^rrrr) rrr~rr[rrrrrrrrcs zMetadata._validate_mappingcCsB|jr.|jd\}}|s|r>td||n||j|jdS)NTz#Metadata: missing: %s, warnings: %s)rrr`rrrr~)rrrrrrrqs zMetadata.validatecCs(|jr|jdSt|j|j}|SdSr!)rrr r INDEX_KEYS)rrrrrrys zMetadata.todictcCs|jr |jrJ|j|jd}|jd}dD]*}||vr.|dkrHd}n|}||||<q.|dg}|dgkrtg}||d<d }|D]*\}}||vr||rd ||ig||<q|j|d <|S) NrT)rnrRrr description classifierr8rr&r))Z requires_distr)Zsetup_requires_distrr'r#)rrrrrrr#)rrZlmdrnkkwrVokrrrr1s*     zMetadata._from_legacyr!r"r*r$r%r'r(r)r-) rnrR)r r rrr7)r python.projectZ project_urlsZHome)r r=contactsrrn)r r=r>remailr)r r 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'r9z extra == "%s"z (%s) and %sr)rraddr)entriesr.r0r%r+ZrlistrrTrrrprocess_entriess"   z,Metadata._to_legacy..process_entriesTFr=r6r;)rrrwLEGACY_MAPPINGr^rrNr IndexErrorrrrrrsorted) rrBrZnmdr:r<rfoundrZr1Zr2rrr _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)rTry) ensure_asciiindent sort_keysrr) r{rPrrrGrrr1rrdumprr)rrrrrZ legacy_mdrrGrrrrs" 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)rrrrinsertrrE)rrralwaysentryZrsetrrrrszMetadata.add_requirementscCs*|jpd}|jpd}d|jj|j||fS)Nz (no name)z no versionz<%s %s %s (%s)>)rnrRrrr)rrnrRrrrrs  zMetadata.__repr__)NNNrx)N)NN)NNFT)0rrrrrecompileZMETADATA_VERSION_MATCHERIZ NAME_MATCHERZFIELDNAME_MATCHERrZVERSION_MATCHERZSUMMARY_MATCHERrrrr5r6r3r __slots__rrrrZ none_listdictZ none_dictr rrr propertyr"r#setterr-r2r4rrrr1rCrGrrrrrrrrHs   +* &    )    3 r)F)Ir __future__rrr?rrrrOr9rrcompatrrr rXr utilr r rRr r getLoggerrr`rrrr__all__rrrPrrrLrMrcrErdZ _426_FIELDSZ _426_MARKERSrOrerfrQrrrZEXTRA_RErSrirr^rrrrrrrrrrrtrvrwZMETADATA_FILENAMEZWHEEL_METADATA_FILENAMEZLEGACY_METADATA_FILENAMErrrrrsz             J  a