3
[2                 @   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$dHZ%dIZ&dJZ'dKZ(dLZ)dMZ*dNZ+e*dO Z,dPZ-e. Z/e/j0e% e/j0e& e/j0e( e/j0e* e/j0e, ej"d9Z1d:d; Z2d<d= Z3ddddd%ddd d!d"d#d+d,d$d&d'd-d/d0d5d1d2d*d)d(d.d3d4d6d7d>Z4dQZ5dRZ6dSZ7dTZ8dUZ9dVZ:dWZ;e< Z=ej"d?Z>dXdAdBZ?G dCdD dDe<Z@dEZAdFZBG dGd de<ZCdS )YzImplementation of the Metadata for Python packages PEPs.

Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental).
    )unicode_literalsN)message_from_file   )DistlibException__version__)StringIOstring_types	text_type)	interpret)extract_by_key
get_extras)
get_schemePEP440_VERSION_REc               @   s   e Zd ZdZdS )MetadataMissingErrorzA required metadata is missingN)__name__
__module____qualname____doc__ r   r   =/tmp/pip-install-65viz3iy/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   sL   | dkrt S | dkrtS | dkr$tS | dkr4tt S | dkr@tS t| d S )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   _version2fieldlistl   s    rC   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rd|kr|jd tjd| |tkrd|kr|jd tjd| |tkrd|kr|jd tjd| |tkod
|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rt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appendr=   removeloggerdebugr>   r?   r@   rA   lenr   _314_MARKERS_345_MARKERS_566_MARKERS_426_MARKERSintr   )
fieldsrG   rD   keyvalueZpossible_versionsZis_1_1Zis_1_2Zis_2_1Zis_2_0r   r   r   _best_versionz   s`    






& 
rW   )metadata_versionnamerB   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   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.- .z%s-%s)	_FILESAFEsubreplace)rY   rB   Zfor_filenamer   r   r   _get_name_and_version   s    rw   c               @   s
  e Zd ZdZd?ddZdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zd@ddZdd Zdd  Zd!d" Zd#d$ ZdAd%d&ZdBd'd(ZdCd)d*Zd+d, Zefd-d.ZdDd/d0ZdEd1d2Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!dS )FLegacyMetadataaa  The legacy metadata of a release.

    Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can
    instantiate the class with one of these arguments (or none):
    - *path*, the path to a metadata file
    - *fileobj* give a file-like object with metadata as content
    - *mapping* is a dict-like object
    - *scheme* is a version scheme name
    Ndefaultc             C   sz   |||g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_filesZ_dependenciesschemeread	read_fileupdateset_metadata_version)selfpathfileobjmappingr~   r   r   r   __init__  s    
zLegacyMetadata.__init__c             C   s   t | j| jd< d S )NzMetadata-Version)rW   r}   )r   r   r   r   r     s    z#LegacyMetadata.set_metadata_versionc             C   s   |j d||f  d S )Nz%s: %s
)write)r   r   rY   rV   r   r   r   _write_field!  s    zLegacyMetadata._write_fieldc             C   s
   | j |S )N)get)r   rY   r   r   r   __getitem__$  s    zLegacyMetadata.__getitem__c             C   s   | j ||S )N)set)r   rY   rV   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_namer}   KeyError)r   rY   
field_namer   r   r   __delitem__*  s
    
zLegacyMetadata.__delitem__c             C   s   || j kp| j|| j kS )N)r}   r   )r   rY   r   r   r   __contains__1  s    
zLegacyMetadata.__contains__c             C   s(   |t kr|S |jddj }tj||S )Nrq   _)_ALL_FIELDSrv   lower_ATTR2FIELDr   )r   rY   r   r   r   r   5  s    zLegacyMetadata._convert_namec             C   s   |t ks|tkrg S dS )NrH   )_LISTFIELDS_ELEMENTSFIELD)r   rY   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   )rX   _LINE_PREFIX_PRE_1_2ru   _LINE_PREFIX_1_2)r   rV   r   r   r   _remove_line_prefix@  s    
z"LegacyMetadata._remove_line_prefixc             C   s   |t kr| | S t|d S )N)r   AttributeError)r   rY   r   r   r   __getattr__F  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   )rw   )r   Zfilesafer   r   r   get_fullnameQ  s    zLegacyMetadata.get_fullnamec             C   s   | j |}|tkS )z+return True if name is a valid metadata key)r   r   )r   rY   r   r   r   is_fieldW  s    
zLegacyMetadata.is_fieldc             C   s   | j |}|tkS )N)r   r   )r   rY   r   r   r   is_multi_field\  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openr   close)r   filepathfpr   r   r   r   `  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 tjd|  | 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).0rV   r   r   r   
<listcomp>u  s    z,LegacyMetadata.read_file.<locals>.<listcomp>rH   z!Attempting to set metadata for %s)
r   r}   r   r   get_all_LISTTUPLEFIELDSr   rL   rM   r   )r   ZfileobmsgfieldvaluesrV   r   r   r   r   h  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   )r   r   skip_unknownr   r   r   r   r     s    zLegacyMetadata.writec             C   s   | j   xt| 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rd
d |D }x|D ]}| j||| qW qW dS )z0Write the PKG-INFO format data to a file object.zMetadata-VersionrH   r   r!   1.01.1r   z	
        z	
       |c             S   s   g | ]}d j |qS )r   )join)r   rV   r   r   r   r     s    z-LegacyMetadata.write_file.<locals>.<listcomp>N)r   r   )
