3
ûâdeÅ˜  ã               @   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j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j"dƒZ#ej"dƒZ$dKZ%dLZ&dMZ'dNZ(dOZ)dPZ*dQZ+e*dR Z,dSZ-e.ƒ Z/e/j0e%ƒ e/j0e&ƒ e/j0e(ƒ e/j0e*ƒ e/j0e,ƒ ej"d9ƒZ1d:d;„ Z2d<d=„ Z3d>d?„ e/D ƒZ4d@d?„ e4j5ƒ D ƒZ6dTZ7dUZ8dVZ9dWZ:dXZ;dYZ<dZZ=e>ƒ Z?ej"dAƒZ@d[dCdD„ZAG dEdF„ dFe>ƒZBdGZCdHZDdIZEG dJd„ de>ƒZFdS )\z„Implementation of the Metadata for Python packages PEPs.

Supports all metadata formats (1.0, 1.1, 1.2, 1.3/2.1 and withdrawn 2.0).
é    )Ú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-build-red6nood/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.N)r   r   r   r   r   r   r   r   r       s   r   c               @   s   e Zd ZdZdS )Ú MetadataUnrecognizedVersionErrorz Unknown metadata version number.N)r   r   r   r   r   r   r   r   r   $   s   r   c               @   s   e Zd ZdZdS )ÚMetadataInvalidErrorzA metadata value is invalidN)r   r   r   r   r   r   r   r   r   (   s   r   ÚMetadataÚPKG_INFO_ENCODINGÚPKG_INFO_PREFERRED_VERSIONzutf-8z1.1z

       \|z	
        úMetadata-VersionÚNameÚVersionÚPlatformÚSummaryÚDescriptionÚKeywordsú	Home-pageÚAuthorúAuthor-emailÚLicenseúSupported-PlatformÚ
ClassifierúDownload-URLÚ	ObsoletesÚProvidesÚRequiresÚ
MaintainerúMaintainer-emailúObsoletes-DistúProject-URLúProvides-DistúRequires-DistúRequires-PythonúRequires-ExternalúPrivate-VersionúObsoleted-ByúSetup-Requires-DistÚ	ExtensionúProvides-ExtraúDescription-Content-Typez"extra\s*==\s*("([^"]+)"|'([^']+)')c             C   sZ   | 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rNtS t| ƒ‚d S )
Nz1.0z1.1z1.2ú1.3ú2.1c             s   s   | ]}|t kr|V  qd S )N)Ú_345_FIELDS)Ú.0Úfr   r   r   ú	<genexpr>z   s    z%_version2fieldlist.<locals>.<genexpr>z2.0)r;   r<   )Ú_241_FIELDSÚ_314_FIELDSr=   ÚtupleÚ_566_FIELDSÚ_426_FIELDSr   )Úversionr   r   r   Ú_version2fieldlistq   s    rG   c       
      C   sR  dd„ }g }x.| j ƒ D ]"\}}|g ddfkr.q|j|ƒ qW ddddd	d
