U
    ™P^*  ã                   @   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-e.ƒ Z/e/ 0e%¡ e/ 0e&¡ e/ 0e(¡ e/ 0e*¡ e/ 0e,¡ e "d#¡Z1d$d%„ Z2d&d'„ Z3d(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFœZ4dGZ5dHZ6dIZ7dJZ8dKZ9dLZ:dMZ;e<ƒ Z=e "dN¡Z>dXdPdQ„Z?G dRdS„ dSe<ƒZ@dTZAdUZBdVZCG dWd„ de<ƒZDdS )YzImplementation 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_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   ú=/tmp/pip-install-220asx0h/pip/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>   z"extra\s*==\s*("([^"]+)"|'([^']+)')c                 C   sL   | dkrt S | dkrtS | dkr$tS | dkr4tt S | dkr@tS t| ƒ‚d S )Nú1.0r   ú1.2)ú1.3ú2.1ú2.0)Ú_241_FIELDSÚ_314_FIELDSÚ_345_FIELDSÚ_566_FIELDSÚ_426_FIELDSr   )Úversionr   r   r   Ú_version2fieldlistp   s    rJ   c           
      C   sB  dd„ }g }|   ¡ D ]"\}}|g ddfkr,q| |¡ qddddd	d
g}|D ]ö}|tkrvd|krv| 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rLd	|krL| d	¡ t d|¡ qLt
|ƒdkrZ|d S t
|ƒdkr|t d| ¡ tdƒ‚d|koŽ||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 |r4dS |r>d
S d	S )z5Detect the best version depending on the fields used.c                 S   s   |D ]}|| kr dS qdS )NTFr   )ÚkeysÚmarkersÚmarkerr   r   r   Ú_has_marker€   s    z"_best_version.<locals>._has_markerÚUNKNOWNNr?   r   r@   rA   rC   rB   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.0 due to %sr   r   z)Out of options - unknown metadata set: %szUnknown metadata setz,You used incompatible 1.1/1.2/2.0/2.1 fields)ÚitemsÚappendrD   ÚremoveÚloggerÚdebugrE   rF   rG   rH   Úlenr   Ú_314_MARKERSÚ_345_MARKERSÚ_566_MARKERSÚ_426_MARKERSÚintr   )
ÚfieldsrN   rK   ÚkeyÚvalueZpossible_versionsZis_1_1Zis_1_2Zis_2_1Zis_2_0r   r   r   Ú_best_version~   s`    






&
r^   r    r!   r"   r#   r+   r$   r%   r&   r'   r(   r)   r1   r2   r*   r,   r-   r3   r5   r6   r;   r7   r8   r0   r/   r.   r4   r9   r:   r<   r=   )Úmetadata_versionÚnamerI   ÚplatformZsupported_platformÚsummaryÚdescriptionÚkeywordsÚ	home_pageÚauthorÚauthor_emailÚ
maintainerÚmaintainer_emailÚlicenseÚ
classifierÚdownload_urlÚobsoletes_distÚprovides_distÚrequires_distÚsetup_requires_distÚrequires_pythonÚrequires_externalÚrequiresÚprovidesÚ	obsoletesÚproject_urlZprivate_versionZobsoleted_byÚ	extensionZprovides_extra)r6   r3   r5   )r7   )r"   )r#   r,   r.   r0   r/   r3   r5   r6   r8   r4   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.ú-ú Ú.z%s-%s)Ú	_FILESAFEÚsubÚreplace)r`   rI   Zfor_filenamer   r   r   Ú_get_name_and_versionù   s    r~   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ÚLegacyMetadataaa  The 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
    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    )r^   r…   ©r‹   r   r   r   rŠ   "  s    z#LegacyMetadata.set_metadata_versionc                 C   s   |  d||f ¡ d S )Nz%s: %s
)Úwrite)r‹   r   r`   r]   r   r   r   Ú_write_field%  s    zLegacyMetadata._write_fieldc                 C   s
   |   |¡S ©N)Úget©r‹   r`   r   r   r   Ú__getitem__(  s    zLegacyMetadata.__getitem__c                 C   s   |   ||¡S r”   )Úset)r‹   r`   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 r”   )Ú_convert_namer…   ÚKeyError)r‹   r`   Ú
