a
    a'a                  	   @   s  d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZ e	rddlmZ edeee
f eee
f dZedeee
f eee
f eee
f edZ eedddZ!eeeef dddZ"efeeee dddZ#eedddZ$d(eee%eedf e&ee&ef dd d!Z'G d"d# d#eZ(efeee(d$d%d&Z)d'S ))zFDefines parsing functions used by isort for parsing import definitions    )OrderedDictdefaultdict)partial)chain)TYPE_CHECKINGAnyDictList
NamedTupleOptionalTuple)warn   )place)parse)MissingSection)DEFAULT_CONFIGConfig)	TypedDictCommentsAboveDictstraightfromCommentsDictr   r   nestedabove)contentsreturnc                 C   s   d| v rdS d| v rdS dS )Nz

 )r   r!   r!   *lib/python3.9/site-packages/isort/parse.py_infer_line_separator   s
    r#   )raw_liner   c                 C   sP   |  dd}| dd}| dd}| dd}| d	d
}| dd}|| fS )zrNormalizes import related statements in the provided line.

    Returns (normalized_line: str, raw_line: str)
    zfrom.import zfrom . import zfrom.cimport zfrom . cimport zimport*zimport *z	 .import z
 . import z
 .cimport z . cimport 	 replace)r$   liner!   r!   r"   _normalize_line'   s    r*   )r)   configr   c                 C   sX   |j r|   drdS d| v s4d| v s4d| v r8dS | drFdS | drTd	S dS )
zPIf the current line is an import line it will return its type (from or straight)ZnoqaN
isort:skipisort: skipzisort: splitimport zcimport r   from r   )Z
honor_noqalowerrstripendswith
startswith)r)   r+   r!   r!   r"   import_type5   s    

