U
    ad,                     @   s   d Z dZddlZddlZddlZeeds2e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   s6   d}| D ]}t j|t|  d}qt jd d S )N  
)sysstderrwritestr)argsseparg r   /usr/lib/python3.8/tabnanny.pyerrprint"   s
    r   c               
   C   s   dd l } z|  tjdd  d\}}W n2 | jk
rX } zt| W Y d S d }~X Y nX |D ](\}}|dkrvtd a|dkr^td aq^|stdtjd d d S |D ]}t| qd S )Nr      Zqvz-qz-vzUsage:z[-v] file_or_directory ...)getoptr
   argverrorr   filename_onlyverboser   )r   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__B   s    zNannyNag.__init__c                 C   s   | j S r   )r   r!   r   r   r   
get_linenoD   s    zNannyNag.get_linenoc                 C   s   | j S r   )r   r#   r   r   r   get_msgF   s    zNannyNag.get_msgc                 C   s   | j S r   )r    r#   r   r   r   get_lineH   s    zNannyNag.get_lineN)__name__
__module____qualname____doc__r"   r$   r%   r&   r   r   r   r   r   =   s
   c           	   
   C   sH  t j| rt j| str*td| f  t | }|D ]J}t j| |}t j|rbt j|rzt j|dd dkr8t	| q8dS zt
| }W n8 tk
r } ztd| |f  W Y dS d}~X Y nX tdkrtd|   z>ztt
|j W n" t
jk
r@ } z td| |f  W Y 
W  dS d}~X Y n tk
r| } ztd	| |f  W Y W dS d}~X Y n tk
r  } z| }| }trtd
| |f  td|f  t|  n6d| krd|  d } trt|  nt| |t| W Y W dS d}~X Y nX W 5 |  X trDt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 directoryNz.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   closer   generate_tokensreadline
TokenErrorIndentationErrorr   r$   r&   r%   r   repr)	filenamesnamefullnamefr   Znagbadliner    r   r   r   r   K   sX    




  
 
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 } }}| j D ]v}||krH|d }|d }q*||kr|d }|d }|t|kr|dg|t| d   }|| d ||< d}q* qq*|| _|| _t||f| _t|dk| _	d S )Nr   r   )
rawrD   STlennnttuplenorm	is_simple)	r!   ZwsrF   rG   countbrI   rJ   Zchr   r   r   r"      s(    

zWhitespace.__init__c                 C   s   | j \}}tt|d |S Nr   )rL   maxrH   )r!   rN   trailingr   r   r   longest_run_of_spaces   s    
z Whitespace.longest_run_of_spacesc                 C   sH   | j \}}d}t|t|D ]}||| ||   }q|||| j   S )Nr   )rL   rangerH   rJ   )r!   tabsizerN   rR   Zilir   r   r   indent_level   s
    
zWhitespace.indent_levelc                 C   s   | j |j kS r   )rL   )r!   otherr   r   r   equal   s    zWhitespace.equalc                 C   sb   t |  | d }g }td|d D ]4}| |||kr(||| |||f q(|S rP   rQ   rS   rT   rW   appendr!   rX   rI   r   tsr   r   r   not_equal_witness   s    zWhitespace.not_equal_witnessc                 C   sp   | j |j krdS | jr(|jr(| j|jkS t|  | d }td|d D ]}| |||krL dS qLdS )NFr      T)rI   rM   rJ   rQ   rS   rT   rW   )r!   rX   rI   r]   r   r   r   less   s    zWhitespace.lessc                 C   sb   t |  | d }g }td|d D ]4}| |||kr(||| |||f q(|S rP   rZ   r\   r   r   r   not_less_witness  s    zWhitespace.not_less_witnessN)r'   r(   r)   rF   rG   r"   rS   rW   rY   r^   r`   ra   r   r   r   r   rD      s   rD   c                 C   s8   dd | D }d}t | dkr&|d }|d d| 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, )rH   r3   )wZfirstsprefixr   r   r   format_witnesses  s
    rh   c                 C   s  t j}t j}t j}t jt jf}tdg}d}| D ]\}}}	}
}||krLd}q0||krd}t|}|d |s|d |}dt	| }t
|	d |||| q0||krd}|d= q0|r0||kr0d}t|}|d |s0|d |}dt	| }t
|	d ||q0d S )Nr   r   r   zindent not greater e.g. zindent not equal e.g. )r5   INDENTDEDENTNEWLINECOMMENTr   rD   r`   ra   rh   r   r[   rY   r^   )tokensrj   rk   rl   ZJUNKindentsZcheck_equaltypetokenstartendr    ZthisguyZwitnessr   r   r   r   r     s6    

__main__)r*   __version__r-   r
   r5   hasattr
ValueError__all__r   r   r   r   	Exceptionr   r   rD   rh   r   r'   r   r   r   r   <module>   s&   

= 7