U
    NªShD—  ã                   @   s  d Z ddlmZ ddlZddlmZ ddlZddlZddlZddl	m
Z
mZ ddlmZmZmZ ddlmZ dd	lmZmZ dd
lmZmZ e e¡ZG dd„ de
ƒZG dd„ de
ƒZG dd„ de
ƒZG dd„ de
ƒZdddgZdZ dZ!e "d¡Z#e "d¡Z$dZ%dZ&dZ'dZ(dZ)dZ*d Z+e*d! Z,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/Z<d0Z=d1Z>d2Z?e@ƒ ZAe "d3¡ZBd=d5d6„ZCG d7d8„ d8e@ƒZDd9ZEd:ZFd;ZGG d<d„ de@ƒZHdS )>zzImplementation of the Metadata for Python packages PEPs.

Supports all metadata formats (1.0, 1.1, 1.2, 1.3/2.1 and 2.2).
é    )Úunicode_literalsN)Úmessage_from_fileé   )ÚDistlibExceptionÚ__version__)ÚStringIOÚstring_typesÚ	text_type)Ú	interpret)Úextract_by_keyÚ
get_extras)Ú
get_schemeÚPEP440_VERSION_REc                   @   s   e Zd ZdZdS )ÚMetadataMissingErrorzA required metadata is missingN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   úO/root/rtd-docs/venv/lib/python3.8/site-packages/pip/_vendor/distlib/metadata.pyr      s   r   c                   @   s   e Zd ZdZdS )ÚMetadataConflictErrorz>Attempt to read or write metadata fields that are conflictual.Nr   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdS )Ú MetadataUnrecognizedVersionErrorz Unknown metadata version number.Nr   r   r   r   r   r   #   s   r   c                   @   s   e Zd ZdZdS )ÚMetadataInvalidErrorzA metadata value is invalidNr   r   r   r   r   r   '   s   r   Ú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/   r0   r,   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)r5   r6   r7   r3   r8   r1   r2   r4   )r    r!   r"   r#   r+   r$   r%   r&   r'   r(   r)   r1   r2   r*   r,   r-   r3   r4   r5   r6   r7   r8   úPrivate-VersionúObsoleted-ByúSetup-Requires-DistÚ	ExtensionúProvides-Extra)r9   r=   r:   r;   r<   )úDescription-Content-Typer0   r/   r.   )r>   )ÚDynamicúLicense-Filez"extra\s*==\s*("([^"]+)"|'([^']+)')c                 C   sl   | dkrt S | dkrtS | dkr$tS | dkrBttdd„ tD ƒƒ S | dkrTtdƒ‚n| d	kr`tS t| ƒ‚d S )
Nú1.0r   ú1.2)ú1.3ú2.1c                 s   s   | ]}|t kr|V  qd S ©N)Ú_345_FIELDS)Ú.0Úfr   r   r   Ú	<genexpr>p   s      z%_version2fieldlist.<locals>.<genexpr>ú2.0z+Metadata 2.0 is withdrawn and not supportedú2.2)Ú_241_FIELDSÚ_314_FIELDSrF   ÚtupleÚ_566_FIELDSÚ
ValueErrorÚ_643_FIELDSr   )Úversionr   r   r   Ú_version2fieldlistg   s    
rS   c           	      C   s  dd„ }dd„ |   ¡ D ƒ}ddddd	d
g}|D ]ð}|tkrXd|krX| d¡ t d|¡ |tkr~d|kr~| d¡ t d|¡ |tkr¤d|kr¤| d¡ t d|¡ |tkrÊd|krÊ| d¡ t d|¡ |tkrød	|krø|dkrø| d	¡ t d|¡ |tkr.d
|kr.| d
¡ t d|¡ q.t	|ƒdkr6|d S t	|ƒdkrXt d| ¡ t
dƒ‚d|koj||tƒ}d|ko~||tƒ}d	|ko’||tƒ}d
|ko¦||tƒ}t|ƒt|ƒ t|ƒ t|ƒ dkrÖt
dƒ‚|sü|sü|sü|süt|krütS |rdS |rdS |rd	S d
S )z5Detect the best version depending on the fields used.c                    s   t ‡ fdd„|D ƒƒS )Nc                 3   s   | ]}|ˆ kV  qd S rE   r   )rG   Úmarker©Úkeysr   r   rI   }   s     z5_best_version.<locals>._has_marker.<locals>.<genexpr>)Úany)rV   Úmarkersr   rU   r   Ú_has_marker|   s    z"_best_version.<locals>._has_markerc                 S   s"   g | ]\}}|g d dfkr|‘qS )ÚUNKNOWNNr   )rG   ÚkeyÚvaluer   r   r   Ú
<listcomp>   s      z!_best_version.<locals>.<listcomp>rA   r   rB   rC   rD   rK   zRemoved 1.0 due to %szRemoved 1.1 due to %szRemoved 1.2 due to %szRemoved 1.3 due to %sr%   zRemoved 2.1 due to %szRemoved 2.2 due to %sr   r   z)Out of options - unknown metadata set: %szUnknown metadata setz,You used incompatible 1.1/1.2/2.1/2.2 fields)ÚitemsrL   ÚremoveÚloggerÚdebugrM   rF   rO   rQ   Úlenr   Ú_314_MARKERSÚ_345_MARKERSÚ_566_MARKERSÚ_643_MARKERSÚintr   )	ÚfieldsrY   rV   Zpossible_versionsr[   Zis_1_1Zis_1_2Zis_2_1Zis_2_2r   r   r   Ú_best_versiony   sX    





&
ri   c                 C   s   i | ]}|  ¡  d d¡|“qS )ú-Ú_)ÚlowerÚreplace)rG   Únamer   r   r   Ú
<dictcomp>Ã   s      ro   c                 C   s   i | ]\}}||“qS r   r   )rG   ÚattrÚfieldr   r   r   ro   Ä   s      )r6   r3   r5   )r7   )r"   )r#   r,   r.   r0   r/   r3   r5   r6   r8   r4   r+   r;   r=   r<   r@   )r4   )r&   )r(   r1   r$   r%   z[^A-Za-z0-9.]+Fc                 C   s0   |r$t  d| ¡} t  d| dd¡¡}d| |f S )zhReturn the distribution name with version.

    If for_filename is true, return a filename-escaped form.rj   ú Ú.z%s-%s)Ú	_FILESAFEÚsubrm   )rn   rR   Zfor_filenamer   r   r   Ú_get_name_and_version×   s    rv   c                   @   s
  e Zd ZdZd?dd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zd@dd„Zdd„ Zdd „ Zd!d"„ Zd#d$„ ZdAd%d&„ZdBd'd(„ZdCd)d*„Zd+d,„ Zefd-d.„ZdDd/d0„ZdEd1d2„Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!dS )FÚLegacyMetadataao  The 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Údefaultc                 C   sz   |||g  d ¡dk rtdƒ‚i | _g | _d | _|| _|d k	rH|  |¡ n.|d k	r\|  |¡ n|d k	rv|  |¡ |  	¡  d S )Né   ú'path, fileobj and mapping are exclusive)
