
0c@_2                 @   sB  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 Gd d   d e
  Z Gd d   d e
  Z Gd d   d e
  Z Gd d   d e
  Z d d d g Z d Z  d Z! e j" d  Z# e j" d  Z$ d d d d d d d  d! d" d# d$ f Z% d d d d d% d d d  d! d" d# d$ d& d' d( d) d* f Z& d( d) d* d& d' f Z' d d d d d% d d d  d! d" d# d+ d, d$ d& d' d- d. d/ d0 d1 d2 f Z( d/ d0 d1 d- d2 d+ d, d. f Z) d d d d d% d d d  d! d" d# d+ d, d$ d& d' d- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 f Z* d3 d7 d4 d5 d6 f Z+ e* d8 d* d) f Z, d8 f Z- e.   Z/ e/ j0 e%  e/ j0 e&  e/ j0 e(  e/ j0 e*  e/ j0 e,  e j" d9  Z1 d: d;   Z2 d< d=   Z3 d> d?   e/ D Z4 d@ d?   e4 j5   D Z6 d0 d- d/ f Z7 d1 f Z8 d f Z9 d d& d( d* d) d- d/ d0 d2 d. d% d5 d7 d6 f Z: d. f Z; d  f Z< d" d+ d d f Z= e>   Z? e j" dA  Z@ dB dC dD  ZA GdE dF   dF e>  ZB dG ZC dH ZD dI ZE GdJ d   d e>  ZF d S)KzImplementation 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-jynh7p1z/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	
        zMetadata-VersionNameVersionPlatformSummaryDescriptionKeywordsz	Home-pageAuthorzAuthor-emailLicensezSupported-Platform
ClassifierzDownload-URL	ObsoletesProvidesRequiresZ
MaintainerzMaintainer-emailzObsoletes-DistzProject-URLzProvides-DistzRequires-DistzRequires-PythonzRequires-ExternalzPrivate-VersionzObsoleted-ByzSetup-Requires-Dist	ExtensionzProvides-ExtrazDescription-Content-Typez"extra\s*==\s*("([^"]+)"|'([^']+)')c             C   sd   |  d k r t  S|  d k r  t S|  d k r0 t S|  d k rD t t S|  d k rT t St |    d  S)Nz1.0z1.1z1.21.32.1z2.0)r)   r*   )_241_FIELDS_314_FIELDS_345_FIELDS_566_FIELDS_426_FIELDSr   )versionr   r   r   _version2fieldlistp   s    r1   c       
      C   s  d d   } g  } x? |  j    D]1 \ } } | g  d d f k rC q | j |  q Wd d d d d	 d
 g } xX| D]P} | 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 rMd | k rM| j d  t j d |  | t k rd
 | k r| d k r| j d
  t j d |  | t	 k rs d	 | k rs | j d	  t j d |  qs Wt
 |  d k r| d St
 |  d k rt j d |   t d   d | k o'| | t  } d | k oB| | t  } d
 | k o]| | t  } d	 | k ox| | t  }	 t |  t |  t |  t |	  d k rt d   | r| r| r|	 rt | k rt S| rd S| rd S| rd
 Sd	 S)z5Detect the best version depending on the fields used.c             S   s%   x | D] } | |  k r d Sq Wd 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appendr+   removeloggerdebugr,   r-   r.   r/   lenr   _314_MARKERS_345_MARKERS_566_MARKERS_426_MARKERSintr   )
