grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026B JøOË»³ã@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_tokenscGs:d}x$|D]}tj |t|ƒ¡d}q Wtj d¡dS)NÚú Ú )ÚsysÚstderrÚwriteÚstr)ÚargsÚsepÚarg©rú-/opt/alt/python37/lib64/python3.7/tabnanny.pyÚerrprint"s  rc Csºddl}y| tjdd…d¡\}}Wn,|jk rR}z t|ƒdSd}~XYnXx0|D](\}}|dkrrtda|dkrZtdaqZW|s tdtjddƒdSx|D] }t|ƒq¦WdS)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)ÚselfrrrrrrÚ__init__BszNannyNag.__init__cCs|jS)N)r)r rrrÚ get_linenoDszNannyNag.get_linenocCs|jS)N)r)r rrrÚget_msgFszNannyNag.get_msgcCs|jS)N)r)r rrrÚget_lineHszNannyNag.get_lineN)Ú__name__Ú __module__Ú __qualname__Ú__doc__r!r"r#r$rrrrr=s c Cs&tj |¡rŒtj |¡sŒtr*td|fƒt |¡}xR|D]J}tj ||¡}tj |¡rdtj |¡r|tj |dd…¡dkr:t |ƒq:WdSyt   |¡}Wn2t k rÌ}zt d||fƒdSd}~XYnXtdkrâtd|ƒ�zytt  |j¡ƒW�nt jk �r2}zt d||fƒdSd}~XYnÎtk �rd}zt d ||fƒdSd}~XYnœtk �rþ}z|| ¡}| ¡}t�r¸td ||fƒtd |fƒt| ¡ƒn6d |k�rÎd |d }t�rÞt|ƒnt||t|ƒƒdSd}~XYnXWd| ¡Xt�r"td|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ÚOSErrorrrÚgenerate_tokensÚreadlineÚ TokenErrorÚIndentationErrorrr"r$r#rÚreprÚclose) ÚfileÚnamesÚnameÚfullnameÚfrZnagÚbadlinerrrrrKsT          c@sLeZdZd\ZZdd„Zdd„Zdd„Zdd „Zd d „Z d d „Z dd„Z dS)Ú Whitespacez c CsÐ||_tjtj}}g}d}}}x~|jD]t}||krJ|d}|d}q,||krž|d}|d}|t|ƒkrˆ|dg|t|ƒd}||d||<d}q,Pq,W||_||_t|ƒ|f|_t|ƒdk|_ dS)Nrr) ÚrawrBÚSÚTÚlenÚnÚntÚtupleÚnormÚ is_simple) r ZwsrDrEÚcountÚbrGrHZchrrrr!Ÿs(    zWhitespace.__init__cCs|j\}}tt|ƒd|ƒS)Nr)rJÚmaxrF)r rLÚtrailingrrrÚlongest_run_of_spaces¸s z Whitespace.longest_run_of_spacescCsL|j\}}d}x*t|t|ƒƒD]}|||||}qW||||jS)Nr)rJÚrangerFrH)r ÚtabsizerLrOZilÚirrrÚ indent_level¼s  zWhitespace.indent_levelcCs |j|jkS)N)rJ)r ÚotherrrrÚequalÓszWhitespace.equalcCsft| ¡| ¡ƒd}g}xFtd|dƒD]4}| |¡| |¡kr*| || |¡| |¡f¡q*W|S)Nr)rNrPrQrTÚappend)r rUrGrÚtsrrrÚnot_equal_witnessÚszWhitespace.not_equal_witnesscCsr|j|jkrdS|jr(|jr(|j|jkSt| ¡| ¡ƒd}x.td|dƒD]}| |¡| |¡krNdSqNWdS)NFréT)rGrKrHrNrPrQrT)r rUrGrXrrrÚlessòs   zWhitespace.lesscCsft| ¡| ¡ƒd}g}xFtd|dƒD]4}| |¡| |¡kr*| || |¡| |¡f¡q*W|S)Nr)rNrPrQrTrW)r rUrGrrXrrrÚnot_less_witnessszWhitespace.not_less_witnessN) r%r&r'rDrEr!rPrTrVrYr[r\rrrrrBˆsrBcCs8dd„|Dƒ}d}t|ƒdkr&|d}|dd |¡S)Ncss|]}t|dƒVqdS)rN)r )Ú.0Útuprrrú sz#format_witnesses..z at tab sizerÚsrz, )rFr1)ÚwZfirstsÚprefixrrrÚformat_witnessess  rccCstj}tj}tj}tjtjf}tdƒg}d}xà|D]Ø\}}} } } ||krNd}q2||kr¦d}t|ƒ} |d | ¡sš|d | ¡} dt | ƒ}t | d|| ƒ‚|  | ¡q2||krºd}|d=q2|r2||kr2d}t| ƒ} |d  | ¡s2|d  | ¡} dt | ƒ}t | d|| ƒ‚q2WdS)Nrrréÿÿÿÿzindent not greater e.g. zindent not equal e.g. )r3ÚINDENTÚDEDENTÚNEWLINEÚCOMMENTrrBr[r\rcrrWrVrY)ÚtokensrerfrgZJUNKÚindentsZ check_equalÚtypeÚtokenÚstartÚendrZthisguyZwitnessrrrrrs6       Ú__main__)r(Ú __version__r+r r3ÚhasattrÚ ValueErrorÚ__all__rrrrÚ ExceptionrrrBrcrr%rrrrÚ s&  =7