g}� xü|D ]ô}|tkr~d|kr~|jdƒ tjd|ƒ |tkr¤d|kr¤|jdƒ tjd|ƒ |tkrÊd|krÊ|jdƒ tjd|ƒ |tkrðd|krð|jdƒ tjd|ƒ |tkoþd
|k�r"|dk�r"|jd
ƒ tjd|ƒ |t	krTd	|krT|jd	ƒ tjd|ƒ qTW t
|ƒdk�rb|d S t
|ƒdk�r„tj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ƒ‚| �r0| �r0| �r0|	 �r0t|k�r0tS |�r:dS |�rDdS |�rNd
S d	S )z5Detect the best version depending on the fields used.c             S   s   x|D ]}|| krdS qW dS )NTFr   )ÚkeysÚmarkersÚmarkerr   r   r   Ú_has_marker‚   s    
z"_best_version.<locals>._has_markerÚUNKNOWNNz1.0z1.1z1.2z1.3z2.0z2.1z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ÚappendrA   ÚremoveÚloggerÚdebugrB   r=   rD   rE   Úlenr   Ú_314_MARKERSÚ_345_MARKERSÚ_566_MARKERSÚ_426_MARKERSÚintr   )
ÚfieldsrK   rH   ÚkeyÚvalueZpossible_versionsZis_1_1Zis_1_2Zis_2_1Zis_2_0r   r   r   Ú_best_version€   s`    






& 
r[   c             C   s   i | ]}||j ƒ jd dƒ“qS )ú-Ú_)ÚlowerÚreplace)r>   Únamer   r   r   ú
<dictcomp>É   s   ra   c             C   s   i | ]\}}||“qS r   r   )r>   ÚattrÚfieldr   r   r   ra   Ì   s    z[^A-Za-z0-9.]+Fc             C   s0   |r$t jd| ƒ} t jd|jddƒƒ}d| |f S )zhReturn the distribution name with version.

    If for_filename is true, return a filename-escaped form.r\   ú Ú.z%s-%s)Ú	_FILESAFEÚsubr_   )r`   rF   Zfor_filenamer   r   r   Ú_get_name_and_versioná   s    rh   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j d ƒdk rtdƒ‚i | _g | _d | _|| _|d k	rH| j|ƒ n.|d k	r\| j|ƒ n|d k	rv| j|ƒ | j	ƒ  d S )Né   z'path, fileobj and mapping are exclusive)
ÚcountÚ	TypeErrorÚ_fieldsZrequires_filesÚ_dependenciesÚschemeÚreadÚ	read_fileÚupdateÚset_metadata_version)ÚselfÚpathÚfileobjÚmappingrp   r   r   r   Ú__init__ú   s    
zLegacyMetadata.__init__c             C   s   t | jƒ| jd< d S )NzMetadata-Version)r[   rn   )ru   r   r   r   rt   
  s    z#LegacyMetadata.set_metadata_versionc             C   s   |j d||f ƒ d S )Nz%s: %s
)Úwrite)ru   rw   r`   rZ   r   r   r   Ú_write_field  s    zLegacyMetadata._write_fieldc             C   s
   | j |ƒS )N)Úget)ru   r`   r   r   r   Ú__getitem__  s    zLegacyMetadata.__getitem__c             C   s   | j ||ƒS )N)Úset)ru   r`   rZ   r   r   r   Ú__setitem__  s    zLegacyMetadata.__setitem__c             C   s8   | j |ƒ}y| j|= W n tk
r2   t|ƒ‚Y nX d S )N)Ú_convert_namern   ÚKeyError)ru   r`   Ú
field_namer   r   r   Ú__delitem__  s
    
