a R€aŘã@súdZddlmZddlZddlmZddlZddlZddlZddl m Z m Z ddl m Z mZmZddlmZdd lmZmZdd lmZmZe e¡ZGd d „d e ƒZGd d„de ƒZGdd„de ƒZGdd„de ƒZgd¢ZdZ dZ!e "d¡Z#e "d¡Z$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/DƒZ4d(d'„e4 5¡DƒZ6d)Z7d*Z8d+Z9d,Z:d-Z;d.ZƒZ?e "d0¡Z@d;d2d3„ZAGd4d5„d5e>ƒ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)ÚMetadataÚPKG_INFO_ENCODINGÚPKG_INFO_PREFERRED_VERSIONúutf-8ú1.1z \|ú ) úMetadata-VersionÚNameÚVersionÚPlatformÚSummaryÚ DescriptionÚKeywordsú Home-pageÚAuthorú Author-emailÚLicense)r r!r"r#úSupported-Platformr$r%r&r'r(r)r*Ú Classifierú Download-URLÚ ObsoletesÚProvidesÚRequires)r.r/r0r,r-)r r!r"r#r+r$r%r&r'r(r)Ú MaintainerúMaintainer-emailr*r,r-úObsoletes-Distú Project-URLú Provides-Distú Requires-DistúRequires-PythonúRequires-External)r5r6r7r3r8r1r2r4)r r!r"r#r+r$r%r&r'r(r)r1r2r*r,r-r3r4r5r6r7r8úPrivate-Versionú Obsoleted-ByúSetup-Requires-DistÚ ExtensionúProvides-Extra)r9r=r:r;r<)úDescription-Content-Typer0r/r.)r>z"extra\s*==\s*("([^"]+)"|'([^']+)')cCsZ|dkr tS|dkrtS|dkr$tS|dvrBttdd„tDƒƒS|dkrNtSt|ƒ‚dS)Nú1.0rú1.2)ú1.3ú2.1css|]}|tvr|VqdS©N)Ú _345_FIELDS)Ú.0ÚfrrrÚ zóz%_version2fieldlist..ú2.0)Ú _241_FIELDSÚ _314_FIELDSrDÚtupleÚ _566_FIELDSÚ _426_FIELDSr)ÚversionrrrÚ_version2fieldlistqsrPc Cs:dd„}g}| ¡D]"\}}|gddfvr,q| |¡qgd¢}|D]ö}|tvrnd|vrn| d¡t d|¡|tvr”d|vr”| d¡t d |¡|tvrºd |vrº| d ¡t d |¡|tvràd |vrà| d ¡t d |¡|tvrd|vr|dkr| d¡t d|¡|t vrDd|vrD| d¡t d|¡qDt |ƒdkrR|dSt |ƒdkrtt d|¡t dƒ‚d|vo†||t ƒ}d |voš||t ƒ}d|vo®||tƒ}d|voÂ||tƒ} t|ƒt|ƒt|ƒt| ƒdkròt 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)ÚkeysÚmarkersÚmarkerrrrÚ _has_marker‚sz"_best_version.._has_markerÚUNKNOWNN)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)ÚitemsÚappendrJÚremoveÚloggerÚdebugrKrDrMrNÚlenrÚ _314_MARKERSÚ _345_MARKERSÚ _566_MARKERSÚ _426_MARKERSÚintr) ÚfieldsrTrQÚkeyÚvalueZpossible_versionsZis_1_1Zis_1_2Zis_2_1Zis_2_0rrrÚ _best_version€s`              & rdcCsi|]}| ¡ dd¡|“qS)ú-Ú_)ÚlowerÚreplace)rEÚnamerrrÚ ÉsrjcCsi|]\}}||“qSrr)rEÚattrÚfieldrrrrjÌrH)r6r3r5)r7)r")r#r,r.r0r/r3r5r6r8r4r+r;r=r<)r4)r&)r(r1r$r%z[^A-Za-z0-9.]+FcCs0|r$t d|¡}t d| dd¡¡}d||fS)zhReturn the distribution name with version. If for_filename is true, return a filename-escaped form.reú Ú.z%s-%s)Ú _FILESAFEÚsubrh)rirOZ for_filenamerrrÚ_get_name_and_versionás rqc@s eZdZdZd?dd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zd@dd„Zdd„Zdd „Zd!d"„Zd#d$„ZdAd%d&„ZdBd'd(„ZdCd)d*„Zd+d,„Zefd-d.„ZdDd/d0„ZdEd1d2„Zd3d4„Zd5d6„Zd7d8„Zd9d:„Zd;d<„Z d=d>„Z!dS)FÚLegacyMetadataaoThe 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 NÚdefaultcCsz|||g d¡dkrtdƒ‚i|_g|_d|_||_|durH| |¡n.|dur\| |¡n|durv| |¡|  ¡dS)Néú'path, fileobj and mapping are exclusive) ÚcountÚ TypeErrorÚ_fieldsZrequires_filesZ _dependenciesÚschemeÚreadÚ read_fileÚupdateÚset_metadata_version)ÚselfÚpathÚfileobjÚmappingryrrrÚ__init__ús   zLegacyMetadata.__init__cCst|jƒ|jd<dS©Nr )rdrx©r~rrrr} sz#LegacyMetadata.set_metadata_versioncCs| d||f¡dS)Nz%s: %s )Úwrite)r~r€rircrrrÚ _write_field szLegacyMetadata._write_fieldcCs | |¡SrC)Úget©r~rirrrÚ __getitem__szLegacyMetadata.__getitem__cCs | ||¡SrC)Úset)r~rircrrrÚ __setitem__szLegacyMetadata.__setitem__cCs6| |¡}z |j|=Wnty0t|ƒ‚Yn0dSrC)Ú _convert_namerxÚKeyError)r~riÚ field_namerrrÚ __delitem__s    zLegacyMetadata.__delitem__cCs||jvp| |¡|jvSrC)rxrŒrˆrrrÚ __contains__s ÿzLegacyMetadata.__contains__cCs(|tvr |S| dd¡ ¡}t ||¡S)Nrerf)Ú _ALL_FIELDSrhrgÚ _ATTR2FIELDr‡rˆrrrrŒ!szLegacyMetadata._convert_namecCs|tvs|tvrgSdS)NrU)Ú _LISTFIELDSÚ_ELEMENTSFIELDrˆrrrÚ_default_value'szLegacyMetadata._default_valuecCs&|jdvrt d|¡St d|¡SdS)N©r?rÚ )Úmetadata_versionÚ_LINE_PREFIX_PRE_1_2rpÚ_LINE_PREFIX_1_2©r~rcrrrÚ_remove_line_prefix,s  z"LegacyMetadata._remove_line_prefixcCs|tvr||St|ƒ‚dSrC)r’ÚAttributeErrorrˆrrrÚ __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)rŒr‘rˆrrrÚis_fieldCs zLegacyMetadata.is_fieldcCs| |¡}|tvSrC)rŒr“rˆrrrÚis_multi_fieldHs zLegacyMetadata.is_multi_fieldcCs6tj|ddd}z| |¡W| ¡n | ¡0dS)z*Read the metadata values from a file path.Úrr©ÚencodingN)ÚcodecsÚopenr{Úclose)r~ÚfilepathÚfprrrrzLs zLegacyMetadata.readcCs¬t|ƒ}|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| d¡ƒ‘qS©ú,)rLÚsplit©rErcrrrÚ arHz,LegacyMetadata.read_file..rUr%)rrxr‘r“Zget_allÚ_LISTTUPLEFIELDSrŠZ get_payload)r~ZfileobÚmsgrlÚvaluesrcÚbodyrrrr{Ts zLegacyMetadata.read_filecCs8tj|ddd}z| ||¡W| ¡n | ¡0dS)z&Write the metadata fields to filepath.Úwrr£N)r¥r¦Ú write_filer§)r~r¨Ú skip_unknownr©rrrr…pszLegacyMetadata.writecCsÄ| ¡t|dƒD]ª}| |¡}|r8|dgdgfvr8q|tvrV| ||d |¡¡q|tvr|dkrŠ|jdvr~| dd¡}n | dd¡}|g}|t vr¦d d „|Dƒ}|D]}| |||¡qªqd S) z0Write the PKG-INFO format data to a file object.r rUr«r%r–r—rz |cSsg|]}d |¡‘qSrª©Újoinr­rrrr®ŒrHz-LegacyMetadata.write_file..N) r}rPr‡r”r†r·r“r˜rhr¯)r~Z fileobjectrµrlr±rcrrrr´xs$   zLegacyMetadata.write_filec sv‡fdd„}|sn@t|dƒr:| ¡D]}||||ƒq$n|D]\}}|||ƒq>|rr| ¡D]\}}|||ƒq^dS)a…Set 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)r’rŠrŒ)rbrcr„rrÚ_set›s z#LegacyMetadata.update.._setrQN)ÚhasattrrQrV)r~ÚotherÚkwargsr¸ÚkÚvrr„rr|‘s     zLegacyMetadata.updatecCsh| |¡}|tvs|dkrNt|ttfƒsNt|tƒrHdd„| d¡Dƒ}qzg}n,|tvrzt|ttfƒszt|tƒrv|g}ng}t  t j ¡r<|d}t |j ƒ}|tvrÚ|durÚ|D](}| | d¡d¡s®t d |||¡q®nb|tvr |dur | |¡s.r«r!Nú;rz$'%s': '%s' is not valid (field '%s')z.'%s': '%s' is not a valid version (field '%s')r%)rŒr”Ú isinstanceÚlistrLrr¬r“rYZ isEnabledForÚloggingZWARNINGr ryÚ_PREDICATE_FIELDSÚis_valid_matcherÚwarningÚ_VERSIONS_FIELDSÚis_valid_constraint_listÚ_VERSION_FIELDSÚis_valid_versionÚ_UNICODEFIELDSrœrx)r~rircZ project_nameryr½rrrrŠ­sJ  ÿ  ÿ  þ ÿ ÿ   zLegacyMetadata.setcCsÊ| |¡}||jvr*|tur&| |¡}|S|tvr@|j|}|S|tvrš|j|}|dur^gSg}|D].}|tvr~| |¡qf| |d|df¡qf|S|tvrÀ|j|}t |t ƒrÀ|  d¡S|j|S)zGet a metadata field.Nrrr«) rŒrxÚ_MISSINGr•rÊr“r¯rWr”rÀrr¬)r~rirsrcÚresÚvalrrrr‡Ùs.         zLegacyMetadata.getc sú| ¡gg}}dD]}||vr| |¡q|rP|gkrPdd |¡}t|ƒ‚dD]}||vrT| |¡qT|ddkr€||fSt|jƒ‰‡fdd„}t|ftˆjft ˆj ffD]@\}}|D]2} |  | d ¡} | d ur¼|| ƒs¼| d | | f¡q¼q°||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]}ˆ | d¡d¡sdSqdS)Nr¿rFT)rÄr¬)rcr½©ryrrÚare_valid_constraintssz3LegacyMetadata.check..are_valid_constraintsNzWrong value for '%s': %s) r}rWr·rr ryrÃrÆrÇrÈrÉr‡) r~ÚstrictÚmissingÚwarningsrkr°rÐraZ controllerrlrcrrÏrÚcheckös8       ÿÿý  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 Z project_urlcSsg|]}d |¡‘qSrªr¶)rEÚurrrr®5rHz)LegacyMetadata.todict..)r}rPrxÚ _FIELD2ATTR)r~Z skip_missingraÚdatarŽrbrrrÚtodict"s zLegacyMetadata.todictcCs8|ddkr$dD]}||vr||=q|d|7<dS)Nr r)r.r0r/r6r)r~Ú requirementsrlrrrÚadd_requirements9s  zLegacyMetadata.add_requirementscCstt|dƒƒSrƒ)rÁrPr„rrrrQDszLegacyMetadata.keysccs| ¡D] }|VqdSrC©rQ)r~rbrrrÚ__iter__Gs zLegacyMetadata.__iter__cs‡fdd„ˆ ¡DƒS)Ncsg|] }ˆ|‘qSrr©rErbr„rrr®LrHz)LegacyMetadata.values..rÛr„rr„rr±KszLegacyMetadata.valuescs‡fdd„ˆ ¡DƒS)Ncsg|]}|ˆ|f‘qSrrrÝr„rrr®OrHz(LegacyMetadata.items..rÛr„rr„rrVNszLegacyMetadata.itemscCsd|jj|j|jfS)Nz <%s %s %s>)Ú __class__rrirOr„rrrÚ__repr__Qs ÿzLegacyMetadata.__repr__)NNNrs)F)F)F)N)F)F)"rrrrr‚r}r†r‰r‹rrrŒr•rœržrŸr r¡rzr{r…r´r|rŠrËr‡rÔrØrÚrQrÜr±rVrßrrrrrrîs@ ÿ     ,  ,  rrz pydist.jsonz metadata.jsonZMETADATAc@sšeZdZdZe d¡Ze dej¡Ze Z e d¡Z dZ de Zdddd œZd Zd Zedfedfe dfe dfd œZd ZdHdd„ZedƒZdefZdefZdefdefeeedefeeeedefdddœ Z[[dd„ZdIdd„Zdd„Zed 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'd0d1„Z(d2d3„Z)d4d5d6d7d8d9d:d;dd?„Z+dKdBdC„Z,dDdE„Z-dFdG„Z.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)rirOÚsummaryzqname 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˜rirOrá)Ú_legacyÚ_dataryNrscCs@|||g d¡dkrtdƒ‚d|_d|_||_|durxz| ||¡||_Wn(tytt||d|_| ¡Yn0nÄd}|r´t |dƒ}|  ¡}WdƒqÀ1s¨0Yn |rÀ|  ¡}|durÚ|j |j dœ|_nbt |tƒsî| d¡}zt |¡|_| |j|¡Wn.ty:tt|ƒ|d|_| ¡Yn0dS)Nrtru)rryÚrb©r˜Ú generatorr)r€ry)rvrwrârãryÚ_validate_mappingrrrÚvalidater¦rzÚMETADATA_VERSIONÚ GENERATORrÀr ÚdecodeÚjsonÚloadsÚ ValueErrorr)r~rr€rryr×rFrrrr‚…s@    (þ    ÿzMetadata.__init__)rirOÚlicenseÚkeywordsrár6r;r=r,)r-N)r N) Ú run_requiresÚbuild_requiresÚ dev_requiresZ test_requiresÚ meta_requiresÚextrasÚmodulesÚ namespacesÚexportsÚcommandsÚ classifiersÚ source_urlr˜c CsXt |d¡}t |d¡}||vr||\}}|jr^|durP|durHdn|ƒ}n |j |¡}nº|durjdn|ƒ}|dvrˆ|j ||¡}ntƒ}|}|j d¡} | r |dkrº|  d|¡}nP|dkrÞ|  d¡} | rÜ|  ||¡}n,|  d ¡} | sø|j d ¡} | r |  ||¡}||urT|}n:||vr2t ||¡}n"|jrH|j |¡}n |j |¡}|S) NÚ common_keysÚ mapped_keys©rùrørör÷rúÚ extensionsrùúpython.commandsrúúpython.detailsúpython.exports)ÚobjectÚ__getattribute__râr‡rã) r~rbÚcommonÚmappedÚlkZmakerÚresultrcÚsentinelÚdrrrrÉsD            zMetadata.__getattribute__cCsH||jvrD|j|\}}|p |j|vrD| |¡}|sDtd||fƒ‚dS)Nz.'%s' is an invalid value for the '%s' property)ÚSYNTAX_VALIDATORSryÚmatchr)r~rbrcryÚpatternÚ exclusionsÚmrrrÚ_validate_valueôs  ÿÿzMetadata._validate_valuecCs*| ||¡t |d¡}t |d¡}||vr¾||\}}|jrV|durJt‚||j|<nf|dvrj||j|<nR|j di¡}|dkrŠ||d<n2|dkr¨| di¡}|||<n| d i¡}|||<nh||vrÖt |||¡nP|d krt|t ƒr|  ¡}|r|  ¡}ng}|jr||j|<n ||j|<dS) Nrürýrþrÿrùrrúrrrð) rrrrâÚNotImplementedErrorrãÚ setdefaultÚ __setattr__rÀrr¾r¬)r~rbrcrrrrfr rrrrþs<               zMetadata.__setattr__cCst|j|jdƒS©NT)rqrirOr„rrrÚname_and_version%szMetadata.name_and_versioncCsF|jr|jd}n|j dg¡}d|j|jf}||vrB| |¡|S)Nr5Úprovidesz%s (%s))rârãrrirOrW)r~rÚsrrrr)s  zMetadata.providescCs |jr||jd<n ||jd<dS)Nr5r)rârãr›rrrr4s c CsÚ|jr |}nÊg}t|pg|jƒ}|D]d}d|vr>d|vr>d}n8d|vrLd}n| d¡|v}|rv| d¡}|rvt||ƒ}|r$| |d¡q$dD]F}d|} | |vrŽ| | ¡|j d|g¡}| |j|||d¡qŽ|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Ú environmentTÚrequires)ZbuildÚdevÚtestz:%s:z %s_requires)rõÚenv) râr rõr‡r ÚextendrXrãÚget_requirements) r~Úreqtsrõrrr ZincluderSrbÚerrrr;s2     ÿ zMetadata.get_requirementscCs|jr| ¡S|jSrC)râÚ _from_legacyrãr„rrrÚ dictionaryeszMetadata.dictionarycCs|jr t‚nt|j|jƒSdSrC)rârr rãÚDEPENDENCY_KEYSr„rrrÚ dependencieskszMetadata.dependenciescCs|jr t‚n |j |¡dSrC)rârrãr|r›rrrr%rsc Cs†| d¡|jkrtƒ‚g}|j ¡D]"\}}||vr$||vr$| |¡q$|rbdd |¡}t|ƒ‚| ¡D]\}}| |||¡qjdS)Nr˜zMissing metadata items: %srÎ) r‡rérÚMANDATORY_KEYSrVrWr·rr) r~rryrÒrbrr°r¼r½rrrrçys zMetadata._validate_mappingcCsB|jr.|j d¡\}}|s|r>t d||¡n| |j|j¡dS)NTz#Metadata: missing: %s, warnings: %s)rârÔrYrÅrçrãry)r~rÒrÓrrrrè‡sÿzMetadata.validatecCs(|jr|j d¡St|j|jƒ}|SdSr)rârØr rãÚ INDEX_KEYS)r~rrrrrØs zMetadata.todictc CsÆ|jr |jrJ‚|j|jdœ}|j d¡}dD]*}||vr.|dkrHd}n|}||||<q.| dg¡}|dgkrtg}||d<d }|D]*\}}||vr„||r„d ||ig||<q„|j|d <i}i} |S) NråT)rirOrïráÚ descriptionÚ classifierr)rúr&Úrð))Z requires_distrñ)Zsetup_requires_distròrr)rârãrérêrØr‡r) r~rZlmdr¼ÚnkÚkwrQÚokZauthorZ maintainerrrrr"—s.þ     zMetadata._from_legacyr!r"r*r$r%r'r(r)r-) rirO)rÿrrïrár()rÿúpython.projectZ project_urlsZHome)rÿr.Úcontactsrri)rÿr.r/rÚemailrû)rÿrrúc Csôdd„}|jr|jrJ‚tƒ}|j}|j ¡D]t\}}t|tƒsV||vr¢||||<q.|}d}|D]2}z ||}Wqbttfy’d}Yq–Yqb0qb|r.|||<q.||j |j ƒ} ||j |j ƒ} |j rØt|j ƒ|d<t| ƒ|d<t| ƒ|d<|S)NcSsŒtƒ}|D]|}| d¡}| d¡}|d}|D]V}|sF|sF| |¡q.d}|rVd|}|rp|rld||f}n|}| d ||f¡¡q.q |S)Nrrrr*z extra == "%s"z (%s) and %sr¿)rŠr‡Úaddr·)Úentriesr r!rrZrlistr¢rSrrrÚprocess_entriesÂs"   z,Metadata._to_legacy..process_entriesTFr=r6r;)rãrârrÚLEGACY_MAPPINGrVrÀrLrÚ IndexErrorrñrôròrórõÚsorted) r~r3rZnmdr+r-r Úfoundr¼Zr1Zr2rrrÚ _to_legacyÁs2     zMetadata._to_legacyFTcCsÖ||g d¡dkrtdƒ‚| ¡|r`|jr4|j}n| ¡}|rP|j||dqÒ|j||dnr|jrp| ¡}n|j}|rt j ||ddddnBt   |dd¡$}t j ||ddddWdƒn1sÈ0YdS) Nrz)Exactly one of path and fileobj is needed)rµTrt)Z ensure_asciiÚindentZ sort_keysr³r) rvrîrèrâr8r…r´r"rãrìÚdumpr¥r¦)r~rr€ràrµZ legacy_mdr rFrrrr…ós*  ÿ ÿzMetadata.writecCsŠ|jr|j |¡nr|j dg¡}d}|D]}d|vr*d|vr*|}qHq*|durfd|i}| d|¡n t|dƒt|ƒB}t|ƒ|d<dS)Nrñrrrr)rârÚrãrÚinsertrŠr6)r~rÙrñÚalwaysÚentryZrsetrrrrÚ szMetadata.add_requirementscCs*|jpd}|jpd}d|jj|j||fS)Nz (no name)z no versionz<%s %s %s (%s)>)rirOrÞrr˜)r~rirOrrrrßs   ÿzMetadata.__repr__)NNNrs)N)NN)NNFT)/rrrrÚreÚcompileZMETADATA_VERSION_MATCHERÚIZ NAME_MATCHERrZVERSION_MATCHERZSUMMARY_MATCHERrérrêr&r'r$r Ú __slots__r‚rŠrürÁZ none_listÚdictZ none_dictrýrrrÚpropertyrrÚsetterrr#r%rçrèrØr"r4r8r…rÚrßrrrrr[s–  ýüÿ -ó+ '    *    ö 2 r)F)GrZ __future__rr¥r0rrìrÂr>r*rrÚcompatrrr rRr Úutilr r rOr rZ getLoggerrrYrrrrÚ__all__rrr?ršr™rJrKr\rDr]rNr_rMr^rŠr‘r|ZEXTRA_RErPrdr’rVrÖrÃrÆrÈr“r¯r”rÊrrËrorqrrZMETADATA_FILENAMEZWHEEL_METADATA_FILENAMEZLEGACY_METADATA_FILENAMErrrrrÚsx             Iÿ  j