
R\                 @   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# 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. d/ d0 d1 f Z' d. d/ d0 d, d1 d* d+ d- f Z( d 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 f Z) d2 d6 d3 d4 d5 f Z* e+   Z, e, j- e$  e, j- e%  e, j- e'  e, j- e)  e j" d7  Z. d8 d9   Z/ d: d;   Z0 i d d< 6d 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 6d4 dO 6d0 dP 6d1 dQ 6d) dR 6d( dS 6d' dT 6d- dU 6d2 dV 6d3 dW 6d5 dX 6d6 dY 6Z1 d/ d, d. f Z2 d0 f Z3 d f Z4 d d% d' d) d( d, d. d/ d1 d- d$ d4 d6 d5 f Z5 d- f Z6 d f Z7 d! d* d d f Z8 e9   Z: e j" dZ  Z; d[ d\ d]  Z< Gd^ d_   d_ e9  Z= d` Z> Gda d   d e9  Z? d S)bz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PEP426_VERSION_REc               @   s   e  Z d  Z d Z d S)MetadataMissingErrorzA required metadata is missingN)__name__
__module____qualname____doc__ r   r   ?/var/www/dbchiro/venv/build/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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   _version2fieldlistf   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_markert   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_versionr   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_filesZ_dependenciesschemeread	read_fileupdateset_metadata_version)selfpathfileobjmappingrg   r   r   r   __init__   s    				zLegacyMetadata.__init__c             C   s   t  |  j  |  j d <d  S)NzMetadata-Version)r@   rf   )rl   r   r   r   rk     s    z#LegacyMetadata.set_metadata_versionc             C   s   | j  d | | f  d  S)Nz%s: %s
)write)rl   rn   rB   r?   r   r   r   _write_field
  s    zLegacyMetadata._write_fieldc             C   s   |  j  |  S)N)get)rl   rB   r   r   r   __getitem__  s    zLegacyMetadata.__getitem__c             C   s   |  j  | |  S)N)set)rl   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)rl   rB   
