grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026o ®û|j0,ã@sŒdZdZddlZddlZddlZgd¢Zdadadd„Zdd„Z Gd d „d e ƒZ d d „Z Gd d„dƒZ dd„Zdd„ZedkrDe ƒdSdS)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_tokenscGs6d}|D]}tj |t|ƒ¡d}qtj d¡dS)NÚú Ú )ÚsysÚstderrÚwriteÚstr)ÚargsÚsepÚarg©rú//opt/alt/python310/lib64/python3.10/tabnanny.pyÚerrprint s rc Cs¶ddl}z| tjdd…d¡\}}Wn|jy+}z t|ƒWYd}~dSd}~ww|D]\}}|dkr:tda|dkrBtdaq.|sPtdtjddƒdS|D]}t|ƒqRdS)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__@szNannyNag.__init__cCó|jSr)r©r rrrÚ get_linenoBózNannyNag.get_linenocCr"r)rr#rrrÚget_msgDr%zNannyNag.get_msgcCr"r)rr#rrrÚget_lineFr%zNannyNag.get_lineN)Ú__name__Ú __module__Ú __qualname__Ú__doc__r!r$r&r'rrrrr;s  rc CsNtj |¡rDtj |¡sDtrtd|fƒt |¡}|D]%}tj ||¡}tj |¡r1tj |¡r=tj |dd…¡dkrAt |ƒqdSzt   |¡}Wnt yf}zt d||fƒWYd}~dSd}~wwtdkrqtd|ƒz¢z tt  |j¡ƒWn‘t jy�}zt d||fƒWYd}~W| ¡dSd}~wty¼}zt d ||fƒWYd}~W| ¡dSd}~wt�y }zE| ¡}| ¡}trätd ||fƒtd |fƒt| ¡ƒnd |vrîd |d }trõt|ƒnt||t|ƒƒWYd}~W| ¡dSd}~wwW| ¡n| ¡wt�r%td|fƒdSdS)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ÚcloseÚIndentationErrorrr$r'r&rÚrepr) ÚfileÚnamesÚnameÚfullnameÚfrZnagZbadlinerrrrrIsj    ÿ€€þ   €î  €ò  €òöÿrc@sLeZdZd\ZZdd„Zdd„Zdd„Zdd „Zd d „Z d d „Z dd„Z dS)Ú Whitespacez c CsÊ||_tjtj}}g}d}}}|jD]9}||kr$|d}|d}q||krN|d}|d}|t|ƒkrC|dg|t|ƒd}||d||<d}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Ñs zWhitespace.equalcCsbt| ¡| ¡ƒd}g}td|dƒD]}| |¡| |¡kr.| || |¡| |¡f¡q|SrP©rQrSrTrWÚappend©r rXrIrÚtsrrrÚnot_equal_witnessØóÿÿþ€zWhitespace.not_equal_witnesscCsp|j|jkrdS|jr|jr|j|jkSt| ¡| ¡ƒd}td|dƒD]}| |¡| |¡kr5dSq&dS)NFréT)rIrMrJrQrSrTrW)r rXrIr]rrrÚlessðs   ÿÿÿzWhitespace.lesscCsbt| ¡| ¡ƒd}g}td|dƒD]}| |¡| |¡kr.| || |¡| |¡f¡q|SrPrZr\rrrÚnot_less_witnessr_zWhitespace.not_less_witnessN) r(r)r*rFrGr!rSrWrYr^rarbrrrrrD†s rDcCs8dd„|Dƒ}d}t|ƒdkr|d}|dd |¡S)Ncss�|] }t|dƒVqdS)rN)r )Ú.0ÚtuprrrÚ s€z#format_witnesses..z at tab sizerÚsrz, )rHr4)ÚwZfirstsÚprefixrrrÚformat_witnesses s  ricCstj}tj}tj}tjtjf}tdƒg}d}|D]l\}}} } } ||kr&d}q||krRd}t|ƒ} |d | ¡sL|d | ¡} dt | ƒ}t | d|| ƒ‚|  | ¡q||kr\d}|d=q|r„||vr„d}t| ƒ} |d  | ¡s„|d  | ¡} dt | ƒ}t | d|| ƒ‚qdS)Nrrréÿÿÿÿzindent not greater e.g. zindent not equal e.g. )r6ÚINDENTÚDEDENTÚNEWLINEÚCOMMENTÚNLrDrarbrirr[rYr^)ÚtokensrkrlrmZJUNKÚindentsZ check_equalÚtypeÚtokenÚstartÚendrZthisguyZwitnessrrrrrs:       €ÔrÚ__main__)r+Ú __version__r.r r6Ú__all__rrrrÚ ExceptionrrrDrirr(rrrrÚs&=7 ÿ