ÚcountÚ	TypeErrorÚ_fieldsZrequires_filesZ_dependenciesÚschemeÚreadÚ	read_fileÚupdateÚset_metadata_version)ÚselfÚpathÚfileobjÚmappingr~   r   r   r   Ú__init__ñ   s    
zLegacyMetadata.__init__c                 C   s   t | jƒ| jd< d S ©Nr    )ri   r}   ©rƒ   r   r   r   r‚      s    z#LegacyMetadata.set_metadata_versionc                 C   s   |  d||f ¡ d S )Nz%s: %s
)Úwrite)rƒ   r…   rn   r\   r   r   r   Ú_write_field  s    zLegacyMetadata._write_fieldc                 C   s
   |   |¡S rE   )Úget©rƒ   rn   r   r   r   Ú__getitem__  s    zLegacyMetadata.__getitem__c                 C   s   |   ||¡S rE   )Úset)rƒ   rn   r\   r   r   r   Ú__setitem__	  s    zLegacyMetadata.__setitem__c                 C   s8   |   |¡}z| j|= W n tk
r2   t|ƒ‚Y nX d S rE   )Ú_convert_namer}   ÚKeyError)rƒ   rn   Ú
field_namer   r   r   Ú__delitem__  s
    
zLegacyMetadata.__delitem__c                 C   s   || j kp|  |¡| j kS rE   )r}   r‘   r   r   r   r   Ú__contains__  s    zLegacyMetadata.__contains__c                 C   s(   |t kr|S | dd¡ ¡ }t ||¡S )Nrj   rk   )Ú_ALL_FIELDSrm   rl   Ú_ATTR2FIELDrŒ   r   r   r   r   r‘     s    zLegacyMetadata._convert_namec                 C   s   |t ks|tkrg S dS )NrZ   )Ú_LISTFIELDSÚ_ELEMENTSFIELDr   r   r   r   Ú_default_value  s    zLegacyMetadata._default_valuec                 C   s&   | j dkrt d|¡S t d|¡S d S )N©rA   r   Ú
)Úmetadata_versionÚ_LINE_PREFIX_PRE_1_2ru   Ú_LINE_PREFIX_1_2©rƒ   r\   r   r   r   Ú_remove_line_prefix!  s    
z"LegacyMetadata._remove_line_prefixc                 C   s   |t kr| | S t|ƒ‚d S rE   )r—   ÚAttributeErrorr   r   r   r   Ú__getattr__'  s    zLegacyMetadata.__getattr__Fc                 C   s   t | d | d |ƒS )zz
        Return the distribution name with version.

        If filesafe is true, return a filename-escaped form.
        r!   r"   )rv   )rƒ   Zfilesafer   r   r   Úget_fullname0  s    zLegacyMetadata.get_fullnamec                 C   s   |   |¡}|tkS )z+return True if name is a valid metadata key)r‘   r–   r   r   r   r   Úis_field8  s    