field_namer   r   r   __delitem__  s
    zLegacyMetadata.__delitem__c             C   s%   | |  j  k p$ |  j |  |  j  k S)N)rf   rw   )rl   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_ATTR2FIELDrs   )rl   rB   r   r   r   rw     s    zLegacyMetadata._convert_namec             C   s    | t  k s | t k r g  Sd S)Nr4   )_LISTFIELDS_ELEMENTSFIELD)rl   rB   r   r   r   _default_value$  s    zLegacyMetadata._default_valuec             C   s   t  j d |  S)N
)_LINE_PREFIXr^   )rl   r?   r   r   r   _remove_line_prefix)  s    z"LegacyMetadata._remove_line_prefixc             C   s$   | t  k r |  | St |   d  S)N)r   AttributeError)rl   rB   r   r   r   __getattr__,  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`   )rl   Zfilesafer   r   r   get_fullname7  s    zLegacyMetadata.get_fullnamec             C   s   |  j  |  } | t k S)z+return True if name is a valid metadata key)rw   r}   )rl   rB   r   r   r   is_field=  s    zLegacyMetadata.is_fieldc             C   s   |  j  |  } | t k S)N)rw   r   )rl   rB   r   r   r   is_multi_fieldB  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openri   close)rl   filepathfpr   r   r   rh   F  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_LISTTUPLEFIELDSru   rk   )rl   Zfileobmsgfieldvaluesr?   r   r   r   ri   N  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   )rl   r   skip_unknownr   r   r   r   rq   d  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 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    r   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)	rk   r/   rs   r   rr   r   r   r_   r   )rl   
fileobjectr   r   r   r?   r   r   r   r   l  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   ru   rw   )r>   r?   )rl   r   r   _set  s    z#LegacyMetadata.update.<locals>._setr0   N)hasattrr0   r5   )rl   otherkwargsr   kvr   )rl   r   rj     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    )rw   r   
isinstancelistr   r   r   r   loggerisEnabledForloggingWARNINGr   rg   _PREDICATE_FIELDSis_valid_matcherwarning_VERSIONS_FIELDSis_valid_constraint_list_VERSION_FIELDSis_valid_version_UNICODEFIELDSr   rf   )rl   rB   r?   project_namerg   r   r   r   r   ru     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   )rw   rf   _MISSINGr   r   r   r   r6   r   r   r   r   )rl   rB   rb   r?   resvalr   r   r   rs     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   )rg   r   r   are_valid_constraints  s    z3LegacyMetadata.check.<locals>.are_valid_constraintsNzWrong value for %r: %s)zNamezVersion)r   r"   )rk   r6   r   r   r   rg   r   r   r   r   r   rs   )rl   strictmissingwarningsattrr   r   r=   Z
controllerr   r?   r   )rg   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   rM   r$   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   @  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
classifierz
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   )rk   rf   )rl   Zskip_missingZmapping_1_0datar>   ry   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   )rl   requirementsr   r   r   r   add_requirementsN  s
    zLegacyMetadata.add_requirementsc             C   s   t  t |  d   S)NzMetadata-Version)r   r/   )rl   r   r   r   r0   Y  s    zLegacyMetadata.keysc             c   s    x |  j    D] } | Vq Wd  S)N)r0   )rl   r>   r   r   r   __iter__\  s    zLegacyMetadata.__iter__c                s     f d d     j    D S)Nc                s   g  |  ] }   |  q Sr   r   )r   r>   )rl   r   r   r   a  s   	 z)LegacyMetadata.values.<locals>.<listcomp>)r0   )rl   r   )rl   r   r   `  s    zLegacyMetadata.valuesc                s     f d d     j    D S)Nc                s    g  |  ] } |   | f  q Sr   r   )r   r>   )rl   r   r   r   d  s   	 z(LegacyMetadata.items.<locals>.<listcomp>)r0   )rl   r   )rl   r   r5   c  s    zLegacyMetadata.itemsc             C   s   d |  j  j |  j |  j f S)Nz
<%s %s %s>)	__class__r   rB   r.   )rl   r   r   r   __repr__f  s    zLegacyMetadata.__repr__)"r   r   r   r   rp   rk   rr   rt   rv   rz   r{   rw   r   r   r   r   r   r   rh   ri   rq   r   rj   ru   r   rs   r   r   r   r0   r   r   r5   r   r   r   r   r   ra      s>   		,,;ra   zpydist.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_datarg   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 exclusivero   rg   rbrA   	generatorzutf-8rn   )rd   re   r   r   rg   _validate_mappingr   ra   validater   rh   METADATA_VERSION	GENERATORr   r	   decodejsonloads
ValueErrorr   )rl   rm   rn   ro   rg   r   fr   r   r   rp     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$   classifiers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 |   } |  j j | |  } nQ | | k r t  j |  |  } n0 |  j r |  j j |  } n |  j j |  } | S)Ncommon_keysmapped_keys)object__getattribute__r   rs   r   )rl   r>   commonmappedlkmakerresultr?   r   r   r   r
    s     		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_VALIDATORSrg   matchr   )rl   r>   r?   rg   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| |  j | <n | | k r t j |  | |  nn | d k r t | t  r | j	   } | r | j
   } q g  } q n  |  j r| |  j | <n | |  j | <d  S)Nr  r  rF   )r  r	  r
  r   NotImplementedErrorr   __setattr__r   r   r   r   )rl   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.   )rl   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   
setdefaultrB   r.   r6   )rl   r  sr   r   r   rV     s    	zMetadata.providesc             C   s*   |  j  r | |  j  d <n | |  j d <d  S)NzProvides-DistrV   )r   r   )rl   r?   r   r   r   rV   %  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   rs   r
   extendr7   r   get_requirements)
rl   reqtsr   r   r  dincluder2   r>   er   r   r   r"  ,  s0    					
zMetadata.get_requirementsc             C   s   |  j  r |  j   S|  j S)N)r   _from_legacyr   )rl   r   r   r   
dictionaryV  s    	
zMetadata.dictionaryc             C   s)   |  j  r t  n t |  j |  j  Sd  S)N)r   r  r   r   DEPENDENCY_KEYS)rl   r   r   r   dependencies\  s    		zMetadata.dependenciesc             C   s&   |  j  r t  n |  j j |  d  S)N)r   r  r   rj   )rl   r?   r   r   r   r*  c  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, )	rs   r   r   MANDATORY_KEYSr5   r6   r   r   r  )	rl   ro   rg   r   r>   r  r   r   r   r   r   r   r   j  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   rg   )rl   r   r   r   r   r   r   x  s    		zMetadata.validatec             C   s6   |  j  r |  j  j d  St |  j |  j  } | Sd  S)NT)r   r   r   r   
INDEX_KEYS)rl   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)r.  r/  )r   r   AssertionErrorr   r   r   rs   rV   )
rl   r  Zlmdr   nkkwr0   okrH   rJ   r   r   r   r'    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   r-  zextra == "%s"z(%s) and %sr   )ru   rs   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   r0  ra   LEGACY_MAPPINGr5   r   r   r   r   r   sorted)rl   r6  r  Znmdr1  r3  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   r9  rq   r   r'  r   r   dumpr   r   )rl   rm   rn   r   r   Z	legacy_mdr$  r   r   r   r   rq     s&    
			
zMetadata.writec             C   s<   |  j  r |  j  j |  n |  j j d g   j |  d  S)Nr   )r   r   r   r  r!  )rl   r   r   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   )rl   rB   r.   r   r   r   r     s    zMetadata.__repr__)legacy)r>  )r>  )r>  )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   r+  r,  r)  r  	__slots__rp   ru   r  r   Z	none_listdictZ	none_dictr  r
  r  r  propertyr  rV   setterr"  r(  r*  r   r   r   r'  r7  r9  rq   r   r   r   r   r   r   r   n  s   

	,

*	
%)@r   
__future__r   r   emailr   r   r   r?  r-  r   r   compatr   r   r	   r1   r
   utilr   r   r.   r   r   	getLoggerr   r   r   r   r   r   __all__r   r   r@  r   r*   r+   r9   r,   r:   r-   r;   ru   r}   rj   ZEXTRA_REr/   r@   r   r   r   r   r   r   r   r   r	  r   r]   r`   ra   ZMETADATA_FILENAMEr   r   r   r   r   <module>	   s   																		8
									 