r   rC   r   r   r   r   r   rX   rv   r   )r   
fileobjectr   r   r   rV   r   r   r   r     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   )rU   rV   )r   r   r   _set  s    z#LegacyMetadata.update.<locals>._setrD   N)hasattrrD   rI   )r   otherkwargsr   kvr   )r   r   r     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	rx|D ](}|j|jdd stjd	||| qW 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listr   r   r   r   rL   isEnabledForloggingWARNINGr   r~   _PREDICATE_FIELDSis_valid_matcherwarning_VERSIONS_FIELDSis_valid_constraint_list_VERSION_FIELDSis_valid_version_UNICODEFIELDSr   r}   )r   rY   rV   project_namer~   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   r}   _MISSINGr   r   r   r   rJ   r   r   r   r   )r   rY   ry   rV   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  qW qW ||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   )rV   r   )r~   r   r   are_valid_constraints  s    
z3LegacyMetadata.check.<locals>.are_valid_constraintsNzWrong value for '%s': %s)r   r   )r   r$   )r   rJ   r   r   r   r~   r   r   r   r   r   r   )r   strictmissingwarningsattrr   r   rT   
controllerr   rV   r   )r~   r   check  s2    




zLegacyMetadata.checkc             C   s   | j   dB}i }x,|D ]$\}}| s.|| jkr| | ||< qW | d dk rdK}x|D ]F\}}| sn|| jkrV|d&k r| | ||< qVd,d- | | D ||< qVW nF| d d.k rdO}x2|D ]*\}}|  s|| jk r| | ||<  qW |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).
        rX   Metadata-VersionrY   r   rB   r   r[   r    r^   	Home-pager_   r$   r`   Author-emailrc   r&   r\   r!   r]   r"   rZ   r   classifiersr(   re   Download-URLz1.2rh   Requires-Distrj   Requires-Pythonrk   Requires-Externalrg   Provides-Distrf   Obsoletes-Distro   Project-URLra   r-   rb   Maintainer-emailc             S   s   g | ]}d j |qS )r   )r   )r   ur   r   r   r   ^  s    z)LegacyMetadata.todict.<locals>.<listcomp>z1.1rm   r+   rl   r,   rn   r*   rX   r   rY   r   rB   r   r[   r    r^   r   r_   r$   r`   r   rc   r&   r\   r!   r]   r"   rZ   r   r   r(   re   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   rh   r   rj   r   rk   r   rg   r   rf   r   ro   r   ra   r-   rb   r   )r   r   r   r   r   r   r   r   rm   r+   rl   r,   rn   r*   )r   r  r  )r   r}   )r   Zskip_missingZmapping_1_0datarU   r   Zmapping_1_2Zmapping_1_1r   r   r   todict1  sP                       
  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   )r   requirementsr   r   r   r   add_requirementsl  s
    