fieldsr5   r2   keyvalueZpossible_versionsZis_1_1Zis_1_2Zis_2_1Zis_2_0r   r   r   _best_version~   s`    0rE   c             C   s+   i  |  ]! } | | j    j d  d   q S)-_)lowerreplace).0namer   r   r   
<dictcomp>   s   	rL   c             C   s   i  |  ] \ } } | |  q Sr   r   )rJ   attrfieldr   r   r   rL      s   	 z[^A-Za-z0-9.]+Fc             C   sD   | r6 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.rF    .z%s-%s)	_FILESAFEsubrI   )rK   r0   Zfor_filenamer   r   r   _get_name_and_version   s    rS   c               @   s  e  Z d  Z d Z d d d 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 d d% d&  Z d d' d(  Z d d) d*  Z d+ d,   Z e d- d.  Z d d/ d0  Z d d1 d2  Z d3 d4   Z d5 d6   Z d7 d8   Z d9 d:   Z d; d<   Z  d= d>   Z! d S)?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   s   | | | g j  d   d k  r* t d   i  |  _ g  |  _ d  |  _ | |  _ | d  k	 rj |  j |  n? | d  k	 r |  j |  n# | d  k	 r |  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mappingr[   r   r   r   __init__   s    				zLegacyMetadata.__init__c             C   s   t  |  j  |  j d <d  S)NzMetadata-Version)rE   rY   )r`   r   r   r   r_     s    z#LegacyMetadata.set_metadata_versionc             C   s   | j  d | | f  d  S)Nz%s: %s
)write)r`   rb   rK   rD   r   r   r   _write_field  s    zLegacyMetadata._write_fieldc             C   s   |  j  |  S)N)get)r`   rK   r   r   r   __getitem__  s    zLegacyMetadata.__getitem__c             C   s   |  j  | |  S)N)set)r`   rK   rD   r   r   r   __setitem__  s    zLegacyMetadata.__setitem__c             C   sB   |  j  |  } y |  j | =Wn t k
 r= t |   Yn Xd  S)N)_convert_namerY   KeyError)r`   rK   
field_namer   r   r   __delitem__  s
    zLegacyMetadata.__delitem__c             C   s%   | |  j  k p$ |  j |  |  j  k S)N)rY   rk   )r`   rK   r   r   r   __contains__  s    zLegacyMetadata.__contains__c             C   s8   | t  k r | S| j d d  j   } t j | |  S)NrF   rG   )_ALL_FIELDSrI   rH   _ATTR2FIELDrg   )r`   rK   r   r   r   rk     s    zLegacyMetadata._convert_namec             C   s    | t  k s | t k r g  Sd S)Nr6   )_LISTFIELDS_ELEMENTSFIELD)r`   rK   r   r   r   _default_value%  s    zLegacyMetadata._default_valuec             C   s3   |  j  d k r t j d |  St j d |  Sd  S)N1.01.1
)ru   rv   )metadata_version_LINE_PREFIX_PRE_1_2rR   _LINE_PREFIX_1_2)r`   rD   r   r   r   _remove_line_prefix*  s    z"LegacyMetadata._remove_line_prefixc             C   s$   | t  k r |  | St |   d  S)N)rq   AttributeError)r`   rK   r   r   r   __getattr__0  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   )rS   )r`   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)rk   rp   )r`   rK   r   r   r   is_fieldA  s    zLegacyMetadata.is_fieldc             C   s   |  j  |  } | t k S)N)rk   rr   )r`   rK   r   r   r   is_multi_fieldF  s    zLegacyMetadata.is_multi_fieldc          
   C   s;   t  j | d d d } z |  j |  Wd | j   Xd S)z*Read the metadata values from a file path.rencodingzutf-8N)codecsopenr]   close)r`   filepathfpr   r   r   r\   J  s    zLegacyMetadata.readc             C   s   t  |  } | d |  j d <x t D] } | | k r9 q$ | t k r | j |  } | t k r | d k	 r d 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),)tuplesplit)rJ   rD   r   r   r   
<listcomp>_  s   	 z,LegacyMetadata.read_file.<locals>.<listcomp>r6   r    )r   rY   rp   rr   get_all_LISTTUPLEFIELDSri   get_payload)r`   ZfileobmsgrN   valuesrD   bodyr   r   r   r]   R  s    
zLegacyMetadata.read_filec          
   C   s>   t  j | d d d } z |  j | |  Wd | j   Xd S)z&Write the metadata fields to filepath.wr   zutf-8N)r   r   
