
^V.                 @   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 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,   Z- e- j. e%  e- j. e&  e- j. e(  e- j. e*  e j" d8  Z/ d9 d:   Z0 d; d<   Z1 i d d= 6d d> 6d d? 6d d@ 6d% dA 6d dB 6d dC 6d  dD 6d! dE 6d" dF 6d# dG 6d+ dH 6d, dI 6d$ dJ 6d& dK 6d' dL 6d- dM 6d/ dN 6d0 dO 6d5 dP 6d1 dQ 6d2 dR 6d* dS 6d) dT 6d( dU 6d. dV 6d3 dW 6d4 dX 6d6 dY 6d7 dZ 6Z2 d0 d- d/ f Z3 d1 f Z4 d f Z5 d d& d( d* d) d- d/ d0 d2 d. d% d5 d7 d6 f Z6 d. f Z7 d  f Z8 d" d+ d d f Z9 e:   Z; e j" d[  Z< d\ d] d^  Z= Gd_ d`   d` e:  Z> da Z? db Z@ Gdc d   d e:  ZA d S)dz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-build-9m6vxulb/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Requires
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"extra\s*==\s*("([^"]+)"|'([^']+)')c             C   sP   |  d k r t  S|  d k r  t S|  d k r0 t S|  d k r@ t St |    d  S)Nz1.0z1.1z1.2z2.0)_241_FIELDS_314_FIELDS_345_FIELDS_426_FIELDSr   )versionr   r   r   _version2fieldlistg   s    r/   c       	      C   s  d d   } g  } xB |  j    D]4 \ } } | g  d d f k rF q n  | j |  q Wd d d d g } x | D] } | t k r d | k r | j d  n  | t k r d | k r | j d  n  | t k r d | k r | j d  n  | t k rp d | k rp | j d  qp qp Wt |  d	 k r4| d
 St |  d
 k rUt d   n  d | k om| | t	  } d | k o| | t
  } d | k o| | t  } t |  t |  t |  d	 k rt d   n  | r| r| rt | k rt Sn  | 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_markeru   s    z"_best_version.<locals>._has_markerUNKNOWNNz1.0z1.1z1.2z2.0r   r   zUnknown metadata setz(You used incompatible 1.1/1.2/2.0 fields)itemsappendr*   remover+   r,   r-   lenr   _314_MARKERS_345_MARKERS_426_MARKERSintr   )	fieldsr3   r0   keyvalueZpossible_versionsZis_1_1Zis_1_2Zis_2_0r   r   r   _best_versions   sB    &r@   metadata_versionnamer.   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_extraz[^A-Za-z0-9.]+Fc             C   sG   | r9 t  j d |   }  t  j d | j d d   } n  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)rB   r.   Zfor_filenamer   r   r   _get_name_and_version   s    !r`   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)?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   s   | | | g j  d   d k  r- t d   n  i  |  _ g  |  _ d  |  _ | |  _ | d  k	 rm |  j |  nB | d  k	 r |  j |  n& | d  k	 r |  j |  |  j	   n  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mappingrh   r   r   r   __init__   s    				zLegacyMetadata.__init__c             C   s   t  |  j  |  j d <d  S)NzMetadata-Version)r@   rf   )rm   r   r   r   rl     s    z#LegacyMetadata.set_metadata_versionc             C   s   | j  d | | f  d  S)Nz%s: %s
)write)rm   ro   rB   r?   r   r   r   _write_field  s    zLegacyMetadata._write_fieldc             C   s   |  j  |  S)N)get)rm   rB   r   r   r   __getitem__  s    zLegacyMetadata.__getitem__c             C   s   |  j  | |  S)N)set)rm   rB   r?   r   r   r   __setitem__  s    zLegacyMetadata.__setitem__c             C   sB   |  j  |  } y |  j | =Wn t k
 r= t |   Yn Xd  S)N)_convert_namerf   KeyError)rm   rB   