zLegacyMetadata.__delitem__c             C   s   || j kp| j|ƒ| j kS )N)rn   r€   )ru   r`   r   r   r   Ú__contains__  s    
zLegacyMetadata.__contains__c             C   s(   |t kr|S |jddƒjƒ }tj||ƒS )Nr\   r]   )Ú_ALL_FIELDSr_   r^   Ú_ATTR2FIELDr|   )ru   r`   r   r   r   r€   !  s    zLegacyMetadata._convert_namec             C   s   |t ks|tkrg S dS )NrL   )Ú_LISTFIELDSÚ_ELEMENTSFIELD)ru   r`   r   r   r   Ú_default_value'  s    zLegacyMetadata._default_valuec             C   s&   | j dkrtjd|ƒS tjd|ƒS d S )Nú1.0ú1.1Ú
)rŠ   r‹   )Úmetadata_versionÚ_LINE_PREFIX_PRE_1_2rg   Ú_LINE_PREFIX_1_2)ru   rZ   r   r   r   Ú_remove_line_prefix,  s    
z"LegacyMetadata._remove_line_prefixc             C   s   |t kr| | S t|ƒ‚d S )N)r†   ÚAttributeError)ru   r`   r   r   r   Ú__getattr__2  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   )rh   )ru   Zfilesafer   r   r   Úget_fullname=  s    zLegacyMetadata.get_fullnamec             C   s   | j |ƒ}|tkS )z+return True if name is a valid metadata key)r€   r…   )ru   r`   r   r   r   Úis_fieldC  s    
zLegacyMetadata.is_fieldc             C   s   | j |ƒ}|tkS )N)r€   r‡   )ru   r`   r   r   r   Úis_multi_fieldH  s    
zLegacyMetadata.is_multi_fieldc          
   C   s.   t j|ddd�}z| j|ƒ W d|jƒ  X dS )z*Read the metadata values from a file path.Úrzutf-8)ÚencodingN)ÚcodecsÚopenrr   Úclose)ru   ÚfilepathÚfpr   r   r   rq   L  s    zLegacyMetadata.readc             C   s°   t |ƒ}|d | jd< xxtD ]p}||kr*q|tkrh|j|ƒ}|tkrZ|dk	rZdd„ |D ƒ}| j||ƒ q|| }|dk	r|dkr| j||ƒ qW |jƒ }|r |n| d | d< dS )z,Read the metadata values from a file object.zmetadata-versionzMetadata-VersionNc             S   s   g | ]}t |jd ƒƒ‘qS )ú,)rC   Úsplit)r>   rZ   r   r   r   ú
<listcomp>a  s    z,LegacyMetadata.read_file.<locals>.<listcomp>rL   r!   )r   rn   r…   r‡   Úget_allÚ_LISTTUPLEFIELDSr~   Úget_payload)ru   ZfileobÚmsgrc   ÚvaluesrZ   Úbodyr   r   r   rr   T  s    

zLegacyMetadata.read_filec          
   C   s0   t j|ddd�}z| j||ƒ W d|jƒ  X dS )z&Write the metadata fields to filepath.Úwzutf-8)r—   N)r˜   r™   Ú
write_filerš   )ru   r›   Úskip_unknownrœ   r   r   r   rz   p  s    zLegacyMetadata.writec             C   sÌ   | j ƒ  x¾t| d ƒD ]®}| j|ƒ}|r:|dg dgfkr:q|tkrX| j||dj|ƒƒ q|tkr’|dkrŒ| jdkr€|jddƒ}n|jdd	ƒ}|g}|t	kr¨d
d„ |D ƒ}x|D ]}| j|||ƒ q®W qW dS )z0Write the PKG-INFO format data to a file object.zMetadata-VersionrL   r�   r!   ú1.0ú1.1rŒ   z	
        z	
       |c             S   s   g | ]}d j |ƒ‘qS )r�   )Újoin)r>   rZ   r   r   r   rŸ   Œ  s    z-LegacyMetadata.write_file.<locals>.<listcomp>N)r©   rª   )
rt   rG   r|   rˆ   r{   r«   r‡   r�   r_   r¡   )ru   Ú
fileobjectr¨   rc   r¤   rZ   r   r   r   r§   x  s$    


zLegacyMetadata.write_filec                s‚   ‡ fdd„}|snHt |dƒr>x<|jƒ D ]}|||| ƒ q&W nx|D ]\}}|||ƒ qDW |r~x|jƒ D ]\}}|||ƒ qhW 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ˆ jˆ j| ƒ|ƒ d S )N)r†   r~   r€   )rY   rZ   )ru   r   r   Ú_set›  s    z#LegacyMetadata.update.<locals>._setrH   N)ÚhasattrrH   rM   )ru   ÚotherÚkwargsr­   ÚkÚvr   )ru   r   rs   ‘  s    

