
    YOg)                     D   S r SSKJr  SSKrSSKrSSKrSSKJr   SSKrSSKJ	r	  Sr " S S	\5      r " S
 S\5      r " S S\5      r " S S\5      r " S S\5      rSS jrSS jrS rSS jr\S:X  a  \" \R0                  SS 5        gg! \
 a    SSKJrJ	r	   Nxf = f)zMeager code path measurement tool.
Ned Batchelder
http://nedbatchelder.com/blog/200803/python_code_complexity_microtool.html
MIT License.
    )with_statementN)defaultdict)iter_child_nodes)astr   z0.7.0c                   0    \ rS rSrSrS rS rS rS rSr	g)	
ASTVisitor   z'Performs a depth-first walk of the AST.c                      S U l         0 U l        g N)node_cacheselfs    K/Users/admin/workspace/ai/Jarvis/env/lib/python3.13/site-packages/mccabe.py__init__ASTVisitor.__init__   s    	    c                 N    [        U5       H  nU R                  " U/UQ76   M     g r   )r   dispatch)r   r   argschilds       r   defaultASTVisitor.default   s"    %d+EMM%'$' ,r   c                     Xl         UR                  nU R                  R                  U5      nUc>  UR                  n[        U R                  SU-   U R                  5      nX@R                  U'   U" U/UQ76 $ )Nvisit)r   	__class__r   get__name__getattrvisitorr   )r   r   r   klassmeth	classNames         r   r   ASTVisitor.dispatch!   sg    	{{u%<I4<<9)<dllKD!%KKD 4  r   c                 X    X l         U R                  Ul        U R                  " U/UQ76   g)z&Do preorder walk of tree using visitorN)r    r   r   )r   treer    r   s       r   preorderASTVisitor.preorder+   s#    d"T"r   )r   r   r    N)
r   
__module____qualname____firstlineno____doc__r   r   r   r'   __static_attributes__ r   r   r   r      s    1(!#r   r   c                   *    \ rS rSrSS jrS rS rSrg)PathNode2   c                     Xl         X l        g r   )namelook)r   r3   r4   s      r   r   PathNode.__init__3   s    		r   c                 j    [        SU R                  U R                  U R                  5       4-  5        g )Nznode [shape=%s,label="%s"] %d;)printr4   r3   dot_idr   s    r   to_dotPathNode.to_dot7   s,    .IItyy$++-21 1 	2r   c                     [        U 5      $ r   )idr   s    r   r8   PathNode.dot_id;   s    $xr   )r4   r3   N)circle)r   r)   r*   r+   r   r9   r8   r-   r.   r   r   r0   r0   2   s    2r   r0   c                   0    \ rS rSrSS jrS rS rS rSrg)		PathGraph?   c                 \    Xl         X l        X0l        X@l        [	        [
        5      U l        g r   )r3   entitylinenocolumnr   listnodes)r   r3   rC   rD   rE   s        r   r   PathGraph.__init__@   s"    	 &
r   c                 ^    U R                   U   R                  U5        / U R                   U'   g r   )rG   append)r   n1n2s      r   connectPathGraph.connectG   s%    

2b!

2r   c                 ,   [        S5        U R                   H  nUR                  5         M     U R                  R                  5        H=  u  pU H2  n[        UR	                  5       < SUR	                  5       < S35        M4     M?     [        S5        g )Nz
subgraph {z -- ;})r7   rG   r9   itemsr8   )r   r   nextsnexts       r   r9   PathGraph.to_dotL   sf    lJJDKKM ::++-KDT[[]DKKMBC  . 	c
r   c                     [        U R                  R                  5        Vs/ s H  n[        U5      PM     sn5      n[        U R                  5      nX#-
  S-   $ s  snf )z2Return the McCabe complexity for the graph.
V-E+2
   )sumrG   valueslen)r   n	num_edges	num_nodess       r   
complexityPathGraph.complexityU   sP     ):):)<=)<AQ)<=>	

O	$q(( >s   A)rE   rC   rD   r3   rG   N)r   )	r   r)   r*   r+   r   rM   r9   r^   r-   r.   r   r   r@   r@   ?   s    '
)r   r@   c                      ^  \ rS rSrSrU 4S jrS rS rS r\r	S r
S rS	 rU 4S
 jrS r\=r=rrS rSS jrS rS r\rS r\rSrU =r$ )PathGraphingAstVisitor^   zOA visitor for a parsed Abstract Syntax Tree which finds executable