field_namer   r   r   __delitem__  s
    zLegacyMetadata.__delitem__c             C   s%   | |  j  k p$ |  j |  |  j  k S)N)rf   rx   )rm   rB   r   r   r   __contains__  s    zLegacyMetadata.__contains__c             C   s8   | t  k r | S| j d d  j   } t j | |  S)NrZ   _)_ALL_FIELDSr_   lower_ATTR2FIELDrt   )rm   rB   r   r   r   rx     s    zLegacyMetadata._convert_namec             C   s    | t  k s | t k r g  Sd S)Nr4   )_LISTFIELDS_ELEMENTSFIELD)rm   rB   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
)r   r   )rA   _LINE_PREFIX_PRE_1_2r^   _LINE_PREFIX_1_2)rm   r?   r   r   r   _remove_line_prefix*  s    z"LegacyMetadata._remove_line_prefixc             C   s$   | t  k r |  | St |   d  S)N)r   AttributeError)rm   rB   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   )r`   )rm   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)rx   r~   )rm   rB   r   r   r   is_fieldA  s    zLegacyMetadata.is_fieldc             C   s   |  j  |  } | t k S)N)rx   r   )rm   rB   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openrj   close)rm   filepathfpr   r   r   ri   J  s    zLegacyMetadata.readc             C   s   t  |  } | d |  j d <x t D] } | | k r< q$ n  | t k r | j |  } | t k r | d k	 r d d   | D } n  |  j | |  q$ | | } | d k	 r$ | d k r$ |  j | |  q$ q$ W|  j   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).0r?   r   r   r   
<listcomp>_  s   	 z,LegacyMetadata.read_file.<locals>.<listcomp>r4   )r   rf   r~   r   get_all_LISTTUPLEFIELDSrv   rl   )rm   Zfileobmsgfieldvaluesr?   r   r   r   rj   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   )rm   r   skip_unknownr   r   r   r   rr   h  s    zLegacyMetadata.writec             C   s-  |  j    xt |  d  D]
} |  j |  } | rT | d g  d g f k rT q n  | t k r |  j | | d j |   q n  | t k r | d k r |  j d k r | j d d  } q | j d d	  } n  | g } n  | t	 k rd
 d   | D } n  x! | D] } |  j | | |  qWq Wd S)z0Write the PKG-INFO format data to a file object.zMetadata-Versionr4   r   r    1.01.1r   z	
        z	
       |c             S   s   g  |  ] } d  j  |   q S)r   )join)r   r?   r   r   r   r     s   	 z-LegacyMetadata.write_file.<locals>.<listcomp>N)r   r   )
rl   r/   rt   r   rs   r   r   rA   r_   r   )rm   
fileobjectr   r   r   r?   r   r   r   r   p  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 Wn  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                s2   |  t  k r. | r.   j   j |   |  n  d  S)N)r   rv   rx   )r>   r?   )rm   r   r   _set  s    z#LegacyMetadata.update.<locals>._setr0   N)hasattrr0   r5   )rm   otherkwargsr   kvr   )rm   r   rk     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  } nF | t k r t | t t f  r t | t  r | g } q g  } n  t j	 t
 j  r|  d } t |  j  } | t k rF| d k	 rFx | D]; } | j | j d  d  st j d	 | | |  qqWq| t k r| d k	 r| j |  st j d
 | | |  qq| t k r| d k	 r| j |  st j d
 | | |  qqn  | t k r| d k r|  j |  } qn  | |  j | <d S)z"Control then set a metadata field.r   c             S   s   g  |  ] } | j     q Sr   )strip)r   r   r   r   r   r     s   	 z&LegacyMetadata.set.<locals>.<listcomp>r   r   N;r   z%r: %r is not valid (field %r)z(%r: %r is not a valid version (field %r)r    )rx   r   
isinstancelistr   r   r   r   loggerisEnabledForloggingWARNINGr   rh   _PREDICATE_FIELDSis_valid_matcherwarning_VERSIONS_FIELDSis_valid_constraint_list_VERSION_FIELDSis_valid_version_UNICODEFIELDSr   rf   )rm   rB   r?   project_namerh   r   r   r   r   rv     s@    		
		zLegacyMetadata.setc             C   s  |  j  |  } | |  j k r@ | t k r< |  j |  } n  | S| t k r] |  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  Sn  |  j | S)zGet a metadata field.Nr   r   r   )rx   rf   _MISSINGr   r   r   r   r6   r   r   r   r   )rm   rB   rb   r?   resvalr   r   r   rt     s.    zLegacyMetadata.getc                sx  |  j    g  g  } } x* d D]" } | |  k r | j |  q q W| rx | g  k rx d d j |  } t |   n  x* d D]" } | |  k r | j |  q q W|  d d k r | | f St |  j      f d	 d
   } x t | f t   j f t	   j
 f f D]b \ } } xS | D]K }	 |  j |	 d  }
 |
 d k	 r| |
  r| j d |	 |
 f  q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   )r?   r   )rh   r   r   are_valid_constraints  s    z3LegacyMetadata.check.<locals>.are_valid_constraintsNzWrong value for %r: %s)zNamezVersion)r   r"   )rl   r6   r   r   r   rh   r   r   r   r   r   rt   )rm   strictmissingwarningsattrr   r   r=   
