L i):dZddlmZddlZddlZddlZddlmZ ddlZddlm Z dZ Gdd e ZGd d e ZGd d e ZGddeZGdde ZddZddZdZddZedk(reej0ddyy#e $r ddl mZm Z YswxYw)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(eZdZdZdZdZdZdZy) ASTVisitorz'Performs a depth-first walk of the AST.c d|_i|_yN)node_cacheselfs L/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/mccabe.py__init__zASTVisitor.__init__s  cJt|D]}|j|g|yr )rdispatch)rr argschilds rdefaultzASTVisitor.defaults)%d+ (E DMM% '$ ' (rc||_|j}|jj|}|?|j}t |j d|z|j}||j|<||g|S)Nvisit)r __class__r get__name__getattrvisitorr)rr rklassmeth classNames rrzASTVisitor.dispatch!sk {{u% <I4<<9)  O 9$q((>sAN)r)rr$r%rr@r0rOr'rrr5r5?s' )rr5ceZdZdZfdZdZdZdZeZdZ dZ dZ fd Z d Z e xZxZZd Zdd Zd ZdZeZdZeZxZS)PathGraphingAstVisitorz\ A visitor for a parsed Abstract Syntax Tree which finds executable statements. cftt| d|_i|_|j y)N)superrQr classnamegraphsreset)rrs rrzPathGraphingAstVisitor.__init__cs( $d46  rc d|_d|_yr )graphtailr s rrWzPathGraphingAstVisitor.resetis  rc4|D]}|j|yr )r)r node_listr s r dispatch_listz$PathGraphingAstVisitor.dispatch_listms D MM$  rc|jr|j|j}n |j}d|j|j|fz}|j|j |}||_|j|jtdd}|jj|j ||jj||||_yt|||j|j|_t|}||_|j|j|j|j|j|j<|jy)Nz %d:%d: %rrSpointr,)rUr+r8 col_offsetrYappendPathNoderZr]bodyr)r@r5rVrW)rr r7r+pathnodebottoms rvisitFunctionDefz'PathGraphingAstVisitor.visitFunctionDefqs >>#~~tyy9FYYFdkk4??FCC :: !**40H DI   tyy )bw/F JJ  tyy& 1 JJ  x 0DI"4dooNDJ~H DI   tyy )@D DKK$..$))< = JJLrc|j}|xj|jdzz c_|j|j||_y)N.)rUr+r]rc)rr old_classnames r visitClassDefz$PathGraphingAstVisitor.visitClassDefs:  $))c/) 499%&rc|jsyt|}|jj|j|||_|Sr )rZr)rYr@)rr+rds rrbz%PathGraphingAstVisitor.appendPathNodes9yy D> 499h/ rcf|jd}n |j}d|z}|j|y)NrzStmt %d)r8rb)rr r8r+s rvisitSimpleStatementz+PathGraphingAstVisitor.visitSimpleStatements2 ;; F[[F6! D!rct|tjr|j|yt t ||g|yr ) isinstancerstmtrmrTrQr)rr rrs rrzPathGraphingAstVisitor.defaults4 dCHH %  % %d + ($ 7 Dt DrcFd|jz}|j||y)NzLoop %dr8 _subgraphrr r+s r visitLoopz PathGraphingAstVisitor.visitLoops4;;& tT"rcFd|jz}|j||y)NzIf %drrrts rvisitIfzPathGraphingAstVisitor.visitIfs$ tT"rc^|j}t|||j|j|_t |}|j ||||j|j |j|<|jy|j|}|j |||y)z?create the subgraphs representing any `if` and `for` statementsN) rYr5r8rar)_subgraph_parserVrUrWrb)rr r+ extra_blocksrds rrsz PathGraphingAstVisitor._subgraphs :: "4t{{DOOLDJ~H  x >;?::DKK$..$7 8 JJL**40H  x >rc4g}||_|j|j|j|j|D]?}||_|j|j|j|jA|jr>||_|j|j|j|jn|j||r8t dd}|D]}|j j|| ||_yy)z@parse the body and any `else` block of `if` and `for` statementsrSr_r`N)rZr]rcr=orelser)rYr@)rr rdrz loose_endsextrareles rryz&PathGraphingAstVisitor._subgraph_parses   499%$))$! )E DI   uzz *   dii ( ) ;; DI   t{{ +   dii (   h ' bw/F  / ""2v. /DI rc^d|jz}|j|||jy)Nz TryExcept %d)rz)r8rshandlersrts rvisitTryExceptz%PathGraphingAstVisitor.visitTryExcepts& + tT >rczd|jz}|j||j|jy)NzWith %d)r8rbr]rcrts r visitWithz PathGraphingAstVisitor.visitWiths04;;& D! 499%r)r')rr$r%r&rrWr]rfvisitAsyncFunctionDefrjrbrmrru visitAsyncForvisitFor visitWhilerwrsryrvisitTryrvisitAsyncWith __classcell__)rs@rrQrQ^sv  4-' "E #-65M5Hz# ?,?H& NrrQcPeZdZdZdZeZdZdZdZ dZ e dZ e dZ d Zy ) McCabeCheckerz%McCabe cyclomatic complexity checker.mccabeC901zC901 %r is too complex (%d)c||_yr )r")rr"filenames rrzMcCabeChecker.__init__s  rcd}ddtddd}t|dd}t|tr@|j d|j |fi||j jd y|j |fi|y) Nz--max-complexityrstorezMcCabe complexity thresholdTrue)ractiontypehelpparse_from_configconfig_optionsrzmax-complexity)intrror: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|_yr )rmax_complexity)roptionss r parse_optionszMcCabeChecker.parse_optionss !7!78rc#K|jdkryt}|j|j||jj D]n}|j |jkDs!|j|j|j fz}|j|j|t|fpyw)Nr) rrQr#r"rVrJrO _error_tmplr7r8r9r)rrrYtexts rrunzMcCabeChecker.runs    " (*G,^^**, CE!D$7$77''5<<9I9I9K*LLllELL$T BB Cs A1C4ACN)rr$r%r&r+ __version__version_coderrr classmethodrrrr'rrrrsQ/ DG E/KN..$99Crrc t||dtj}g}|t_ t||jD]\}}}} |jd|||fz t|dk(rytdj|t|S#t$r@t j d}tj jd|d|dYywxYw)NexeczUnable to parse z:  rz %s:%d:1: %s)compiler PyCF_ONLY_AST SyntaxErrorsysexc_infostderrwriterrrr=rKr.join) code thresholdrr"ecomplxr8offsetrchecks rget_code_complexityrstXvs/@/@A F#,M '4T8'D'H'H'J@#e mx&>>?@ 6{a $))F  v;  LLN1  xCDsBAC#"C#c4t|}t|||S)z"Returns the complexity of a module)r)_readr) module_pathrrs rget_module_complexityr$s  D tY EErchdtjcxkrdkr)nn&t|d5}|jcdddSdtjcxkrdkrdny t|d5}t j |j \}}dddt|d5}|jcdddSy#1swYyxYw#1swY>xYw#tttf$r8t|d5}|jcdddcYS#1swYnxYwYwxYw#1swYyxYw) N)rH)rrU)rrbzlatin-1)encodingr) r version_infoopenreadtokenizedetect_encodingreadline LookupErrorr UnicodeError)rfr_s rrr*s   )6) (D ! Q668   3## ,f ,# h% E ( 8 8 D 1 E (C( 3 q668   -    E E[,7 h3 qvvx       sYC! C-#C C&D(C  CC!D%:D D%D D%$D%(D1c$|tjdd}tj}|j ddddd|j dd d d d d |j |\}}t |d}t||ddtj}t}|j|||jrptd|jjD]<}|j r|j#|j k\s-|j%>tdy|jjD]D}|j#|j k\s!t|j&|j#Fy)Nrz-dz--dotdotzoutput a graphviz dot file store_true)destrrz-mz--minrzminimum complexity for outputr)rrrrrrzgraph {rC)rargvoptparse OptionParserr parse_argsrrrrrQr#rr.rVrJrrOr0r+)roparrrrr"rrYs rmainr;sZ |xx|  "DOOD'5lLOOD' 8uOOD)MGT a>D 4a&#*;*; rs & #2$ ##8 v ))>CZCL*CF*CZ&F "6< z!"S 2112s B BB