o
    'f                     @  s   d Z ddlmZ ddlZddlZddlZddlZddlZddl	m
Z
 ddlmZ ddlmZ ddlmZ d	d
 Zejdd Zee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(d)ZdS ).z2
Tools for converting old- to new-style metadata.
    )annotationsN)Message)Parser)Iterator   )Requirementc                 C  s   | o|  d S )N#)
startswith)str r   F/home/ubuntu/flask/venv/lib/python3.10/site-packages/wheel/metadata.py	_nonblank   s   r   c                 C  s   t jtt| S )a  
    Yield valid lines of a string or iterable.
    >>> list(yield_lines(''))
    []
    >>> list(yield_lines(['foo', 'bar']))
    ['foo', 'bar']
    >>> list(yield_lines('foo\nbar'))
    ['foo', 'bar']
    >>> list(yield_lines('\nfoo\n#bar\nbaz #comment'))
    ['foo', 'baz #comment']
    >>> list(yield_lines(['foo\nbar', 'baz', 'bing\n\n\n']))
    ['foo', 'bar', 'baz', 'bing']
    )	itertoolschainfrom_iterablemapyield_lines)iterabler   r   r   r      s   r   c                 C  s   t tttj|  S N)filterr   r   r
   strip
splitlines)textr   r   r   _)   s   r   c                 c  sv    d}g }t | D ]*}|dr.|dr)|s|r||fV  |dd  }g }q	td||| q	||fV  dS )ar  Split a string or iterable thereof into (section, content) pairs
    Each ``section`` is a stripped version of the section header ("[section]")
    and each ``content`` is a list of stripped lines excluding blank lines and
    comment-only lines.  If there are any such lines before the first section
    header, they're returned in a first ``section`` of ``None``.
    N[]r   zInvalid section heading)r   r	   endswithr   
ValueErrorappend)ssectioncontentliner   r   r   split_sections.   s   



r$   c                 C  s   t dd|  S )zConvert an arbitrary string to a standard 'extra' name
    Any runs of non-alphanumeric characters are replaced with a single '_',
    and the result is always lowercased.
    z[^A-Za-z0-9.-]+r   )resublower)extrar   r   r   
safe_extraG   s   r)   c                 C  s   t dd| S )zConvert an arbitrary string to a standard distribution name
    Any runs of non-alphanumeric/. characters are replaced with a single '-'.
    z[^A-Za-z0-9.]+-)r%   r&   )namer   r   r   	safe_nameO   s   r,   requirementr   returnr
   c                 C  sR   t | ddrd| j S g }| jD ]}||j|j  q|r'ddt| S dS )zFReturn the version specifier for a requirement in PEP 345/566 fashion.urlNz @  , )getattrr/   	specifierr   operatorversionjoinsorted)r-   requires_distspecr   r   r   requires_to_requires_distV   s   

r;   requirements	list[str]Iterator[str]c                 c  s^    | D ])}t |}t|}dtdd |jD }|r"d| d}t|j| | V  qdS )z=Yield Requires-Dist: strings for parsed requirements strings.r1   c                 s  s    | ]}t |V  qd S r   )r)   ).0er   r   r   	<genexpr>j   s    z'convert_requirements.<locals>.<genexpr>r   r   N)r   r;   r7   r8   extrasr,   r+   )r<   reqparsed_requirementr:   rB   r   r   r   convert_requirementse   s   rE   extras_requiredict[str, list[str]]Iterator[tuple[str, str]]c                 c  s    |   D ]C\}}d}|pd}d|v r|dd\}}t|}|r4d|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.
    r2   :r   Provides-Extra(z) and zextra == '%s'z ; Requires-DistN)itemssplitr)   rE   )rF   r(   depends	conditionnew_reqr   r   r   generate_requirementsq   s$   

rR   egg_info_pathpkginfo_pathr   c              
   C  sF  t |dd}t |}W d   n1 sw   Y  |dd |d= |d= tj| d}tj|rwt |dd}| }W d   n1 sJw   Y  t	t
|d	d
 d}|D ]\}}	t||	iD ]\}
}|
|f| vru|||
< qeq[|d }|r|d  }d|d  td|dd df}|| |d= |S )zN
    Convert .egg-info directory with PKG-INFO to the Metadata 2.1 format
    zutf-8)encodingNzMetadata-Versionz2.1rJ   rL   zrequires.txtc                 S  s   | d pdS )Nr   r2   r   )xr   r   r   <lambda>   s    z%pkginfo_to_metadata.<locals>.<lambda>)keyDescription
r   r   )openr   parsereplace_headerospathr7   existsreadr8   r$   rR   rM   r   lstriptextwrapdedentset_payload)rS   rT   headerspkg_inforequires_pathrequires_filerequiresparsed_requirementsr(   reqsrX   valuedescriptiondescription_linesdedented_descriptionr   r   r   pkginfo_to_metadata   s<   


	rq   )r-   r   r.   r
   )r<   r=   r.   r>   )rF   rG   r.   rH   )rS   r
   rT   r
   r.   r   )__doc__
__future__r   	functoolsr   os.pathr^   r%   rc   email.messager   email.parserr   typingr   vendored.packaging.requirementsr   r   singledispatchr   registerr
   r   r$   r)   r,   r;   rE   rR   rq   r   r   r   r   <module>   s.    




