3
;p_                 @   s\   d Z ddlZddlZddlZddlmZ dd Zdd Zd	d
 Z	dd Z
dd Zdd ZdS )z2
Tools for converting old- to new-style metadata.
    N   )read_pkg_infoc             C   sV   t | ddrd| j S g }x | jD ]\}}|j||  q"W |sDdS ddjt| S )zFReturn the version specifier for a requirement in PEP 345/566 fashion.urlNz @  z (%s),)getattrr   specsappendjoinsorted)requirementZrequires_distopver r   1/tmp/pip-install-ofl94hr3/wheel/wheel/metadata.pyrequires_to_requires_dist   s    
r   c             c   sR   xL| D ]D}t jj|}t|}djt|j}|r:d| }|j| | V  qW dS )z=Yield Requires-Dist: strings for parsed requirements strings.r   z[%s]N)pkg_resourcesRequirementparser   r
   r   extrasproject_name)requirementsreqZparsed_requirementspecr   r   r   r   convert_requirements   s    
r   c             c   s   x| j  D ]\}}d}|pd}d|kr6|jdd\}}tj|}|rjd|fV  |r^d| d }|d| 7 }|rvd| }xt|D ]}d	|| fV  qW q
W d
S )a,  
    Convert requirements from a setup()-style dictionary to ('Requires-Dist', 'requirement')
    and ('Provides-Extra', 'extra') tuples.

    extras_require is a dictionary of {extra: [requirements]} as passed to setup(),
    using the empty extra {'': [requirements]} to hold install_requires.
    r   :r   zProvides-Extra(z) and zextra == '%s'z ; zRequires-DistN)itemssplitr   
safe_extrar   )Zextras_requireextradepends	conditionZnew_reqr   r   r   generate_requirements%   s    

r#   c             C   s   t |}|jdd |d= |d= tjj| d}tjj|rt|}|j }W dQ R X tt	j
|dd d	}xB|D ]:\}}x0t||iD ] \}	}
|	|
f|j kr|
||	< qW qrW |d
 }|r|jt| |d
= |S )zN
    Convert .egg-info directory with PKG-INFO to the Metadata 2.1 format
    zMetadata-Versionz2.1zProvides-ExtrazRequires-Distzrequires.txtNc             S   s   | d p
dS )Nr   r   r   )xr   r   r   <lambda>P   s    z%pkginfo_to_metadata.<locals>.<lambda>)keyDescription)r   replace_headerospathr
   existsopenreadr   r   split_sectionsr#   r   set_payloaddedent_description)Zegg_info_pathZpkginfo_pathpkg_infoZrequires_pathZrequires_filerequiresZparsed_requirementsr    reqsr&   valuedescriptionr   r   r   pkginfo_to_metadataA   s&    

r6   c             C   sX   | | }|j  }t|tsTx8| j D ],}|d j  |kr$|d jddjd}P q$W |S )z<Hack to coax Unicode out of an email Message() - Python 3.3+r   r   asciisurrogateescapezutf-8)lower
isinstancestr	raw_itemsencodedecode)r1   fieldtextitemr   r   r   pkginfo_unicode^   s    
rB   c             C   sr   | d }d}t |ts$d}t| d}|j }dj|d j tjdj|dd df}|rn|jdj	d	d
}|S )z@
    Dedent and convert pkg_info['Description'] to Unicode.
    r'   FT
r   r   Nutf8r7   r8   )
r:   r;   rB   
splitlinesr
   lstriptextwrapdedentr=   r>   )r1   r5   Z
surrogatesZdescription_linesZdescription_dedentr   r   r   r0   l   s    


r0   )__doc__os.pathr)   rG   r   Zpkginfor   r   r   r#   r6   rB   r0   r   r   r   r   <module>   s   