3
eb,                 @   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re  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/lib/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 |stdtjd d d S x|D ]}t| qW 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| rt jj|  rtr,td| f  t j| }xT|D ]L}t jj| |}t jj|rht jj| st 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rt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rtd
| |f  td|f  t|j  n6d| krd|  d } trt|  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rd}t|}|d j|s|d j|}dt	| }t
|	d |||j| q2||krd}|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