o
    øÑÐbÐ  ã                   @   sÊ   d Z ddlmZmZmZ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ZddlZddl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 ddlmZ G dd„ deƒZddd„ZdS )aà  isort.py.

Exposes a simple library to sort through imports within Python code

usage:
    SortImports(file_name)
or:
    sorted = SortImports(file_contents=file_contents).output

Copyright (C) 2013  Timothy Edmund Crosley

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or
substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

é    )Úabsolute_importÚdivisionÚprint_functionÚunicode_literalsN)ÚOrderedDictÚ
namedtuple)Údatetime)Úunified_diffé   )Úsettings)ÚFindersManager)Únsorted)Úinputc                   @   s,  e Zd ZdZdZ		dAdd„Zedd„ ƒZd	d
„ Ze	dd„ ƒZ
dd„ Zdd„ Ze	dd„ ƒZdd„ Ze	dBdd„ƒZdCdd„Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Ze	dDd5d6„ƒZe	d7d8„ ƒZ e	d9d:„ ƒZ!d;d<„ Z"d=d>„ Z#d?d@„ Z$dS )EÚSortImportsFNÚ Tc                    s´  |s|rt j t j |¡¡}|pt  ¡ }t |¡ ¡ ˆ _| 	¡ D ]F\}}| 
dd¡ ¡ }|dkratˆ j |¡ƒttfv ra| d¡rQttˆ j| ƒ |¡ƒˆ j|< q ttˆ j| ƒ |¡ƒˆ j|< q |ˆ j|< q ˆ jd rwˆ j dddddœ¡ tˆ jd ƒ}| ¡ r‰d	t|ƒ }n| d
¡ d¡}| ¡ dkr™d}|ˆ jd< ˆ jd  d
¡ d¡ˆ jd< i ˆ _i ˆ _‡ fdd„ˆ jd D ƒˆ _‡ fdd„ˆ jd D ƒˆ _dd„ ˆ j 	¡ D ƒˆ _dˆ _|}|pßdˆ _|r½t j |¡}|
r|	rü| |	¡rü| 
|	dd¡}n|}d}	t  |ˆ j|	¡rdˆ _!ˆ jd rt"d #|¡ƒ d }ˆ j!s¼|s¼t$ %|d¡}t&|ƒ}W d   ƒ n	1 s8w   Y  t$j%||dd#}z| '¡ }|ˆ _|ˆ _d}W n t(y`   d}Y nw W d   ƒ n	1 slw   Y  |s¼t$j%|dd8}z| '¡ }|ˆ _|j)ˆ _W n" t(y«   d}d }dˆ _!ˆ jd r©t"d #|ˆ j|j)¡ƒ Y nw W d   ƒ n	1 s·w   Y  n,|réz| *d¡ t&|ƒˆ _| *d¡ W n t$j+yÜ   Y nw t, -ˆ j¡}||ƒ '¡ }|rzt. tt/f}W n t0y    t/}Y nw t1||ƒr| 2t&| 3¡ ƒ¡}|d u sd|v r.dˆ _!d ˆ _4|r,|r,t5j6 7|¡ d S ˆ jd r;ˆ jd ˆ _8nd |v rDd ˆ _8nd!|v rMd!ˆ _8nd"ˆ _8| 9ˆ j8¡ˆ _:t;ˆ j:ƒˆ _<ˆ j<dksvˆ j:d d… g dgfvsvˆ jd# rƒˆ jD ]	}ˆ j: =|¡ qyt;ˆ j:ƒˆ _>g ˆ _?i i i i i d$œd%œˆ _@tAƒ ˆ _Bi ˆ _Cˆ jd }tDd&|ƒd'd„ |D ƒŽ ˆ _EtF Gˆ jEˆ jd( ¡D ]}tAƒ tAƒ d$œˆ jB|< qºtHˆ jˆ jEd)ˆ _Idˆ _Jd*ˆ _Kd*ˆ _Ld*ˆ _Mˆ  N¡  ˆ jKd*krëˆ  O¡  t;ˆ j?ƒˆ j< ˆ _Pˆ j?rˆ j?d*  ¡ dkrˆ j? Qd*¡ ˆ j?rˆ j?d*  ¡ dksˆ j? =d¡ ˆ j8 Rˆ j?¡ˆ _4ˆ jd+ rzztSˆ  Tˆ j?ˆ j8¡ˆ jd,ddƒ W n> tUyy   |ˆ _4dˆ _VztSˆ  Tˆ j:ˆ j8¡ˆ jd,ddƒ t"d- #ˆ j¡ƒ W Y d S  tUyx   t"d. #ˆ j¡ƒ Y Y d S w w |rÊˆ j4}|}ˆ jd/ r¦| 
ˆ j8d¡ 
d	d¡ 
d0d¡}| 
ˆ j8d¡ 
d	d¡ 
d0d¡}| ¡ | ¡ kr¿ˆ jd r½t"d1 #ˆ j¡ƒ d S t"d2 #ˆ j¡ƒ dˆ _V|sÓˆ jd3 rÚˆ  W|¡ d S |ræt5j6 7ˆ j4¡ d S |rV|sXˆ j4|krôd S |r#ˆ  W|¡ d }|d4vr#tXd5 #ˆ j¡ƒ ¡ }|d6v rd S |d7v rt5 Yd¡ |d4vst$j%ˆ jˆ jd8dd9}ˆ jd: s=t"d; #ˆ j¡ƒ | 7ˆ j4¡ W d   ƒ d S 1 sOw   Y  d S d S d S )<NÚnot_r   ÚsectionsZforce_alphabetical_sortTr
   )Ú'force_alphabetical_sort_within_sectionsÚno_sectionsÚlines_between_typesÚ
