U e5d�,�@s�dZdZddlZddlZddlZeed�s2ed��dddgZdada d d �Z d d �Z Gd d�de �Z dd�ZGdd�d�Zdd�Zdd�Zedkr�e �dS)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_tokenscGs6d}|D]}tj�|t|��d}qtj�d�dS)N�� � )�sys�stderr�write�str)�args�sep�arg�r� /usr/lib64/python3.8/tabnanny.py�errprint"s rc Cs�ddl}z|�tjdd�d�\}}Wn2|jk rX}zt|�WY�dSd}~XYnX|D](\}}|dkrvtda|dkr^tdaq^|s�tdtjdd�dS|D] }t|�q�dS)Nr�Zqvz-qz-vzUsage:z[-v] file_or_directory ...)�getoptr �argv�errorr� filename_only�verboser)rZoptsr�msg�o�arrrr�main)s   rc@s0eZdZdZdd�Zdd�Zdd�Zdd �Zd S) rzk Raised by process_tokens() if detecting an ambiguous indent. Captured and handled in check(). cCs||||_|_|_dS�N)�linenor�line)�selfrrr rrr�__init__BszNannyNag.__init__cCs|jSr)r�r!rrr� get_linenoDszNannyNag.get_linenocCs|jSr)rr#rrr�get_msgFszNannyNag.get_msgcCs|jSr)r r#rrr�get_lineHszNannyNag.get_lineN)�__name__� __module__� __qualname__�__doc__r"r$r%r&rrrrr=s c CsHtj�|�r�tj�|�s�tr*td|f�t�|�}|D]J}tj�||�}tj�|�rbtj�|�rztj�|dd��dkr8t |�q8dSzt � |�}Wn8t k r�}zt d||f�WY�dSd}~XYnXtdkr�td|��z>ztt �|j��W�n"t jk �r@}z t d||f�WY� W���dSd}~XYn�tk �r|}zt d ||f�WY�W��dSd}~XYn�tk �r }z�|��}|��}t�r�td ||f�td |f�t|���n6d |k�r�d |d }t�r�t|�nt||t|��WY�W�dSd}~XYnXW5|��Xt�rDtd|f�dS)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: %srzchecking %r ...z%r: Token Error: %sz%r: Indentation Error: %sz)%r: *** Line %d: trouble in tab city! ***zoffending line: %rr�"z%r: Clean bill of health.)�os�path�isdir�islinkr�print�listdir�join�normcaser�tokenize�open�OSErrorr�closer�generate_tokens�readline� TokenError�IndentationErrorrr$r&r%r�repr) �file�names�name�fullname�frZnag�badliner rrrrKsX    ��      c@sLeZdZd\ZZdd�Zdd�Zdd�Zdd �Zd d �Z d d �Z dd�Z dS)� Whitespacez c Cs�||_tjtj}}g}d}}}|jD]v}||krH|d}|d}q*||kr�|d}|d}|t|�kr�|dg|t|�d}||d||<d}q*q�q*||_||_t|�|f|_t|�dk|_ dS)Nrr) �rawrD�S�T�len�n�nt�tuple�norm� is_simple) r!ZwsrFrG�count�brIrJZchrrrr"�s(    zWhitespace.__init__cCs|j\}}tt|�d|�S�Nr)rL�maxrH)r!rN�trailingrrr�longest_run_of_spaces�s z Whitespace.longest_run_of_spacescCsH|j\}}d}t|t|��D]}|||||}q||||jS)Nr)rL�rangerHrJ)r!�tabsizerNrRZil�irrr� indent_level�s  zWhitespace.indent_levelcCs |j|jkSr)rL)r!�otherrrr�equal�szWhitespace.equalcCsbt|��|���d}g}td|d�D]4}|�|�|�|�kr(|�||�|�|�|�f�q(|SrP�rQrSrTrW�append�r!rXrIr�tsrrr�not_equal_witness�s���zWhitespace.not_equal_witnesscCsp|j|jkrdS|jr(|jr(|j|jkSt|��|���d}td|d�D]}|�|�|�|�krLdSqLdS)NFr�T)rIrMrJrQrSrTrW)r!rXrIr]rrr�less�s   ��zWhitespace.lesscCsbt|��|���d}g}td|d�D]4}|�|�|�|�kr(|�||�|�|�|�f�q(|SrPrZr\rrr�not_less_witnesss���zWhitespace.not_less_witnessN) r'r(r)rFrGr"rSrWrYr^r`rarrrrrD�srDcCs8dd�|D�}d}t|�dkr&|d}|dd�|�S)Ncss|]}t|d�VqdS)rN)r )�.0�tuprrr� sz#format_witnesses..z at tab sizer�srz, )rHr3)�wZfirsts�prefixrrr�format_witnessess  rhcCstj}tj}tj}tjtjf}td�g}d}|D]�\}}} } } ||krLd}q0||kr�d}t|�} |d�| �s�|d�| �} dt | �}t | d|| ��|� | �q0||kr�d}|d=q0|r0||kr0d}t| �} |d� | �s0|d� | �} dt | �}t | d|| ��q0dS)Nrrr�����zindent not greater e.g. zindent not equal e.g. )r5�INDENT�DEDENT�NEWLINE�COMMENTrrDr`rarhrr[rYr^)�tokensrjrkrlZJUNK�indentsZ check_equal�type�token�start�endr ZthisguyZwitnessrrrrrs6       �__main__)r*� __version__r-r r5�hasattr� ValueError�__all__rrrr� ExceptionrrrDrhrr'rrrr�s&  =7