zLegacyMetadata.updatec             C   sn  | j |ƒ}|tks|dkrPt|ttfƒ rPt|tƒrJdd„ |jdƒD ƒ}q~g }n.|tkr~t|ttfƒ r~t|tƒrz|g}ng }tj	t
jƒ�rB| d }t| jƒ}|tkrâ|dk	râx’|D ](}|j|jdƒd ƒs´tjd	|||ƒ q´W n`|tkoð|dk	�r|j|ƒ�sBtjd
|||ƒ n0|tk�rB|dk	�rB|j|ƒ�sBtjd
|||ƒ |tk�r`|dk�r`| j|ƒ}|| j|< dS )z"Control then set a metadata field.r   c             S   s   g | ]}|j ƒ ‘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ÚlistrC   r   rž   r‡   rP   ÚisEnabledForÚloggingÚWARNINGr   rp   Ú_PREDICATE_FIELDSÚis_valid_matcherÚwarningÚ_VERSIONS_FIELDSÚis_valid_constraint_listÚ_VERSION_FIELDSÚis_valid_versionÚ_UNICODEFIELDSr�   rn   )ru   r`   rZ   Úproject_namerp   r²   r   r   r   r~   ­  s@    








zLegacyMetadata.setc             C   sÎ   | j |ƒ}|| jkr*|tkr&| j|ƒ}|S |tkr@| j| }|S |tkrž| j| }|dkr^g S g }x6|D ].}|tkr€|j|ƒ qh|j|d |d fƒ qhW |S |tkrÄ| j| }t	|t
ƒrÄ|jdƒS | j| S )zGet a metadata field.Nr   r   r�   )r€   rn   Ú_MISSINGr‰   rÁ   r‡   r¡   rN   rˆ   rµ   r   rž   )ru   r`   rj   rZ   ÚresÚvalr   r   r   r|   Ù  s.    








zLegacyMetadata.getc                s  | j ƒ  g g  }}xdD ]}|| kr|j|ƒ qW |rT|g krTddj|ƒ }t|ƒ‚xdD ]}|| krZ|j|ƒ qZW | d dkrˆ||fS t| jƒ‰ ‡ fd	d
„}xdt|ftˆ jft	ˆ j
ffD ]F\}}x<|D ]4}	| j|	dƒ}
|
dk	oè||
ƒ rÈ|jd|	|
f ƒ qÈW qºW ||fS )zkCheck if the metadata is compliant. If strict is True then raise if
        no Name or Version are providedr   r   zmissing required metadata: %sz, ú	Home-pager$   zMetadata-Versionz1.2c                s*   x$| D ]}ˆ j |jdƒd ƒsdS qW dS )Nr´   r   FT)r»   rž   )rZ   r²   )rp   r   r   Úare_valid_constraints  s    
z3LegacyMetadata.check.<locals>.are_valid_constraintsNzWrong value for '%s': %s)r   r   )rÆ   r$   )rt   rN   r«   r   r   rp   rº   r½   r¾   r¿   rÀ   r|   )ru   ÚstrictÚmissingÚwarningsrb   r£   rÇ   rX   Ú
controllerrc   rZ   r   )rp   r   Úcheckö  s2    




zLegacyMetadata.checkc             C   sn   | j ƒ  t| d ƒ}i }xP|D ]H}| s2|| jkrt| }|dkrP| | ||< qdd„ | | D ƒ||< qW |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.
        zMetadata-VersionZproject_urlc             S   s   g | ]}d j |ƒ‘qS )r�   )r«   )r>   Úur   r   r   rŸ   5  s    z)LegacyMetadata.todict.<locals>.<listcomp>)rt   rG   rn   Ú_FIELD2ATTR)ru   Zskip_missingrX   Údatar‚   rY   r   r   r   Útodict"  s    
zLegacyMetadata.todictc             C   s<   | d dkr(xdD ]}|| kr| |= qW | d  |7  < d S )NzMetadata-Versionz1.1r*   r,   r+   zRequires-Dist)r*   r,   r+   r   )ru   Úrequirementsrc   r   r   r   Úadd_requirements9  s
    

zLegacyMetadata.add_requirementsc             C   s   t t| d ƒƒS )NzMetadata-Version)r¶   rG   )ru   r   r   r   rH   D  s    zLegacyMetadata.keysc             c   s   x| j ƒ D ]
}|V  q
W d S )N)rH   )ru   rY   r   r   r   Ú__iter__G  s    zLegacyMetadata.__iter__c                s   ‡ fdd„ˆ j ƒ D ƒS )Nc                s   g | ]}ˆ | ‘qS r   r   )r>   rY   )ru   r   r   rŸ   L  s    z)LegacyMetadata.values.<locals>.<listcomp>)rH   )ru   r   )ru   r   r¤   K  s    zLegacyMetadata.valuesc                s   ‡ fdd„ˆ j ƒ D ƒS )Nc                s   g | ]}|ˆ | f‘qS r   r   )r>   rY   )ru   r   r   rŸ   O  s    z(LegacyMetadata.items.<locals>.<listcomp>)rH   )ru   r   )ru   r   rM   N  s    zLegacyMetadata.itemsc             C   s   d| j j| j| jf S )Nz
<%s %s %s>)Ú	__class__r   r`   rF   )ru   r   r   r   Ú__repr__Q  s    zLegacyMetadata.__repr__)NNNrj   )F)F)F)N)F)F)"r   r   r   r   ry   rt   r{   r}   r   rƒ   r„   r€   r‰   r�   r’   r“   r”   r•   rq   rr   rz   r§   rs   r~   rÃ   r|   rÌ   rÐ   rÒ   rH   rÓ   r¤   rM   rÕ   r   r   r   r   ri   î   s>   	 




