a q egD—ã@sdZddlmZddlZddlmZddlZddlZddlZddl 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-d!Z.e,e.Z/e0ƒZ1e1 2e%¡e1 2e&¡e1 2e(¡e1 2e*¡e1 2e,¡e1 2e/¡e "d"¡Z3d#d$„Z4d%d&„Z5d'd(„e1DƒZ6d)d(„e6 7¡DƒZ8d*Z9d+Z:d,Z;d-Zd0Z?e@ƒZAe "d1¡ZBdAttempt 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)Ú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>)ÚDynamicú License-Filez"extra\s*==\s*("([^"]+)"|'([^']+)')cCsl|dkr tS|dkrtS|dkr$tS|dvrBttdd„tDƒƒS|dkrTtdƒ‚n |d kr`tSt|ƒ‚dS) Nú1.0rú1.2)ú1.3ú2.1css|]}|tvr|VqdS©N)Ú _345_FIELDS)Ú.0ÚfrrrÚ póz%_version2fieldlist..ú2.0z+Metadata 2.0 is withdrawn and not supportedú2.2)Ú _241_FIELDSÚ _314_FIELDSrFÚtupleÚ _566_FIELDSÚ ValueErrorÚ _643_FIELDSr)ÚversionrrrÚ_version2fieldlistgs rTc Csdd„}dd„| ¡Dƒ}gd¢}|D]ð}|tvrPd|vrP| d¡t d|¡|tvrvd|vrv| d¡t d |¡|tvrœd |vrœ| d ¡t d |¡|tvrÂd |vrÂ| d ¡t d |¡|tvrðd|vrð|dkrð| d¡t d|¡|tvr&d|vr&| d¡t d|¡q&t |ƒdkr.|dSt |ƒdkrPt d|¡t dƒ‚d|vob||t ƒ}d |vov||t ƒ}d|voŠ||t ƒ}d|vož||tƒ}t|ƒt|ƒt|ƒt|ƒdkrÎt dƒ‚|sô|sô|sô|sôt|vrôtS|rþdS|rd S|rdSdS)z5Detect the best version depending on the fields used.cst‡fdd„|DƒƒS)Nc3s|]}|ˆvVqdSrEr)rGÚmarker©ÚkeysrrrI}rJz5_best_version.._has_marker..)Úany)rWÚmarkersrrVrÚ _has_marker|sz"_best_version.._has_markercSs"g|]\}}|gddfvr|‘qS)ÚUNKNOWNNr)rGÚkeyÚvaluerrrÚ rJz!_best_version..)rArrBrCrDrLrAzRemoved 1.0 due to %srzRemoved 1.1 due to %srBzRemoved 1.2 due to %srCzRemoved 1.3 due to %srDr%zRemoved 2.1 due to %srLzRemoved 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)ÚitemsrMÚremoveÚloggerÚdebugrNrFrPrRÚlenrÚ _314_MARKERSÚ _345_MARKERSÚ _566_MARKERSÚ _643_MARKERSÚintr) ÚfieldsrZrWZpossible_versionsr\Zis_1_1Zis_1_2Zis_2_1Zis_2_2rrrÚ _best_versionysX            & rjcCsi|]}| ¡ dd¡|“qS)ú-Ú_)ÚlowerÚreplace)rGÚnamerrrÚ ÃrJrpcCsi|]\}}||“qSrr)rGÚattrÚfieldrrrrpÄrJ)r6r3r5)r7)r")r#r,r.r0r/r3r5r6r8r4r+r;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.rkú Ú.z%s-%s)Ú _FILESAFEÚsubrn)rorSZ for_filenamerrrÚ_get_name_and_version×s rwc@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ÚmappingrrrrÚ__init__ñs   zLegacyMetadata.__init__cCst|jƒ|jd<dS©Nr )rjr~©r„rrrrƒsz#LegacyMetadata.set_metadata_versioncCs| d||f¡dS)Nz%s: %s )Úwrite)r„r†ror]rrrÚ _write_fieldszLegacyMetadata._write_fieldcCs | |¡SrE)Úget©r„rorrrÚ __getitem__szLegacyMetadata.__getitem__cCs | ||¡SrE)Úset)r„ror]rrrÚ __setitem__ szLegacyMetadata.__setitem__cCs6| |¡}z |j|=Wnty0t|ƒ‚Yn0dSrE)Ú _convert_namer~ÚKeyError)r„roÚ field_namerrrÚ __delitem__ s    zLegacyMetadata.__delitem__cCs||jvp| |¡|jvSrE)r~r’rŽrrrÚ __contains__szLegacyMetadata.__contains__cCs(|tvr |S| dd¡ ¡}t ||¡S)Nrkrl)Ú _ALL_FIELDSrnrmÚ _ATTR2FIELDrrŽrrrr’szLegacyMetadata._convert_namecCs|tvs|tvrgSdS)Nr[)Ú _LISTFIELDSÚ_ELEMENTSFIELDrŽrrrÚ_default_valueszLegacyMetadata._default_valuecCs&|jdvrt d|¡St d|¡SdS)N©rArÚ )Úmetadata_versionÚ_LINE_PREFIX_PRE_1_2rvÚ_LINE_PREFIX_1_2©r„r]rrrÚ_remove_line_prefix!s  z"LegacyMetadata._remove_line_prefixcCs|tvr||St|ƒ‚dSrE)r˜ÚAttributeErrorrŽrrrÚ __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")rw)r„ZfilesaferrrÚ get_fullname0szLegacyMetadata.get_fullnamecCs| |¡}|tvS)z+return True if name is a valid metadata key)r’r—rŽrrrÚis_field8s zLegacyMetadata.is_fieldcCs| |¡}|tvSrE)r’r™rŽrrrÚis_multi_field=s 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Úfprrrr€As 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©ú,)rOÚsplit©rGr]rrrr^VrJz,LegacyMetadata.read_file..r[r%)rr~r—r™Úget_allÚ_LISTTUPLEFIELDSrÚ get_payload)r„ZfileobÚmsgrrÚvaluesr]ÚbodyrrrrIs 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‹eszLegacyMetadata.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 r[r±r%rœrrz |cSsg|]}d |¡‘qSr°©Újoinr³rrrr^rJz-LegacyMetadata.write_file..N) rƒrTrršrŒr¾r™ržrnrµ)r„Ú fileobjectr¼rrr¸r]rrrr»ms$   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ˆ ˆ |¡|¡dSrE)r˜rr’)r\r]rŠrrÚ_set‘s z#LegacyMetadata.update.._setrWN)ÚhasattrrWr_)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ÚlistrOrr²r™raÚ isEnabledForÚloggingÚWARNINGr rÚ_PREDICATE_FIELDSÚis_valid_matcherÚwarningÚ_VERSIONS_FIELDSÚis_valid_constraint_listÚ_VERSION_FIELDSÚis_valid_versionÚ_UNICODEFIELDSr¢r~)r„ror]Ú project_namerrÅrrrr£s4         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’r~Ú_MISSINGr›rÔr™rµÚappendršrÈrr²)r„roryr]Ú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 rBcs(|D]}ˆ | d¡d¡sdSqdS)NrÇrFT)rÎr²)r]rÅ©rrrÚare_valid_constraintssz3LegacyMetadata.check..are_valid_constraintsNzWrong value for '%s': %s) rƒr×r¾rr rrÍrÐrÑrÒrÓr) r„ÚstrictÚmissingÚwarningsrqr·rÜriÚ controllerrrr]rrÛrÚcheckæs2        ÿÿ  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 |¡‘qSr°r½)rGÚurrrr^#rJz)LegacyMetadata.todict..)rƒrTr~Ú _FIELD2ATTR)r„Z skip_missingriÚdatar”r\rrrÚtodicts zLegacyMetadata.todictcCs8|ddkr$dD]}||vr||=q|d|7<dS)Nr r)r.r0r/r6r)r„Ú requirementsrrrrrÚadd_requirements's  zLegacyMetadata.add_requirementscCstt|dƒƒSr‰)rÉrTrŠrrrrW2szLegacyMetadata.keysccs| ¡D] }|VqdSrErV)r„r\rrrÚ__iter__5s zLegacyMetadata.__iter__cs‡fdd„ˆ ¡DƒS)Ncsg|] }ˆ|‘qSrr©rGr\rŠrrr^:rJz)LegacyMetadata.values..rVrŠrrŠrr¸9szLegacyMetadata.valuescs‡fdd„ˆ ¡DƒS)Ncsg|]}|ˆ|f‘qSrrrêrŠrrr^=rJz(LegacyMetadata.items..rVrŠrrŠrr_<szLegacyMetadata.itemscCsd|jj|j|jfS)Nz <%s %s %s>)Ú __class__rrorSrŠrrrÚ__repr__?szLegacyMetadata.__repr__)NNNry)F)F)F)N)F)F)"rrrrrˆrƒrŒrr‘r•r–r’r›r¢r¤r¥r¦r§r€rr‹r»r‚rrÖrrárærèrWrér¸r_rìrrrrrxäs<     &  *  rxz pydist.jsonz metadata.jsonÚMETADATAc@s®eZdZdZe d¡Ze dej¡Ze dej¡Z e Z e d¡Z dZ deZddd d œZd Zd Zedfed fe d fe d fe d fd œZdZdIdd„ZedƒZdefZdefZdefdefeeedefeeeedefdddœ Z[[dd„ZdJdd„Zdd „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/d0„Z(d1d2„Z)d3d4„Z*d5d6d7d8d9d:d;dœ Z+d?d@„Z,dLdCdD„Z-dEdF„Z.dGdH„Z/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}rKz distlib (%s)r)Úlegacy)rorSÚ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žrorSrïZdynamic)Ú_legacyÚ_datarNrycCs@|||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)Nrzr{)r‡rÚrb©ržÚ generatorr)r†r)r|r}rðrñrÚ_validate_mappingrrxÚvalidater¬r€ÚMETADATA_VERSIONÚ GENERATORrÈr ÚdecodeÚjsonÚloadsrQr)r„r…r†r‡rrårHrrrrˆus<    (þ    zMetadata.__init__)rorSÚ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©rrrrrÚ extensionsrúpython.commandsrúpython.detailsúpython.exports)ÚobjectÚ__getattribute__rðrrñ) r„r\ÚcommonÚmappedÚlkÚmakerÚresultr]Ú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_VALIDATORSrÚmatchr)r„r\r]rÚ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 rr rrrrý) rrrrðÚNotImplementedErrorrñÚ setdefaultÚ __setattr__rÈrrÆr²)r„r\r]rrrrlrrrrr!ês<               zMetadata.__setattr__cCst|j|jdƒS©NT)rwrorSrŠrrrÚname_and_versionszMetadata.name_and_versioncCsF|jr|jd}n|j dg¡}d|j|jf}||vrB| |¡|S)Nr5Úprovidesz%s (%s))rðrñr rorSr×)r„rÚsrrrr$s  zMetadata.providescCs |jr||jd<n ||jd<dS)Nr5r$)rðrñr¡rrrr$s 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)ÚbuildÚdevÚtestz:%s:z %s_requires)rÚenv) rðr rrr Úextendr`rñÚget_requirements) r„Úreqtsrr,rrÚincluderUr\Úerrrr.&s.    zMetadata.get_requirementscCs|jr| ¡S|jSrE)rðÚ _from_legacyrñrŠrrrÚ dictionaryOszMetadata.dictionarycCs|jr t‚nt|j|jƒSdSrE)rðrr rñÚDEPENDENCY_KEYSrŠrrrÚ dependenciesUszMetadata.dependenciescCs|jr t‚n |j |¡dSrE)rðrrñr‚r¡rrrr5\sc Cs†| d¡|jkrtƒ‚g}|j ¡D]"\}}||vr$||vr$| |¡q$|rbdd |¡}t|ƒ‚| ¡D]\}}| |||¡qjdS)NržzMissing metadata items: %srÚ) rr÷rÚMANDATORY_KEYSr_r×r¾rr) r„r‡rrÞr\rr·rÄrÅrrrrõcs zMetadata._validate_mappingcCsB|jr.|j d¡\}}|s|r>t d||¡n| |j|j¡dS)NTz#Metadata: missing: %s, warnings: %s)rðrárarÏrõrñr)r„rÞrßrrrröqs zMetadata.validatecCs(|jr|j d¡St|j|jƒ}|SdSr")rðrær rñÚ INDEX_KEYS)r„rrrrræys zMetadata.todictcCs¾|jr |jrJ‚|j|jdœ}|j d¡}dD]*}||vr.|dkrHd}n|}||||<q.| dg¡}|dgkrtg}||d<d }|D]*\}}||vr„||r„d ||ig||<q„|j|d <|S) NróT)rorSrürïÚ descriptionÚ classifierr9rr&Úrý))Z requires_distrþ)Zsetup_requires_distrÿr(r$)rðrñr÷rørærr$)r„rZlmdrÄÚnkÚkwrWÚokrrrr2€s*þ     zMetadata._from_legacyr!r"r*r$r%r'r(r)r-) rorS)r rrürïr8)r úpython.projectZ project_urlsZHome)r r>Úcontactsrro)r r>r?rÚemailr)r rrc 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)Nr&r'r(r:z extra == "%s"z (%s) and %srÇ)rrÚaddr¾)Úentriesr/r1r&r,Zrlistr¨rUrrrÚprocess_entriesªs"   z,Metadata._to_legacy..process_entriesTFr=r6r;)rñrðrxÚLEGACY_MAPPINGr_rÈrOr“Ú IndexErrorrþrrÿrrÚsorted) r„rCrZnmdr;r=rÚfoundrÄÚr1Úr2rrrÚ _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¼Trz)Ú ensure_asciiÚindentÚ sort_keysrºr) r|rQrörðrJr‹r»r2rñrúÚdumpr«r¬)r„r…r†rîr¼Z legacy_mdrrHrrrr‹Û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þr'r&r(r)rðrèrñr ÚinsertrrF)r„rçrþÚalwaysÚentryZrsetrrrrèószMetadata.add_requirementscCs*|jpd}|jpd}d|jj|j||fS)Nz (no name)z no versionz<%s %s %s (%s)>)rorSrërrž)r„rorSrrrrìs  zMetadata.__repr__)NNNry)N)NN)NNFT)0rrrrÚreÚcompileZMETADATA_VERSION_MATCHERÚIZ NAME_MATCHERZFIELDNAME_MATCHERrZVERSION_MATCHERZSUMMARY_MATCHERr÷rrør6r7r4rÚ __slots__rˆrr rÉZ none_listÚdictZ none_dictr rrr!Úpropertyr#r$Úsetterr.r3r5rõrörær2rDrJr‹rèrìrrrrrHs–  ýû +ó* &    )   ö 3 r)F)IrÚ __future__rr«r@rrúrËrRr:rrÚcompatrrr rYr Úutilr r rSr rÚ getLoggerrrarrrrÚ__all__rrrSr rŸrMrNrdrFreZ _426_FIELDSZ _426_MARKERSrPrfrgrRrr—r‚ZEXTRA_RErTrjr˜r_rärÍrÐrÒr™rµršrÔrrÖrurwrxZMETADATA_FILENAMEZWHEEL_METADATA_FILENAMEZLEGACY_METADATA_FILENAMErrrrrÚsz             J  a