zLegacyMetadata.is_fieldc                 C   s   |   |¡}|tkS rE   )r‘   r˜   r   r   r   r   Úis_multi_field=  s    
zLegacyMetadata.is_multi_fieldc                 C   s.   t j|ddd}z|  |¡ W 5 | ¡  X dS )z*Read the metadata values from a file path.Úrr   ©ÚencodingN)ÚcodecsÚopenÚcloser€   )rƒ   ÚfilepathÚfpr   r   r   r   A  s    zLegacyMetadata.readc                 C   s¬   t |ƒ}|d | jd< tD ]p}||kr(q|tkrf| |¡}|tkrX|dk	rXdd„ |D ƒ}|  ||¡ q|| }|dk	r|dkr|  ||¡ q| ¡ }|rœ|n| d | d< dS )z,Read the metadata values from a file object.zmetadata-versionr    Nc                 S   s   g | ]}t | d ¡ƒ‘qS ©ú,)rN   Úsplit©rG   r\   r   r   r   r]   V  s     z,LegacyMetadata.read_file.<locals>.<listcomp>rZ   r%   )r   r}   r–   r˜   Úget_allÚ_LISTTUPLEFIELDSr   Úget_payload)rƒ   ZfileobÚmsgrq   Úvaluesr\   Úbodyr   r   r   r€   I  s    
zLegacyMetadata.read_filec                 C   s0   t j|ddd}z|  ||¡ W 5 | ¡  X dS )z&Write the metadata fields to filepath.Úwr   r¨   N)rª   r«   r¬   Ú
write_file)rƒ   r­   Úskip_unknownr®   r   r   r   rŠ   e  s    zLegacyMetadata.writec                 C   sÄ   |   ¡  t| d ƒD ]ª}|  |¡}|r8|dg dgfkr8q|tkrV|  ||d |¡¡ q|tkr|dkrŠ| jdkr~| dd¡}n| dd¡}|g}|t	kr¦d	d
„ |D ƒ}|D ]}|  |||¡ qªqdS )z0Write the PKG-INFO format data to a file object.r    rZ   r°   r%   r›   rœ   r   z	
       |c                 S   s   g | ]}d   |¡‘qS r¯   ©Újoinr²   r   r   r   r]     s     z-LegacyMetadata.write_file.<locals>.<listcomp>N)
r‚   rS   rŒ   r™   r‹   r½   r˜   r   rm   r´   )rƒ   Ú
fileobjectr»   rq   r·   r\   r   r   r   rº   m  s$    

zLegacyMetadata.write_filec                    sv   ‡ fdd„}|sn@t |dƒr:| ¡ D ]}|||| ƒ q$n|D ]\}}|||ƒ q>|rr| ¡ D ]\}}|||ƒ q^dS )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.
        c                    s"   | t kr|rˆ  ˆ  | ¡|¡ d S rE   )r—   r   r‘   )r[   r\   r‰   r   r   Ú_set‘  s    z#LegacyMetadata.update.<locals>._setrV   N)ÚhasattrrV   r^   )rƒ   ÚotherÚkwargsr¿   ÚkÚvr   r‰   r   r   †  s    