field_namer   r   r   Ú__delitem__.  s
    
zLegacyMetadata.__delitem__c                 C   s   || j kp|  |¡| j kS r”   )r…   rš   r–   r   r   r   Ú__contains__5  s    
ÿzLegacyMetadata.__contains__c                 C   s(   |t kr|S | dd¡ ¡ }t ||¡S )Nrx   Ú_)Ú_ALL_FIELDSr}   ÚlowerÚ_ATTR2FIELDr•   r–   r   r   r   rš   9  s    zLegacyMetadata._convert_namec                 C   s   |t ks|tkrg S dS )NrO   )Ú_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©r?   r   Ú
)r_   Ú_LINE_PREFIX_PRE_1_2r|   Ú_LINE_PREFIX_1_2©r‹   r]   r   r   r   Ú_remove_line_prefixD  s    
z"LegacyMetadata._remove_line_prefixc                 C   s   |t kr| | S t|ƒ‚d S r”   )r¢   ÚAttributeErrorr–   r   r   r   Ú__getattr__J  s    zLegacyMetadata.__getattr__Fc                 C   s   t | d | d |ƒS )zhReturn the distribution name with version.

        If filesafe is true, return a filename-escaped form.r!   r"   )r~   )r‹   Zfilesafer   r   r   Úget_fullnameU  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_field[  s    