write_filer   )r`   r   skip_unknownr   r   r   r   re   n  s    zLegacyMetadata.writec             C   s  |  j    xt |  d  D] } |  j |  } | rQ | d g  d g f k rQ q | t k r| |  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 Wq Wd S)z0Write the PKG-INFO format data to a file object.zMetadata-Versionr6   r   r    1.01.1rw   z	
        z	
       |c             S   s   g  |  ] } d  j  |   q S)r   )join)rJ   rD   r   r   r   r     s   	 z-LegacyMetadata.write_file.<locals>.<listcomp>N)r   r   )
r_   r1   rg   rs   rf   r   rr   rx   rI   r   )r`   
fileobjectr   rN   r   rD   r   r   r   r   v  s$    
	zLegacyMetadata.write_filec                s     f d d   } | s n^ t  | d  rU xL | j   D] } | | | |  q7 Wn$ x! | D] \ } } | | |  q\ W| r x' | j   D] \ } } | | |  q Wd 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)rq   ri   rk   )rC   rD   )r`   r   r   _set  s    z#LegacyMetadata.update.<locals>._setr2   N)hasattrr2   r7   )r`   otherkwargsr   kvr   )r`   r   r^     s    
zLegacyMetadata.updatec             C   s  |  j  |  } | t k s' | d k rt t | t t f  rt t | t  rk d d   | j d  D } q g  } nC | t k r t | t t f  r t | t  r | g } n g  } t j	 t
 j  r|  d } t |  j  } | t k r@| d k	 r@x | D]8 } | j | j d  d  st j d	 | | |  qWn} | t k r| d k	 r| j |  st j d
 | | |  n= | t k r| d k	 r| j |  st 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 Sr   )strip)rJ   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    )rk   rs   
isinstancelistr   r   r   rr   r:   isEnabledForloggingWARNINGr   r[   _PREDICATE_FIELDSis_valid_matcherwarning_VERSIONS_FIELDSis_valid_constraint_list_VERSION_FIELDSis_valid_version_UNICODEFIELDSr{   rY   )r`   rK   rD   project_namer[   r   r   r   r   ri     s@    	
		zLegacyMetadata.setc             C   s  |  j  |  } | |  j k r= | t k r9 |  j |  } | S| t k rZ |  j | } | S| t k r |  j | } | d k r g  Sg  } xE | D]= } | t k r | j |  q | j | d | d f  q W| S| t k r
|  j | } t	 | t
  r
| j d  S|  j | S)zGet a metadata field.Nr   r   r   )rk   rY   _MISSINGrt   r   rr   r   r8   rs   r   r   r   )r`   rK   rU   rD   resvalr   r   r   rg     s.    zLegacyMetadata.getc                sl  |  j    g  g  } } x' d D] } | |  k r | j |  q W| rr | g  k rr d d j |  } t |   x' d D] } | |  k ry | j |  qy W|  d d k r | | f St |  j      f d	 d
   } x t | f t   j f t	   j
 f f D]_ \ } } xP | D]H }	 |  j |	 d  }
 |
 d k	 r| |
  r| j d |	 |
 f  qWq 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                s5   x. |  D]& }   j  | j d  d  s d Sq Wd S)Nr   r   FT)r   r   )rD   r   )r[   r   r   are_valid_constraints  s    z3LegacyMetadata.check.<locals>.are_valid_constraintsNzWrong value for '%s': %s)zNamezVersion)r   r"   )r_   r8   r   r   r   r[   r   r   r   r   r   rg   )r`   strictmissingwarningsrM   r   r   rB   
controllerrN   rD   r   )r[   r   check  s2    

	zLegacyMetadata.checkc             C   s   |  j    t |  d  } i  } xf | D]^ } | sC | |  j k r' t | } | d k rj |  | | | <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   )rJ   ur   r   r   r   3  s   	 z)LegacyMetadata.todict.<locals>.<listcomp>)r_   r1   rY   _FIELD2ATTR)r`   Zskip_missingrB   datarm   rC   r   r   r   todict   s    

