B
    /zf                 @   s$  d 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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ZddlZdZedZde_eejejejgZe	dZe	dZdZd	d
 Z dd Z!dddhZ"dddddddddddddhZ#ee! e" e#B 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,G d-d. d.Z-G d/d0 d0ej.j/Z0d1d2 Z1dd4d5Z2dd6d7Z3G d8d9 d9Z4d:d; Z5d<d= Z6e$fd>d?Z7d@dA Z8G dBdC dCe4Z9ddEdFZ:dGdH Z;dIdJ Z<ddKdLZ=dMdN Z>dOdP Z?ddQdRZ@ddSdTZAddUdVZBdWdX ZCdYdZ ZDdd[d\ZEdd]d^ZFd_d` ZGdadb ZHddcddZIdeJdedfdgZKdeJdedhdiZLddldmZMddndoZNdpdq ZOdrds ZPdtdu ZQdvdw ZRdxdy ZSdzd{ ZTd|d} ZUd~d ZVdd ZWdd ZXdd ZYdeJdeddZZdd Z[e\dkr e]e[  dS )zDRemoves unused imports and unused variables as reported by pyflakes.    Nz1.7.8	autoflakeFz^\s*except [\s,()\w]+ as \w+:$z^#!.*\bpython[3]?\b\s*$i   c              c   sl   t  } ddg}xV|D ]N}|| kr| | }t|E dH  tj|d}tj|rt|E dH  qW dS )z Yield paths to standard modules.stdlib
platstdlibNzlib-dynload)	sysconfig	get_pathsoslistdirpathjoinisdir)pathsZ
path_names	path_namer	   Zdynload_path r   L/home/ankuromar296_gmail_com/.local/lib/python3.7/site-packages/autoflake.pystandard_paths9   s    
r   c              c   sL   xFt  D ]<} | dsd| kr qd| kr4| ds4q| dd V  qW dS )zYield standard module names._-.)sopyZpycr   N)r   
startswithendswithsplit)namer   r   r   standard_package_namesI   s    r   Zantigravityrlcompleterthisdatetimegrpiojsonmathmultiprocessingparserpwdstringoperatorr   systimec             c   s(   x"| D ]}t |tjjr|jV  qW dS )z%Yield line numbers of unused imports.N)
isinstancepyflakesmessagesUnusedImportlineno)r+   messager   r   r   unused_import_line_numbersm   s    
r/   c             c   sT   d}xJ| D ]B}t |tjjr
t|t|}|r
| dd }|j|fV  q
W dS )z4Yield line number and module name of unused imports.z	\'(.+?)\'   N)	r)   r*   r+   r,   researchstrgroupr-   )r+   patternr.   module_namer   r   r   unused_import_module_namet   s    
r8   c             c   s(   x"| D ]}t |tjjr|jV  qW dS )z'Yield line number of star import usage.N)r)   r*   r+   ZImportStarUsedr-   )r+   r.   r   r   r   star_import_used_line_numbers   s    
r9   c             c   sB   x<| D ]4}t |tjjr|jd }|jd }|j||fV  qW dS )zBYield line number, undefined name, and its possible origin module.r   r0   N)r)   r*   r+   ZImportStarUsagemessage_argsr-   )r+   r.   undefined_namer7   r   r   r    star_import_usage_undefined_name   s
    


r<   c             c   s(   x"| D ]}t |tjjr|jV  qW dS )z'Yield line numbers of unused variables.N)r)   r*   r+   ZUnusedVariabler-   )r+   r.   r   r   r   unused_variable_line_numbers   s    
r=   c             c   s   dd | D } | rt | }|d}xf| D ]Z\}} d}x2| D ]*}||jd  }|jd }t||s@d}q@W |r.x| D ]}|jV  qxW q.W dS )	z%Yield line numbers of duplicate keys.c             S   s   g | ]}t |tjjr|qS r   )r)   r*   r+   ZMultiValueRepeatedKeyLiteral).0r.   r   r   r   
<listcomp>   s   z.duplicate_key_line_numbers.<locals>.<listcomp>
Tr0   r   FN)create_key_to_messages_dictr   itemsr-   r:   dict_entry_has_key)r+   sourceZkey_to_messageslineskeyZgoodr.   liner   r   r   duplicate_key_line_numbers   s    




