3 Pf@sdZddlmZddlZddlmZddlZddlZddlZddl m Z m Z ddl m Z mZmZddlmZdd lmZmZdd lmZmZejeZGd d d e ZGd dde ZGddde ZGddde ZdddgZdZ dZ!ej"dZ#ej"dZ$dGZ%dHZ&dIZ'dJZ(dKZ)dLZ*dMZ+e,Z-e-j.e%e-j.e&e-j.e(e-j.e*ej"d8Z/d9d:Z0d;d<Z1ddddd%ddd d!d"d#d+d,d$d&d'd-d/d0d5d1d2d*d)d(d.d3d4d6d7d=Z2dNZ3dOZ4dPZ5dQZ6dRZ7dSZ8dTZ9e:Z;ej"d>ZdDZ?dEZ@GdFdde:ZAdS)VzImplementation 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.6/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-Extraz"extra\s*==\s*("([^"]+)"|'([^']+)')cCs<|dkr tS|dkrtS|dkr$tS|dkr0tSt|dS)Nz1.0z1.1z1.2z2.0) _241_FIELDS _314_FIELDS _345_FIELDS _426_FIELDSr)versionrrr_version2fieldlistgsr?c Csdd}g}x.|jD]"\}}|gddfkr.q|j|qWddddg}xt|D]l}|tkrld|krl|jd|tkrd|kr|jd|tkrd|kr|jd|tkrNd|krN|jdqNWt|d kr|d St|d krtd d|ko||t }d|ko ||t }d|ko||t }t |t |t |d krFtd | rl| rl| rlt |krlt S|rvdS|rdSdS) z5Detect the best version depending on the fields used.cSsx|D]}||krdSqWdS)NTFr)keysmarkersmarkerrrr _has_markerus z"_best_version.._has_markerUNKNOWNNz1.0z1.1z1.2z2.0rrzUnknown metadata setz(You used incompatible 1.1/1.2/2.0 fields)itemsappendr:remover;r<r=lenr _314_MARKERS _345_MARKERS _426_MARKERSintr) fieldsrCr@keyvalueZpossible_versionsZis_1_1Zis_1_2Zis_2_0rrr _best_versionssB        rP)metadata_versionnamer>platformZsupported_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_extraz[^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.- .z%s-%s) _FILESAFEsubreplace)rRr>Z for_filenamerrr_get_name_and_versions rpc@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|||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_filesZ _dependenciesschemeread read_fileupdateset_metadata_version)selfpathfileobjmappingrwrrr__init__s   zLegacyMetadata.__init__cCst|j|jd<dS)NzMetadata-Version)rPrv)r|rrrr{sz#LegacyMetadata.set_metadata_versioncCs|jd||fdS)Nz%s: %s )write)r|r~rRrOrrr _write_field szLegacyMetadata._write_fieldcCs |j|S)N)get)r|rRrrr __getitem__szLegacyMetadata.__getitem__cCs |j||S)N)set)r|rRrOrrr __setitem__szLegacyMetadata.__setitem__c Cs8|j|}y |j|=Wntk r2t|YnXdS)N) _convert_namervKeyError)r|rR field_namerrr __delitem__s   zLegacyMetadata.__delitem__cCs||jkp|j||jkS)N)rvr)r|rRrrr __contains__s zLegacyMetadata.__contains__cCs(|tkr |S|jddj}tj||S)Nrj_) _ALL_FIELDSrolower _ATTR2FIELDr)r|rRrrrrszLegacyMetadata._convert_namecCs|tks|tkrgSdS)NrD) _LISTFIELDS_ELEMENTSFIELD)r|rRrrr_default_value%szLegacyMetadata._default_valuecCs&|jdkrtjd|Stjd|SdS)N1.01.1 )rr)rQ_LINE_PREFIX_PRE_1_2rn_LINE_PREFIX_1_2)r|rOrrr_remove_line_prefix*s  z"LegacyMetadata._remove_line_prefixcCs|tkr||St|dS)N)rAttributeError)r|rRrrr __getattr__0szLegacyMetadata.__getattr__FcCst|d|d|S)zhReturn the distribution name with version. If filesafe is true, return a filename-escaped form.rr)rp)r|Zfilesaferrr get_fullname;szLegacyMetadata.get_fullnamecCs|j|}|tkS)z+return True if name is a valid metadata key)rr)r|rRrrris_fieldAs zLegacyMetadata.is_fieldcCs|j|}|tkS)N)rr)r|rRrrris_multi_fieldFs zLegacyMetadata.is_multi_fieldc Cs.tj|ddd}z|j|Wd|jXdS)z*Read the metadata values from a file path.rzutf-8)encodingN)codecsopenryclose)r|filepathfprrrrxJszLegacyMetadata.readcCst|}|d|jd<xxtD]p}||kr*q|tkrh|j|}|tkrZ|dk rZdd|D}|j||q||}|dk r|dkr|j||qW|jdS)z,Read the metadata values from a file object.zmetadata-versionzMetadata-VersionNcSsg|]}t|jdqS),)tuplesplit).0rOrrr _sz,LegacyMetadata.read_file..rD)rrvrrZget_all_LISTTUPLEFIELDSrr{)r|ZfileobmsgfieldvaluesrOrrrryRs  zLegacyMetadata.read_filec Cs0tj|ddd}z|j||Wd|jXdS)z&Write the metadata fields to filepath.wzutf-8)rN)rr write_filer)r|r skip_unknownrrrrrhszLegacyMetadata.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-VersionrDrr!1.01.1rz z |cSsg|]}dj|qS)r)join)rrOrrrrsz-LegacyMetadata.write_file..N)rr) r{r?rrrrrrQror)r|Z fileobjectrrrrOrrrrps$    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)rrr)rNrO)r|rr_sets z#LegacyMetadata.update.._setr@N)hasattrr@rE)r|otherkwargsrkvr)r|rrzs  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)rrrrrrsz&LegacyMetadata.set..rrN;rz$'%s': '%s' is not valid (field '%s')z.'%s': '%s' is not a valid version (field '%s')r!)rr isinstancelistrrrrloggerZ isEnabledForloggingZWARNINGr rw_PREDICATE_FIELDSis_valid_matcherwarning_VERSIONS_FIELDSis_valid_constraint_list_VERSION_FIELDSis_valid_version_UNICODEFIELDSrrv)r|rRrOZ project_namerwrrrrrs@            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) rrv_MISSINGrrrrrFrrrr)r|rRrrrOresvalrrrrs.          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)rOr)rwrrare_valid_constraintss z3LegacyMetadata.check..are_valid_constraintsNzWrong value for '%s': %s)rr)rr$) r{rFrrr rwrrrrrr) r|strictmissingwarningsattrrrrMZ controllerrrOr)rwrchecks2         zLegacyMetadata.checkcCs|jdB}i}x,|D]$\}}| s.||jkr||||<qW|ddkrdK}x|D]F\}}| sn||jkrV|d&kr||||<qVd,d-||D||<qVWnF|dd.krdO}x2|D]*\}}| s||jkr||||<qW|S)PzReturn 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). rQMetadata-VersionrRrr>rrTr rW Home-pagerXr$rY Author-emailr\r&rUr!rVr"rSr classifiersr(r^ Download-URLz1.2ra Requires-DistrcRequires-PythonrdRequires-Externalr` Provides-Distr_Obsoletes-Distrh Project-URLrZr-r[Maintainer-emailcSsg|]}dj|qS)r)r)rurrrrGsz)LegacyMetadata.todict..z1.1rfr+rer,rgr*rQrrRrr>rrTr rWrrXr$rYrr\r&rUr!rVr"rSrrr(r^r) rrrrrrrrrrrrrrarrcrrdrr`rr_rrhrrZr-r[r)rrrrrrrrrfr+rer,rgr*)rrr)r{rv)r|Z skip_missingZ mapping_1_0datarNrZ mapping_1_2Z mapping_1_1rrrtodictsP zLegacyMetadata.todictcCs<|ddkr(xdD]}||kr||=qW|d|7<dS)NzMetadata-Versionz1.1r*r,r+z Requires-Dist)r*r,r+r)r| requirementsrrrradd_requirementsUs    zLegacyMetadata.add_requirementscCstt|dS)NzMetadata-Version)rr?)r|rrrr@`szLegacyMetadata.keysccsx|jD] }|Vq WdS)N)r@)r|rNrrr__iter__cszLegacyMetadata.__iter__csfddjDS)Ncsg|] }|qSrr)rrN)r|rrrhsz)LegacyMetadata.values..)r@)r|r)r|rrgszLegacyMetadata.valuescsfddjDS)Ncsg|]}||fqSrr)rrN)r|rrrksz(LegacyMetadata.items..)r@)r|r)r|rrEjszLegacyMetadata.itemscCsd|jj|j|jfS)Nz <%s %s %s>) __class__rrRr>)r|rrr__repr__ms zLegacyMetadata.__repr__)NNNrr)F)F)F)N)F)F)"rrrrrr{rrrrrrrrrrrrrxryrrrzrrrrrrr@rrrErrrrrrqs>      ,  , ; rqz pydist.jsonz metadata.jsonc@seZdZdZejdZejdejZe Z ejdZ dZ de ZffdIdZd Zd ZeffedJfe dKfe dLfd ZdMZdNddZedOZdefZdefZdefdefeeedefeeeedefdPdQd Z[[dd ZdRd!d"Zd#d$Zed%d&Z ed'd(Z!e!j"d)d(Z!dSd*d+Z#ed,d-Z$ed.d/Z%e%j"d0d/Z%d1d2Z&d3d4Z'd5d6Z(d7d8Z)d9d:d;dZ*d?d@Z+dTdCdDZ,dEdFZ-dGdHZ.dS)Urz 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)rRr>rTzqname 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)rQrRr>rT_legacy_datarwNrrcCs0|||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)Nrsz'path, fileobj and mapping are exclusive)rrwrb)rQ generatorzutf-8)r~rw)rtrurrrw_validate_mappingrrqvalidaterrxMETADATA_VERSION GENERATORrr decodejsonloads ValueErrorr)r|r}r~rrwrfrrrrs<       zMetadata.__init__rRr>r\rVrTz Requires-DistzSetup-Requires-DistzProvides-Extrar( Download-URLMetadata-Version) run_requiresbuild_requires dev_requiresZ test_requires meta_requiresextrasmodules namespacesexportscommandsrZ source_urlrQc 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__rrr) r|rNcommonmappedlkZmakerresultrOsentineldrrrrsF            zMetadata.__getattribute__cCsH||jkrD|j|\}}|p |j|krD|j|}|sDtd||fdS)Nz.'%s' is an invalid value for the '%s' property)SYNTAX_VALIDATORSrwmatchr)r|rNrOrwpattern 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.exportsrV)rrrrr) r'rrrNotImplementedErrorr setdefault __setattr__rrrr)r|rNrOrrrrr!rrrr*s>               zMetadata.__setattr__cCst|j|jdS)NT)rprRr>)r|rrrname_and_version@szMetadata.name_and_versioncCsF|jr|jd}n|jjdg}d|j|jf}||krB|j||S)Nz Provides-Distrfz%s (%s))rrr)rRr>rF)r|rsrrrrfDs  zMetadata.providescCs |jr||jd<n ||jd<dS)Nz Provides-Distrf)rr)r|rOrrrrfOs 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 environmentTrebuilddevtestz:%s:z %s_requires)renv)r/r0r1) rr rrr extendrGrget_requirements) r|reqtsrr2rr!includerBrNerrrr4Vs0       zMetadata.get_requirementscCs|jr|jS|jS)N)r _from_legacyr)r|rrr dictionaryszMetadata.dictionarycCs|jr tnt|j|jSdS)N)rr(r rDEPENDENCY_KEYS)r|rrr dependenciesszMetadata.dependenciescCs|jr tn |jj|dS)N)rr(rrz)r|rOrrrr;sc Cs|jd|jkrtg}x0|jjD]"\}}||kr&||kr&|j|q&W|rfddj|}t|x"|jD]\}}|j|||qpWdS)NrQzMissing metadata items: %sz, ) rrrMANDATORY_KEYSrErFrrr') r|rrwrrNr%rrrrrrrszMetadata._validate_mappingcCsB|jr.|jjd\}}|s|r>tjd||n|j|j|jdS)NTz#Metadata: missing: %s, warnings: %s)rrrrrrrw)r|rrrrrrs  zMetadata.validatecCs(|jr|jjdSt|j|j}|SdS)NT)rrr r INDEX_KEYS)r|rrrrrs 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)rQrTrRr>r\rTrUr]rr"rVrarrbrrerf)rRr>r\rTrUr]rarrbr)r?r@)rrAssertionErrorrrrrrf) r|rZlmdrnkkwr@okrXrZrrrr8s0     zMetadata._from_legacyrrr&r r!)rRr>r\rTrUrcCsdd}|jr|j stt}|j}x*|jjD]\}}||kr2||||<q2W||j|j}||j|j }|j rt |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.rer>z extra == "%s"z (%s) and %sr)rraddr)Zentriesr5r7r-r2ZrlistrrBrrrprocess_entriess"      z,Metadata._to_legacy..process_entrieszProvides-Extraz Requires-DistzSetup-Requires-Dist) rrrArqLEGACY_MAPPINGrErrrrrsorted)r|rFrZnmdrBrDZr1Zr2rrr _to_legacys  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)rTrs)Z ensure_asciiindentZ sort_keysrzutf-8) rtr rrrIrrr8rrdumprr)r|r}r~rrZ legacy_mdr!r rrrrs&    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-rer)rrrr)insertrrH)r|rralwaysentryZrsetrrrrs zMetadata.add_requirementscCs*|jpd}|jpd}d|jj|j||fS)Nz (no name)z no versionz<%s %s %s (%s)>)rRr>rrrQ)r|rRr>rrrr(s  zMetadata.__repr__)r)r)r)r)rrrw)NNNrr)rRr>r\rVrT)r N)r N)N)NN)NNFT)/rrrrrecompileZMETADATA_VERSION_MATCHERIZ NAME_MATCHERrZVERSION_MATCHERZSUMMARY_MATCHERrrrr<r=r:r" __slots__rrrrZ none_listdictZ none_dictrrr'r*propertyr+rfsetterr4r9r;rrrr8rGrIrrrrrrrrvsx    ,+ '   *   % ) 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)r2r/r1)r3)r)rr(r*r,r+r/r1r2r4r0r'r7r9r8)r0)r")r$r-r r!)F)BrZ __future__rrZemailrrrrOr>rrcompatrrr rAr utilr r r>r rZ getLoggerrrrrrr__all__rrrPrrr:r;rIr<rJr=rKrrrzZEXTRA_REr?rPrrrrrrrrrrrmrprqZMETADATA_FILENAMEZWHEEL_METADATA_FILENAMErrrrr s             9