zLegacyMetadata.todictc             C   sF   |  d d k r4 x! d D] } | |  k r |  | =q W|  d | 7<d  S)NzMetadata-Versionz1.1r%   r'   r&   zRequires-Dist)z	ObsoleteszRequireszProvidesr   )r`   requirementsrN   r   r   r   add_requirements7  s
    zLegacyMetadata.add_requirementsc             C   s   t  t |  d   S)NzMetadata-Version)r   r1   )r`   r   r   r   r2   B  s    zLegacyMetadata.keysc             c   s    x |  j    D] } | Vq Wd  S)N)r2   )r`   rC   r   r   r   __iter__E  s    zLegacyMetadata.__iter__c                s     f d d     j    D S)Nc                s   g  |  ] }   |  q Sr   r   )rJ   rC   )r`   r   r   r   J  s   	 z)LegacyMetadata.values.<locals>.<listcomp>)r2   )r`   r   )r`   r   r   I  s    zLegacyMetadata.valuesc                s     f d d     j    D S)Nc                s    g  |  ] } |   | f  q Sr   r   )rJ   rC   )r`   r   r   r   M  s   	 z(LegacyMetadata.items.<locals>.<listcomp>)r2   )r`   r   )r`   r   r7   L  s    zLegacyMetadata.itemsc             C   s   d |  j  j |  j |  j f S)Nz
<%s %s %s>)	__class__r   rK   r0   )r`   r   r   r   __repr__O  s    zLegacyMetadata.__repr__)"r   r   r   r   rd   r_   rf   rh   rj   rn   ro   rk   rt   r{   r}   r~   r   r   r\   r]   re   r   r^   ri   r   rg   r   r   r   r2   r   r   r7   r   r   r   r   r   rT      s>   		,,rT   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 d f  d f  d	 d^ i Z d Z d Z d e f  f d e d_ f d e
 d` f d	 e da f i Z db Z d d d d d d  Z e dc  Z d e f Z d e f Z d d e f d d e f d e d e d e d d e f d  e d! e d" e d# e d$ d% e f d& dd d de i Z [ [ d) d*   Z d d+ d,  Z d- d.   Z e d/ d0    Z  e d1 d2    Z! e! j" d3 d2    Z! d d d4 d5  Z# e d6 d7    Z$ e d8 d9    Z% e% j" d: d9    Z% d; d<   Z& d= d>   Z' d? d@   Z( dA dB   Z) d dC d dD df dG d	 dH dI dJ dg dN dh dQ di dS d& d' dj d% i
 Z* dT dU   Z+ d d dV dW dX dY  Z, dZ d[   Z- d\ d]   Z. d S)kr   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)rK   r0   summarylegacyzqname 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_environmentsrx   _legacy_datar[   NrU   c             C   s  | | | g j  d   d k  r* t d   d  |  _ d  |  _ | |  _ | d  k	 r y |  j | |  | |  _ Wqt k
 r t d | d |  |  _ |  j   YqXn d  } | r t	 | d   } | j
   } Wd  QRXn | r | j
   } | d  k rd |  j d |  j i |  _ n t | t  s6| j d  } y) t j |  |  _ |  j |  j |  Wn: t k
 rt d	 t |  d |  |  _ |  j   Yn Xd  S)