,
,
ri   zpydist.jsonzmetadata.jsonÚMETADATAc               @   s¬  e Zd ZdZejdƒZejdejƒZe	Z
ejdƒZdZde Zf f dVdœZd	Zd
Zef fedWfe
dXfedYfdœZdZZd[d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d_d!d"„Zd#d$„ Zed%d&„ ƒZ ed'd(„ ƒZ!e!j"d)d(„ ƒZ!d`d*d+„Z#ed,d-„ ƒZ$ed.d/„ ƒZ%e%j"d0d/„ ƒZ%d1d2„ Z&d3d4„ Z'd5d6„ Z(d7d8„ Z)dd9dd:dad=dd>d?d@dbdDdcdGdddIdJddedi
Z*dLdM„ Z+dfdPdQ„Z,dRdS„ Z-dTdU„ Z.dS )gr   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}z2.0zdistlib (%s)Úlegacy)r`   rF   Ú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�   r`   rF   rØ   Ú_legacyÚ_datarp   Nrj   c             C   s0  |||gj d ƒdk rtdƒ‚d | _d | _|| _|d k	rzy| j||ƒ || _W n* tk
rv   t||d�| _| jƒ  Y nX n²d }|r¢t	|dƒ�}|j
ƒ }W d Q R X n|r®|j
ƒ }|d krÈ| j| jdœ| _ndt|tƒsÜ|jdƒ}ytj|ƒ| _| j| j|ƒ W n0 tk
�r*   tt|ƒ|d�| _| jƒ  Y nX d S )Nrk   z'path, fileobj and mapping are exclusive)rx   rp   Úrb)r�   Ú	generatorzutf-8)rw   rp   )rl   rm   rÙ   rÚ   rp   Ú_validate_mappingr   ri   Úvalidater™   rq   ÚMETADATA_VERSIONÚ	GENERATORrµ   r	   ÚdecodeÚjsonÚloadsÚ
ValueErrorr   )ru   rv   rw   rx   rp   rÏ   r?   r   r   r   ry   …  s<    



zMetadata.__init__r`   rF   ÚlicenseÚkeywordsrØ   zRequires-DistzSetup-Requires-DistzProvides-Extrar(   úDownload-URLúMetadata-Version)Úrun_requiresÚbuild_requiresÚdev_requiresZtest_requiresÚmeta_requiresÚextrasÚmodulesÚ
namespacesÚexportsÚcommandsÚclassifiersÚ
source_urlr�   c       
      C   sZ  t j| dƒ}t j| dƒ}||k�r|| \}}| jr^|d krP|d krHd n|ƒ }n| jj|ƒ}n¼|d krjd n|ƒ }|dkrˆ| jj||ƒ}n’t ƒ }|}| jjdƒ}	|	�r|dkrº|	jd	|ƒ}nR|dkrÞ|	jd
