B
    0zfK#                 @   sj   d Z ddlmZmZ ddlZddlZddlZddlZddlm	Z	 dZ
G dd dejZG dd	 d	eZdS )
z1Extension for flake8 to test string format usage.    )print_functionunicode_literalsN)	Formatterz0.3.0c                   s|   e Zd ZdZ f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 fddZ  ZS )TextVisitorz
    Node visitor for bytes and str instances.

    It tries to detect docstrings as string of the first expression of each
    module, class or function.
    c                s   t t|   g | _i | _d S )N)superr   __init__nodescalls)self)	__class__ W/home/ankuromar296_gmail_com/.local/lib/python3.7/site-packages/flake8_string_format.pyr      s    zTextVisitor.__init__c             C   s$   t |dsd|_|  j|g7  _d S )Nis_docstringF)hasattrr   r   )r
   noder   r   r   	_add_node   s    
zTextVisitor._add_nodec             C   s,   t jf}tjd dkr"|t jf7 }t||S )Nr      )astStrsysversion_infoBytes
isinstance)r
   r   typr   r   r   is_base_string$   s    zTextVisitor.is_base_stringc             C   s   |  | d S )N)r   )r
   r   r   r   r   	visit_Str*   s    zTextVisitor.visit_Strc             C   s   |  | d S )N)r   )r
   r   r   r   r   visit_Bytes-   s    zTextVisitor.visit_Bytesc             C   s(   x|j D ]}| | qW | | d S )N)Zdecorator_listvisit_visit_body)r
   r   	decoratorr   r   r   _visit_definition0   s    zTextVisitor._visit_definitionc             C   sh   |j rJt|j d tjrJ| |j d jrJd|j d j_| |j d j x|j D ]}| | qRW dS )z
        Traverse the body of the node manually.

        If the first node is an expression which contains a string or bytes it
        marks that as a docstring.
        r   TN)bodyr   r   Exprr   valuer   r   )r
   r   Zsub_noder   r   r   r   9   s    zTextVisitor._visit_bodyc             C   s   t |jtjr| |j d S )N)r   r#   r   Call
visit_Call)r
   r   r   r   r   
visit_ExprH   s    zTextVisitor.visit_Exprc             C   s   |  | d S )N)r   )r
   r   r   r   r   visit_ModuleN   s    zTextVisitor.visit_Modulec             C   s   |  | d S )N)r    )r
   r   r   r   r   visit_ClassDefQ   s    zTextVisitor.visit_ClassDefc             C   s   |  | d S )N)r    )r
   r   r   r   r   visit_FunctionDefU   s    zTextVisitor.visit_FunctionDefc                s   t |jtjr|jjdkr| |jjr<|df| j|jj< nHt |jjtjr|jjj	dkr|j
r| |j
d r|df| j|j
d < tt| | d S )NformatFstrr   T)r   funcr   	Attributeattrr   r#   r	   Nameidargsr   r   generic_visit)r
   r   )r   r   r   r%   Y   s    zTextVisitor.visit_Call)__name__
__module____qualname____doc__r   r   r   r   r   r    r   r&   r'   r(   r)   r%   __classcell__r   r   )r   r   r      s   	r   c               @   sf   e Zd Ze ZedZeZ	dZ
ddddddd	d
ddd
Zdd Zdd Zdd Zdd Zdd ZdS )StringFormatCheckerz^((?:\s|.)*?)(\..*|\[.*\])?$zflake8-string-formatz/format string does contain unindexed parametersz+docstring does contain unindexed parametersz.other string does contain unindexed parametersz(format call uses too large index ({idx})z'format call uses missing keyword ({kw})z7format call uses keyword arguments but no named entriesz;format call uses variable arguments but no numbered entriesz7format call uses implicit and explicit indexes togetherz)format call provides unused index ({idx})z*format call provides unused keyword ({kw}))
e   f   g                  i-  i.  c             C   s
   || _ d S )N)tree)r
   rA   filenamer   r   r   r   z   s    zStringFormatChecker.__init__c             C   s   |  ||jrdndS )Nr:   r;   )_generate_errorr   )r
   r   r   r   r   _generate_unindexed}   s    z'StringFormatChecker._generate_unindexedc             K   sX   t jd d dkr&t|tjr&|jj}d|| j| }|jf |}|j	|j
|t| fS )N   )rE      r   zP{0} {1})r   r   r   r   r$   r,   r#   r*   ERRORSlineno
col_offsettype)r
   r   codeparamsmsgr   r   r   rC      s
    z#StringFormatChecker._generate_errorc          
   C   s   t  }t }d}d}yzxt| j|D ]d\}}}}	|d k	r&|	d ksJ|	dkr&|s`tt|}d}nd}|| |dd | j|D  q&W W n* t	k
r }
 zt  ddfS d }
~
X Y nX |||fS d S )NFZrsaTc             s   s"   | ]}|d  dk	r|d  V  qdS )   Nr   ).0Zparsed_specr   r   r   	<genexpr>   s   z1StringFormatChecker.get_fields.<locals>.<genexpr>)
set	itertoolscount
_FORMATTERparser+   nextaddupdate
ValueError)r
   stringfieldsZcntimplicitexplicitliteralfieldspecconver   r   r   
get_fields   s"    

zStringFormatChecker.get_fieldsc             c   s  t  }|| j t|jt|j r*tx|jD ]}|j}tj	d dkrt
|try|d}W n$ tk
r } zw4W d d }~X Y nX | |\}}}|r||jkr|jrt| |dV  n| |V  ||jkr4|j| \}}	t }
t }xl|D ]d}| j|}yt|d}W n tk
r6   d}Y nX |dkrN|
| q||d qW tdd |jD }t|j}|	r|d8 }tj	d	k rt|j}t|j}n:d |k}td
d |jD }|r|d  |r||8 }|r|s| |dV  |r|
s| |dV  |s|sx.t |
D ]"}||kr4| j|d|dV  q4W x.t |D ]"}||krd| j|d|dV  qdW x.t!|D ]"}||
kr| j|d|dV  qW x*|D ]"}||kr| j|d|dV  qW |r4|r4| |dV  q4W d S )Nr   r   asciir9   rN   c             s   s   | ]}|j V  qd S )N)arg)rO   keywordr   r   r   rP      s    z*StringFormatChecker.run.<locals>.<genexpr>)rE      c             s   s   | ]}t |tjrd V  qdS )rN   N)r   r   Starred)rO   rf   r   r   r   rP      s    r>   r?   r<   )idxr=   )kwi-  i.  r@   )"r   r   rA   rQ   r	   r   AssertionErrorsr   r   r   bytesdecodeUnicodeDecodeErrorrc   r   rC   rD   FIELD_REGEXmatchintgrouprY   rW   keywordslenr1   boolkwargsZstarargssumdiscardsortedrange)r
   visitorr   textrb   r[   r\   r]   callZstr_argsnumbersnamesnameZfield_matchnumberru   num_argsZ
has_kwargsZhas_starargsrf   rg   r   r   r   run   s~    













zStringFormatChecker.runN)r3   r4   r5   r   rT   recompilerq   __version__versionr   rG   r   rD   rC   rc   r   r   r   r   r   r8   e   s&   
	r8   )r6   
__future__r   r   r   rR   r   r   rZ   r   r   NodeVisitorr   objectr8   r   r   r   r   <module>   s   T