
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3

  \“,  ã               @   s¤   d Z dZddlZddlZddlZddlZeedƒs:edƒ‚dddgZda	da
d	d
„ Zdd„ ZG dd„ deƒZdd„ ZG dd„ dƒZdd„ Zdd„ Zedkr eƒ  dS )a–  The Tab Nanny despises ambiguous indentation.  She knows no mercy.

tabnanny -- Detection of ambiguous indentation

For the time being this module is intended to be called as a script.
However it is possible to import it into an IDE and use the function
check() described below.

Warning: The API provided by this module is likely to change in future
releases; such changes may not be backward compatible.
Ú6é    NÚNLz4tokenize.NL doesn't exist -- tokenize module too oldÚcheckÚNannyNagÚprocess_tokensc              G   s:   d}x$| D ]}t jj|t|ƒ ƒ d}q
W t jjdƒ d S )NÚ ú Ú
)ÚsysÚstderrÚwriteÚstr)ÚargsÚsepÚarg© r   ú /usr/lib64/python3.6/tabnanny.pyÚerrprint#   s
    
r   c              C   s°   yt j tjdd … dƒ\} }W n* t jk
rH } zt|ƒ d S d }~X nX x0| D ](\}}|dkrhtd a|dkrPtd aqPW |s–tdtjd dƒ d S x|D ]}t|ƒ qœW d S )Né   Zqvz-qz-vzUsage:r   z[-v] file_or_directory ...)Úgetoptr
   ÚargvÚerrorr   Úfilename_onlyÚverboser   )Zoptsr   ÚmsgÚoÚar   r   r   r   Úmain*   s    
r   c               @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )r   zk
    Raised by process_tokens() if detecting an ambiguous indent.
    Captured and handled in check().
    c             C   s   |||  | _ | _| _d S )N)Úlinenor   Úline)Úselfr   r   r   r   r   r   Ú__init__A   s    zNannyNag.__init__c             C   s   | j S )N)r   )r    r   r   r   Ú
get_linenoC   s    zNannyNag.get_linenoc             C   s   | j S )N)r   )r    r   r   r   Úget_msgE   s    zNannyNag.get_msgc             C   s   | j S )N)r   )r    r   r   r   Úget_lineG   s    zNannyNag.get_lineN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   r"   r#   r$   r   r   r   r   r   <   s
   c       	   %   C   s"  t jj| ƒr�t jj| ƒ r�tr,td| f ƒ t j| ƒ}xT|D ]L}t jj| |ƒ}t jj|ƒrht jj|ƒ s€t jj|dd… ƒdkr<t	|ƒ q<W dS yt
j| ƒ}W n0 tk
rÎ } ztd| |f ƒ dS d}~X nX tdkrätd|  ƒ �zytt
j|jƒƒ W � nü t
jk
�r2 } ztd| |f ƒ dS d}~X nÊ tk
�rb } ztd	| |f ƒ dS d}~X nš tk
�rú } z||jƒ }|jƒ }t�r¶td
| |f ƒ td|f ƒ t|jƒ ƒ n6d| k�rÌd|  d } t�rÜt| ƒ nt| |t|ƒƒ dS d}~X nX W d|jƒ  X t�rtd| f ƒ dS )a~  check(file_or_dir)

    If file_or_dir is a directory and not a symbolic link, then recursively
    descend the directory tree named by file_or_dir, checking all .py files
    along the way. If file_or_dir is an ordinary Python source file, it is
    checked for whitespace related problems. The diagnostic messages are
    written to standard output using the print statement.
    z%r: listing directoryé   Nz.pyz%r: I/O Error: %sr   zchecking %r ...z%r: Token Error: %sz%r: Indentation Error: %sz)%r: *** Line %d: trouble in tab city! ***zoffending line: %rr   ú"z%r: Clean bill of health.éýÿÿÿ)ÚosÚpathÚisdirÚislinkr   ÚprintÚlistdirÚjoinÚnormcaser   ÚtokenizeÚopenÚOSErrorr   r   Úgenerate_tokensÚreadlineÚ
TokenErrorÚIndentationErrorr   r"   r$   r#   r   ÚreprÚclose)	ÚfileÚnamesÚnameÚfullnameÚfr   ZnagÚbadliner   r   r   r   r   J   sT    



  