ƒ}	|	rÜ|	j||ƒ}n.|	jdƒ}	|	� sú| jjdƒ}	|	�r|	j||ƒ}||k�rV|}n:||k�r4t j| |ƒ}n"| j�rJ| jj|ƒ}n| jj|ƒ}|S )NÚcommon_keysÚmapped_keysrñ   rð   rî   rï   rò   Ú
extensionszpython.commandszpython.detailszpython.exports)rñ   rð   rî   rï   rò   )ÚobjectÚ__getattribute__rÙ   r|   rÚ   )
ru   rY   ÚcommonÚmappedÚlkÚmakerÚresultrZ   ÚsentinelÚdr   r   r   rø   É  sF    




zMetadata.__getattribute__c             C   sH   || j krD| j | \}}|p | j|krD|j|ƒ}|sDtd||f ƒ‚d S )Nz.'%s' is an invalid value for the '%s' property)ÚSYNTAX_VALIDATORSrp   Úmatchr   )ru   rY   rZ   rp   ÚpatternÚ
exclusionsÚmr   r   r   Ú_validate_valueô  s    

zMetadata._validate_valuec             C   s*  | j ||ƒ tj| dƒ}tj| dƒ}||kr¾|| \}}| jrV|d krJt‚|| j|< nf|dkrj|| j|< nR| jjdi ƒ}|dkrŠ||d	< n2|dkr¨|jd
i ƒ}|||< n|jdi ƒ}|||< nh||krÖtj| ||ƒ nP|dk�rt|t	ƒ�r|j
ƒ }|�r|jƒ }ng }| j�r|| j|< n
|| j|< d S )Nrô   rõ   rñ   rð   rî   rï   rò   rö   zpython.commandszpython.detailszpython.exportsræ   )rñ   rð   rî   rï   rò   )r  r÷   rø   rÙ   ÚNotImplementedErrorrÚ   Ú
setdefaultÚ__setattr__rµ   r   r³   rž   )ru   rY   rZ   rù   rú   rû   r]   rÿ   r   r   r   r  þ  s>    




zMetadata.__setattr__c             C   s   t | j| jdƒS )NT)rh   r`   rF   )ru   r   r   r   Úname_and_version%  s    zMetadata.name_and_versionc             C   sF   | j r| j d }n| jjdg ƒ}d| j| jf }||krB|j|ƒ |S )NzProvides-DistÚprovidesz%s (%s))rÙ   rÚ   r  r`   rF   rN   )ru   rý   Úsr   r   r   r
  )  s    
zMetadata.providesc             C   s    | j r|| j d< n
|| jd< d S )NzProvides-Distr
  )rÙ   rÚ   )ru   rZ   r   r   r   r
  4  s    c       
      C   sâ   | j r|}nÒg }t|pg | jƒ}xl|D ]d}d|kr@d|kr@d}n8d|krNd}n|jdƒ|k}|rx|jdƒ}|rxt||ƒ}|r&|j|d ƒ q&W xNdD ]F}d| }	|	|kr”|j|	ƒ | jjd	| g ƒ}|j| j|||d
�ƒ q”W |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   rí   r|   r
   ÚextendrO   rÚ   Úget_requirements)