statements.
c                 f   > [         [        U ]  5         SU l        0 U l        U R                  5         g )N )superra   r   	classnamegraphsreset)r   r   s    r   r   PathGraphingAstVisitor.__init__c   s(    $d46

r   c                      S U l         S U l        g r   )graphtailr   s    r   rh   PathGraphingAstVisitor.reseti   s    
	r   c                 8    U H  nU R                  U5        M     g r   )r   )r   	node_listr   s      r   dispatch_list$PathGraphingAstVisitor.dispatch_listm   s    DMM$ r   c                    U R                   (       a  U R                   < UR                  < 3nOUR                  nSUR                  UR                  U4-  nU R                  b  U R                  U5      nX@l        U R                  UR                  5        [        SSS9nU R                  R                  U R                  U5        U R                  R                  XE5        XPl        g [        X2UR                  UR                  5      U l        [        U5      nX@l        U R                  UR                  5        U R                  U R                  U R                   < UR                  < 3'   U R                  5         g )Nz	%d:%d: %rrd   pointr4   )rf   r3   rD   
col_offsetrk   appendPathNoderl   rp   bodyr0   rM   r@   rg   rh   )r   r   rC   r3   pathnodebottoms         r   visitFunctionDef'PathGraphingAstVisitor.visitFunctionDefq   s	   >>#~~tyy9FYYFdkk4??FCC::!**40H Ityy)bw/FJJtyy&1JJx0I"4dooNDJ~H Ityy)@D

DKK$..$))<=JJLr   c                     U R                   nU =R                   UR                  S-   -  sl         U R                  UR                  5        X l         g )N.)rf   r3   rp   rw   )r   r   old_classnames      r   visitClassDef$PathGraphingAstVisitor.visitClassDef   s8    $))c/)499%&r   c                     U R                   (       d  g [        U5      nU R                  R                  U R                   U5        X l         U$ r   )rl   r0   rk   rM   )r   r3   rx   s      r   rv   %PathGraphingAstVisitor.appendPathNode   s7    yyD>

499h/	r   c                 h    UR                   c  SnOUR                   nSU-  nU R                  U5        g )Nr   zStmt %d)rD   rv   )r   r   rD   r3   s       r   visitSimpleStatement+PathGraphingAstVisitor.visitSimpleStatement   s2    ;;F[[F6!D!r   c                    > [        U[        R                  5      (       a  U R                  U5        g [        [
        U ]  " U/UQ76   g r   )
isinstancer   stmtr   re   ra   r   )r   r   r   r   s      r   r   PathGraphingAstVisitor.default   s7    dCHH%%%%d+($7DtDr   c                 D    SUR                   -  nU R                  X5        g )NzLoop %drD   	_subgraphr   r   r3   s      r   	visitLoop PathGraphingAstVisitor.visitLoop   s    4;;&t"r   c                 D    SUR                   -  nU R                  X5        g )NzIf %dr   r   s      r   visitIfPathGraphingAstVisitor.visitIf   s    $t"r   c                 ^   U R                   c}  [        X"UR                  UR                  5      U l         [	        U5      nU R                  XU5        U R                   U R                  U R                  < U< 3'   U R                  5         gU R                  U5      nU R                  XU5        g)z?create the subgraphs representing any `if` and `for` statementsN)
rk   r@   rD   ru   r0   _subgraph_parserg   rf   rh   rv   )r   r   r3   extra_blocksrx   s        r   r    PathGraphingAstVisitor._subgraph   s    ::"4t{{DOOLDJ~H  >;?::DKK$..$78JJL**40H  >r   c                 @   / nX l         U R                  UR                  5        UR                  U R                   5        U H?  nX l         U R                  UR                  5        UR                  U R                   5        MA     UR                  (       a=  X l         U R                  UR                  5        UR                  U R                   5        OUR                  U5        U(       a5  [        SSS9nU H  nU R                  R                  Xv5        M      X`l         gg)z@parse the body and any `else` block of `if` and `for` statementsrd   rs   rt   N)rl   rp   rw   rJ   orelser0   rk   rM   )r   r   rx   r   
loose_endsextrary   les           r   r   &PathGraphingAstVisitor._subgraph_parse   s    
	499%$))$!E Iuzz*dii( " ;; It{{+dii(h'bw/F 

""2. !I	 r   c                 V    SUR                   -  nU R                  XUR                  S9  g )NzTryExcept %d)r   )rD   r   handlersr   s      r   visitTryExcept%PathGraphingAstVisitor.visitTryExcept   s$    +t>r   c                 z    SUR                   -  nU R                  U5        U R                  UR                  5        g )NzWith %d)rD   rv   rp   rw   r   s      r   	visitWith PathGraphingAstVisitor.visitWith   s0    4;;&D!499%r   )rf   rk   rg   rl   )r.   )r   r)   r*   r+   r,   r   rh   rp   rz   visitAsyncFunctionDefr   rv   r   r   r   visitAsyncForvisitFor
visitWhiler   r   r   r   visitTryr   visitAsyncWithr-   __classcell__)r   s   @r   ra   ra   ^   sv     4 -'"E# -65M5Hz#?,? H&
 Nr   ra   c                   X    \ rS rSrSrSr\rSrSr	Sr