rH   c             C   s4   t dd }x | D ]}||jd  | qW |S )z0Return dict mapping the key to list of messages.c               S   s   g S )Nr   r   r   r   r   <lambda>       z-create_key_to_messages_dict.<locals>.<lambda>r   )collectionsdefaultdictr:   append)r+   
dictionaryr.   r   r   r   rA      s    
rA   c          
   C   s>   t  }ytjj| d|d W n tttfk
r6   Y nX |jS )zReturn messages from pyflakes.z<string>)filenamereporter)ListReporterr*   apicheckAttributeErrorRecursionErrorUnicodeDecodeErrorr+   )rD   rP   r   r   r   rS      s    rS   c               @   s   e Zd ZdZdd ZdS )StubFilezStub out file for pyflakes.c             G   s   dS )z	Stub out.Nr   )selfr   r   r   r   write   s    zStubFile.writeN)__name__
__module____qualname____doc__rY   r   r   r   r   rW      s   rW   c               @   s    e Zd ZdZdd Zdd ZdS )rQ   z%Accumulate messages in messages list.c             C   s"   t  }tjj| || g | _dS )z:Initialize.

        Ignore errors from Reporter.
        N)rW   r*   rP   Reporter__init__r+   )rX   ignorer   r   r   r_      s    zListReporter.__init__c             C   s   | j | dS )zAccumulate messages.N)r+   rM   )rX   r.   r   r   r   flake   s    zListReporter.flakeN)rZ   r[   r\   r]   r_   ra   r   r   r   r   rQ      s   	rQ   c             C   sn   d| kst d| kst d| ks$t d| ks0t |  drL|  d }ndS |dd	 }d
|ksjt |S )z(Return package name in import statement.\();)importfromr0   Nr   r    )AssertionErrorlstripr   r   )rG   wordpackager   r   r   extract_package_name   s    rm    c             C   s$   xdD ]}|| krdS qW t | |S )z/Return True if import is spans multiples lines.z()T)multiline_statement)rG   previous_linesymbolr   r   r   multiline_import   s    
rr   c          	   C   sb   xdD ]}|| krdS qW t | }ytt|j | dS  ttj	fk
r\   dS X dS )z5Return True if this is part of a multiline statement.z\:;Trb   N)
r   StringIOlisttokenizegenerate_tokensreadlinerstripr   SyntaxError
TokenError)rG   rp   rq   sior   r   r   ro      s    

ro   c               @   s    e Zd ZdZdd Zdd ZdS )
PendingFixzAllows a rewrite operation to span multiple lines.

    In the main rewrite loop, every time a helper function returns a
    ``PendingFix`` object instead of a string, this object will be called
    with the following line.
    c             C   s   t |g| _dS )z!Analyse and store the first line.N)rK   dequeaccumulator)rX   rG   r   r   r   r_     s    zPendingFix.__init__c             C   s   t ddS )zProcess line considering the accumulator.

        Return self to keep processing the following lines or a string
        with the final result of all the lines processed at once.
        z'Abstract method needs to be overwrittenN)NotImplementedError)rX   rG   r   r   r   __call__  s    zPendingFix.__call__N)rZ   r[   r\   r]   r_   r   r   r   r   r   r|     s   r|   c             C   s0   | d}| | }|dko*||kp*|dk }|S )z?Return True if a char appears in the line and is not commented.#r   )find)charrG   Zcomment_indexZ
char_indexZvalid_char_in_liner   r   r   _valid_char_in_line  s
    

r   c             C   s   | d dkrdS |  dd S )z9Return the name of the top level module in the hierarchy.r   r   z%LOCAL_MODULE%)r   )r7   r   r   r   _top_module'  s    r   c                s    fdd| D S )zADiscard unused modules that are not safe to remove from the list.c                s   g | ]}t | kr|qS r   )r   )r>   x)safe_to_remover   r   r?   0  s    z&_modules_to_remove.<locals>.<listcomp>r   )Zunused_modulesr   r   )r   r   _modules_to_remove.  s    r   c             C   s   |  tjd p| S )as  Extract the module identifier inside the segment.

    It might be the case the segment does not have a module (e.g. is composed
    just by a parenthesis or line continuation and whitespace). In this
    scenario we just keep the segment... These characters are not valid in
    identifiers, so they will never be contained in the list of unused modules
    anyway.
    z,\())stripr%   
