U
    f                     @  s   d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
mZ ddlmZ dd	lmZ dd
lmZ edZe	edf ZeZejZddddddZdddddZddddddZdd Zdd Zdd Zdd Zd d! Zd"d# ZdS )$aS  Helper code used to generate ``requires.txt`` files in the egg-info directory.

The ``requires.txt`` file has an specific format:
    - Environment markers need to be part of the section headers and
      should not be part of the requirement spec itself.

See https://setuptools.pypa.io/en/latest/deprecated/python_eggs.html#requires-txt
    )annotationsN)defaultdict)filterfalse)DictMappingTypeVar   )_reqs)yield_lines)Requirement_T
_StrOrIterzMapping[str, _StrOrIter]z&tuple[list[str], dict[str, list[str]]])install_requiresextras_requirereturnc                 C  s   t |}t| |S )zGiven values for ``install_requires`` and ``extras_require``
    create modified versions in a way that can be written in ``requires.txt``
    )_convert_extras_requirements"_move_install_requirements_markers)r   r   Zextras r   >lib/python3.8/site-packages/setuptools/command/_requirestxt.py_prepare   s    r   z#Mapping[str, _Ordered[Requirement]])r   r   c                 C  sL   t t}|  D ]6\}}||  t|D ]}||t|  | q*q|S )z
    Convert requirements in `extras_require` of the form
    `"extra": ["barbazquux; {marker}"]` to
    `"extra:{marker}": ["barbazquux"]`.
    )r   dictitemsr	   parse_suffix_for
setdefault)r   outputZsectionvrr   r   r   r   '   s    r   c                 C  sp   t t| }tt|}tt|}t tt|}|D ]}|dt|j  	| q4t
dd | D }||fS )a+  
    The ``requires.txt`` file has an specific format:
        - Environment markers need to be part of the section headers and
          should not be part of the requirement spec itself.

    Move requirements in ``install_requires`` that are using environment
    markers ``extras_require``.
    :c              	   s  s4   | ],\}}|t td d tt|D fV  qdS )c                 s  s   | ]}t |V  qd S N)str).0r   r   r   r   	<genexpr>R   s     z?_move_install_requirements_markers.<locals>.<genexpr>.<genexpr>N)listr   fromkeysmap
_clean_req)r!   kr   r   r   r   r"   P   s   z5_move_install_requirements_markers.<locals>.<genexpr>)r#   r	   r   filter
_no_markerr   r%   r    markerr   r   r   )r   r   Z	inst_reqsZsimple_reqsZcomplex_reqsZsimple_install_requiresr   Zexpanded_extrasr   r   r   r   9   s    

r   c                 C  s   | j rdt| j  S dS )z;Return the 'extras_require' suffix for a given requirement.r    )r*   r    reqr   r   r   r   Y   s    r   c                 C  s   t t| }d|_|S )z=Given a Requirement, remove environment markers and return itN)r   r    r*   )r-   r   r   r   r   r&   ^   s    r&   c                 C  s   | j  S r   )r*   r,   r   r   r   r)   e   s    r)   c                 C  s,   t |pd}dd }t||}| | d S )Nr   c                 S  s   | d S )N
r   )liner   r   r   	append_crl   s    z&_write_requirements.<locals>.append_cr)r
   r%   
writelines)streamZreqslinesr0   r   r   r   _write_requirementsi   s    
r4   c                 C  sx   | j }t }t|jpd|jp i \}}t|| t|D ]&}|dj	f t
  t|||  q:| d||  d S )Nr   z
[{extra}]
Zrequirements)distributionioStringIOr   r   r   r4   sortedwriteformatvarswrite_or_delete_filegetvalue)cmdbasenamefilenameZdistdatar   r   Zextrar   r   r   write_requirementss   s     
rB   c                 C  s,   t  }t|| jj | d||  d S )Nzsetup-requirements)r6   r7   r4   r5   Zsetup_requiresr<   r=   )r>   r?   r@   rA   r   r   r   write_setup_requirements   s    rC   ) __doc__Z
__future__r   r6   collectionsr   	itertoolsr   typingr   r   r   r+   r	   Zjaraco.textr
   Zpackaging.requirementsr   r   Z_Orderedr   Z_orderedr   r   r   r   r   r&   r)   r4   rB   rC   r   r   r   r   <module>   s*   	
 