from_firstÚindentú ú'ú"Útabú	Úcomment_prefixc                    ó   g | ]}ˆ   |¡‘qS © )Ú_format_simplified)Ú.0Zremoval©Úselfr   úJ/var/www/secure340b-portal/env/lib/python3.10/site-packages/isort/isort.pyÚ
<listcomp>X   ó    z(SortImports.__init__.<locals>.<listcomp>Úremove_importsc                    r   r   )Ú_format_natural)r!   Zadditionr"   r   r$   r%   Y   r&   Úadd_importsc                 S   s&   g | ]\}}|  d ¡r|rd| ‘qS )Zimport_headingz# ©Ú
startswith)r!   ÚkeyÚvaluer   r   r$   r%   Z   s
    ÿÿúutf-8ÚverbosezbWARNING: {0} was skipped as it's listed in 'skip' setting or matches a glob in 'skip_glob' settingÚrb)ÚencodingÚnewlineF)r2   zcWARNING: {} was skipped as it couldn't be opened with the given {} encoding or {} fallback encodingr   zisort:skip_fileZline_endingz
úÚ
Z
force_adds©ÚstraightÚfrom)r7   r6   ÚnestedÚaboveZSectionsc                 S   s   g | ]}|‘qS r   r   )r!   Únamer   r   r$   r%   ¾   ó    Úforced_separate)Úconfigr   éÿÿÿÿZatomicÚexeczSERROR: {0} isort would have introduced syntax errors, please report to the project!z'ERROR: {0} File contains syntax errors.Úignore_whitespaceúz#SUCCESS: {0} Everything Looks Good!z*ERROR: {0} Imports are incorrectly sorted.Ú	show_diff)ÚyesÚyÚnoÚnÚquitÚqz*Apply suggested changes to '{0}' [y/n/q]? )rE   rF   )rG   rH   Úw)r1   Úmoder2   Úquietz
Fixing {0})ZÚosÚpathÚdirnameÚabspathÚgetcwdr   Ú	from_pathÚcopyr=   ÚitemsÚreplaceÚlowerÚtypeÚgetÚlistÚtupler+   ÚsetÚ
differenceÚunionÚupdateÚstrÚisdigitÚintÚstripÚplace_importsÚimport_placementsr'   r)   Ú_section_commentsÚfile_encodingÚ	file_pathÚshould_skipÚskippedÚprintÚformatÚioÚopenÚcoding_checkÚreadÚUnicodeDecodeErrorr1   ÚseekÚUnsupportedOperationÚcodecsÚ	getreaderÚ
basestringÚbytesÚ	NameErrorÚ
isinstanceÚdecodeÚ
splitlinesÚoutputÚsysÚstdoutÚwriteÚline_separatorÚsplitÚin_linesÚlenÚoriginal_lengthÚappendÚnumber_of_linesÚ	out_linesÚcommentsr   ÚimportsÚas_mapr   r   Ú	itertoolsÚchainr   ÚfinderÚindexÚimport_indexÚ_first_comment_index_startÚ_first_comment_index_endÚ_parseÚ_add_formatted_importsZlength_changeÚpopÚjoinÚcompileÚ_strip_top_commentsÚSyntaxErrorÚincorrectly_sortedÚ
_show_diffr   Úexit)r#   rf   Úfile_contentsÚfile_Zwrite_to_stdoutÚcheckrB   Zsettings_pathZask_to_applyZrun_pathZ
check_skipZsetting_overridesr,   r-   Z
access_keyr   Ú	file_nameÚfre   Zfile_to_import_sortZencoding_successÚreaderZneed_decodeZ
add_importZsection_namesÚsectionÚcheck_outputZcheck_againstZanswerZoutput_filer   r"   r$   Ú__init__2   sˆ   
  
ý

ÿ
ÿÿ€ú	þÿ€û€û€

ÿþ

2

ÿ"ÿýýù





û$ýózSortImports.__init__c                 C   s   | j  S ©N)r—   r"   r   r   r$   Úcorrectly_sorted  s   zSortImports.correctly_sortedc                 C   sn   t | d¡| j d¡| jd | jd t| jr t tj 	| j¡¡nt 
¡ ƒtt 
¡ ƒdD ]}tj |¡ q,d S )Nr
   z:beforez:after)ÚfromfileÚtofileZfromfiledateZ
