a
    ¬…aµ   ã                   @   s¸   U d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
 ddlmZmZmZ ddlmZ ddlmZmZ d	Ze
ed
f ed< G dd„ deƒZeddfe	eee eee dœdd„ZdS )zVFast stream based import identification.
Eventually this will likely replace parse.py
é    )Úpartial)ÚPath)ÚIteratorÚ
NamedTupleÚOptionalÚTextIOÚTuple)Ú_normalize_lineÚ_strip_syntaxÚ	skip_lineé   )Úparse)ÚDEFAULT_CONFIGÚConfig)zdef zcdef zcpdef zclass ú@z	async def.ÚSTATEMENT_DECLARATIONSc                   @   s~   e Zd ZU eed< eed< eed< dZee ed< dZ	ee ed< dZ
eed< dZee ed	< ed
œdd„Zed
œdd„ZdS )ÚImportÚline_numberÚindentedÚmoduleNÚ	attributeÚaliasFÚcimportÚ	file_path)Úreturnc                 C   sZ   | j r
dnd}| jr0d| j› d|› d| j› }n|› d| j› }| jrV|d| j› 7 }|S )Nr   Úimportúfrom ú z as )r   r   r   r   )ÚselfZ
import_cmdÚimport_string© r    ú-lib/python3.9/site-packages/isort/identify.pyÚ	statement   s    zImport.statementc                 C   s.   | j pd› d| j› d| jrdnd› |  ¡ › S )NÚ ú:r   z	indented )r   r   r   r"   )r   r    r    r!   Ú__str__#   s    ÿÿÿzImport.__str__)Ú__name__Ú
__module__Ú__qualname__ÚintÚ__annotations__ÚboolÚstrr   r   r   r   r   r   r"   r%   r    r    r    r!   r      s   

r   NF)Úinput_streamÚconfigr   Útop_onlyr   c              
   c   sÀ  d}t | ƒ}|D ]¨\}}t||||jd\}}|rH|sH| t¡rH q¼|rNq| ¡  d¡d }	|	 d¡sv|	 d¡r|	dkrÆ|	rŠ|	dkrÆzt|ƒ\}}
W n ty°   Y qÆY n0 |
 ¡  d¡d }	q~|	 	d¡rzt|ƒ\}}
W n työ   Y qY n0 |
 ¡  d¡d }	qÆq| dd¡^}}d	d
„ | d¡D ƒ}|rR|d › d|d › |d< |D ]`}t
|ƒ\}}| d¡rzd}n| d¡rVd}nqVt|ƒ\}}| dd¡ dd¡ dd¡}d|v pÊ| d¡}tt|d | d¡||d}d| dd¡d v rd| d¡d  ¡  	d¡szt|ƒ\}}
W n tyB   Y qY n0 t|
ƒ\}}|d| 7 }qþn,| ¡  	d¡rzt|ƒ\}}
W n tyž   Y qY n0 t|
ƒ\}}d| d¡d v rDd| d¡d vrD|d| 7 }| d¡d  ¡  	d¡sŒzt|ƒ\}}
W n ty$   Y qŒY n0 t|
ƒ\}}|d| 7 }qànH| ¡  	d¡sd| ¡  d¡rr|d| 7 }n| ¡  d¡d | ¡  }qd|dkr| dd¡ dd¡ dd¡}| |rÄdnd¡}|d  d¡}|râdnd |d d d |dd… ¡ g|dd…  ¡}dd
„ t|ƒ ¡ D ƒ}|dd… }d}d|v rl| d¡d t|ƒk rld|v rld}| d¡}|dkr||d  }|d }|d  | }||d  }| |¡ | |¡ | d¡ ||dd…< ||krô|jrô|||ƒV  n||||d!V  nb||d  }||d  }| |¡ | d¡ | |¡ ||krZ|jrZ||ƒV  n|||d!V  q\|rV|dkr | d¡}|D ]}|||ƒV  qŠn|D ]}||ƒV  q¤qVqdS )"z9Parses a python file taking out and categorizing imports.r#   )Úin_quoteÚindexÚsection_commentsú#r   ÚraiseÚyieldú\r   c                 S   s   g | ]}|  ¡ ‘qS r    )Ústrip)Ú.0Úliner    r    r!   Ú
<listcomp>R   ó    zimports.<locals>.<listcomp>ú;éÿÿÿÿ)zimport zcimport Zstraightr   Úfromzimport(zimport (r   Ú
z	 cimport r   )r   ú	)r   r   ú(ú))z importz cimportz import Nc                 S   s    g | ]}|  d d¡  dd¡‘qS )z{|z{ z|}z })Úreplace)r8   Úitemr    r    r!   r:   £   s   ÿÚasÚ.)r   )Ú	enumerater   r2   Ú
startswithr   r7   ÚsplitÚnextÚStopIterationÚendswithr	   Úparse_commentsrC   r   r   ÚrstripÚlstripÚjoinr
   r1   ÚlenÚremoveZremove_redundant_aliasesÚpop)r-   r.   r   r/   r0   Zindexed_inputr1   Zraw_lineZskipping_lineZstripped_lineZ	next_liner9   Zend_of_line_commentZ
statementsr"   Z	_raw_lineZtype_of_importr   Ú_Znormalized_import_stringZcimportsZidentified_importÚpartsZfrom_importZjust_importsZdirect_importsZtop_level_moduler   Zas_indexr   r   r    r    r!   Úimports*   s   
ÿ




ÿ
þû(ÿþÿ
ÿþÿ*ÿ
þ"










rV   )Ú__doc__Ú	functoolsr   Úpathlibr   Útypingr   r   r   r   r   Zisort.parser	   r
   r   Zcommentsr   rM   Zsettingsr   r   r   r,   r*   r   r+   rV   r    r    r    r!   Ú<module>   s$   üû