zLegacyMetadata.updatec                 C   sh  |   |¡}|tks|dkrNt|ttfƒsNt|tƒrHdd„ | d¡D ƒ}qzg }n,|tkrzt|ttfƒszt|tƒrv|g}ng }t 	t
j¡r<| d }t| jƒ}|tkrÚ|dk	rÚ|D ](}| | d¡d ¡s®t d	|||¡ q®nb|tkr|dk	r| |¡s<t d
|||¡ n0|tkr<|dk	r<| |¡s<t d
|||¡ |tkrZ|dkrZ|  |¡}|| j|< dS )z"Control then set a metadata field.r#   c                 S   s   g | ]}|  ¡ ‘qS r   )Ústrip)rG   rÄ   r   r   r   r]   ©  s     z&LegacyMetadata.set.<locals>.<listcomp>r°   r!   Nú;r   z$'%s': '%s' is not valid (field '%s')z.'%s': '%s' is not a valid version (field '%s')r%   )r‘   r™   Ú
isinstanceÚlistrN   r   r±   r˜   r`   ÚisEnabledForÚloggingÚWARNINGr   r~   Ú_PREDICATE_FIELDSÚis_valid_matcherÚwarningÚ_VERSIONS_FIELDSÚis_valid_constraint_listÚ_VERSION_FIELDSÚis_valid_versionÚ_UNICODEFIELDSr¡   r}   )rƒ   rn   r\   Úproject_namer~   rÄ   r   r   r   r   £  s4    






zLegacyMetadata.setc                 C   sÊ   |   |¡}|| jkr*|tkr&|  |¡}|S |tkr@| j| }|S |tkrš| j| }|dkr^g S g }|D ].}|tkr~| |¡ qf| |d |d f¡ qf|S |tkrÀ| j| }t	|t
ƒrÀ| d¡S | j| S )zGet a metadata field.Nr   r   r°   )r‘   r}   Ú_MISSINGrš   rÓ   r˜   r´   Úappendr™   rÇ   r   r±   )rƒ   rn   rx   r\   ÚresÚvalr   r   r   rŒ   É  s.    







zLegacyMetadata.getc                    sú   |   ¡  g g  }}dD ]}|| kr| |¡ q|rP|g krPdd |¡ }t|ƒ‚dD ]}|| krT| |¡ qT| d dkr€||fS t| jƒ‰ ‡ fdd„}t|ftˆ jft	ˆ j
ffD ]@\}}|D ]2}	|  |	d	¡}
|
d	k	r¼||
ƒs¼| d
|	|
f ¡ q¼q°||fS )zkCheck if the metadata is compliant. If strict is True then raise if
        no Name or Version are provided)r!   r"   zmissing required metadata: %sú, )r'   r(   r    rB   c                    s(   | D ]}ˆ   | d¡d ¡s dS qdS )NrÆ   r   FT)rÍ   r±   )r\   rÄ   ©r~   r   r   Úare_valid_constraints   s    z3LegacyMetadata.check.<locals>.are_valid_constraintsNzWrong value for '%s': %s)r‚   rÖ   r½   r   r   r~   rÌ   rÏ   rÐ   rÑ   rÒ   rŒ   )rƒ   ÚstrictÚmissingÚwarningsrp   r¶   rÛ   rh   Ú
controllerrq   r\   r   rÚ   r   Úcheckæ  s4    

 ÿÿzLegacyMetadata.checkc                 C   sh   |   ¡  t| d ƒ}i }|D ]F}|r.|| jkrt| }|dkrL| | ||< qdd„ | | D ƒ||< q|S )a  Return 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_urlc                 S   s   g | ]}d   |¡‘qS r¯   r¼   )rG   Úur   r   r   r]   #  s     z)LegacyMetadata.todict.<locals>.<listcomp>)r‚   rS   r}   Ú_FIELD2ATTR)rƒ   Zskip_missingrh   Údatar“   r[   r   r   r   Útodict  s    zLegacyMetadata.todictc                 C   s8   | d dkr$dD ]}|| kr| |= q| d  |7  < d S )Nr    r   )r.   r0   r/   r6   r   )rƒ   Úrequirementsrq   r   r   r   Úadd_requirements'  s
    zLegacyMetadata.add_requirementsc                 C   s   t t| d ƒƒS rˆ   )rÈ   rS   r‰   r   r   r   rV   2  s    zLegacyMetadata.keysc                 c   s   |   ¡ D ]
}|V  qd S rE   rU   )rƒ   r[   r   r   r   Ú__iter__5  s    zLegacyMetadata.__iter__c                    s   ‡ fdd„ˆ   ¡ D ƒS )Nc                    s   g | ]}ˆ | ‘qS r   r   ©rG   r[   r‰   r   r   r]   :  s     z)LegacyMetadata.values.<locals>.<listcomp>rU   r‰   r   r‰   r   r·   9  s    zLegacyMetadata.valuesc                    s   ‡ fdd„ˆ   ¡ D ƒS )Nc                    s   g | ]}|ˆ | f‘qS r   r   ré   r‰   r   r   r]   =  s     z(LegacyMetadata.items.<locals>.<listcomp>rU   r‰   r   r‰   r   r^   <  s    zLegacyMetadata.itemsc                 C   s   d| j j| j| jf S )Nz
<%s %s %s>)Ú	__class__r   rn   rR   r‰   r   r   r   Ú__repr__?  s    zLegacyMetadata.__repr__)NNNrx   )F)F)F)N)F)F)"r   r   r   r   r‡   r‚   r‹   rŽ   r   r”   r•   r‘   rš   r¡   r£   r¤   r¥   r¦   r   r€   rŠ   rº   r   r   rÕ   rŒ   rà   rå   rç   rV   rè   r·   r^   rë   r   r   r   r   rw   ä   s<   
	



&
*
rw   zpydist.jsonzmetadata.jsonÚMETADATAc                   @   s®  e Zd ZdZe d¡Ze dej¡Ze dej¡Z	e
Ze d¡ZdZde Zddd	d
œZdZdZedfed	fed	fed	fe	d	fdœZdZdIdd„ZedƒZdefZdefZdefdefeeedefeeeedefdddœZ[[dd„ ZdJdd„Zdd „ Ze 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<d=dd>œ
Z+d?d@„ Z,dLdCdD„Z-dEdF„ Z.dGdH„ Z/dS )Mr   zÃ
    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}rJ   zdistlib (%s)r   )Úlegacy)rn   rR   Ú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   rn   rR   rî   Zdynamic)Ú_legacyÚ_datar~   Nrx   c              	   C   s0  |||g  d ¡dk rtdƒ‚d | _d | _|| _|d k	rzz|  ||¡ || _W n* tk
rv   t||d| _|  ¡  Y nX n²d }|r¢t	|dƒ}| 
¡ }W 5 Q R X n|r®| 
¡ }|d krÈ| j| jdœ| _ndt|tƒsÜ| d¡}zt |¡| _|  | j|¡ W n0 tk
r*   tt|ƒ|d| _|  ¡  Y nX d S )Nry   rz   )r†   r~   Úrb©r   Ú	generatorr   )r…   r~   )r{   r|   rï   rð   r~   Ú_validate_mappingr   rw   Úvalidater«   r   ÚMETADATA_VERSIONÚ	GENERATORrÇ   r	   ÚdecodeÚjsonÚloadsrP   r   )rƒ   r„   r…   r†   r~   rä   rH   r   r   r   r‡   u  s<    
þ


zMetadata.__init__)rn   rR   ÚlicenseÚkeywordsrî   r6   r;   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           
      C   sX  t  | d¡}t  | d¡}||kr|| \}}| jr^|d krP|d krHd n|ƒ }n| j |¡}nº|d krjd n|ƒ }|dkrˆ| j ||¡}nt ƒ }|}| j d¡}	|	r
|dkrº|	 d|¡}nP|dkrÞ|	 d¡}	|	rÜ|	 ||¡}n,|	 d	¡}	|	sø| j d	¡}	|	r
|	 ||¡}||krT|}n:||kr2t  | |¡}n"| jrH| 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ƒ   r[   ÚcommonÚmappedÚlkÚmakerÚresultr\   ÚsentinelÚdr   r   r   r  ·  sD    




zMetadata.__getattribute__c                 C   sH   || j krD| j | \}}|p | j|krD| |¡}|sDtd||f ƒ‚d S )Nz.'%s' is an invalid value for the '%s' property)ÚSYNTAX_VALIDATORSr~   Úmatchr   )rƒ   r[   r\   r~   ÚpatternÚ
exclusionsÚmr   r   r   Ú_validate_valueá  s    

ÿzMetadata._validate_valuec                 C   s*  |   ||¡ t | d¡}t | d¡}||kr¾|| \}}| jrV|d krJt‚|| j|< nf|dkrj|| j|< nR| j di ¡}|dkrŠ||d< n2|dkr¨| di ¡}|||< n| d	i ¡}|||< nh||krÖt | ||¡ nP|d
krt|t	ƒr| 
¡ }|r| ¡ }ng }| jr|| j|< n
|| j|< d S )Nr  r	  r
  r  r  r  r  r  r  rü   )r  r  r  rï   ÚNotImplementedErrorrð   Ú
setdefaultÚ__setattr__rÇ   r   rÅ   r±   )rƒ   r[   r\   r  r  r  rk   r  r   r   r   r   ê  s<    




zMetadata.__setattr__c                 C   s   t | j| jdƒS ©NT)rv   rn   rR   r‰   r   r   r   Úname_and_version  s    zMetadata.name_and_versionc                 C   sF   | j r| j d }n| j dg ¡}d| j| jf }||krB| |¡ |S )Nr5   Úprovidesz%s (%s))rï   rð   r  rn   rR   rÖ   )rƒ   r  Úsr   r   r   r#    s    
zMetadata.providesc                 C   s    | j r|| j d< n
|| jd< d S )Nr5   r#  )rï   rð   r    r   r   r   r#    s    c           
      C   sÚ   | j r|}nÊg }t|pg | jƒ}|D ]d}d|kr>d|kr>d}n8d|krLd}n| d¡|k}|rv| d¡}|rvt||ƒ}|r$| |d ¡ q$dD ]F}d| }	|	|krŽ| |	¡ | 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   r  rŒ   r
   Úextendr_   rð   Úget_requirements)
rƒ   Úreqtsr  r+  r  r  ÚincluderT   r[   Úer   r   r   r-  &  s.    	


zMetadata.get_requirementsc                 C   s   | j r|  ¡ S | jS rE   )rï   Ú_from_legacyrð   r‰   r   r   r   Ú
dictionaryO  s    zMetadata.dictionaryc                 C   s   | j rt‚nt| j| jƒS d S rE   )rï   r  r   rð   ÚDEPENDENCY_KEYSr‰   r   r   r   ÚdependenciesU  s    zMetadata.dependenciesc                 C   s   | j rt‚n| j |¡ d S rE   )rï   r  rð   r   r    r   r   r   r4  \  s    c           	      C   s†   |  d¡| jkrtƒ ‚g }| j ¡ D ]"\}}||kr$||kr$| |¡ q$|rbdd |¡ }t|ƒ‚| ¡ D ]\}}|  |||¡ qjd S )Nr   zMissing metadata items: %srÙ   )	rŒ   rö   r   ÚMANDATORY_KEYSr^   rÖ   r½   r   r  )	rƒ   r†   r~   rÝ   r[   r  r¶   rÃ   rÄ   r   r   r   rô   c  s    zMetadata._validate_mappingc                 C   sB   | j r.| j  d¡\}}|s|r>t d||¡ n|  | j| j¡ d S )NTz#Metadata: missing: %s, warnings: %s)rï   rà   r`   rÎ   rô   rð   r~   )rƒ   rÝ   rÞ   r   r   r   rõ   q  s
    zMetadata.validatec                 C   s(   | j r| j  d¡S t| j| jƒ}|S d S r!  )rï   rå   r   rð   Ú
