
    (g
-                         d Z dZddlZddlZddlZg dZdadad Zd Z	 G d de
      Zd	 Z G d
 d      Zd Zd Zd Zedk(  r e	        yy)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)checkNannyNagprocess_tokensc                      d}| D ]/  }t         j                  j                  |t        |      z          d}1 t         j                  j                  d       t        j                  d       y )N  
   )sysstderrwritestrexit)argssepargs      /usr/lib/python3.12/tabnanny.pyerrprintr       sT    
C 

s3x( JJTHHQK    c                  Z   dd l } 	 | j                  t        j                  dd  d      \  }}D ]"  \  }}|dk(  r	t
        dz   a|dk(  st        dz   a$ st	        dt        j                  d   d       |D ]  }t        |        y # | j                  $ r}t	        |       Y d }~yd }~ww xY w)Nr   r   qvz-qz-vzUsage:z[-v] file_or_directory ...)getoptr   argverrorr   filename_onlyverboser   )r   optsr   msgoar   s          r   mainr"   (   s    ]]388AB<6
d  "19)A-M9kG	"
 388A;(DE c
 << s   &B B*B%%B*c                   (    e Zd ZdZd Zd Zd Zd Zy)r   zk
    Raised by process_tokens() if detecting an ambiguous indent.
    Captured and handled in check().
    c                 0    |||c| _         | _        | _        y N)linenor   line)selfr&   r   r'   s       r   __init__zNannyNag.__init__?   s    +13(TXtyr   c                     | j                   S r%   )r&   r(   s    r   
get_linenozNannyNag.get_linenoA   s    {{r   c                     | j                   S r%   )r   r+   s    r   get_msgzNannyNag.get_msgC   s    xxr   c                     | j                   S r%   )r'   r+   s    r   get_linezNannyNag.get_lineE   s    yyr   N)__name__
__module____qualname____doc__r)   r,   r.   r0    r   r   r   r   :   s    =r   r   c                    t         j                  j                  |       rt         j                  j                  |       st        rt        | d       t        j                  |       }|D ]  }t         j                  j                  | |      }t         j                  j                  |      rt         j                  j                  |      r&t         j                  j                  |dd       dk(  st        |        y	 t        j                  |       }t        dkD  rt        d| z         	 t        t        j                  |j                                	 |j%                          t        rt        | d       yy# t        $ r}t        | d|       Y d}~yd}~ww xY w# t        j"                  $ r*}t        | d|       Y d}~|j%                          yd}~wt&        $ r*}t        | d|       Y d}~|j%                          yd}~wt(        $ r*}t        | d	|       Y d}~|j%                          yd}~wt*        $ r}|j-                         }|j/                         }t        r8t        d
| |fz         t        d|       t        |j1                                n4d| v rd| z   dz   } t2        rt        |        nt        | |t5        |             Y d}~|j%                          yd}~ww xY w# |j%                          w xY w)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: listing directoryNz.pyz: I/O Error: r   zchecking %r ...z: Token Error: z: Indentation Error: z)%r: *** Line %d: trouble in tab city! ***zoffending line: r	   "z: Clean bill of health.)ospathisdirislinkr   printlistdirjoinnormcaser   tokenizeopenOSErrorr   r   generate_tokensreadline
TokenErrorcloseSyntaxErrorIndentationErrorr   r,   r0   r.   r   repr)	filenamesnamefullnamefr   nagbadliner'   s	            r   r   r   H   sG    
ww}}T277>>$#7T34

4  	 Dww||D$/Hh'GGNN8,  bc+u4h	  	MM$
 {$&'x//

;<8 	
	T34 M  c23  $450 	
	-  $45( 	
	%  c:;  	
	  .."||~=wOP$01#++- d{3:#3DeDkgtDz2 	
	 	
	sy    E< -(F" <	FFF"K45GK7 K4&H6K7 K4H<'K7 <K4BK/K7 /K44K7 7L	c                   @    e Zd Zd\  ZZd Zd Zd Zd Zd Z	d Z
d Zy	)

Whitespacez 	c                    || _         t        j                  t        j                  }}g }dx}x}}| j                   D ]V  }||k(  r|dz   }|dz   }||k(  r>|dz   }|dz   }|t	        |      k\  r|dg|t	        |      z
  dz   z  z   }||   dz   ||<   d}V n || _        || _        t        |      |f| _        t	        |      dk  | _	        y )Nr   r   )