tofiledate)r	   ry   rz   rf   r^   r   ÚfromtimestamprL   rM   ÚgetmtimeÚnowr{   r|   r}   )r#   rš   Úliner   r   r$   r˜     s   
ÿÿ

ù	÷zSortImports._show_diffc                 C   sD   t   | ¡} | r| d  d¡r| dd… } | r| d  d¡s| | ¡S )z:Strips # comments that exist at the top of the given linesr   ú#r
   N)rR   r+   r“   )Úlinesr~   r   r   r$   r•     s
   
ÿ
zSortImports._strip_top_commentsc                 C   s   | j  |¡S )z¤Tries to determine if a module is a python std import, third party import, or project code:

        if it can't determine - it assumes it is project code

        )r‹   Úfind)r#   Úmodule_namer   r   r$   Úplace_module  s   zSortImports.place_modulec                 C   s   | j | j }|  jd7  _|S )zDReturns the current line from the file while incrementing the index.r
   )r€   rŒ   )r#   rª   r   r   r$   Ú	_get_line"  s   zSortImports._get_linec                 C   s,   d| v rdS |   d¡rdS |   d¡rdS dS )zPIf the current line is an import line it will return its type (from or straight)z
isort:skipNúimport r6   úfrom r7   r*   )rª   r   r   r$   Ú_import_type(  s   

ÿzSortImports._import_typec                 C   s   | j | jkS )z.returns True if we are at the end of the file.)rŒ   r„   r"   r   r   r$   Ú_at_end2  s   zSortImports._at_endc           	      C   s  t  d| ¡}|r|d rdnd}| | ¡ ¡} d}|r"t| ƒ ¡ } nt| ƒ} |rF|d rF|  ¡ r9t| ƒdkr9d}n| d	d…  ¡ rDd
}nd}|d sN|  ¡ } |d u s\dt|ƒ ¡  |vra|d }n
|dt|ƒ ¡   }d | |d v rudpvd
||rƒtt| ƒƒd |  p„| ¡S )Nz^(\.+)\s*(.*)Zreverse_relativer   Ú_r   Úorder_by_typer
   ÚAr   ÚBÚCÚcase_sensitiveZlength_sort_Úlength_sortú	{0}{1}{2}Úforce_to_topú:)	ÚreÚmatchr“   Úgroupsr^   rU   Úisupperr   rj   )	r®   r=   Zsub_importsÚignore_caseÚsection_namerÀ   ÚsepÚprefixr»   r   r   r$   Ú_module_key6  s,   
ÿzSortImports._module_keyc                 C   sH   | j d s|rd |  |¡d | j d d |¡¡p|S |o#|  |¡d S )zY
            Returns a string with comments added if ignore_comments is not set.
        Úignore_commentsú
{0}{1} {2}r   r   z; )r=   rj   Ú_strip_commentsr“   )r#   r†   Zoriginal_stringr   r   r$   Ú_add_commentsS  s   
þþzSortImports._add_commentsc                 C   sT  | j d }t|ƒ| j d kr	|tjjkr	|}d}d|v r&| dd¡\}}dD ]Þ}dt |¡ d }t ||¡r| 	¡  
|¡st ||¡}|rTd |d	 |¡|d	< g }t|ƒd
 | j d pd| j d kr†|r†| | ¡ ¡ | |¡}t|ƒd
 | j d p‚| j d kr†|sh|sŒ| ¡ }|  | j d | |¡ ¡  ¡}	| j d rûd ||| j|	| j d r®dnd|tjjtjjfv r¼| jnd¡}
|
 | j¡}| j d |d	 v ró|d	  d¡ró|d	  | j d d¡\}}|d | j d  |dd	…  |d	< | j |¡  S d ||| j|	¡  S q(|S t|ƒ| j d kr(|tjjkr(d|vr(d || j d ¡S |S )zZ
            Returns an import wrapped to the specified line-length, if possible.
        Úmulti_line_outputÚline_lengthNr«   r
   )r±   Ú.zas z\bz{0}#{1}r>   é   Úwrap_lengthr   Zuse_parenthesesz{0}{1}({2}{3}{4}{5})Úinclude_trailing_commaú,r   r   ú)z{0}{1}\{2}{3}z# NOQAú{0}{1} NOQA)r=   r   r   Ú	WrapModesÚNOQAr   r¿   ÚescapeÚsearchra   r+   rj   rƒ   r’   r“   Ú_wrapÚlstripr~   ZVERTICAL_HANGING_INDENTZVERTICAL_GRID_GROUPEDÚendswith)r#   rª   Z	wrap_modeZline_without_commentÚcommentZsplitterÚexpZ
line_partsÚ	next_lineZ	cont_linerz   r¬   r   r   r$   rÙ   _  sT   
"$
$þ

þú "€"ü
zSortImports._wrapc                 C   s    |D ]K}|| j v r
q|| jv r'd}| jd rd |¡}|d || j| ¡7 }nd |¡}| jd d  |d ¡}|r>| |¡ | |  | jd  	|¡|¡¡ qd S )Nr   Zkeep_direct_and_as_importszimport {0}
zimport {0} as {1}ú
import {0}r9   r6   )
r'   rˆ   r=   rj   r†   r’   Úextendrƒ   rË   rW   )r#   Ústraight_modulesr    Úsection_outputÚmoduleZimport_definitionZcomments_abover   r   r$   Ú_add_straight_imports‹  s   





 ñz!SortImports._add_straight_importsc                    sb  |D ]«‰ˆˆj v rqd ˆ¡}tˆjˆ d ˆ ƒ}ˆjd r%ˆjd r1t|‡ ‡‡fdd„d}ˆj r>‡‡fdd	„|D ƒ}‡fd