whitespace)segmentr   r   r   _segment_module3  s    	r   c               @   s|   e Zd ZdZedZedZedZedej	Z
edZdded	fd
dZdddZdd Zdd ZdddZdS )FilterMultilineImporta&  Remove unused imports from multiline import statements.

    This class handles both the cases: "from imports" and "direct imports".

    Some limitations exist (e.g. imports with comments, lines joined by ``;``,
    etc). In these cases, the statement is left unchanged to avoid problems.
    z\bimport\b\s*z^\s*z\bfrom\s+([^ ]+)z.([^,\s]+(?:[\s\\]+as[\s\\]+[^,\s]+)?[,\s\\)]*)z[^,\s]+r   Frn   c             C   s   || _ d|k| _| jj|dd\| _}| j| j}|rB|dnd| _d| _	|s|| jrnt
| j|krnd| _	nt| j || _ d|krd| _	| | t| | dS )z8Receive the same parameters as ``filter_unused_import``.rc   r0   )maxsplitNFTrb   )removeparenthesized	IMPORT_REr   from_BASE_REr3   r5   basegive_upr   r   analyzer|   r_   )rX   rG   unused_moduleremove_all_unused_importsr   rp   importsmatchr   r   r   r_   R  s    	

zFilterMultilineImport.__init__Nc             C   s*   |p| j d }| jrtd|S td| S )z6Return True if the multiline import statement is over.r1   rd   rb   )r~   r   r   )rX   rG   r   r   r   is_overp  s    
zFilterMultilineImport.is_overc                s    t  fdddD rd| _dS )z8Decide if the statement will be fixed or left unchanged.c             3   s   | ]}| kV  qd S )Nr   )r>   ch)rG   r   r   	<genexpr>{  s    z0FilterMultilineImport.analyze.<locals>.<genexpr>z;:#TN)anyr   )rX   rG   r   )rG   r   r   y  s    zFilterMultilineImport.analyzec       	         s8  d |}t|}dd | j|D }dd |D }t|| j| jtt|krj| jd d | S d rt	t
||}|dtd  |dd  }d fd	d
t|D  | jrt fdd
dD r tjd |  t tjd dk }|r*| j| jd}|d | S | jd   S )z?Given a collection of accumulated lines, fix the entire import.rn   c             S   s   g | ]}|r|qS r   r   )r>   r   r   r   r   r?     s    z-FilterMultilineImport.fix.<locals>.<listcomp>c             S   s   g | ]}t |qS r   )r   )r>   r   r   r   r   r?     s    zimport Nr0   r1   c             3   s&   | ]\}\}}| | | V  qd S )N)replace)r>   imoduletemplate)keepr   r   r     s   z,FilterMultilineImport.fix.<locals>.<genexpr>c             3   s   | ]}| kV  qd S )Nr   )r>   r   )fixedr   r   r     s    z()z\(),r   pass)r
   get_line_ending
SEGMENT_REfindall_filter_importsr   r   lenr   rt   zip	enumerater   r   r   r%   r   INDENTATION_REr3   r5   )	rX   ZaccumulatedZold_importsendingsegmentsmodulesZ	templatesemptyindentationr   )r   r   r   fix~  s*    
 
zFilterMultilineImport.fixc             C   sP   |r| j | | | | |s(| S | jrD| jd d| j  S | | j S )z@Accumulate all the lines in the import and then trigger the fix.zimport rn   )r~   rM   r   r   r   r   r
   r   )rX   rG   r   r   r   r     s    