controllerr   r?   r   )rh   r   check  s2    

	"zLegacyMetadata.checkc             C   s0  |  j    dB } i  } x; | D]3 \ } } | s? | |  j k r |  | | | <q q W|  d d k r dK } x | D]] \ } } | s | |  j k rq | d& k r |  | | | <q d, d-   |  | D | | <qq qq WnW |  d d. k r,dO } x> | D]3 \ } } | s| |  j k r |  | | | <q q Wn  | S)PzReturn 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).
        rA   Metadata-VersionrB   r   r.   r   rD   r   rG   	Home-pagerH   r"   rI   Author-emailrL   r#   rE   r    rF   r!   rC   r   classifiersr$   rN   Download-URLz1.2rQ   Requires-DistrS   Requires-PythonrT   Requires-ExternalrP   Provides-DistrO   Obsoletes-DistrX   Project-URLrJ   r(   rK   Maintainer-emailc             S   s   g  |  ] } d  j  |   q S)r   )r   )r   ur   r   r   r   G  s   	 z)LegacyMetadata.todict.<locals>.<listcomp>z1.1rV   r&   rU   r'   rW   r%   zmetadata_versionr   znamezNamezversionzVersionzsummaryr   rG   r   zauthorzAuthorzauthor_emailr   zlicenser#   zdescriptionzDescriptionzkeywordsr!   zplatformzPlatformzclassifiersz