d	„|D ƒ}‡fdd„t||ƒD ƒ}ˆjd rwd|v raˆjd swt |¡D ]}	|	|v rv| |	¡|| 	|	¡< qf|r®ˆj
d  ˆd¡}
d|v rœˆjd rœˆ ˆ |
d |¡¡¡}d }nõˆjd rg }|rþ| d¡}	|	|v rÌˆj
d  d ˆ|	¡¡}| ˆ |ˆ |||	  ¡¡¡ q¤ˆ |
||	 ¡}ˆj
d  ˆi ¡ |	d ¡}|rò|d |
rêdpîˆjd |¡7 }| ˆ |¡¡ d }
|s¦ˆj |¡}n‹|rN|d |v rN| d¡}	ˆj
d  d ˆ|	¡¡}ˆj
d d  ˆd ¡}|r4| |¡ | ˆ |ˆ |||	  ¡¡¡ |rN|d |v sd}d|v rj| ˆ |
d |¡¡¡ | d¡ d}d }
t |¡D ]U}	|	|v rxqoˆj
d  ˆi ¡ |	d ¡}|rÃˆ |
||	 ¡}|d |
r™dpˆjd |¡7 }ˆj
d d  ˆd ¡}|r´| |¡ | ˆ |¡¡ | |	¡ d }
qog }|rã|d |vrã| | d¡¡ |rã|d |vsÑ|rî|d |¡ }nˆ |
|d |¡ ¡}|sþd}d}ˆjd }|rt|ƒ|krd}t|ƒˆjd kr$t|ƒd kr$d}t|ƒˆjd kr?t|ƒdkr?ˆjd! d"vr?d}|rˆ |||
¡}ˆjd! dkrd#ˆjd!< z"ˆ |||
¡}td$d%„ | d&¡D ƒƒˆjd krr|}W dˆjd!< ndˆjd!< w |s‘t|ƒˆjd kr‘ˆ |¡}|r¬ˆj
d d  ˆd ¡}|r§| |¡ | |¡ |szqd S )'Nzfrom {0} import r7   Zno_inline_sortZforce_single_linec                    s   ˆj | ˆjdˆ ˆdS )NT©rÄ   ©rÇ   r=   ©r,   )rÃ   r    r#   r   r$   Ú<lambda>¥  r&   z/SortImports._add_from_imports.<locals>.<lambda>rç   c                    s"   g | ]}d   ˆ |¡ˆjvr|‘qS ©z{0}.{1})rj   r'   ©r!   rª   )rã   r#   r   r$   r%   §  s    ÿz1SortImports._add_from_imports.<locals>.<listcomp>c                    s   g | ]}d   ˆ |¡‘qS ré   )rj   )r!   Úfrom_import)rã   r   r$   r%   ª  s    c                    s.   i | ]\}}|ˆ j v r|d  |ˆ j | ¡“qS )z
{0} as {1})rˆ   rj   )r!   rë   Z
sub_moduler"   r   r$   Ú
<dictcomp>«  s    ýÿz1SortImports._add_from_imports.<locals>.<dictcomp>Úcombine_as_importsÚ*Zcombine_starr   z{0}*r   r6   z{}.{}r8   ú{0} {1}ú;r   r9   FTú, r   Úforce_grid_wraprÍ   r
   rÌ   )r
   r   é   c                 s   ó    | ]}t |ƒV  qd S r£   ©r   )r!   Úxr   r   r$   Ú	<genexpr>
  s   € ÿz0SortImports._add_from_imports.<locals>.<genexpr>r4   )r'   rj   rX   r‡   r=   r   ÚziprR   r’   rŒ   r†   rÙ   rË   rW   rƒ   r~   r“   rà   Úremover   Ú_multi_line_reformatÚmaxr   )r#   Úfrom_modulesr    râ   rÃ   Úimport_startÚfrom_importsZsub_modulesZ
as_importsrë   r†   Úimport_statementZimport_statementsZfrom_commentsZsingle_import_linerÜ   Zabove_commentsZstar_importZfrom_import_sectionZdo_multiline_reformatrò   Zother_import_statementr   )rÃ   rã   r    r#   r$   Ú_add_from_imports  sì   