r5   )import_stringr   c                 C   s   |  dd} |  dd} dD ]}|  |d} q|  }dD ]}||v r:|| q:d|} |  dd} |  dd} |  dd	 d
dS )NZ_importz[[i]]Z_cimportz[[ci]])\(),r&   )r   importZcimport{ {| }|})r(   splitremovejoin)r6   Zremove_syntaxZimport_listkeyr!   r!   r"   _strip_syntaxB   s    
rD   T.)r)   in_quoteindexsection_commentsneeds_importr   c           	      C   s  t |}d| v sd| v rd}|t| k r| | dkr>|d7 }nl|r`| ||t|  |krd}nJ| | dv r| ||d  }|d	v r|}|d
7 }q| | }n| | dkrq|d7 }qd| dd v r|rdd | dD D ] }|r|ds|dsd}qt |p||fS )zDetermine if a given line should be skipped.

    Returns back a tuple containing:

    (skip_line: bool,
     in_quote: str,)
    "'r   r7   r    )rJ   rI      )"""'''   #;c                 s   s   | ]}|  V  qd S Nstrip.0partr!   r!   r"   	<genexpr>t       zskip_line.<locals>.<genexpr>r0   r.   T)boollenr@   r4   )	r)   rE   rF   rG   rH   Zshould_skipZ
char_indexZ
long_quoterW   r!   r!   r"   	skip_lineQ   s8    



r\   c                   @   s   e Zd ZU ee ed< ee ed< eed< eeee f ed< eeef ed< eeeeee f f ed< eeeeef f ed< ded	< eed
< eed< eed< eed< ee ed< dS )ParsedContentin_lineslines_without_importsimport_indexplace_importsimport_placementsas_mapimportsr   categorized_commentschange_countoriginal_line_countline_separatorsectionsverbose_outputN)	__name__
__module____qualname__r	   str__annotations__intr   r   r!   r!   r!   r"   r]      s   
r]   )r   r+   r   c           9         s  |j pt| }|  }| r0| d dv r0|d g }t|}|jr\ddlm} ||dj}nt	t
j|d}t|}i }	i }
ttttd}t }g }t|j|jD ]}t t d||< qi i i i i dd}d	}d}d}||k r|| }|d7 }|}t||||jd
\}}||jv r4|s4|dkr|d }qd|v rv|drv|dd  d	  }g |	|< ||
|< n@d|v r|dr|dd  d	  }g |	|< ||
|< |r|| q| }|jr>|dkr>|r>|s>|ds>|ds>|ds>|dsT|dsT|d }|r>||d  s>|d8 }q2n|ddd	  }d|v s|d|v r>d|v r>d|vr>|}|}d|v sd|v r>|ddd	 }d|v r| ds||k r||k r$| ds$|| ddd	 }|d7 }qn|d7 }||kr2q>|| }q|dd^}}d|v rndd |dD }n|g}|r|d  d|d	  |d< |D 
]}t|\}}t||pd}|g}|s|| q|dkr|d }i }t|\} }!|!r|!gng }"dd t|  dD }#|dkrPt|#dkrP|"rP|"d	 ||#d < d|ddd	 v r||k r|dd	  ds||k rt|| \}}$|d7 }|$r|"|$ t| }%|dkr|%rd|% ddvr|$r|"d ||%< | || 7 } || qpn| drt|| \}}$| }|d7 }|$rZ|"|$ d|dd	 v rd|dd	 vr||k rt| }%|dkr|%rd|% ddvr|$r|"d ||%< | || 7 } || |dd	  ds||k rt|| \}}$|d7 }|$r.|"|$ t| }%|dkrn|%rnd|% ddvrn|$rn|"d ||%< | || 7 } || qt| }%|dkr|%rd|% ddvr|$r|"d ||%< |  ds| dr| || 7 } n|  dd |  } q|dkr|  d d! dd d"d} d#| vrR|!| qd$| v rl| d$}&d%}'n| d&}&d'}'|&d	 d}(|'rd$nd&"|(d	 d d"|(dd(  g|&dd(  } d)d t|  D })d(}*|)dd(  d%}+d},d*|)v 	r|)#d*d t|)k 	rd'}+d*|)v 	rd(}-|)#d*}.|dk	r
|)|.d  }-|)d	 },|,d+ |- }/|)|.d  }0 $|-  $|0  $d* |-|0kr|j%rn$|0|d |/ vr|d |/ |0 |- d|0 }1|&|1}2|2	rZ|2|d, '|,i |1< |2|"v 	rZ|"(|"#|2 nP|)|.d  }/|)|.d  }0|/|0k	r6|j%	r6n$|0|d- |/ v	rZ|d- |/ |0 |"	r|*d(u 	r|-	r|j)	r|d '|, d.g }*nR|dk	s|j%	r|0|/d+d k	r|d- '|/g }*n|d- '|/ d|0 g }*|)|.|.d = q|dkr|)(d	|}3|j*
r6|j+
s6t,d/ d0|3  n|j*
rT|d/ d0|3  |3dk
rtt-d1 d2| d3 ||3 | |)D ]D}4|&|4}2|2
r|2|d, 'i |4< |2|"v 
r|"(|"#|2 
q|j.r<|"r<|*d(u r<t|)dkr<|d, 'i }5|5&|)d	 d}6|6 |6rd4nd d4"|" |5|)d	 < g }"|"r\|*d(u r\|d 'g }*t|t/|dd krB|r|d  nd}7|7dr|7ds|7dsd|7vrd|7vr|j0s|7 |j1vr|d5 d 'g 2d	|(d |r|d  }7nd}7q|d |krB|t|d5 d &g 8 }vrht fd6d7|)D < n  3 fd8d7|)D  |"r|*d(ur|*!|" q|"r|*d(ur|*!|" g }"|)D ]}/|"r|"|d- |/< g }"t|t/|ddd kr|r|d  nd}7|7dr|7ds|7dsd|7vrd|7vr|j0s|7 |j1vr|d5 d- '|/g 2d	|(d |r|d  }7nd}7q|d |kr|t|d5 d- &|/g 8 }||/}3|j*r|j+st,d9|/ d0|3  n|j*r|d9|/ d0|3  |3dkrNt-d1|/ d2| d3 |'dt t d |3rj|3|vrjt4|/|3d:|+||3 | &|/d'O }+|+||3 | |/< qȐqqt|| }8t5||||	|
||||8|||j|d;S )<z9Parses a python file taking out and categorizing imports.)r    r   rK   r   )FindersManager)r+   r   r   r   )rE   rF   rG   zisort:imports-rP   zisort: imports-rN   rM   r;   r   r,   r-   r8   r9   rQ   c                 S   s   g | ]}|  qS r!   rS   )rV   r)   r!   r!   r"   
<listcomp>   rY   z!file_contents.<locals>.<listcomp>c                 S   s   g | ]}|r|qS r!   r!   rU   r!   r!   r"   rs     rY   r&   rO   z as r7   )z importz cimportr.   zimport(zimport (r    r/   z	 cimport Tz import FNc                 S   s    g | ]}| d d ddqS )r=   r<   r?   r>   r'   )rV   itemr!   r!   r"   rs   v  s   as.r   r   z.__combined_as__zfrom-type place_module for z
 returned zcould not place module z	 of line z, -- Do you need to define a default section?z; r   c                 3   s   | ]}|| v fV  qd S rR   r!   rV   module)direct_importsr!   r"   rX     s   z file_contents.<locals>.<genexpr>c                 3   s*   | ]"}|  |d p| v fV  qdS )FN)getrw   ry   Zimport_fromrootr!   r"   rX     s   zelse-type place_module for )import_modulesection)r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   )6Zline_endingr#   
splitlinesappendr[   Zold_findersZdeprecated.findersrr   findr   r   rx   r   listr   r   ri   Zforced_separater\   rG   r4   r@   upperlstripZfloat_to_toprT   r2   r3   r*   r5   parse_commentsrD   r(   extendrB   rF   rA   Zremove_redundant_aliasesrz   
setdefaultpopZcombine_as_importsverboseZonly_modifiedprintr   Zforce_single_linemaxZtreat_all_comments_as_codeZtreat_comments_as_codeinsertupdater   r]   )9r   r+   rh   r^   Z	out_linesrg   rr   finderZ
line_countra   rb   rc   rd   rj   r~   re   rF   r`   rE   r)   Zstatement_indexZskipping_lineZlstripped_lineZcommentlessZstarting_lineZend_of_line_commentZ
statementsZ	statementr$   Ztype_of_importZ	raw_linesZnested_commentsr6   ZcommentcommentsZ
line_partsZnew_commentZstripped_linepartsZcimportsZfrom_importZjust_importsZattach_comments_toZstraight_importZtop_level_moduleZnested_moduleZas_indexrx   Zas_nameZ	full_nameZassociated_commentZplaced_moduleZimport_nameZnested_from_commentsZexisting_commentZlastrf   r!   r{   r"   file_contents   s:   





	




 $


$






*
"















	



	

r   N)T)*__doc__collectionsr   r   	functoolsr   	itertoolsr   typingr   r   r   r	   r
   r   r   warningsr   rK   r   r   r   r   
exceptionsr   Zsettingsr   r   Zmypy_extensionsr   rn   r   r   r#   r*   r5   rD   rp   rZ   r\   r]   r   r!   r!   r!   r"   <module>   sJ   $


 

.