rawrS   STlennnttuplenorm	is_simple)	r(   wsrV   rW   countbrY   rZ   chs	            r   r)   zWhitespace.__init__   s    ||Z\\1A(( 	BQwEEqE!VE
?!QC1s5z>A+=$>>E 8a<a	 %L!O	Uqr   c                 P    | j                   \  }}t        t        |      dz
  |      S Nr   )r\   maxrX   )r(   r_   trailings      r   longest_run_of_spacesz Whitespace.longest_run_of_spaces   s$    ))x3u:a<**r   c                     | j                   \  }}d}t        |t        |            D ]  }|||z  ||   z  z   } |||| j                  z   z  z   S )Nr   )r\   rangerX   rZ   )r(   tabsizer_   re   ilis         r   indent_levelzWhitespace.indent_level   s_     ))xwE
+ 	,Aaj58++B	,'R$''\222r   c                 4    | j                   |j                   k(  S r%   )r\   )r(   others     r   equalzWhitespace.equal   s    yyEJJ&&r   c                 4   t        | j                         |j                               dz   }g }t        d|dz         D ]X  }| j                  |      |j                  |      k7  s'|j	                  || j                  |      |j                  |      f       Z |S rc   rd   rf   rh   rl   appendr(   rn   rY   r!   tss        r   not_equal_witnesszWhitespace.not_equal_witness       **,++-/1231Q3- 	5B  $(:(:2(>>2,,R0 --b13 5	5
 r   c                 b   | j                   |j                   k\  ry| j                  r%|j                  r| j                  |j                  k  S t        | j	                         |j	                               dz   }t        d|dz         D ]'  }| j                  |      |j                  |      k\  s' y y)NFr      T)rY   r]   rZ   rd   rf   rh   rl   )r(   rn   rY   rt   s       r   lesszWhitespace.less   s    66UWW>>eoo77ehh&&**,++-/123 1Q3- 	B  $(:(:2(>>	 r   c                 4   t        | j                         |j                               dz   }g }t        d|dz         D ]X  }| j                  |      |j                  |      k\  s'|j	                  || j                  |      |j                  |      f       Z |S rc   rq   rs   s        r   not_less_witnesszWhitespace.not_less_witness  rv   r   N)r1   r2   r3   rV   rW   r)   rf   rl   ro   ru   ry   r{   r5   r   r   rS   rS      s.    DAq*)2+3.'	0"	r   rS   c                 l    d | D        }d}t        |       dkD  r|dz   }|dz   dj                  |      z   S )Nc              3   8   K   | ]  }t        |d            yw)r   N)r   ).0tups     r   	<genexpr>z#format_witnesses.<locals>.<genexpr>  s     'cc#a&k's   zat tab sizer   sr	   z, )rX   r?   )wfirstsprefixs      r   format_witnessesr     s=    'Q'FF
1vz#C<$))F+++r   c                     	 t        |        y # t        $ r0}t        |j                  |j                  |j
                        d }~ww xY wr%   )_process_tokensTabErrorr   r&   r   text)tokenses     r   r   r     s:    0 0qxx//0s    	A+AAc                    t         j                  }t         j                  }t         j                  }t         j                  t         j
                  f}t        d      g}d}| D ]  \  }}}	}
}||k(  rd}||k(  red}t        |      }|d   j                  |      s2|d   j                  |      }dt        |      z   }t        |	d   ||      |j                  |       {||k(  rd}|d= |s||vsd}t        |      }|d   j                  |      r|d   j                  |      }dt        |      z   }t        |	d   ||       y )Nr   r   r   zindent not greater e.g. zindent not equal e.g. )rA   INDENTDEDENTNEWLINECOMMENTNLrS   ry   r{   r   r   rr   ro   ru   )r   r   r   r   JUNKindentscheck_equaltypetokenstartendr'   thisguywitnessr   s                  r   r   r     sQ   __F__FGX[[(D"~GK+1 ,4'ueS$7? KV^K 'G2;##G,!"+66w?03CG3LLuQxd33NN7#V^ KT- K &G2;$$W-!"+77@.1A'1JJuQxd33Y,4r   __main__)r4   __version__r9   r   rA   __all__r   r   r   r"   	Exceptionr   r   rS   r   r   r   r1   r5   r   r   <module>r      sv   
$  	 
 
1
$y ?5BD DL,044n zF r   