INDEX_KEYS)rƒ   r  r   r   r   rå   y  s    zMetadata.todictc                 C   s¾   | j r| jrt‚| j| jdœ}| j  d¡}dD ]*}||kr.|dkrHd}n|}|| ||< q.| dg ¡}|dgkrtg }||d< d	}|D ]*\}}||kr„|| r„d
|| ig||< q„| j|d< |S )Nrò   T)rn   rR   rû   rî   ÚdescriptionÚ
classifierr8  r  r&   Ú rü   ))Zrequires_distrý   )Zsetup_requires_distrþ   r'  r#  )rï   rð   ÚAssertionErrorrö   r÷   rå   rŒ   r#  )rƒ   r  ZlmdrÃ   ÚnkÚkwrV   Úokr   r   r   r1  €  s*    þ

zMetadata._from_legacyr!   r"   r*   r$   r%   r'   r(   r)   r-   )
rn   rR   )r  r  rû   rî   r7  )r  úpython.projectZproject_urlsZHome)r  r>  Úcontactsr   rn   )r  r>  r?  r   Úemailr  )r  r  r  c                 C   sö   dd„ }| j r| jrt‚tƒ }| j }| j ¡ D ]v\}}t|tƒsV||kr¤|| ||< q.|}d}|D ]4}z|| }W qb tt	fk
r”   d}Y  q˜Y qbX qb|r.|||< q.|| j
| j ƒ}	|| j| j ƒ}
| jrÚt| jƒ|d< t|	ƒ|d< t|
ƒ|d< |S )Nc                 S   sŒ   t ƒ }| D ]|}| d¡}| d¡}|d }|D ]V}|sF|sF| |¡ q.d}|rVd| }|rp|rld||f }n|}| d ||f¡¡ q.q
|S )Nr%  r&  r'  r9  zextra == "%s"z(%s) and %srÆ   )r   rŒ   Úaddr½   )Úentriesr.  r0  r%  r+  Zrlistr§   rT   r   r   r   Úprocess_entriesª  s"    