zFilterMultilineImport.__call__)N)N)rZ   r[   r\   r]   r2   compiler   r   r   Mr   ZIDENTIFIER_RESAFE_IMPORTSr_   r   r   r   r   r   r   r   r   r   ?  s    




	)r   r   c                s:   rd dkrdndfdd  fdd| D S )Nr1   r   rn   c                s    d kr| S   |  S )Nr   )r   )parentsepr   r   	full_name  s    z"_filter_imports.<locals>.full_namec                s   g | ]} |kr|qS r   r   )r>   r   )r   r   r   r   r?     s    z#_filter_imports.<locals>.<listcomp>r   )r   r   r   r   )r   r   r   r   r   r     s    r   c             C   s   t jd| dd\}}t jd|dd}t jd| d}t|||}|s^t| d t|  S |d7 }|d	t	| t|  S )
zParse and filter ``from something import a, b, c``.

    Return line without unused import modules, or `pass` if all of the
    module in import is unused.
    z
\bimport\br0   )r6   r%   r   z\bfrom\s+([^ ]+))r6   r%   z\s*,\s*r   zimport z, )
r2   r   r3   r5   r   r   get_indentationr   r
   sorted)rG   r   r   r   base_moduleZfiltered_importsr   r   r   filter_from_import  s    r   c                s   d| kst d| kst d| ks$t d| ks0t d| ks<t |  drNt t| s^| S tjd| dd	\ } d
7  st d fddt|dD S )z+Return line with imports on separate lines.rb   rc   rd   re   r   rg   z
\bimport\br0   )r6   r%   r   zimport rn   c                s   g | ]} |    qS r   )r   )r>   r   )r   newliner   r   r?     s    z#break_up_import.<locals>.<listcomp>,)ri   rj   r   r   r2   r   r
   r   )rG   r   r   )r   r   r   break_up_import  s"    r   c             c   s  t }|r|t|O }~t| }	|r*t }
ntt|	}
tdd }x"t|	D ]\}}|| | qNW |rt	d| st	d| stt
|	}t|dkrt }qg }x t|	D ]\}}}|| qW |st }nt }|rtt|	}nt }|r
tt|	| }nt }t|	}t| }d}d}xt| ddD ]\}}t|trZ||}nd	|krj|}nt||
krt||| |||d
}nR||krt||d}n:||krt||| ||| }n||krt||}n|}t|ts|V  |}q<W dS )z'Yield code with unused imports removed.c               S   s   g S )Nr   r   r   r   r   rI     rJ   zfilter_code.<locals>.<lambda>z\b__all__\bz\bdel\br0   rn   N)startr   )r   r   r   rp   )drop_rhs)r   	frozensetrS   r/   rK   rL   r8   rM   r2   r3   r9   r   r<   r=   rH   get_messages_by_liner   rs   r   	readlinesr)   r|   filter_unused_importfilter_unused_variablefilter_duplicate_keyfilter_star_import)rD   additional_importsexpand_star_importsr   remove_duplicate_keysremove_unused_variablesremove_rhs_for_unused_variablesignore_init_module_importsr   r+   Zmarked_import_line_numbersZmarked_unused_moduleline_numberr7   Zmarked_star_import_line_numbersZundefined_namesr;   r   Zmarked_variable_line_numbersZmarked_key_line_numbersline_messagesr{   rp   resultrG   r   r   r   filter_code  s    