þ€

ÿÿó


ÿù



ÿ

€ÿ
""ÿ
ÿÿ€


Ÿ€ézSortImports._add_from_importsc                 C   sR  t jj| jd   ¡ }t| d| | jƒ}dt|ƒd  }| jd }| jd p*| jd }||t |¡||||ƒ}	| jd rš|	 	| j
¡}
t|
ƒ}t|
ƒdkrZtd	d
„ |
d d… D ƒƒ}nd}|	}t|
d ƒ|k ršt|
ƒ|krš|dkrš|}	|d8 }||t |¡||||ƒ}| 	| j
¡}
t|
d ƒ|k ršt|
ƒ|krš|dksp|	 | j
¡dkr§|  |	¡S |	S )NrÌ   Z_output_r   r
   r   rÐ   rÍ   Zbalanced_wrappingc                 s   rô   r£   rõ   rê   r   r   r$   r÷   $  ó   € z3SortImports._multi_line_reformat.<locals>.<genexpr>r>   r   é
   )r   rÕ   Ú_fieldsr=   rU   ÚgetattrÚ_output_gridr   rR   r   r~   ÚminÚcountrÙ   )r#   rý   rþ   r†   Zoutput_modeÚ	formatterZdynamic_indentr   rÍ   rÿ   r¬   Ú
line_countZminimum_lengthZnew_import_statementr   r   r$   rú     sD   
ÿ

ÿÿÿú
ÿÿ
z SortImports._multi_line_reformatc                    s|  ˆj d }t ˆjˆj d ¡}ˆj d rEg i dœˆjd< |D ]$‰ ˆjd d  ˆjˆ   dg ¡¡ ˆjd d  ˆjˆ   di ¡¡ qd}g }d}|D ]è‰ ˆjˆ  d }t|‡ ‡fd	d
„d}ˆjˆ  d }t|‡ ‡fdd
„d}g }ˆj d rœˆ 	|ˆ ||¡ ˆj d r”|r”|r”| dgˆj d  ¡ ˆ 
|ˆ |¡ n#ˆ 
|ˆ |¡ ˆj d r·|r·|r·| dgˆj d  ¡ ˆ 	|ˆ ||¡ ˆj d rÐ‡fdd„}t||d}ˆ }	|	ˆj d v }
|r-|	ˆjv rç|ˆj|	< qKˆj  dt|	ƒ ¡  d¡}|rd |¡}|ˆjdd… vr|ˆjdd… vr| d|¡ |s|
s&|dgˆj d  7 }||7 }d}qK|p2|
 }qK|rP|d  ¡ dkrP| ¡  |rP|d  ¡ dks@|rm|d  ¡ dkrm| d¡ |rm|d  ¡ dks\d}ˆjˆjk rzˆj}nˆjdkr‰ˆjdkr‰ˆj}|ˆj|d…< |t|ƒ }dd„ ˆj||d … D ƒdgkrÀˆj |¡ dd„ ˆj||d … D ƒdgks¨tˆjƒ|krwd}dˆ_ˆj|d… }t|ƒD ]Z\}}ˆj}ˆ |¡s
| ¡ r
| ¡  d¡rt|ƒ|d kr||d   ¡ rqØ|} n)|s1| ¡ }t|ƒdkr1|d d kr1d!|d vr1d"|d vr1|} nqØˆj d# dkrMd$d„ tˆj d# ƒD ƒˆj|d…< n*| d%¡se| d&¡se| d'¡se| d(¡roddgˆj|d…< ndgˆj|d…< ˆjr¼g }tˆjƒD ]4\}}| |¡ |ˆj v rµ| ˆjˆj |  ¡ tˆjƒ|ks°ˆj|d   ¡ dkrµ| d¡ q‚|ˆ_dS dS ))z‡Adds the imports back to the file.

        (at the index of the first import) sorted alphabetically and split between groups

        r   r<   r   r5   r6   r7   )r   Fc                    ó   ˆj | ˆjˆ dS ©Nrå   ræ   rç   ©r    r#   r   r$   rè   G  ó    z4SortImports._add_formatted_imports.<locals>.<lambda>rç   c                    r
  r  ræ   rç   r  r   r$   rè   I  r  r   r   r   Zforce_sort_within_sectionsc                    sh   d}|   d¡r	dS t dd| ¡} t dd| ¡} |  d¡d ˆ jd	 v r%d
}ˆ jd s.|  ¡ } d || ¡S )Nr¸   r«   ZAAz^from r   z^import r   r   r½   r·   r¶   ú{0}{1})r+   r¿   Úsubr   r=   rU   rj   )rª   r    r"   r   r$   Ú	by_moduleX  s   