ru   Úreqtsrí   r  rý   rÿ   ÚincluderJ   rY   Úer   r   r   r  ;  s0    	




zMetadata.get_requirementsc             C   s   | j r| jƒ S | jS )N)rÙ   Ú_from_legacyrÚ   )ru   r   r   r   Ú
dictionarye  s    zMetadata.dictionaryc             C   s   | j rt‚nt| j| jƒS d S )N)rÙ   r  r   rÚ   ÚDEPENDENCY_KEYS)ru   r   r   r   Údependenciesk  s    zMetadata.dependenciesc             C   s   | j rt‚n| jj|ƒ d S )N)rÙ   r  rÚ   rs   )ru   rZ   r   r   r   r  r  s    c       	      C   sŽ   |j dƒ| jkrtƒ ‚g }x0| jjƒ D ]"\}}||kr&||kr&|j|ƒ q&W |rfddj|ƒ }t|ƒ‚x"|jƒ D ]\}}| j|||ƒ qpW d S )Nr�   zMissing metadata items: %sz, )	r|   rß   r   ÚMANDATORY_KEYSrM   rN   r«   r   r  )	ru   rx   rp   rÉ   rY   r  r£   r±   r²   r   r   r   rÝ   y  s    zMetadata._validate_mappingc             C   sB   | j r.| j jdƒ\}}|s|r>tjd||ƒ n| j| j| jƒ d S )NTz#Metadata: missing: %s, warnings: %s)rÙ   rÌ   rP   r¼   rÝ   rÚ   rp   )ru   rÉ   rÊ   r   r   r   rÞ   ‡  s    
zMetadata.validatec             C   s(   | j r| j jdƒS t| j| jƒ}|S d S )NT)rÙ   rÐ   r   rÚ   Ú
INDEX_KEYS)ru   rý   r   r   r   rÐ   �  s    zMetadata.todictc       
      C   sÐ   | j r| j st‚| j| jdœ}| j jdƒ}x2dD ]*}||kr2|dkrLd	}n|}|| ||< q2W |jd
g ƒ}|dgkrzg }||d< d}x2|D ]*\}}||krŒ|| rŒd|| ig||< qŒW | j|d< i }i }	|S )N)r�   rÜ   Tr`   rF   rå   rØ   ÚdescriptionÚ
classifierrò   r"   Ú ræ   Úrequires_distré   Úsetup_requires_distrê   r  r
  )r`   rF   rå   rØ   r  r  ©r!  ré   ©r"  rê   )r#  r$  )rÙ   rÚ   ÚAssertionErrorrß   rà   rÐ   r|   r
  )
ru   rý   Zlmdr±   ÚnkÚkwrH   ÚokÚauthorÚ
maintainerr   r   r   r  —  s0    

 
zMetadata._from_legacyr   r   rö   úpython.detailsr&   r    r  r!   úpython.projectÚproject_urlsÚHomez	Home-pageÚcontactsr   r$   ÚemailzAuthor-emailró   rò   c             C   sü   dd„ }| j r| j st‚tƒ }| j }x„| jjƒ D ]v\}}t|tƒsZ||kr¨|| ||< q2|}d}x8|D ]0}y|| }W qh tt	fk
r–   d}P Y qhX qhW |r2|||< q2W || j
| j ƒ}	|| j| j ƒ}
| jràt| jƒ|d< t|	ƒ|d< t|
ƒ|d< |S )Nc             S   s˜   t ƒ }xŒ| D ]„}|jdƒ}|jdƒ}|d }xb|D ]Z}| rN| rN|j|ƒ q2d}|r^d| }|rx|rtd||f }n|}|jdj||fƒƒ q2W qW |S )Nr  r  r  r   zextra == "%s"z(%s) and %sr´   )r~   r|   Úaddr«   )Úentriesr  r  r  r  Zrlistr–   rJ   r   r   r   Úprocess_entriesÂ  s"    