Classifierzdownload_urlr   )r   r   r   r   r   r   r   r   r   r   r   r   r   zrequires_distr   rS   r   rT   r   rP   r   rO   r   rX   r   z
maintainerr(   zmaintainer_emailr   )r   r   r   r   r   r   r   r   zprovideszProvideszrequireszRequiresz	obsoletesz	Obsoletes)r   r   r   )rl   rf   )rm   Zskip_missingZmapping_1_0datar>   rz   Zmapping_1_2Zmapping_1_1r   r   r   todict  sP    
                   %  zLegacyMetadata.todictc             C   sL   |  d d k r: x' d D] } | |  k r |  | =q q Wn  |  d | 7<d  S)NzMetadata-Versionz1.1r%   r'   r&   zRequires-Dist)z	ObsoleteszRequireszProvidesr   )rm   requirementsr   r   r   r   add_requirementsU  s
    zLegacyMetadata.add_requirementsc             C   s   t  t |  d   S)NzMetadata-Version)r   r/   )rm   r   r   r   r0   `  s    zLegacyMetadata.keysc             c   s    x |  j    D] } | Vq Wd  S)N)r0   )rm   r>   r   r   r   __iter__c  s    zLegacyMetadata.__iter__c                s     f d d     j    D S)Nc                s   g  |  ] }   |  q Sr   r   )r   r>   )rm   r   r   r   h  s   	 z)LegacyMetadata.values.<locals>.<listcomp>)r0   )rm   r   )rm   r   r   g  s    zLegacyMetadata.valuesc                s     f d d     j    D S)Nc                s    g  |  ] } |   | f  q Sr   r   )r   r>   )rm   r   r   r   k  s   	 z(LegacyMetadata.items.<locals>.<listcomp>)r0   )rm   r   )rm   r   r5   j  s    zLegacyMetadata.itemsc             C   s   d |  j  j |  j |  j f S)Nz
<%s %s %s>)	__class__r   rB   r.   )rm   r   r   r   __repr__m  s    zLegacyMetadata.__repr__)"r   r   r   r   rq   rl   rs   ru   rw   r{   r|   rx   r   r   r   r   r   r   ri   rj   rr   r   rk   rv   r   rt   r   r   r   r0   r   r   r5   r   r   r   r   r   ra      s>   		,,;ra   zpydist.jsonzmetadata.jsonc               @   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 i f  d 6f  d 6dS d
 6Z d Z d Z i e f  f d 6e dT f d 6e
 dU f d 6e dV f d
 6Z dW Z d d d d d d  Z e dX  Z d e f Z d e f Z i d e f d 6d e f d 6e d 6e d 6e d 6d e f d 6e d  6e d! 6e d" 6e d# 6d$ e f d% 6dY d' 6dZ d 6Z [ [ 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) i dC d 6dD d 6dE d 6dF d
 6dG dH 6d$ d% 6Z* dI dJ   Z+ d d dK dL dM dN  Z, dO dP   Z- dQ dR   Z. d S)[r   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)rB   r.   legacyrD   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_environmentsrA   _legacy_datarh   Nrb   c             C   s  | | | g j  d   d k  r- t d   n  d  |  _ d  |  _ | |  _ | d  k	 r y |  j | |  | |  _ Wqt k
 r t d | d |  |  _ |  j   YqXn d  } | r t	 | d   } | j
   } Wd  QXn | r | j
   } n  | d  k ri |  j d 6|  j d 6|  _ n t | t  s@| j d  } n  y) t j |  |  _ |  j |  j |  Wn: t k
 rt d	 t |  d |  |  _ |  j   Yn Xd  S)
Nrc   z'path, fileobj and mapping are exclusiverp   rh   rbrA   	generatorzutf-8ro   )rd   re   r   r   rh   _validate_mappingr   ra   validater   ri   METADATA_VERSION	GENERATORr   r	   decodejsonloads
ValueErrorr   )rm   rn   ro   rp   rh   r   fr   r   r   rq     s>    			
zMetadata.__init__rL   rF   zRequires-Distrun_requireszSetup-Requires-Distbuild_requiresdev_requiresZtest_requiresmeta_requireszProvides-Extraextrasmodules
namespacesexportscommandsr$   r   Download-URLZ
source_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  }	 |	 ru| d k r|	 j d	 |  } qu| d k rH|	 j d
  }	 |	 rr|	 j | |  } qrqu|	 j d  }	 |	 ru|	 j | |  } qun  | | k r| } q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   rt   r   )
rm   r>   commonmappedlkmakerresultr?   sentineldr   r   r   r    sB    				zMetadata.__getattribute__c             C   so   | |  j  k rk |  j  | \ } } | p. |  j | k rk | j |  } | sh t d | | f   qh qk n  d  S)Nz*%r is an invalid value for the %r property)SYNTAX_VALIDATORSrh   matchr   )rm   r>   r?   rh   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 rn t  n  | |  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 r4t j |  | |  nn | d k r|t | t	  r|| j
   } | rp| j   } qyg  } q|n  |  j r| |  j | <n | |  j | <d  S)Nr  r  r  r
  r  r	  r   r  zpython.commandszpython.detailszpython.exportsrF   )zcommandszexportszmodulesz
namespaceszclassifiers)r  r  r  r   NotImplementedErrorr   
setdefault__setattr__r   r   r   r   )rm   r>   r?   r  r  r  r}   r  r   r   r   r"    s>    				zMetadata.__setattr__c             C   s   t  |  j |  j d  S)NT)r`   rB   r.   )rm   r   r   r   name_and_version>  s    zMetadata.name_and_versionc             C   sd   |  j  r |  j  d } n |  j j d g   } d |  j |  j f } | | k r` | j |  n  | S)NzProvides-DistrV   z%s (%s))r   r   r!  rB   r.   r6   )rm   r  sr   r   r   rV   B  s    	zMetadata.providesc             C   s*   |  j  r | |  j  d <n | |  j d <d  S)NzProvides-DistrV   )r   r   )rm   r?   r   r   r   rV   M  s    	c       
      C   sL  |  j  r | } n6g  } t | p$ g  |  j  } x | D] } d | k r^ d | k r^ d } nZ d | k rs d } n | j d  | k } | r | j d  } | r t | |  } q n  | r7 | j | d  q7 q7 Wxo d D]g } d | }	 |	 | k r | j |	  |  j j d	 | g   } | j |  j | d
 | d |  q 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environmentTrU   builddevtestz:%s:z%s_requiresr  env)zbuildzdevztest)	r   r   r  rt   r
   extendr7   r   get_requirements)
rm   reqtsr  r*  r  r  includer2   r>   er   r   r   r,  T  s0    					
zMetadata.get_requirementsc             C   s   |  j  r |  j   S|  j S)N)r   _from_legacyr   )rm   r   r   r   
dictionary~  s    	
zMetadata.dictionaryc             C   s)   |  j  r t  n t |  j |  j  Sd  S)N)r   r   r   r   DEPENDENCY_KEYS)rm   r   r   r   dependencies  s    		zMetadata.dependenciesc             C   s&   |  j  r t  n |  j j |  d  S)N)r   r   r   rk   )rm   r?   r   r   r   r3    s    		c       	      C   s   | j  d  |  j k r$ t    n  g  } xH |  j j   D]7 \ } } | | k r: | | k rq | j |  qq q: q: W| r d d j |  } t |   n  x- | j   D] \ } } |  j | | |  q Wd  S)NrA   zMissing metadata items: %sz, )	rt   r   r   MANDATORY_KEYSr5   r6   r   r   r  )	rm   rp   rh   r   r>   r  r   r   r   r   r   r   r     s    zMetadata._validate_mappingc             C   s`   |  j  rF |  j  j d  \ } } | s- | r\ t j d | |  q\ n |  j |  j |  j  d  S)NTz#Metadata: missing: %s, warnings: %s)r   r   r   r   r   r   rh   )rm   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)rm   r  r   r   r   r     s    	zMetadata.todictc       
      C   s-  |  j  r |  j s t  i |  j d 6|  j d 6} |  j  j d  } xF d D]> } | | k rL | d	 k rs d
 } n | } | | | | <qL qL W| j d g   } | d g k r g  } n  | | d <d } xE | D]= \ } } | | k r | | r i | | d 6g | | <q q W|  j | d <i  } i  }	 | S)NrA   r   TrB   r.   rL   rD   rE   rM   r   r!    rF   rQ   r  rR   r  rU   rV   )znamezversionzlicensezsummaryzdescriptionz