zLegacyMetadata.add_requirementsc             C   s   t t| d S )NzMetadata-Version)r   rC   )r   r   r   r   rD   w  s    zLegacyMetadata.keysc             c   s   x| j  D ]
}|V  q
W d S )N)rD   )r   rU   r   r   r   __iter__z  s    zLegacyMetadata.__iter__c                s    fdd j  D S )Nc                s   g | ]} | qS r   r   )r   rU   )r   r   r   r     s    z)LegacyMetadata.values.<locals>.<listcomp>)rD   )r   r   )r   r   r   ~  s    zLegacyMetadata.valuesc                s    fdd j  D S )Nc                s   g | ]}| | fqS r   r   )r   rU   )r   r   r   r     s    z(LegacyMetadata.items.<locals>.<listcomp>)rD   )r   r   )r   r   rI     s    zLegacyMetadata.itemsc             C   s   d| j j| j| jf S )Nz
<%s %s %s>)	__class__r   rY   rB   )r   r   r   r   __repr__  s    zLegacyMetadata.__repr__)NNNry   )F)F)F)N)F)F)"r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  rD   r  r   rI   r	  r   r   r   r   rx     s>   	 




,
,
;rx   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f f dIdZd	Zd
Zef fedJfe
dKfedLfdZdMZdNddZedO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dPdQdZ[[dd  ZdRd!d"Zd#d$ Zed%d& Z ed'd( Z!e!j"d)d( Z!dSd*d+Z#ed,d- Z$ed.d/ Z%e%j"d0d/ Z%d1d2 Z&d3d4 Z'd5d6 Z(d7d8 Z)d9d:d;d<d=dd>Z*d?d@ Z+dTdCdDZ,dEdF Z-dGdH Z.dS )Ur   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)rY   rB   r[   zqname version license summary description author author_email keywords platform home_page classifiers download_urlzwextras run_requires test_requires build_requires dev_requires provides meta_requires obsoleted_by supports_environments)rX   rY   rB   r[   _legacy_datar~   Nry   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 nd }|rt	|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 )Nrz   z'path, fileobj and mapping are exclusive)r   r~   rb)rX   	generatorzutf-8)r   r~   )r{   r|   r  r  r~   _validate_mappingr   rx   validater   r   METADATA_VERSION	GENERATORr   r	   decodejsonloads
ValueErrorr   )r   r   r   r   r~   r  fr   r   r   r     s<    



zMetadata.__init__rY   rB   rc   r]   r[   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commandsr   Z
source_urlrX   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||}nt  }|}| 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  )
r   rU   commonmappedlkmakerresultrV   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_VALIDATORSr~   matchr   )r   rU   rV   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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rt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   )r4  r&  r'  r  NotImplementedErrorr  
setdefault__setattr__r   r   r   r   )r   rU   rV   r(  r)  r*  r   r.  r   r   r   r7  0  s>    




zMetadata.__setattr__c             C   s   t | j| jdS )NT)rw   rY   rB   )r   r   r   r   name_and_versionW  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-Distrm   z%s (%s))r  r  r6  rY   rB   rJ   )r   r,  sr   r   r   rm   [  s    
zMetadata.providesc             C   s    | j r|| j d< n
|| jd< d S )NzProvides-Distrm   )r  r  )r   rV   r   r   r   rm   f  s    c       
      C   s   | j r|}ng }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
 qW |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environmentTrl   builddevtestz:%s:z%s_requires)r  env)r<  r=  r>  )	r  r   r  r   r
   extendrK   r  get_requirements)