NrV   z'path, fileobj and mapping are exclusiverc   r[   rbrx   	generatorzutf-8rb   )rW   rX   r   r   r[   _validate_mappingr   rT   validater   r\   METADATA_VERSION	GENERATORr   r	   decodejsonloads
ValueErrorr   )r`   ra   rb   rc   r[   r   fr   r   r   rd     s<    				zMetadata.__init__licensekeywordsrun_requireszRequires-Distbuild_requireszSetup-Requires-Distdev_requiresZtest_requiresmeta_requiresextraszProvides-Extramodules
namespacesexportscommandsclassifiersr$   Z
source_urlDownload-URLMetadata-Versionc       
      C   s  t  j |  d  } t  j |  d  } | | k r| | \ } } |  j r | d  k rs | d  k rg d  n |   } q|  j j |  } q| d  k r d  n |   } | d k r |  j j | |  } qt    } | } |  j j d  }	 |	 r| d k r|	 j d	 |  } nu | d k rE|	 j d
  }	 |	 r|	 j | |  } n? |	 j d  }	 |	 sl|  j j d  }	 |	 r|	 j | |  } | | k r| } nQ | | k rt  j |  |  } n0 |  j r|  j j |  } n |  j j |  } | S)Ncommon_keysmapped_keysr   r   r   r   r   
extensionszpython.commandszpython.detailszpython.exports)zcommandszexportszmodulesz
namespaceszclassifiers)object__getattribute__r   rg   r   )
r`   rC   commonmappedlkmakerresultrD   sentineldr   r   r   r     sF    					zMetadata.__getattribute__c             C   sf   | |  j  k rb |  j  | \ } } | p. |  j | k rb | j |  } | sb t d | | f   d  S)Nz.'%s' is an invalid value for the '%s' property)SYNTAX_VALIDATORSr[   matchr   )r`   rC   rD   r[   pattern
exclusionsmr   r   r   _validate_value  s    zMetadata._validate_valuec             C   s  |  j  | |  t j |  d  } t j |  d  } | | k r| | \ } } |  j r{ | d  k rk t  | |  j | <q| d k r | |  j | <q|  j j d i   } | d k r | | d	 <q| d k r | j d
 i   } | | | <q| j d i   } | | | <n | | k r1t j |  | |  nh | d k rst | t	  rs| j
   } | rm| 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   )zcommandszexportszmodulesz
namespaceszclassifiers)r   r   r   r   NotImplementedErrorr   
setdefault__setattr__r   r   r   r   )r`   rC   rD   r   r   r   rG   r   r   r   r   r     s>    			zMetadata.__setattr__c             C   s   t  |  j |  j d  S)NT)rS   rK   r0   )r`   r   r   r   name_and_version#  s    zMetadata.name_and_versionc             C   sa   |  j  r |  j  d } n |  j j d g   } d |  j |  j f } | | k r] | j |  | S)NzProvides-Distprovidesz%s (%s))r   r   r   rK   r0   r8   )r`   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   )r`   rD   r   r   r   r   2  s    	c       
      C   s@  |  j  r | } n*g  } t | p$ g  |  j  } x | D] } d | k r^ d | k r^ d } nT d | k rs d } n | j d  | k } | r | j d  } | r t | |  } | r7 | j | d  q7 Wxl d D]d } d | }	 |	 | k r | j |	  |  j j d	 | g   } | j |  j | d
 | 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_requiresr   env)zbuildzdevztest)	r   r   r   rg   r
   extendr9   r   get_requirements)
r`   reqtsr   r   r   r   includer4   rC   er   r   r   r   9  s0    					
zMetadata.get_requirementsc             C   s   |  j  r |  j   S|  j S)N)r   _from_legacyr   )r`   r   r   r   
dictionaryc  s    	
zMetadata.dictionaryc             C   s)   |  j  r t  n t |  j |  j  Sd  S)N)r   r   r   r   DEPENDENCY_KEYS)r`   r   r   r   dependenciesi  s    		zMetadata.dependenciesc             C   s&   |  j  r t  n |  j j |  d  S)N)r   r   r   r^   )r`   rD   r   r   r   r  p  s    		c       	      C   s   | j  d  |  j k r! t    g  } xB |  j j   D]1 \ } } | | k r7 | | k r7 | j |  q7 W| r d d j |  } t |   x- | j   D] \ } } |  j | | |  q Wd  S)Nrx   zMissing metadata items: %sz, )	rg   r   r   MANDATORY_KEYSr7   r8   r   r   r   )	r`   rc   r[   r   rC   r   r   r   r   r   r   r   r   w  s    	zMetadata._validate_mappingc             C   s]   |  j  rC |  j  j d  \ } } | s- | rY t j d | |  n |  j |  j |  j  d  S)NTz#Metadata: missing: %s, warnings: %s)r   r   r:   r   r   r   r[   )r`   r   r   r   r   r   r     s    		zMetadata.validatec             C   s6   |  j  r |  j  j d  St |  j |  j  } | Sd  S)NT)r   r   r   r   
INDEX_KEYS)r`   r   r   r   r   r     s    	zMetadata.todictc       
      C   s!  |  j  r |  j s t  d |  j d |  j i } |  j  j d  } xC d D]; } | | k rJ | d	 k rq d
 } n | } | | | | <qJ W| j d g   } | d g k r g  } | | d <d } xA | D]9 \ } } | | k r | | r d | | i g | | <q W|  j | d <i  } i  }	 | S)Nrx   r   TrK   r0   r   r   description
classifierr   r!    r   requires_distr   setup_requires_distr   r   r   )znamezversionzlicensezsummaryzdescriptionz
classifierr  zrun_requiresr  zbuild_requires)r  r  )r   r   AssertionErrorr   r   r   rg   r   )
r`   r   Zlmdr   nkkwr2   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-emailc             C   sL  d d   } |  j  r |  j s% t  t   } |  j  } x |  j j   D] \ } } t | t  s | | k r | | | | <qG | } d } x> | D]6 } y | | } Wq t t	 f k
 r d } PYq Xq W| rG | | | <qG W| |  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 } x | D]{ } | ri | ri | j |  qE d } | r d | } | r | r d | | f } n | } | j d j | | f   qE Wq W| S)Nr   r   r   r  zextra == "%s"z(%s) and %sr   )ri   rg   addr   )entriesr  r  r   r   Zrlistr   r4   r   r   r   process_entries  s"    	

