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    