r   c             C   s    i }x| D ]}|||j < q
W |S )z3Return dictionary that maps line number to message.)r-   )r+   r   r.   r   r   r   r   `  s    
r   c             C   s    t t|}tdd|| S )z*Return line with the star import expanded.z\*z, )r   setr2   subr
   )rG   Z!marked_star_import_undefined_namer;   r   r   r   r   h  s    r   c             C   s   |   dr| S t| |r2t| ||||}| S |   d}d| krT|sTt| S t| }|sl||krl| S d| kr|s|tt| |S t| d t	|  S dS )z+Return line if used, otherwise return None.>rg   r   r   N)
rj   r   rr   r   r   rm   ri   r   r   r   )rG   r   r   r   rp   ZfiltZis_from_importrl   r   r   r   r   n  s(    	

r   c             C   s   t t| rt jdd| ddS t| |r,| S | ddkr| d}t|dksTt|d 	 }d|d krp| S t
|rd	t|  }|rt| | S |rd
S t| | S | S dS )z+Return line if used, otherwise return None.z	 as \w+:$:r0   )count=   r   r   r   rn   N)r2   r   EXCEPT_REGEXr   ro   r   r   r   ri   rj   is_literal_or_namer   r   )rG   rp   r   Z
split_linevaluer   r   r   r     s$    

r   c             C   s   |r|t |d krdS | S )zAReturn '' if first occurrence of the key otherwise return `line`.r   rn   )r   )rG   r.   r   Zmarked_line_numbersrD   rp   r   r   r   r     s    	r   c          	   C   sh   d| krdS t d| }|s dS yt|d}W n ttfk
rL   dS X t|dr`dS ||kS )zReturn True if `line` is a dict entry that uses `key`.

    Return False for multiline cases where the line should not be removed by
    itself.

    r   Fz\s*(.*)\s*:\s*(.*),\s*$r0   r   )r2   r   astliteral_evalr5   ry   
