
f[\,                 @   s   d  Z  d Z d d l Z d d l Z d d l Z d d l Z e e d  sZ e d   n  d d d g Z d a	 d a
 d	 d
   Z d d   Z Gd d   d e  Z d d   Z Gd d   d  Z d d   Z d d   Z e d k r e   n  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   sK   d } x. |  D]& } t  j j | t |   d } q Wt  j j d  d  S)N  
)sysstderrwritestr)argsseparg r   /usr/lib/python3.4/tabnanny.pyerrprint#   s
    
r   c              C   s   y) t  j  t j d d   d  \ }  } Wn6 t  j k
 ra } z t |  d  SWYd  d  } ~ Xn XxF |  D]> \ } } | d k r t d a n  | d k ri t d a qi qi W| s t d t j d d  d  Sx | D] } t |  q Wd  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               @   sF   e  Z d  Z d Z d d   Z d d   Z d d   Z d d	   Z d
 S)r   zg
    Raised by tokeneater() 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  n  t  j |   } xw | D]o } t  j j |  |  } t  j j |  r t  j j |  s t  j j | d d   d k rU t	 |  qU qU Wd Sy t
 j |   } Wn= t k
 r} z t d |  | f  d SWYd d } ~ Xn Xt d k r<t d |   n  zay t t
 j | j   Wn@t
 j k
 r} z t d |  | f  d SWYd d } ~ Xnt k
 r} z t d	 |  | f  d SWYd d } ~ Xn t k
 r} z | j   } | j   } t r?t d
 |  | f  t d | f  t | j    nF d |  k r\d |  d }  n  t rot |   n t |  | t |   d SWYd d } ~ Xn XWd | j   Xt rt d |  f  n  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               @   sp   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] } | | k rc | d } | d } q: | | k r | d } | d } | t |  k r | d g | t |  d } n  | | d | | <d } q: Pq: 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   s^   |  j  \ } } d } x3 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   s   t  |  j   | j    d } g  } xd t d | d  D]O } |  j |  | j |  k r9 | j | |  j |  | j |  f  q9 q9 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   s   |  j  | j  k r d S|  j r8 | j r8 |  j | j k St |  j   | j    d } x= t d | d  D]( } |  j |  | j |  k rk d Sqk Wd S)NFr      T)rH   rL   rI   rO   rQ   rR   rU   )r    rV   rH   rY   r   r   r   less   s    zWhitespace.lessc             C   s   t  |  j   | j    d } g  } xd t d | d  D]O } |  j |  | j |  k r9 | j | |  j |  | j |  f  q9 q9 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   sM   d d   |  D } d } t  |   d k r8 | d } n  | 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 } xA|  D]9\ } } }	 }
 } | | k rs d } qI | | k r d } t |  } | d j |  s | d j |  } d t	 |  } t
 |	 d | |   n  | j |  qI | | k rd } | d =qI | rI | | k rI d } t |  } | d	 j |  s| d
 j |  } d t	 |  } t
 |	 d | |   qqI qI Wd  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