eaiovnaovbqoebvqoeavibavo B  f,@sdZdZddlZddlZddlZeeds2eddddgZdada d d Z d d Z Gd dde Z ddZGdddZddZddZedkre dS)aThe 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. 6NNLz4tokenize.NL doesn't exist -- tokenize module too oldcheckNannyNagprocess_tokenscGs:d}x$|D]}tj|t|d}q WtjddS)N  )sysstderrwritestr)argssepargr-/opt/alt/python37/lib64/python3.7/tabnanny.pyerrprint"s  rc Csddl}y|tjddd\}}Wn,|jk rR}z t|dSd}~XYnXx0|D](\}}|dkrrtda|dkrZtdaqZW|stdtjdddSx|D] }t|qWdS)NrZqvz-qz-vzUsage:z[-v] file_or_directory ...)getoptr argverrorr filename_onlyverboser)rZoptsrmsgoarrrrmain)s   rc@s0eZdZdZddZddZddZdd Zd S) rzk Raised by process_tokens() if detecting an ambiguous indent. Captured and handled in check(). cCs||||_|_|_dS)N)linenorline)selfrrrrrr__init__BszNannyNag.__init__cCs|jS)N)r)r rrr get_linenoDszNannyNag.get_linenocCs|jS)N)r)r rrrget_msgFszNannyNag.get_msgcCs|jS)N)r)r rrrget_lineHszNannyNag.get_lineN)__name__ __module__ __qualname____doc__r!r"r#r$rrrrr=s c Cs&tj|rtj|str*td|ft|}xR|D]J}tj||}tj|rdtj|r|tj|dddkr:t |q:WdSyt |}Wn2t k r}zt d||fdSd}~XYnXtdkrtd|zytt |jWnt jk r2}zt d||fdSd}~XYntk rd}zt d ||fdSd}~XYntk r}z||}|}trtd ||ftd |ft|n6d |krd |d }trt|nt||t|dSd}~XYnXWd|Xtr"td|fdS)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: %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.)ospathisdirislinkrprintlistdirjoinnormcasertokenizeopenOSErrorrrgenerate_tokensreadline TokenErrorIndentationErrorrr"r$r#rreprclose) filenamesnamefullnamefrZnagbadlinerrrrrKsT          c@sLeZdZd\ZZddZddZddZdd Zd d Z d d Z ddZ 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) rawrBSTlennnttuplenorm is_simple) r ZwsrDrEcountbrGrHZchrrrr!s(    zWhitespace.__init__cCs|j\}}tt|d|S)Nr)rJmaxrF)r rLtrailingrrrlongest_run_of_spacess z Whitespace.longest_run_of_spacescCsL|j\}}d}x*t|t|D]}|||||}qW||||jS)Nr)rJrangerFrH)r tabsizerLrOZilirrr indent_levels  zWhitespace.indent_levelcCs |j|jkS)N)rJ)r otherrrrequalszWhitespace.equalcCsft||d}g}xFtd|dD]4}||||kr*||||||fq*W|S)Nr)rNrPrQrTappend)r rUrGrtsrrrnot_equal_witnessszWhitespace.not_equal_witnesscCsr|j|jkrdS|jr(|jr(|j|jkSt||d}x.td|dD]}||||krNdSqNWdS)NFrT)rGrKrHrNrPrQrT)r rUrGrXrrrlesss   zWhitespace.lesscCsft||d}g}xFtd|dD]4}||||kr*||||||fq*W|S)Nr)rNrPrQrTrW)r rUrGrrXrrrnot_less_witnessszWhitespace.not_less_witnessN) r%r&r'rDrEr!rPrTrVrYr[r\rrrrrBsrBcCs8dd|D}d}t|dkr&|d}|dd|S)Ncss|]}t|dVqdS)rN)r ).0tuprrr sz#format_witnesses..z at tab sizersrz, )rFr1)wZfirstsprefixrrrformat_witnessess  rccCstj}tj}tj}tjtjf}tdg}d}x|D]\}}} } } ||krNd}q2||krd}t|} |d| s|d| } dt | }t | d|| | | q2||krd}|d=q2|r2||kr2d}t| } |d | s2|d | } dt | }t | d|| q2WdS)Nrrrzindent not greater e.g. zindent not equal e.g. )r3INDENTDEDENTNEWLINECOMMENTrrBr[r\rcrrWrVrY)tokensrerfrgZJUNKindentsZ check_equaltypetokenstartendrZthisguyZwitnessrrrrrs6       __main__)r( __version__r+r r3hasattr ValueError__all__rrrr ExceptionrrrBrcrr%rrrr s&  =7