bg)fdZddlmZddlZddlZddlZddlmZ ddlZddlm Z n#e $r ddl mZm Z YnwxYwdZ Gdd e ZGd d e ZGd d e ZGddeZGdde ZddZddZdZddZedkreejdddSdS)z Meager code path measurement tool. Ned Batchelder http://nedbatchelder.com/blog/200803/python_code_complexity_microtool.html MIT License. )with_statementN) defaultdict)iter_child_nodes)astrz0.7.0c*eZdZdZdZdZdZdZdS) ASTVisitorz'Performs a depth-first walk of the AST.c"d|_i|_dSN)node_cacheselfs W/builddir/build/BUILD/cloudlinux-venv-1.0.7/venv/lib/python3.11/site-packages/mccabe.py__init__zASTVisitor.__init__s  cFt|D]}|j|g|RdSr )rdispatch)rr argschilds rdefaultzASTVisitor.defaults@%d++ ( (E DM% '$ ' ' ' ' ' ( (rc||_|j}|j|}|/|j}t |jd|z|j}||j|<||g|RS)Nvisit)r __class__r get__name__getattrvisitorr)rr rklassmeth classNames rrzASTVisitor.dispatch!sm {u%% <I4<9) . Ity$++--211 2 2 2 2 2rc t|Sr )idr s rr0zPathNode.dot_id;s $xxrN)r*)rr$r%rr1r0r'rrr)r)2sF222rr)c(eZdZddZdZdZdZdS) PathGraphrcp||_||_||_||_t t |_dSr )r,entitylinenocolumnrlistnodes)rr,r7r8r9s rrzPathGraph.__init__@s1     && rcZ|j||g|j|<dSr )r;append)rn1n2s rconnectzPathGraph.connectGs+ 2b!!! 2rc8td|jD]}||jD]C\}}|D];}t|d|dz(PathGraph.complexity..Ys===AQ===r)sumr;valuesrI)r num_edges num_nodess r complexityzPathGraph.complexityUsK==):):)<)<===>>  OO 9$q((rN)r)rr$r%rr@r1rRr'rrr5r5?sU'''' )))))rr5ceZdZdZfdZdZdZdZeZdZ dZ dZ fd Z d Z e xZxZZd Zdd ZdZdZeZdZeZxZS)PathGraphingAstVisitorz\ A visitor for a parsed Abstract Syntax Tree which finds executable statements. ctt|d|_i|_|dS)N)superrTr classnamegraphsreset)rrs rrzPathGraphingAstVisitor.__init__cs? $d++44666  rc"d|_d|_dSr )graphtailr s rrZzPathGraphingAstVisitor.resetis  rc:|D]}||dSr )r)r node_listr s r dispatch_listz$PathGraphingAstVisitor.dispatch_listms0  D MM$      rc|jr|j|j}n|j}d|j|j|fz}|j||}||_||jtdd}|j |j||j ||||_dSt|||j|j|_t|}||_||j|j|j |j|j<| dS)Nz %d:%d: %rrVpointr-)rXr,r8 col_offsetr\appendPathNoder]r`bodyr)r@r5rYrZ)rr r7r,pathnodebottoms rvisitFunctionDefz'PathGraphingAstVisitor.visitFunctionDefqs0 > #~~tyy9FFYFdk4?FCC : !**400H DI   ty ) ) )bw///F J  ty& 1 1 1 J  x 0 0 0DIII"4doNNDJ~~H DI   ty ) ) )@D DK$..$))< = JJLLLLLrc|j}|xj|jdzz c_||j||_dS)N.)rXr,r`rf)rr old_classnames r visitClassDefz$PathGraphingAstVisitor.visitClassDefs@  $)c/) 49%%%&rc|jsdSt|}|j|j|||_|Sr )r]r)r\r@)rr,rgs rrez%PathGraphingAstVisitor.appendPathNodesBy  FD>> 49h/// rc\|jd}n|j}d|z}||dS)NrzStmt %d)r8re)rr r8r,s rvisitSimpleStatementz+PathGraphingAstVisitor.visitSimpleStatements< ; FF[F6! D!!!!!rct|tjr||dSt t |j|g|RdSr ) isinstancerstmtrprWrTr)rr rrs rrzPathGraphingAstVisitor.defaults^ dCH % % E  % %d + + + + + 7E($ / / 7 Dt D D D D D DrcFd|jz}|||dS)NzLoop %dr8 _subgraphrr r,s r visitLoopz PathGraphingAstVisitor.visitLoops(4;& tT"""""rcFd|jz}|||dS)NzIf %drurws rvisitIfzPathGraphingAstVisitor.visitIfs($ tT"""""rr'cV|jut|||j|j|_t |}|||||j|j|j|<|dS| |}||||dS)z?create the subgraphs representing any `if` and `for` statementsN) r\r5r8rdr)_subgraph_parserYrXrZre)rr r, extra_blocksrgs rrvz PathGraphingAstVisitor._subgraphs : "4t{DOLLDJ~~H  x > > >;?:DK$..$$7 8 JJLLLLL**400H  x > > > > >rc(g}||_||j||j|D]=}||_||j||j>|jr<||_||j||jn|||r:t dd}|D]}|j||||_dSdS)z@parse the body and any `else` block of `if` and `for` statementsrVrbrcN)r]r`rfr=orelser)r\r@)rr rgr} loose_endsextrarhles rr|z&PathGraphingAstVisitor._subgraph_parses,   49%%%$)$$$! ) )E DI   uz * * *   di ( ( ( ( ; ( DI   t{ + + +   di ( ( ( (   h ' ' '  bw///F  / / ""2v....DIII   rcTd|jz}||||jdS)Nz TryExcept %d)r})r8rvhandlersrws rvisitTryExceptz%PathGraphingAstVisitor.visitTryExcepts. + tT >>>>>rcxd|jz}||||jdS)NzWith %d)r8rer`rfrws r visitWithz PathGraphingAstVisitor.visitWiths>4;& D!!! 49%%%%%r)r')rr$r%r&rrZr`rivisitAsyncFunctionDefrmrerprrx visitAsyncForvisitFor visitWhilerzrvr|rvisitTryrvisitAsyncWith __classcell__)rs@rrTrT^s4    4-''' """EEEEE ###-65M5Hz### ? ? ? ?,???H&&& NNNNNrrTc^eZdZdZdZeZdZdZdZ dZ e dZ e dZ d Zd S) McCabeCheckerz%McCabe cyclomatic complexity checker.mccabeC901zC901 %r is too complex (%d)c||_dSr )r")rr"filenames rrzMcCabeChecker.__init__s  rc d}ddtddd}t|dd}t|tr?|d|j|fi||jd dS|j|fi|dS) Nz--max-complexityrstorezMcCabe complexity thresholdTrue)ractiontypehelpparse_from_configconfig_optionsrzmax-complexity)intrrrr:pop add_optionrr=)clsparserflagkwargs config_optss r add_optionszMcCabeChecker.add_optionss!1!'   f&6== k4 ( ( . JJ* + + + F d - -f - - -  ! ( ()9 : : : : : F d - -f - - - - -rc8t|j|_dSr )rmax_complexity)roptionss r parse_optionszMcCabeChecker.parse_optionss !788rc#lK|jdkrdSt}||j||jD]a}||jkrB|j|j|fz}|j |j |t|fVbdS)Nr) rrTr#r"rYrOrR _error_tmplr7r8r9r)rrr\texts rrunzMcCabeChecker.runs   " " F(**G,,,^**,, C CE!!D$777'5<9I9I9K9K*LLlEL$T BBBB C CrN)rr$r%r&r, __version__version_coderrr classmethodrrrr'rrrrs// DG E/KN..[.$99[9CCCCCrrstdinc t||dtj}nP#t$rCt jd}tjd|d|dYdSwxYwg}|t_ t|| D]"\}}}} | d|||fz#t|dkrdStd|t|S)NexeczUnable to parse z:  rz %s:%d:1: %s)compiler PyCF_ONLY_AST SyntaxErrorsysexc_infostderrwriterrrr=rIr/join) code thresholdrr"ecomplxr8offsetrchecks rget_code_complexityrstXvs/@AA  LNN1  xxxCDDDqq F#,M '4T8'D'D'H'H'J'J@@#e mx&>>???? 6{{aq $))F   v;;sA A,+A,cDt|}t|||S)z"Returns the complexity of a module)r)_readr) module_pathrrs rget_module_complexityr$s$   D tY E E EErcdtjcxkrdkrAnn>t|d5}|cdddS#1swxYwYdSdtjcxkrdkrndS t|d5}t j|j\}}dddn #1swxYwYn\#tttf$rBt|d5}|cdddcYS#1swxYwYYnwxYwt|d|5}|cdddS#1swxYwYdSdS) N)rM)rrU)rrbzlatin-1)encodingr) r version_infoopenreadtokenizedetect_encodingreadline LookupErrorr UnicodeError)rfr_s rrr*s  ))))6))))) (D ! ! Q6688                   3# , , , ,f , , , , , ,# h%% E ( 8 D D 1 E E E E E E E E E E E E E E E[,7   h333 qvvxx                     (C( 3 3 3 q6688                   - ,s}A  AA6B;B/# B;/B33B;6B37B;;(D#D7 DD D D DD)E  EEc^|tjdd}tj}|ddddd|dd d d d d ||\}}t |d}t||ddtj }t}| |||j rttd|jD]:}|jr||jkr|;tddS|jD]F}||jkr't|j|GdS)Nrz-dz--dotdotzoutput a graphviz dot file store_true)destrrz-mz--minrzminimum complexity for outputr)rrrrrrzgraph {rC)rargvoptparse OptionParserr parse_argsrrrrrTr#rr/rYrOrrRr1r,)roparrrrr"rr\s rmainr;s |x|  " "DOOD'5lLLLOOD' 8uOOD))MGT a>>D 4a&#*; < rs &%%%%% ######2JJJ$$$$$$$22211111111112 ########8     v   ))))))))>CCCCCZCCCL*C*C*C*C*CF*C*C*CZ&FFFF "6666< zD!""s ' 77