S r\S 5       r\S	 5       rS
 rSrg)McCabeChecker   z%McCabe cyclomatic complexity checker.mccabeC901zC901 %r is too complex (%d)c                     Xl         g r   r&   )r   r&   filenames      r   r   McCabeChecker.__init__   s    	r   c                 
   SnSS[         SSS.n[        USS 5      n[        U[        5      (       a@  UR	                  S5        UR
                  " U40 UD6  UR                  R                  S	5        g UR
                  " U40 UD6  g )
Nz--max-complexityr   storezMcCabe complexity thresholdTrue)r   actiontypehelpparse_from_configconfig_optionsr   zmax-complexity)intr   r   rF   pop
add_optionr   rJ   )clsparserflagkwargsconfig_optss        r   add_optionsMcCabeChecker.add_options   s    !1!'
 f&6=k4((JJ*+d-f-!!(()9:d-f-r   c                 8    [        UR                  5      U l        g r   )r   max_complexity)r   optionss     r   parse_optionsMcCabeChecker.parse_options  s     !7!78r   c              #     #    U R                   S:  a  g [        5       nUR                  U R                  U5        UR                  R                  5        Hq  nUR                  5       U R                   :  d  M#  U R                  UR                  UR                  5       4-  nUR                  UR                  U[        U 5      4v   Ms     g 7f)Nr   )r   ra   r'   r&   rg   rY   r^   _error_tmplrC   rD   rE   r   )r   r    rk   texts       r   runMcCabeChecker.run  s     "(*G,^^**,E!D$7$77''5<<9I9I9K*LLllELL$T
BB -s   A1C
7AC
r   N)r   r)   r*   r+   r,   r3   __version__version_coder   r   r   classmethodr   r   r   r-   r.   r   r   r   r      sQ    /DGE/KN . .$ 9 9Cr   r   c                     [        XS[        R                  5      n/ nU[        l	        [        X25      R                  5        H  u  pgpUR                  SX&U4-  5        M     [        U5      S:X  a  g[        SR                  U5      5        [        U5      $ ! [         aC    [        R
                  " 5       S   n[        R                  R                  SU< SU< S35         gf = f)Nexec   zUnable to parse z: 
r   z%s:%d:1: %s)compiler   PyCF_ONLY_ASTSyntaxErrorsysexc_infostderrwriter   r   r   rJ   rZ   r7   join)
code	thresholdr   r&   ecomplxrD   offsetr   checks
             r   get_code_complexityr     s    tvs/@/@A F#,M '4T'D'H'H'J#mx&>>? (K 6{a	$))F
v;  LLN1

xCDs   B A
C%$C%c                 ,    [        U 5      n[        X!U S9$ )z"Returns the complexity of a module)r   )_readr   )module_pathr   r   s      r   get_module_complexityr   $  s    DtEEr   c                    S[         R                  s=:  a  S:  a)  O  O&[        U S5       nUR                  5       sS S S 5        $ S[         R                  s=::  a  S:  aa  O  g   [        U S5       n[        R
                  " UR                  5      u  p#S S S 5        [        U SWS9 nUR                  5       sS S S 5        $ g ! , (       d  f       g = f! , (       d  f       NE= f! [        [        [        4 a9    [        U SS9 nUR                  5       sS S S 5        s $ ! , (       d  f        N= ff = f! , (       d  f       g = f)	N)rW      )   r   rU)   r   rbzlatin-1)encodingr)
r   version_infoopenreadtokenizedetect_encodingreadlineLookupErrorr   UnicodeError)r   fr   _s       r   r   r   *  s      )6)(D!Q668 "!	3##	,f	,#	 h% ( 8 8 D & (C(3q668 43 
- "!
 &%[,7 	 h3qvvx 4333	  43s_   C%C$ 1#CC$ 'D5
C
C!C$ !C$ $D2D
D2
D.	)D2.D25
Ec           	      :   U c  [         R                  SS  n [        R                  " 5       nUR	                  SSSSSS9  UR	                  SS	S
SSSS9  UR                  U 5      u  p#[        US   5      n[        XCS   S[        R                  5      n[        5       nUR                  XV5        UR                  (       ay  [        S5        UR                  R                  5        HD  nUR                   (       a   UR#                  5       UR                   :  d  M4  UR%                  5         MF     [        S5        g UR                  R                  5        HG  nUR#                  5       UR                   :  d  M#  [        UR&                  UR#                  5       5        MI     g )Nr   z-dz--dotdotzoutput a graphviz dot file
store_true)destr   r   z-mz--minr   zminimum complexity for outputr   )r  r   r   r   r   r   zgraph {rQ   )r   argvoptparseOptionParserr   
parse_argsr   r   r   r   ra   r'   r   r7   rg   rY   r   r^   r9   r3   )r  oparr   r   r   r&   r    rk   s           r   mainr  ;  sJ   |xx|  "DOOD'5l  LOOD'8u   OOD)MGa>D4a&#*;*;<D$&GT#{{i^^**,E%%$$&'*;*;; - 	c
^^**,E!W%6%66ejj%"2"2"45 -r   __main__r   )   stdin)r	  r   )r,   
__future__r   r  r   r   collectionsr   r   r   ImportErrorflake8.utilr   objectr   r0   r@   ra   r   r   r   r   r  r   r  r.   r   r   <module>r     s   
 &  
  #2$ # #8
v 
) )>CZ CL*CF *CZ&F"6< z!" S
  2112s   
B BB