z,Metadata._to_legacy.<locals>.process_entriesTFr=   r6   r;   )rð   rï   r:  rw   ÚLEGACY_MAPPINGr^   rÇ   rN   r’   Ú
IndexErrorrý   r   rþ   rÿ   r  Úsorted)rƒ   rC  r  Znmdr;  r=  r  ÚfoundrÃ   Úr1Úr2r   r   r   Ú
_to_legacy¨  s2    

zMetadata._to_legacyFTc              	   C   sÂ   ||g  d ¡dkrtdƒ‚|  ¡  |r`| jr4| j}n|  ¡ }|rP|j||d q¾|j||d n^| jrp|  ¡ }n| j}|rt	j
||dddd n.t |dd¡}t	j
||dddd W 5 Q R X d S )	Nr   z)Exactly one of path and fileobj is needed)r»   Try   )Úensure_asciiÚindentÚ	sort_keysr¹   r   )r{   rP   rõ   rï   rJ  rŠ   rº   r1  rð   rù   Údumprª   r«   )rƒ   r„   r…   rí   r»   Z	legacy_mdr  rH   r   r   r   rŠ   Û  s"    
zMetadata.writec                 C   sŠ   | j r| j  |¡ nr| j dg ¡}d }|D ]}d|kr*d|kr*|} qHq*|d krfd|i}| d|¡ n t|d ƒt|ƒB }t|ƒ|d< d S )Nrý   r&  r%  r'  r   )rï   rç   rð   r  Úinsertr   rF  )rƒ   ræ   rý   ÚalwaysÚentryZrsetr   r   r   rç   ó  s    zMetadata.add_requirementsc                 C   s*   | j pd}| jpd}d| jj| j||f S )Nz	(no name)z
no versionz<%s %s %s (%s)>)rn   rR   rê   r   r   )rƒ   rn   rR   r   r   r   rë     s    

zMetadata.__repr__)NNNrx   )N)NN)NNFT)0r   r   r   r   ÚreÚcompileZMETADATA_VERSION_MATCHERÚIZNAME_MATCHERZFIELDNAME_MATCHERr   ZVERSION_MATCHERZSUMMARY_MATCHERrö   r   r÷   r5  r6  r3  r  Ú	__slots__r‡   r   r  rÈ   Z	none_listÚdictZ	none_dictr	  r  r  r   Úpropertyr"  r#  Úsetterr-  r2  r4  rô   rõ   rå   r1  rD  rJ  rŠ   rç   rë   r   r   r   r   r   H  s–   

ýû
+ó*
	&




)


ö3
)F)Ir   Ú
__future__r   rª   r@  r   rù   rÊ   rR  r9  r   r   Úcompatr   r   r	   rX   r
   Úutilr   r   rR   r   r   Ú	getLoggerr   r`   r   r   r   r   Ú__all__r   r   rS  rŸ   rž   rL   rM   rc   rF   rd   Z_426_FIELDSZ_426_MARKERSrO   re   rf   rQ   r   r–   r   ZEXTRA_RErS   ri   r—   r^   rã   rÌ   rÏ   rÑ   r˜   r´   r™   rÓ   r  rÕ   rt   rv   rw   ZMETADATA_FILENAMEZWHEEL_METADATA_FILENAMEZLEGACY_METADATA_FILENAMEr   r   r   r   r   Ú<module>   sz   










J

  a