classifierzrequires_distzrun_requiresrR   zbuild_requires)r7  r8  )r   r   AssertionErrorr   r   r   rt   rV   )
rm   r  Zlmdr   nkkwr0   okrH   rJ   r   r   r   r0    s2    

		
 zMetadata._from_legacyr   r   r#   r   r    rE   c             C   s   d d   } |  j  r |  j s% t  t   } |  j  } x: |  j j   D]) \ } } | | k rG | | | | <qG qG W| |  j |  j  } | |  j |  j	  } |  j
 r t |  j
  | d <n  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 | } n  | r | r d | | f } q | } n  | j d j | | f   qE Wq W| S)Nr%  r&  rU   r6  zextra == "%s"z(%s) and %sr   )rv   rt   addr   )entriesr-  r/  r%  r*  Zrlistr   r2   r   r   r   process_entries  s"    	
	$z,Metadata._to_legacy.<locals>.process_entrieszProvides-ExtrazRequires-DistzSetup-Requires-Dist)r   r   r9  ra   LEGACY_MAPPINGr5   r  r  r  r  r  sorted)rm   r?  r  Znmdr:  r<  Zr1Zr2r   r   r   
_to_legacy  s    			zMetadata._to_legacyFTc             C   s  | | g j  d   d k r* t d   n  |  j   | r |  j rO |  j } n |  j   } | rw | j | d | q| j | d | n |  j r |  j   } n	 |  j } | r t	 j
 | | d d d d d d n@ t j | d	 d
  ) } t	 j
 | | d d d d d d Wd  QXd  S)Nr   z)Exactly one of path and fileobj is neededr   ensure_asciiTindentrc   	sort_keysr   zutf-8)rd   r  r   r   rB  rr   r   r0  r   r   dumpr   r   )rm   rn   ro   r   r   Z	legacy_mdr  r  r   r   r   rr     s&    
			
zMetadata.writec             C   s   |  j  r |  j  j |  n |  j j d g   } d  } x0 | D]( } d | k r> d | k r> | } Pq> q> W| d  k r i | d 6} | j d |  n* t | d  t |  B} t |  | d <d  S)Nr  r&  r%  rU   r   )r   r   r   r!  insertrv   rA  )rm   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)>)rB   r.   r   r   rA   )rm   rB   r.   r   r   r   r   &  s    zMetadata.__repr__)legacy)rJ  )rJ  )rJ  )z_legacyz_datazscheme)znamezversionzlicensezkeywordszsummary)r  N)r  N)/r   r   r   r   recompileZMETADATA_VERSION_MATCHERIZNAME_MATCHERr   ZVERSION_MATCHERZSUMMARY_MATCHERr   r   r   r4  r5  r2  r  	__slots__rq   rv   r  r   Z	none_listdictZ	none_dictr  r  r  r"  propertyr#  rV   setterr,  r1  r3  r   r   r   r0  r@  rB  rr   r   r   r   r   r   r   r   v  s   

	,
)
'*	
%)Br   
__future__r   r   emailr   r   r   rK  r6  r   r   compatr   r   r	   r1   r
   utilr   r   r.   r   r   	getLoggerr   r   r   r   r   r   __all__r   r   rL  r   r   r*   r+   r9   r,   r:   r-   r;   rv   r~   rk   ZEXTRA_REr/   r@   r   r   r   r   r   r   r   r   r  r   r]   r`   ra   ZMETADATA_FILENAMEZWHEEL_METADATA_FILENAMEr   r   r   r   r   <module>	   s   																		8
									 