z,Metadata._to_legacy.<locals>.process_entriesTFzProvides-ExtrazRequires-DistzSetup-Requires-Dist)rÚ   rÙ   r%  ri   ÚLEGACY_MAPPINGrM   rµ   rC   r�   Ú
IndexErrorré   rì   rê   rë   rí   Úsorted)ru   r3  rý   Znmdr&  r(  rÿ   Úfoundr±   Zr1Zr2r   r   r   Ú
_to_legacyÁ  s2    

zMetadata._to_legacyFTc             C   sÂ   ||gj d ƒdkrtdƒ‚| jƒ  |r`| jr4| j}n| jƒ }|rP|j||d� q¾|j||d� n^| jrp| jƒ }n| j}|r�t	j
||dddd� n.tj|ddƒ�}t	j
||dddd� W d Q R X d S )	Nr   z)Exactly one of path and fileobj is needed)r¨   Trk   )Úensure_asciiÚindentÚ	sort_keysr¦   zutf-8)rl   rä   rÞ   rÙ   r8  rz   r§   r  rÚ   râ   Údumpr˜   r™   )ru   rv   rw   r×   r¨   Z	legacy_mdrÿ   r?   r   r   r   rz   ó  s&    

zMetadata.writec             C   sŒ   | j r| j j|ƒ nt| jjdg ƒ}d }x"|D ]}d|kr,d|kr,|}P q,W |d krhd|i}|jd|ƒ n t|d ƒt|ƒB }t|ƒ|d< d S )Nré   r  r  r  r   )rÙ   rÒ   rÚ   r  Úinsertr~   r6  )ru   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)>)r`   rF   rÔ   r   r�   )ru   r`   rF   r   r   r   rÕ     s    

zMetadata.__repr__)r×   )r×   )r×   )r×   )rÙ   rÚ   rp   )NNNrj   )r`   rF   rå   ræ   rØ   )rç   N)rè   N)N)NN)rö   r+  rå   )rö   r,  r-  r.  )rö   r,  r/  r   r`   )rö   r,  r/  r   r0  )rö   r+  rò   )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__ry   r~   rô   r¶   Z	none_listÚdictZ	none_dictrõ   rø   r  r  Úpropertyr	  r
  Úsetterr  r  r  rÝ   rÞ   rÐ   r  r4  r8  rz   rÒ   rÕ   r   r   r   r   r   [  s€   

 
,+

'
*	2
)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*   r+   r,   r(   r)   )r   r   r   r   r'   r    r!   r"   r#   r$   r%   r-   r.   r&   r(   r)   r/   r0   r1   r2   r3   r4   )r1   r2   r3   r/   r4   r-   r.   r0   )r   r   r   r   r'   r    r!   r"   r#   r$   r%   r-   r.   r&   r(   r)   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   )r5   r9   r6   r7   r8   )r:   r,   r+   r*   )r:   )r2   r/   r1   )r3   )r   )r   r(   r*   r,   r+   r/   r1   r2   r4   r0   r'   r7   r9   r8   )r0   )r"   )r$   r-   r    r!   )F)Gr   Ú
__future__r   r˜   r0  r   râ   r¸   r@  r   r   r   Úcompatr   r   r	   rI   r
   Úutilr   r   rF   r   r   Ú	getLoggerr   rP   r   r   r   r   Ú__all__r   r   rA  r�   rŽ   rA   rB   rS   r=   rT   rE   rV   rD   rU   r~   r…   rs   ZEXTRA_RErG   r[   r†   rM   rÎ   rº   r½   r¿   r‡   r¡   rˆ   rÁ   r÷   rÃ   rf   rh   ri   ZMETADATA_FILENAMEZWHEEL_METADATA_FILENAMEZLEGACY_METADATA_FILENAMEr   r   r   r   r   Ú<module>	   s²   



                         





I    

  j