o
    ca                     @   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   sR   t | ddrd| j S g }| jD ]\}}|||  q|s dS ddt| S )zFReturn the version specifier for a requirement in PEP 345/566 fashion.urlNz @  z (%s),)getattrr   specsappendjoinsorted)requirementrequires_distopver r   0/usr/lib/python3/dist-packages/wheel/metadata.pyrequires_to_requires_dist   s   
r   c                 c   sP    | D ]"}t j|}t|}dt|j}|rd| }|j| | V  q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reqparsed_requirementspecr   r   r   r   convert_requirements   s   r   c                 c   s    |   D ]D\}}d}|pd}d|v r|dd\}}t|}|r5d|fV  |r/d| d }|d| 7 }|r;d| }t|D ]	}d	|| fV  q?q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   Provides-Extra(z) and zextra == '%s'z ; Requires-DistN)itemssplitr   
safe_extrar   )extras_requireextradepends	conditionnew_reqr   r   r   generate_requirements%   s$   

r)   c                 C   s   t |}|dd |d= |d= tj| d}tj|r^t|}| }W d   n1 s0w   Y  tt	
|dd d	}|D ]\}}t||iD ]\}	}
|	|
f| vr\|
||	< qLqB|d
 }|rn|t| |d
= |S )zN
    Convert .egg-info directory with PKG-INFO to the Metadata 2.1 format
    zMetadata-Versionz2.1r   r    z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)egg_info_pathpkginfo_pathpkg_inforequires_pathrequires_filerequiresparsed_requirementsr%   reqsr,   valuedescriptionr   r   r   pkginfo_to_metadataA   s.   


rA   c                 C   sX   | | }|  }t|ts*|  D ]}|d   |kr)|d ddd} |S q|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)r9   fieldtextitemr   r   r   pkginfo_unicode^   s   
rM   c              
   C   sr   | d }d}t |tsd}t| d}| }d|d  td|dd df}|r7|d	d	d
}|S )z@
    Dedent and convert pkg_info['Description'] to Unicode.
    r-   FT
r   r   Nutf8rB   rC   )
rE   rF   rM   
splitlinesr
   lstriptextwrapdedentrH   rI   )r9   r@   
surrogatesdescription_linesdescription_dedentr   r   r   r6   l   s$   


r6   )__doc__os.pathr/   rR   r   pkginfor   r   r   r)   rA   rM   r6   r   r   r   r   <module>   s    