z5SortImports._add_formatted_imports.<locals>.by_moduleÚno_lines_beforeZimport_heading_z# {0}r   r
   Zlines_between_sectionsr>   rÏ   c                 S   s   g | ]}|  ¡ ‘qS r   ©ra   )r!   Ú	characterr   r   r$   r%   Š  ó    z6SortImports._add_formatted_imports.<locals>.<listcomp>Nr«   é   ú=r   r   Zlines_after_importsc                 S   s   g | ]}d ‘qS ©r   r   rê   r   r   r$   r%      r;   zdef zclass ú@z	async def)!r=   r‰   rŠ   r   r‡   rà   rW   r]   r   r   rä   rb   r^   rU   rj   r…   r€   Úinsertra   r’   r   r‚   r   rŽ   r   Ú	_in_quoteÚ	enumerateÚ
_skip_liner+   r   Úrangerƒ   rc   )r#   Zsort_ignore_caser   rz   Zpending_lines_beforerá   rü   râ   r  rÄ   r  Zsection_titleZsection_commentZ	output_atZimports_tailZnext_constructÚtailrŒ   rª   Zin_quoteÚpartsZnew_out_linesr   r  r$   r‘   3  sÂ   

"$




(ÿ
ÿ$$ÿ48€$ÿÿ
(
€
øz"SortImports._add_formatted_importsc                 C   s  |d|  d¡ 7 }|r|  d¡}|  ||d | ¡}t| | j¡d ƒd |krwd || d¡d ¡g}	| d¡dd … D ] }
d |	d |
¡}t|ƒd |krY|	 d ||
¡¡ q=||	d< q=| j |	¡}|  |d	 |¡¡d | j|¡ }d }n|d| 7 }|s|| jd
 rŠd d S d d S )Nú(r   rñ   r>   r
   r  r   rï   z{0},rÑ   rÒ   r   rÓ   )	r’   rË   r   r   r~   rj   rƒ   r“   r=   )r#   Ú	statementr‡   Úwhite_spacer   rÍ   r†   Únext_importÚnext_statementr¬   ÚpartÚnew_liner   r   r$   r  ±  s&   

ÿð zSortImports._output_gridc                 C   sP   |   || d¡d ¡| j | }d ||d| j |  |¡| jd r%d¡S d¡S )Nr   rÒ   z{0}({1}{2}{3})rÑ   r   )rË   r’   r~   rj   r“   r=   )r#   r!  r‡   r"  r   rÍ   r†   Zfirst_importr   r   r$   Ú_output_verticalÆ  s    üüzSortImports._output_verticalc           	      C   s~   ||  d¡7 }|r=|  d¡}|  ||d | ¡}t| | j¡d ƒd |kr9|  |d |¡¡d | j||¡ }d }|}|s	|S )Nr   rñ   r>   r  z{0}, \r¼   )r’   rË   r   r   r~   rj   )	r#   r!  r‡   r"  r   rÍ   r†   r#  r$  r   r   r$   Ú_output_hanging_indentÏ  s   
ÿùz"SortImports._output_hanging_indentc              	   C   s<   d  ||  |¡| j|d| j |  |¡| jd rd¡S d¡S )Nz{0}({1}{2}{3}{4}{5}{2})rÒ   rÑ   r   )rj   rË   r~   r“   r=   ©r#   r!  r‡   r"  r   rÍ   r†   r   r   r$   Ú_output_vertical_hanging_indentÛ  s   úúz+SortImports._output_vertical_hanging_indentc                 C   sš   ||   |d¡| j | | d¡ 7 }|rB| d¡}d ||¡}	t|	 | j¡d ƒ}
|s-|r1|
d7 }
|
|kr>d || j||¡}	|	}|s| jd rK|d7 }|S )	Nr   r   z{0}, {1}r>   r
   z{0},{1}{2}{3}rÑ   rÒ   )rË   r~   r’   rj   r   r   r=   )r#   r!  r‡   r"  r   rÍ   r†   Zneed_trailing_charr#  r$  Zcurrent_line_lengthr   r   r$   Ú_output_vertical_grid_commonå  s   $
ö
z(SortImports._output_vertical_grid_commonc              	   C   s   |   ||||||d¡d S ©NTrÓ   )r+  r)  r   r   r$   Ú_output_vertical_grid÷  s
   ÿÿz!SortImports._output_vertical_gridc              	   C   ó    |   ||||||d¡| j d S r,  ©r+  r~   r)  r   r   r$   Ú_output_vertical_grid_groupedû  ó   ÿÿÿz)SortImports._output_vertical_grid_groupedc              	   C   r.  )NFrÓ   r/  r)  r   r   r$   Ú&_output_vertical_grid_grouped_no_commaÿ  r1  z2SortImports._output_vertical_grid_grouped_no_commac           	      C   s²   d  |d |¡¡}d |¡}|r.t|ƒt| jd ƒ d t|ƒ |kr-d  || jd |¡S nt|ƒ|kr6|S |rPd|v rFd  || jd |¡S d  || jd |¡S d	  || jd ¡S )