$z,Metadata._to_legacy.<locals>.process_entriesTFzProvides-ExtrazRequires-DistzSetup-Requires-Dist)r   r   r  rT   LEGACY_MAPPINGr7   r   r   rl   
IndexErrorr   r   r   r   r   sorted)r`   r  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 rL |  j } n |  j   } | rt | j | d | q| j | d | n |  j r |  j   } n	 |  j } | r t	 j
 | | d d d d d d nA t j | d	 d
  ) } t	 j
 | | d d d d d d Wd  QRXd  S)Nr   z)Exactly one of path and fileobj is neededr   ensure_asciiTindentrV   	sort_keysr   zutf-8)rW   r   r   r   r$  re   r   r  r   r   dumpr   r   )r`   ra   rb   r   r   Z	legacy_mdr   r   r   r   r   re     s&    
			
zMetadata.writec             C   s   |  j  r |  j  j |  n |  j j d g   } d  } x- | D]% } d | k r> d | k r> | } Pq> W| d  k r d | i } | j d |  n* t | d  t |  B} t |  | d <d  S)Nr   r   r   r   r   )r   r   r   r   insertri   r"  )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)>)rK   r0   r   r   rx   )r`   rK   r0   r   r   r   r     s    zMetadata.__repr__)legacy)r,  )r,  )r,  )z_legacyz_datazscheme)namezversionlicensezkeywordszsummary)r   N)r   N)
extensionsr  r.  )r/  r  r  r  )r/  r  r  r   r-  )r/  r  r  r   zemail)r/  r  zclassifiers)/r   r   r   r   recompileZMETADATA_VERSION_MATCHERIZNAME_MATCHERr   ZVERSION_MATCHERZSUMMARY_MATCHERr   r   r   r  r	  r  r   	__slots__rd   ri   r   r   Z	none_listdictZ	none_dictr   r   r   r   propertyr   r   setterr   r  r  r   r   r   r  r   r$  re   r   r   r   r   r   r   r   Y  s   
	,+
'*	2)Gr   
__future__r   r   r  r   r   r   r0  r  r   r   compatr   r   r	   r3   r
   utilr   r   r0   r   r   	getLoggerr   r:   r   r   r   r   __all__r   r   r1  rz   ry   r+   r,   r=   r-   r>   r/   r@   r.   r?   ri   rp   r^   ZEXTRA_REr1   rE   rq   r7   r   r   r   r   rr   r   rs   r   r   r   rQ   rS   rT   ZMETADATA_FILENAMEZWHEEL_METADATA_FILENAMEZLEGACY_METADATA_FILENAMEr   r   r   r   r   <module>	   s   																			I	
									 i