ValueErrorro   )rG   rF   r   Zcandidate_keyr   r   r   rC     s    rC   c          	   C   sD   yt |  dS  ttfk
r&   Y nX |  dkr8dS td| S )z,Return True if value is a literal or a name.T)zdict()zlist()zset()z^\w+\s*$)r   r   ry   r   r   r2   r   )r   r   r   r   r     s    
r   c             c   s   t | }d}d}d}d}d}xt|jD ]}|d }	|d d }
|d }|	tjko`| dk}|
d |krt||kr|	tkr|s|
d V  |r|
}t|}|tj	ko|
 d }|
 d	}|r|r|rq,n|
V  |	}|}| r,|}q,W dS )
z1Yield line numbers of unneeded "pass" statements.Nrn   r   r      r   r0   rb   )z'''z""")r   rs   ru   rv   rw   NAMEr   r   ATOMSINDENTrx   r   )rD   ignore_pass_after_docstringr{   Zprevious_token_typeZlast_pass_rowZlast_pass_indentationrp   Zprevious_non_empty_linetoken
token_typeZ	start_rowrG   Zis_passZis_trailing_passZis_pass_after_docstringr   r   r   useless_pass_line_numbers  s>    


r   c          	   c   sz   |rt  }n4yt t| |}W n  ttjfk
r>   t  }Y nX t| }x*t| ddD ]\}}||kr\|V  q\W dS )z-Yield code with useless "pass" lines removed.r0   )r   N)	r   r   ry   ru   rz   r   rs   r   r   )rD   ignore_pass_statementsr   Zmarked_linesr{   r   rG   r   r   r   filter_useless_pass   s    
r   c             C   s0   |   r(t| t|   }| d| S dS dS )zReturn leading whitespace.Nrn   )r   r   rj   )rG   non_whitespace_indexr   r   r   r   9  s    r   c             C   s,   t |  t |  }|sdS | |d S dS )zReturn line ending.rn   N)r   rx   )rG   r   r   r   r   r   B  s    r   c
             C   s^   | s| S d| krd}d}
x@d td t| |||||||d||	d}
|
| krRP |
} qW |
S )z)Return code with all filtering run on it.nonlocalFNrn   )r   r   r   r   r   r   r   )r   r   )r
   r   r   )rD   r   r   r   r   r   r   r   r   r   filtered_sourcer   r   r   fix_codeK  s0    
r   )returnc          	   C   sF   |dkrt j}t| }t| |d}t|| ||d ||dS Q R X dS )zRun fix_code() on a file.N)encodingwrite_to_stdout)r'   stdoutdetect_encodingopen_with_encoding	_fix_file)rO   argsstandard_outr   
input_filer   r   r   fix_file}  s    r   c             C   s  |   }|}tj|dk}|d r.|r.d}	nd}	t|d|krL|d dnd |d |d |d	 |d
 |d |	|d |d d
}
||
krf|d r|| dtj  dS |d rtt	
| t	
|
 |}|d| dS |r||
 nl|d r4t|d|d}||
 W d Q R X td| n0tt	
| t	
|
 |}|d| nT|rx||
 nB|d s|d r|d s|| dtj  ntd| dS )Nz__init__.pyr   TFr   r   r   r   r   r   r   r   r   )	r   r   r   r   r   r   r   r   r   rS   z#: Unused imports/variables detectedr0   
check_diffrn   in_placew)moder   zFixed %squietz: No issues detected!zClean %s: nothing to fixr   )readr   r	   basenamer   r   rY   linesepget_diff_textr   rs   r   r
   r   _LOGGERinfodebug)r   rO   r   r   r   r   rD   Zoriginal_sourceZ
isInitFiler   r   diffZoutput_filer   r   r   r     sd    

r   rr1   c             C   s    |st | |d}t| ||ddS )z,Return opened file with a specific encoding.)limit_byte_checkrn   )r   r   r   )r   open)rO   r   r   r  r   r   r   r     s    r   c          
   C   sd   yDt | d0}t|j}t| |}|| W dQ R X W dQ R X |S  tttfk
r^   dS X dS )zReturn file encoding.rbNzlatin-1)r	  _detect_encodingrw   r   r   LookupErrorry   rV   )rO   r  r   r   r   r   r   r     s    
r   c          
   C   s2   yt | d }|S  tttfk
r,   dS X dS )zReturn file encoding.r   zlatin-1N)ru   r   r  ry   rV   )rw   r   r   r   r   r    s
    r  c             C   sX   d}t j| |d| d| |d}d}x.|D ]&}||7 }||s*||d | 7 }q*W |S )z0Return text of unified diff between old and new.r@   z	original/zfixed/)Zlinetermrn   z\ No newline at end of file)difflibZunified_diffr   )oldnewrO   r   r  textrG   r   r   r   r     s    

r  c             C   s   dd |  dD S )zReturn a set of strings.c             S   s   h | ]}|  r|  qS r   )r   )r>   r  r   r   r   	<setcomp>  s    z)_split_comma_separated.<locals>.<setcomp>r   )r   )r%   r   r   r   _split_comma_separated  s    r  c          	   C   sv   |  drdS y<t| dtd$}|t}|s2dS | d }W dQ R X W n ttfk
rb   dS X t|srdS dS )z'Return True if filename is Python file.z.pyTN)r  Fr   )	r   r   MAX_PYTHON_FILE_DETECTION_BYTESr   
splitlinesOSError
IndexErrorPYTHON_SHEBANG_REGEXr   )rO   fr  
first_liner   r   r   is_python_file  s"    


r  c             C   sL   t j| }|drdS x,|D ]$}t||r4dS t| |r dS q W dS )z,Return True if file matches exclude pattern.r   TF)r   r	   r   r   fnmatch)rO   exclude	base_namer6   r   r   r   is_exclude_file3  s    

r  c             C   s6   t | |rtd|  dS tj| s2t| s2dS dS )z4Return True if file is okay for modifying/recursing.z&Skipped %s: matched to exclude patternFT)r  r  r  r   r	   r   r  )rO   r  r   r   r   
match_fileB  s    
r  c             #   s   x| r|  d}|rptj|rpxlt|D ]>\}}|  fdd|D 7 }  fdd|D |dd< q,W qt| s|V  qtd| qW dS )zYield filenames.r   c                s.   g | ]&}t tj| rtj|qS r   )r  r   r	   r
   )r>   r  )r  rootr   r   r?   U  s   zfind_files.<locals>.<listcomp>c                s$   g | ]}t tj| r|qS r   )r  r   r	   r
   )r>   d)r  r   r   r   r?   ]  s   Nz&Skipped %s: matched to exclude pattern)popr   r	   r   walkr  r  r  )	filenames	recursiver  r   directorieschildrenr   )r  r   r   
find_filesN  s    


r(  c          	   C   sZ   yddl }W n tk
r(   ddl}Y nX t| d}||di ddS Q R X dS )z0Extract config mapping from pyproject.toml file.r   Nr
  Ztoolr   )tomllibModuleNotFoundErrortomlir	  loadget)Ztoml_file_pathr)  r  r   r   r   process_pyproject_tomlk  s    r.  c             C   s0   ddl }| }||  |ds(dS |d S )z(Extract config mapping from config file.r   Nr   )configparserConfigParserr   has_section)config_file_pathr/  readerr   r   r   process_config_filev  s    

r4  c             C   s   t td}tjdd | d D }d }xnxH| D ]<\}}tjtj||}tj|r4||}|d k	r4P q4W |d k	r~P tj|\}}|s*P q*W |S )N)zpyproject.tomlz	setup.cfgc             S   s   g | ]}t j|qS r   )r   r	   abspath)r>   filer   r   r   r?     s    z+find_and_process_config.<locals>.<listcomp>files)	r.  r4  r   r	   
commonpathrB   r
   isfiler   )r   ZCONFIG_FILESZconfig_pathconfigconfig_file	processorr2  tailr   r   r   find_and_process_config  s$    r>  c             C   s  ddddddddd}d| krRt | d  }t|}|sZtd| | dfS nt| }dddd	d
dddddddddh}i }|dk	rPx| D ]\}}|dd}||krt	|t
r|| |}t	|tstd| | dfS |||< qt	|tr$tdd |D r$ddd |D }t	|t
sDtd| | dfS |||< qW i }	ddh}
xH|
D ]@}dd ||| |fD }d|}|d krb||	|< qbW d!d" |D }||| |	dfS )#z*Merge configuration from a file into args.TF)1yestrueon0nofalseoffr;  zcan't parse config file '%s'rS   r   r   r   r   r   r   r   r%  r   r   r   r   r   Nr   r   z+'%s' in the config file should be a booleanc             s   s   | ]}t |tV  qd S )N)r)   r4   )r>   valr   r   r   r     s    z+merge_configuration_file.<locals>.<genexpr>r   c             s   s   | ]}t |V  qd S )N)r4   )r>   rG  r   r   r   r     s    zM'%s' in the config file should be a comma separated string or list of stringsr   r  c             s   s   | ]}|d k	r|V  qd S )Nr   )r>   vr   r   r   r     s    rn   c             S   s   i | ]
}d |qS )Fr   )r>   argr   r   r   
<dictcomp>  s    z,merge_configuration_file.<locals>.<dictcomp>)pathlibPathresolver4  r  errorr>  rB   r   r)   r4   r-  lowerboolrt   allr
   )Z	flag_argsZ
BOOL_TYPESr;  r:  Z
BOOL_FLAGSZconfig_argsr   r   rI  Zmerged_argsZmergeable_keysrF   valuesZdefault_argsr   r   r   merge_configuration_file  s    







rS  c             C   s  ddl }|jtd|jd}| }|jddddd	 |jd
dddd	 | }|jddd |jdddd	 |jddddd	 |jddtdddd |jdddd |jdddd	 |jd dd!d	 |jd"dd#d	 |jd$dd%d	 |jd&dd'd	 |jd(dd)d	 |jd*dd+d	 |jd,d-d.t d/ |jd0dd1d	 |jd2d3d4d5dd6d7 |jd8d9d:d;d< |jd=d>d?d@ |jdAdBdCdD | }|jdEdFddGd	 |jdHdIddJdKdL || dMd }	t	|	}	|dkrt
t  nZt
t| tjtjtjg}
y|
|	d5  }W n tk
r0   |
dN }Y nX t
| t|	\}	}|sRdMS |	dO rt|	dP stt
dQ dMS dR|	krt|	dR |	dR< n
t |	dR< |	dS dMk rt }tjdTkrt|dU}|pdM|	dS< tt|	dA }d}tt||	dV |	dR }|	dS dMks>t|dMks>|	dS dMks>dW|ks>|dk	rx|D ]}|dWkrv|t ||	d9 |	dX|pltj!dYO }nRy|t"||	|dZO }W n: t#k
r } zt
t$| |dMO }W dd}~X Y nX qDW nddl%}|&|	dS }g }x*|D ]"}|j't"||	fd[}|(| qW xZ|D ]R}y||) O }W n: t#k
rl } zt
t$| |dMO }W dd}~X Y nX qW W dQ R X |S )\z/Return exit status.

    0 means no error.
    r   Nr   )descriptionprogargument_defaultz-cz--check
store_truez'return error code if changes are needed)actionhelpz-cdz--check-diffz@return error code if changes are needed, also display file diffsz	--importsz{by default, only unused standard library imports are removed; specify a comma-separated list of additional modules/packages)rY  z--remove-all-unused-importszDremove all unused imports (not just those from the standard library)z-rz--recursivez"drill down directories recursivelyz-jz--jobsnzCnumber of parallel jobs; match CPU count if value is 0 (default: 0))typemetavardefaultrY  z	--excludeglobszCexclude file/directory names that match these comma-separated globs)r\  rY  z--expand-star-importszexpand wildcard star imports with undefined names; this only triggers if there is only one star import in the file; this is skipped if there are any uses of `__all__` or `del` in the filez--ignore-init-module-importsz0exclude __init__.py when removing unused importsz--remove-duplicate-keysz$remove all duplicate keys in objectsz--remove-unused-variableszremove unused variablesz!--remove-rhs-for-unused-variablesz@remove RHS of statements when removing unused variables (unsafe)z--ignore-pass-statementszignore all pass statementsz--ignore-pass-after-docstringz6ignore pass statements after a newline ending on '"""'z	--versionversionz	%(prog)s )rX  r_  z--quietz&Suppress output if there are no issuesz-vz	--verboser   	verbosityzEprint more verbose logs (you can repeat `-v` to make it more verbose))rX  destr]  rY  z--stdin-display-nameZstdin_display_namestdinz.the name used when processing input from stdin)ra  r]  rY  z--configr;  zQExplicitly set the config file instead of auto determining based on file location)ra  rY  r7  +zfiles to format)nargsrY  z-iz
--in-placez/make changes to files instead of printing diffsz-sz--stdoutr   z[print changed text to stdout. defaults to true when formatting stdin, or to false otherwise)rX  ra  rY  r0   r1   r   r   zaUsing --remove-rhs-for-unused-variables only makes sense when used with --remove-unused-variablesr  jobswin32<   r%  r   T)r   r   r   )r   r   )r   )*argparseArgumentParserr]   SUPPRESSadd_mutually_exclusive_groupadd_argumentint__version__
parse_argsvarsr  
addHandlerloggingNullHandlerStreamHandlerWARNINGINFODEBUGr  setLevelrS  rN  r  r   r   	cpu_countr'   platformminrt   r(  r   r   r   r   r  r4   r"   ZPoolZapply_asyncrM   r-  )argvr   standard_errorstandard_inputrh  r#   Zcheck_groupZimports_groupZoutput_groupr   Z	loglevelsZloglevelsuccessZworker_countr$  exit_statusr7  r   	exceptionr"   poolZfutsfutr   r   r   _main  sR   











"

*r  c               C   sZ   yt  t jt j W n tk
r(   Y nX yttjdtjtjdS  t	k
rT   dS X dS )zCommand-line entry point.N)r   r}  r~  r   )
signalSIGPIPESIG_DFLrT   r  r'   r|  stderrrb  KeyboardInterruptr   r   r   r   main  s    
r  __main__)rn   )rn   )Nr   )NFFFFFF)rn   )rn   F)rn   )F)FF)	NFFFFFFFF)N)N)r  r1   )r1   )N)^r]   r   rK   r  r  r   rr  r   rK  r2   r  r%   r'   r   ru   Zpyflakes.apir*   Zpyflakes.messagesZpyflakes.reporterrn  	getLoggerr  	propagater   r   NUMBERSTRINGr   r   r   r  r  r   r   ZIMPORTS_WITH_SIDE_EFFECTSZBINARY_IMPORTSr   r/   r8   r9   r<   r=   rH   rA   rS   rW   rP   r^   rQ   rm   rr   ro   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rC   r   r   r   r   r   r   rm  r   r   r   r   r  r  r  r  r  r  r(  r.  r4  r>  rS  r  r  rZ   exitr   r   r   r   <module>   s   



	

	

u
      
b
%
!
	
5 
	        
(E 

	] q