Nr  rñ   r   r   r
   rÉ   rÖ   z{0}{1} NOQA {2}rÔ   )rj   r“   r   r=   )	r#   r!  r‡   r"  r   rÍ   r†   ÚretvalZcomment_strr   r   r$   Ú_output_noqa  s   
&ÿzSortImports._output_noqac                 C   sV   |du rg }d}|   d¡}|dkr&| | |d d…  ¡ ¡ d}| d|… } | ||fS )z"Removes comments from import line.NFr«   r>   r
   T)r­   rƒ   ra   )rª   r†   Únew_commentsÚcomment_startr   r   r$   rÊ     s   

zSortImports._strip_commentsc                 C   sH   |   ¡ } |  d¡r|  dd¡} |  dd¡} | S |  d¡r"|  dd¡} | S )Nr²   r   ú import rÎ   r±   )ra   r+   rT   )Úimport_liner   r   r$   r    #  s   

ýzSortImports._format_simplifiedc                 C   sX   |   ¡ } |  d¡s*|  d¡s*d| vrd | ¡S |  d¡}| d¡}d d |¡|¡S | S )Nr²   r±   rÎ   rß   r>   zfrom {0} import {1})ra   r+   rj   r   r’   r“   )r8  r  Úendr   r   r$   r(   .  s   


zSortImports._format_naturalc                 C   s\  | j }| jdkr| d¡rd| _dS | jr(| d¡r|| jv r(d| _| jd | _d|v s0d|v r¦d}| jdkrE| d¡sA| d¡rE| j| _|t|ƒk r¦|| d	krV|d7 }nF| j ru|||t| j ƒ … | j krtd| _ | j| jk rt| j| _n'|| d
v r•|||d … }|dv r|| _ |d7 }n|| | _ n|| dkrœn
|d7 }|t|ƒk sK|p­| j p­| jS )Nr
   r«   TFr   r   r   r>   ú\)r   r   r  )ú"""ú'''rÏ   )r  rŒ   r+   Ú_in_top_commentrd   r   rŽ   r   )r#   rª   Ú	skip_linerŒ   Z
long_quoter   r   r$   r  :  s@   
€
ïzSortImports._skip_linec                 C   sp   |  dd¡}dD ]}|  |d¡}q| ¡ }dD ]}||v r"| |¡ qd |¡}|  dd¡}|  dd¡  dd	¡S )
NZ_importz[[i]])r:  r   rÓ   rÒ   r   )r7   Úimportú{ ú{|ú }ú|})rT   r   rù   r“   )r#   Úimport_stringZremove_syntaxZimport_listr,   r   r   r$   Ú_strip_syntax]  s   
€
zSortImports._strip_syntaxc              	   C   s\	  d| _ d| _|  ¡ s¬|  ¡  }}| dd¡}| dd¡ dd¡}| dd	¡}| j}|  |¡}|| jv rB|sB| jd
krA| jd | _qd|v rb| 	d¡rb| 
d¡d
  
¡ d  ¡ }g | j|< || j|< d|v rdd„ | 
d¡D ƒD ]}|r€| 	d¡s€| 	d¡s€d}qp|  |¡}|rŠ|r‘| j |¡ qdd„ | 
d¡D ƒD ]	}|  |¡}|s¬| j |¡ q›| jd
kr·| jd | _i }|  |¡\}	}
}dd„ |  |	¡ ¡  
d¡D ƒ}|dkrêt|ƒdkrê|d dkrê|rê|
d ||d
 < d| 
d¡d v rC|  ¡ sC| ¡  d¡sB|  ¡ sB|  |  ¡ |
¡\}}
}|  |¡ ¡ }|dkr.|r.d|vr.|r.|
d
 ||< |	| j| 7 }	| ¡  d¡sB|  ¡ rnã| ¡  d¡r&|  |  ¡ |
¡\}}
}d| 
d¡d v rÜd| 
d¡d vrÜ|  ¡ sÜ|  |¡ ¡ }|dkrŒ|rŒd|vrŒ|rŒ|
d
 ||< |	| j| 7 }	| ¡  d¡sÜ|  ¡ sÜ|  |  ¡ |
¡\}}
}|  |¡ ¡ }|dkrÈ|rÈd|vrÈ|rÈ|
d
 ||< |	| j| 7 }	| ¡  d¡sÜ|  ¡ r |  |¡ ¡ }|dkrù|rùd|vrù|rù|
d
 ||< |	 ¡  d¡s	| ¡  	d¡r|	| j| 7 }	n|	 ¡  d¡d | ¡  }	| ¡  d¡sK|dkrV|	 dd ¡}	|	 
d!¡}|d  
d¡}d! |d d d" |dd#… ¡ g|dd#…  ¡}	d$d„ |  |	¡ 
¡ D ƒ}d%|v rÂ| d%¡d t|ƒk rÂd%|v rÂ| d%¡}|dkr˜|d d& ||d   }||d  | j|< n||d  }||d  | j|< | jd' s¶|
| jd( |< g }
|||d …= d%|v sx|dkrÓ| d¡}|  |¡}| jd) rßtd*||f ƒ |d"krìtd+  ||¡ƒ | j!| | }|D ]}| "|¡}|r|| jd,  #|i ¡|< |
 |
 |¡¡ qõ|
r#| jd  #|g ¡ $|
¡ t| jƒt%| j| j&d dƒd kr¼| jrA| jd
  ¡ pBd"}| 	d¡r¢| d-¡s¢| d.¡s¢d|vr¢| jd/ d  #|g ¡ 'd| j d
¡¡ t| jƒt%| jd | j&d dƒd kr‰| jd
  ¡ }nd"}| 	d¡r¢| d-¡s¢| d.¡s¢d|vsZ|d | jkr¼|  jt| jd/ d  "|g ¡ƒ8  _||vrÆt(ƒ ||< ||  )d0d„ |D ƒ¡ q›|D ]Ï}|
rã|
| jd( |< d#}
t| jƒt%| j| j&d dƒd krz| jr| jd
  ¡ pd"}| 	d¡r_| d-¡s_| d.¡s_d|vr_| jd/ d(  #|g ¡ 'd| j d
¡¡ t| jƒdkrFt| jƒ| j&krF| jd
  ¡ }nd"}| 	d¡r_| d-¡s_| d.¡s_d|vs| jd | jkrz|  jt| jd/ d(  "|g ¡ƒ8  _|  |¡}| jd) rtd1||f ƒ |d"krštd+  ||¡ƒ d#| j!| | |< qÕq›|  ¡ rd#S d#S )2z9Parses a python file taking out and categorizing imports.Fzfrom.import zfrom . import r   r   zimport*zimport *z	 .import z
 . import r>   r
   zisort:imports-r«   r   rð   c                 s   ó    | ]}|  ¡ V  qd S r£   r  ©r!   r%  r   r   r$   r÷   €  r  z%SortImports._parse.<locals>.<genexpr>r²   r±   Tc                 s   rF  r£   r  rê   r   r   r$   r÷   ‰  r  c                 S   s   g | ]}|r|‘qS r   r   rG  r   r   r$   r%   “  r  z&SortImports._parse.<locals>.<listcomp>r7   rÏ   rî   r   rÓ   r:  z importzimport(zimport (r7  r   Nc                 S   s    g | ]}|  d d¡  dd¡‘qS )rA  r@  rC  rB  )rT   )r!   Úitemr   r   r$   r%   ¾  s     ÚasrÎ   rí   r6   r/   z)from-type place_module for %s returned %sz[WARNING: could not place module {0} of line {1} -- Do you need to define a default section?r8   r;  r<  r9   c                 s   s    | ]}|d fV  qd S r£   r   )r!   rã   r   r   r$   r÷   î  r  z)else-type place_module for %s returned %s)*r  r=  r´   r°   rT   rŒ   r  rd   r   r+   r   Úupperrb   rc   r³   r…   rƒ   rÊ   rE  ra   r   rÛ   r~   ÚrstriprÚ   r“   rˆ   r=   r†   r’   r¯   ri   rj   r‡   rW   Ú
setdefaultrà   rû   r   r  r   r]   )r#   Zraw_linerª   Zstatement_indexr>  r    r%  Zimport_typeZnested_commentsrD  r†   r5  Zstripped_liner  rë   r‡   rŒ   rã   Zimport_fromZplaced_moduleÚrootÚimport_nameZassociated_commentÚlastr   r   r$   r   i  s:  




€


$ û€2  û  é

2ÿ"



õ



þ
€$$ÿ&($úÿ$

$$ÿ
ÿ"$ùÿ$

þæ üzSortImports._parse)
NNNFFFNFr   T)FFNr  r£   )%Ú__name__Ú
__module__Ú__qualname__r—   rh   r¢   Úpropertyr¤   r˜   Ústaticmethodr•   r¯   r°   r³   r´   rÇ   rË   rÙ   rä   r   rú   r‘   r  r'  r(  r*  r+  r-  r0  r2  r4  rÊ   r    r(   r  rE  r   r   r   r   r$   r   .   sV    
ÿ Q


	
,{~	



#r   r.   c                 C   sR   t  d¡}t| dƒD ]\}}t  ||¡}|r|d  d¡  S |dkr& |S q
|S )Ns   coding[:=]\s*([-\w.]+)r
   r   ÚasciirÏ   )r¿   r”   r  Úfindallrx   )r¬   ÚdefaultÚpatternÚline_numberrª   rÁ   r   r   r$   rm     s   
ýrm   )r.   )Ú__doc__Ú
__future__r   r   r   r   rr   rR   rk   r‰   rL   r¿   r{   Úcollectionsr   r   r   Údifflibr	   r   r   Zfindersr   Znaturalr   Z	pie_slicer   Úobjectr   rm   r   r   r   r$   Ú<module>   s2           f