r   reqtsr  r?  r,  r.  includerF   rU   er   r   r   rA  m  s0    	




zMetadata.get_requirementsc             C   s   | j r| j S | jS )N)r  _from_legacyr  )r   r   r   r   
dictionary  s    zMetadata.dictionaryc             C   s   | j rtnt| j| jS d S )N)r  r5  r   r  DEPENDENCY_KEYS)r   r   r   r   dependencies  s    zMetadata.dependenciesc             C   s   | j rtn| jj| d S )N)r  r5  r  r   )r   rV   r   r   r   rH    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 )NrX   zMissing metadata items: %sz, )	r   r  r   MANDATORY_KEYSrI   rJ   r   r   r4  )	r   r   r~   r   rU   r2  r   r   r   r   r   r   r    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   rL   r   r  r  r~   )r   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)r   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|| rd|| ig||< qW | j|d< i }i }	|S )N)rX   r  TrY   rB   rc   r[   r\   rd   r   r"    r]   rh   r  ri   r  rl   rm   )rY   rB   rc   r[   r\   rd   rh   r  ri   r  )rL  rM  )r  r  AssertionErrorr  r  r  r   rm   )
r   r,  Zlmdr   nkkwrD   okr_   ra   r   r   r   rE    s0    

 
zMetadata._from_legacyr   r   r&   r    r!   )rY   rB   rc   r[   r\   r   c             C   s   dd }| j r| j stt }| j }x*| jj D ]\}}||kr2|| ||< q2W || j| j }|| j| j	 }| j
rt| 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;  rl   rK  zextra == "%s"z(%s) and %sr   )r   r   addr   )entriesrB  rD  r:  r?  Zrlistr   rF   r   r   r   process_entries  s"    



z,Metadata._to_legacy.<locals>.process_entrieszProvides-ExtrazRequires-DistzSetup-Requires-Dist)r  r  rN  rx   LEGACY_MAPPINGrI   r  r  r  r  r  sorted)r   rT  r,  ZnmdrO  rQ  Zr1Zr2r   r   r   
_to_legacy  s    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}|rt	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   Trz   )ensure_asciiindent	sort_keysr   zutf-8)r{   r  r  r  rW  r   r   rE  r  r  dumpr   r   )r   r   r   r
  r   Z	legacy_mdr.  r  r   r   r   r     s&    

zMetadata.writec             C   s   | j r| j 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:  rl   r   )r  r  r  r6  insertr   rV  )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)>)rY   rB   r  r   rX   )r   rY   rB   r   r   r   r	  ?  s    

zMetadata.__repr__)r
  )r
  )r
  )r
  )r  r  r~   )NNNry   )rY   rB   rc   r]   r[   )r  N)r  N)N)NN)NNFT)/r   r   r   r   recompileZMETADATA_VERSION_MATCHERIZNAME_MATCHERr   ZVERSION_MATCHERZSUMMARY_MATCHERr  r   r  rI  rJ  rG  r/  	__slots__r   r   r#  r   Z	none_listdictZ	none_dictr$  r'  r4  r7  propertyr8  rm   setterrA  rF  rH  r  r  r  rE  rU  rW  r   r  r	  r   r   r   r   r     sx   

 
,+

'
*	%
)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:   )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)Dr   
__future__r   r   emailr   r  r   r_  rK  r   r   compatr   r   r	   rE   r
   utilr   r   rB   r   r   	getLoggerr   rL   r   r   r   r   __all__r   r   r`  r   r   r=   r>   rO   r?   rP   rA   rR   r@   rQ   r   r   r   ZEXTRA_RErC   rW   r   r   r   r   r   r   r   r   r&  r   rt   rw   rx   ZMETADATA_FILENAMEZWHEEL_METADATA_FILENAMEr   r   r   r   r   <module>	   s   



                         





H    

   