c               @   sL   e Zd Zd\ZZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ ZdS )Ú
Whitespacez 	c       	      C   sÐ   || _ tjtj }}g }d } }}x~| j D ]t}||krJ|d }|d }q,||krž|d }|d }|t|ƒkrˆ|dg|t|ƒ d   }|| d ||< d}q,P q,W || _|| _t|ƒ|f| _t|ƒdk| _	d S )Nr   r   )
ÚrawrC   ÚSÚTÚlenÚnÚntÚtupleÚnormÚ	is_simple)	r    ZwsrE   rF   ÚcountÚbrH   rI   Zchr   r   r   r!   ž   s(    
zWhitespace.__init__c             C   s   | j \}}tt|ƒd |ƒS )Nr   )rK   ÚmaxrG   )r    rM   Útrailingr   r   r   Úlongest_run_of_spaces·   s    
z Whitespace.longest_run_of_spacesc             C   sL   | j \}}d}x*t|t|ƒƒD ]}||| ||   }qW |||| j   S )Nr   )rK   ÚrangerG   rI   )r    ÚtabsizerM   rP   ZilÚir   r   r   Úindent_level»   s
    
zWhitespace.indent_levelc             C   s   | j |j kS )N)rK   )r    Úotherr   r   r   ÚequalÒ   s    zWhitespace.equalc             C   sf   t | jƒ |jƒ ƒd }g }xFtd|d ƒD ]4}| j|ƒ|j|ƒkr*|j|| j|ƒ|j|ƒfƒ q*W |S )Nr   )rO   rQ   rR   rU   Úappend)r    rV   rH   r   Útsr   r   r   Únot_equal_witnessÙ   s    zWhitespace.not_equal_witnessc             C   sr   | j |j krdS | jr(|jr(| j|jkS t| jƒ |jƒ ƒd }x.td|d ƒD ]}| j|ƒ|j|ƒkrNdS qNW dS )NFr   é   T)rH   rL   rI   rO   rQ   rR   rU   )r    rV   rH   rY   r   r   r   Úlessñ   s    zWhitespace.lessc             C   sf   t | jƒ |jƒ ƒd }g }xFtd|d ƒD ]4}| j|ƒ|j|ƒkr*|j|| j|ƒ|j|ƒfƒ q*W |S )Nr   )rO   rQ   rR   rU   rX   )r    rV   rH   r   rY   r   r   r   Únot_less_witness  s    zWhitespace.not_less_witnessN)r%   r&   r'   rE   rF   r!   rQ   rU   rW   rZ   r\   r]   r   r   r   r   rC   ‡   s   rC   c             C   s8   dd„ | D ƒ}d}t | ƒdkr&|d }|d dj|ƒ S )Nc             s   s   | ]}t |d  ƒV  qdS )r   N)r   )Ú.0Útupr   r   r   ú	<genexpr>  s    z#format_witnesses.<locals>.<genexpr>zat tab sizer   Úsr   z, )rG   r2   )ÚwZfirstsÚprefixr   r   r   Úformat_witnesses  s
    rd   c             C   s  t j}t j}t j}t jt jf}tdƒg}d}xà| D ]Ø\}}}	}
}||krNd}q2||kr¦d}t|ƒ}|d j|ƒsš|d j|ƒ}dt	|ƒ }t
|	d ||ƒ‚|j|ƒ q2||krºd}|d= q2|oÄ||kr2d}t|ƒ}|d	 j|ƒs2|d
 j|ƒ}dt	|ƒ }t
|	d ||ƒ‚q2W d S )Nr   r   r   zindent not greater e.g. zindent not equal e.g. éÿÿÿÿre   re   re   re   )r4   ÚINDENTÚDEDENTÚNEWLINEÚCOMMENTr   rC   r\   r]   rd   r   rX   rW   rZ   )Útokensrf   rg   rh   ZJUNKÚindentsZcheck_equalÚtypeÚtokenÚstartÚendr   ZthisguyZwitnessr   r   r   r   r     s6    

Ú__main__)r(   Ú__version__r,   r
   r   r4   ÚhasattrÚ
ValueErrorÚ__all__r   r   r   r   Ú	Exceptionr   r   rC   rd   r   r%   r   r   r   r   Ú<module>   s(   

= 7