zLegacyMetadata.is_fieldc                 C   s   |   |¡}|tkS r”   )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‡   d  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dS )z,Read the metadata values from a file object.zmetadata-versionr    Nc                 S   s   g | ]}t | d ¡ƒ‘qS ©ú,)ÚtupleÚsplit©Ú.0r]   r   r   r   Ú
<listcomp>y  s     z,LegacyMetadata.read_file.<locals>.<listcomp>rO   )r   r…   r    r£   Úget_allÚ_LISTTUPLEFIELDSr˜   )r‹   ZfileobÚmsgÚfieldÚvaluesr]   r   r   r   rˆ   l  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’   ƒ  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    rO   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Š   rJ   r•   r¤   r“   rÉ   r£   r_   r}   rÁ   )r‹   Ú
fileobjectrÇ   rÃ   rÄ   r]   r   r   r   rÆ   ‹  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 r”   )r¢   r˜   rš   )r\   r]   r‘   r   r   Ú_set®  s    z#LegacyMetadata.update.<locals>._setrK   N)ÚhasattrrK   rP   )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)r¾   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Úlistr»   r   r¼   r£   rS   ÚisEnabledForÚloggingÚWARNINGr   r†   Ú_PREDICATE_FIELDSÚis_valid_matcherÚwarningÚ_VERSIONS_FIELDSÚis_valid_constraint_listÚ_VERSION_FIELDSÚis_valid_versionÚ_UNICODEFIELDSr«   r…   )r‹   r`   r]   Úproject_namer†   rÐ   r   r   r   r˜   À  sV    
ÿ
ÿ

  þ  ÿ  ÿ


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Á   rQ   r¤   rÓ   r   r¼   )r‹   r`   r€   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    r@   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Š   rQ   rÉ   r   r   r†   rØ   rÛ   rÜ   rÝ   rÞ   r•   )r‹   ÚstrictÚmissingÚwarningsÚattrrÂ   ræ   r[   Ú
controllerrÃ   r]   r   rå   r   Úcheck	  s8    

ÿÿýzLegacyMetadata.checkc                 C   sÎ   |   ¡  d}i }|D ]"\}}|r*|| jkr| | ||< q| d dkr’d}|D ]B\}}|rb|| jkrL|dkrx| | ||< qLdd„ | | D ƒ||< qLn8| d dkrÊd	}|D ]"\}}|r¼|| jkr¦| | ||< q¦|S )
zº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).
        ))r_   r    )r`   r!   )rI   r"   )rb   r$   )re   r'   )rf   r(   )rg   r)   )rj   r*   )rc   r%   )rd   r&   )ra   r#   )Úclassifiersr,   )rl   r-   r    r@   ))ro   r6   )rq   r7   )rr   r8   )rn   r5   )rm   r3   )rv   r4   )rh   r1   )ri   r2   rv   c                 S   s   g | ]}d   |¡‘qS r¹   rÈ   )r¾   Úur   r   r   r¿   b  s     z)LegacyMetadata.todict.<locals>.<listcomp>r   ))rt   r/   )rs   r0   )ru   r.   )rŠ   r…   )r‹   Zskip_missingZmapping_1_0Údatar\   rœ   Zmapping_1_2Zmapping_1_1r   r   r   Útodict5  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‹   ÚrequirementsrÃ   r   r   r   Úadd_requirementsp  s
    zLegacyMetadata.add_requirementsc                 C   s   t t| d ƒƒS r   )rÔ   rJ   r‘   r   r   r   rK   {  s    zLegacyMetadata.keysc                 c   s   |   ¡ D ]
}|V  qd S r”   ©rK   )r‹   r\   r   r   r   Ú__iter__~  s    zLegacyMetadata.__iter__c                    s   ‡ fdd„ˆ   ¡ D ƒS )Nc                    s   g | ]}ˆ | ‘qS r   r   ©r¾   r\   r‘   r   r   r¿   ƒ  s     z)LegacyMetadata.values.<locals>.<listcomp>ró   r‘   r   r‘   r   rÄ   ‚  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>ró   r‘   r   r‘   r   rP   …  s    zLegacyMetadata.itemsc                 C   s   d| j j| j| jf S )Nz
<%s %s %s>)Ú	__class__r   r`   rI   r‘   r   r   r   Ú__repr__ˆ  s    ÿzLegacyMetadata.__repr__)NNNr€   )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ò   rK   rô   rÄ   rP   r÷   r   r   r   r   r     s@     ÿ




,
,
;r   zpydist.jsonzmetadata.jsonÚMETADATAc                   @   s’  e Zd ZdZe d¡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dœZdZdDd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dEdd„Zdd„ Zed d!„ ƒZ ed"d#„ ƒZ!e!j"d$d#„ ƒZ!dFd%d&„Z#ed'd(„ ƒZ$ed)d*„ ƒZ%e%j"d+d*„ ƒZ%d,d-„ Z&d.d/„ Z'd0d1„ Z(d2d3„ Z)d4d5d6d7d8dd9œZ*d:d;„ Z+dGd>d?„Z,d@dA„ Z-dBdC„ Z.dS )Hr   zÊ
    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}rC   zdistlib (%s)r   )Úlegacy)r`   rI   rb   zqname 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_   r`   rI   rb   )Ú_legacyÚ_datar†   Nr€   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 )Nr   r‚   )rŽ   r†   Úrb©r_   Ú	generatorr   )r   r†   )rƒ   r„   rú   rû   r†   Ú_validate_mappingr   r   Úvalidaterµ   r‡   ÚMETADATA_VERSIONÚ	GENERATORrÓ   r	   ÚdecodeÚjsonÚloadsÚ
ValueErrorr   )r‹   rŒ   r   rŽ   r†   rï   Úfr   r   r   r   ¼  s@    
þ


ÿzMetadata.__init__)r`   rI   rj   rd   rb   r6   r;   r=   r,   )r-   N)r    N)Úrun_requiresÚbuild_requiresÚdev_requiresZtest_requiresÚmeta_requiresÚextrasÚmodulesÚ
namespacesÚexportsÚcommandsrí   Z
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  rd   )r&  r  r  rú   ÚNotImplementedErrorrû   Ú
setdefaultÚ__setattr__rÓ   r   rÑ   r¼   )r‹   r\   r]   r  r  r  rŸ   r   r   r   r   r)  5  s<    




zMetadata.__setattr__c                 C   s   t | j| jdƒS ©NT)r~   r`   rI   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   rt   z%s (%s))rú   rû   r(  r`   rI   rQ   )r‹   r  Úsr   r   r   rt   `  s    
zMetadata.providesc                 C   s    | j r|| j d< n
|| jd< d S )Nr5   rt   )rú   rû   rª   r   r   r   rt   k  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ÚenvironmentTrs   )ÚbuildÚdevÚtestz:%s:z%s_requires)r  Úenv)	rú   r   r  r•   r
   ÚextendrR   rû   Úget_requirements)
r‹   Úreqtsr  r2  r  r   ÚincluderM   r\   Úer   r   r   r4  r  s2    	


ÿ
zMetadata.get_requirementsc                 C   s   | j r|  ¡ S | jS r”   )rú   Ú_from_legacyrû   r‘   r   r   r   Ú
dictionaryœ  s    zMetadata.dictionaryc                 C   s   | j rt‚nt| j| jƒS d S r”   )rú   r'  r   rû   ÚDEPENDENCY_KEYSr‘   r   r   r   Údependencies¢  s    zMetadata.dependenciesc                 C   s   | j rt‚n| j |¡ d S r”   )rú   r'  rû   r‰   rª   r   r   r   r;  ©  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_KEYSrP   rQ   rÉ   r   r&  )	r‹   rŽ   r†   rè   r\   r$  rÂ   rÏ   rÐ   r   r   r   rÿ   °  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ì   rS   rÚ   rÿ   rû   r†   )r‹   rè   ré   r   r   r   r   ¾  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ð   Ç  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< i }i }	|S )Nrý   T)r`   rI   rj   rb   rc   rk   rk   rí   r&   Ú rd   ))ro   r  )rp   r	  rs   rt   )rú   rû   ÚAssertionErrorr  r  rð   r•   rt   )
r‹   r  ZlmdrÏ   ÚnkÚkwrK   Úokrf   rh   r   r   r   r8  Î  s.    þ

zMetadata._from_legacyr!   r"   r*   r$   r%   )r`   rI   rj   rb   rc   rí   c                 C   sœ   dd„ }| j r| jrt‚tƒ }| j }| j ¡ D ]\}}||k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.  rs   r>  zextra == "%s"z(%s) and %srÒ   )r˜   r•   ÚaddrÉ   )Úentriesr5  r7  r-  r2  Zrlistr±   rM   r   r   r   Úprocess_entriesõ  s"    

z,Metadata._to_legacy.<locals>.process_entriesr=   r6   r;   )rû   rú   r?  r   ÚLEGACY_MAPPINGrP   r  r  r	  r
  r  Úsorted)r‹   rE  r  Znmdr@  rB  Zr1Zr2r   r   r   Ú
_to_legacyô  s    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Ç   Tr   )Úensure_asciiÚindentÚ	sort_keysrÅ   r   )rƒ   r  r   rú   rH  r’   rÆ   r8  rû   r  Údumpr´   rµ   )r‹   rŒ   r   rù   rÇ   Z	legacy_mdr   r  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-  rs   r   )rú   rò   rû   r(  Úinsertr˜   rG  )r‹   rñ   r  ÚalwaysÚentryZrsetr   r   r   rò   3  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)>)r`   rI   rö   r   r_   )r‹   r`   rI   r   r   r   r÷   D  s    

  ÿzMetadata.__repr__)NNNr€   )N)NN)NNFT)/r   r   r   r   ÚreÚcompileZMETADATA_VERSION_MATCHERÚIZNAME_MATCHERr   ZVERSION_MATCHERZSUMMARY_MATCHERr  r   r  r<  r=  r:  r!  Ú	__slots__r   r˜   r  rÔ   Z	none_listÚdictZ	none_dictr  r  r&  r)  Úpropertyr+  rt   Úsetterr4  r9  r;  rÿ   r   rð   r8  rF  rH  r’   rò   r÷   r   r   r   r   r   ’  sŽ   

ýü  ÿ
-ó+

'




*


	ú	%
)F)Er   Ú
__future__r   r´   Úemailr   r  rÖ   rP  r>  r   r   Úcompatr   r   r	   rL   r
   Úutilr   r   rI   r   r   Ú	getLoggerr   rS   r   r   r   r   Ú__all__r   r   rQ  r©   r¨   rD   rE   rV   rF   rW   rH   rY   rG   rX   r˜   r    r‰   ZEXTRA_RErJ   r^   r¢   rØ   rÛ   rÝ   r£   rÁ   r¤   rß   r  rá   r{   r~   r   ZMETADATA_FILENAMEZWHEEL_METADATA_FILENAMEZLEGACY_METADATA_FILENAMEr   r   r   r   r   Ú<module>   s°   










Hâ!

   
