
    g)                     :   d Z ddlmZ ddlZddlZddlZddlmZ 	 ddlZddlm	Z	 dZ G d d	e      Z G d
 de      Z G d de      Z G d de      Z G d de      ZddZddZd ZddZedk(  r eej0                  dd        yy# e
$ r ddlmZm	Z	 Y sw xY w)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)astr   z0.7.0c                   (    e Zd ZdZd Zd Zd Zd Zy)
ASTVisitorz'Performs a depth-first walk of the AST.c                      d | _         i | _        y N)node_cacheselfs    I/var/www/html/brdwt/brdwt/brdwtenv/lib/python3.12/site-packages/mccabe.py__init__zASTVisitor.__init__   s    	    c                 J    t        |      D ]  } | j                  |g|   y r
   )r   dispatch)r   r   argschilds       r   defaultzASTVisitor.default   s)    %d+ 	(EDMM%'$'	(r   c                     || _         |j                  }| j                  j                  |      }|?|j                  }t        | j                  d|z   | j                        }|| j                  |<    ||g| S )Nvisit)r   	__class__r   get__name__getattrvisitorr   )r   r   r   klassmeth	classNames         r   r   zASTVisitor.dispatch!   sk    	{{u%<I4<<9)<dllKD!%DKKD 4  r   c                 Z    || _         | j                  |_         | j                  |g|  y)z&Do preorder walk of tree using visitorN)r   r   r   )r   treer   r   s       r   preorderzASTVisitor.preorder+   s'    d"T"r   N)r   
__module____qualname____doc__r   r   r   r#    r   r   r   r      s    1(!#r   r   c                        e Zd ZddZd Zd Zy)PathNodec                      || _         || _        y r
   )namelook)r   r+   r,   s      r   r   zPathNode.__init__3   s    		r   c                 j    t        d| j                  | j                  | j                         fz         y )Nznode [shape=%s,label="%s"] %d;)printr,   r+   dot_idr   s    r   to_dotzPathNode.to_dot7   s,    .IItyy$++-21 1 	2r   c                     t        |       S r
   )idr   s    r   r/   zPathNode.dot_id;   s    $xr   N)circle)r   r$   r%   r   r0   r/   r'   r   r   r)   r)   2   s    2r   r)   c                   &    e Zd ZddZd Zd Zd Zy)	PathGraphc                 d    || _         || _        || _        || _        t	        t
              | _        y r
   )r+   entitylinenocolumnr   listnodes)r   r+   r7   r8   r9   s        r   r   zPathGraph.__init__@   s*    	 &
r   c                 ^    | j                   |   j                  |       g | j                   |<   y r
   )r;   append)r   n1n2s      r   connectzPathGraph.connectG   s%    

2b!

2r   c                    t        d       | j                  D ]  }|j                           | j                  j                         D ]9  \  }}|D ]/  }t        |j	                         d|j	                         d       1 ; t        d       y )Nz
subgraph {z -- ;})r.   r;   r0   itemsr/   )r   r   nextsnexts       r   r0   zPathGraph.to_dotL   s{    lJJ 	DKKM	::++- 	DKD% DT[[]DKKMBCD	D 	c
r   c                     t        | j                  j                         D cg c]  }t        |       c}      }t        | j                        }||z
  dz   S c c}w )zG Return the McCabe complexity for the graph.
            V-E+2
           )sumr;   valueslen)r   n	num_edges	num_nodess       r   
complexityzPathGraph.complexityU   sL     ):):)<=AQ=>	

O	9$q(( >s   AN)r   )r   r$   r%   r   r@   r0   rO   r'   r   r   r5   r5   ?   s    '
)r   r5   c                        e Zd ZdZ fdZd Zd Zd ZeZd Z	d Z
d Z fd	Zd
 ZexZxZZd ZddZd Zd ZeZd ZeZ xZS )PathGraphingAstVisitorz\ A visitor for a parsed Abstract Syntax Tree which finds executable
        statements.
    c                 f    t         t        |           d| _        i | _        | j                          y )N )superrQ   r   	classnamegraphsreset)r   r   s    r   r   zPathGraphingAstVisitor.__init__c   s(    $d46

r   c                      d | _         d | _        y r
   )graphtailr   s    r   rW   zPathGraphingAstVisitor.reseti   s    
	r   c                 4    |D ]  }| j                  |        y r
   )r   )r   	node_listr   s      r   dispatch_listz$PathGraphingAstVisitor.dispatch_listm   s     	 DMM$	 r   c                    | j                   r| j                   |j                  }n|j                  }d|j                  |j                  |fz  }| j                  | j                  |      }|| _        | j                  |j                         t        dd      }| j                  j                  | j                  |       | j                  j                  ||       || _        y t        |||j                  |j                        | _        t        |      }|| _        | j                  |j                         | j                  | j                  | j                   |j                  <   | j                          y )Nz	%d:%d: %rrS   pointr,   )rU   r+   r8   
col_offsetrY   appendPathNoderZ   r]   bodyr)   r@   r5   rV   rW   )r   r   r7   r+   pathnodebottoms         r   visitFunctionDefz'PathGraphingAstVisitor.visitFunctionDefq   s   >>#~~tyy9FYYFdkk4??FCC::!**40H DItyy)bw/FJJtyy&1JJx0DI"4dooNDJ~H DItyy)@D

DKK$..$))<=JJLr   c                     | j                   }| xj                   |j                  dz   z  c_         | j                  |j                         || _         y )N.)rU   r+   r]   rc   )r   r   old_classnames      r   visitClassDefz$PathGraphingAstVisitor.visitClassDef   s:    $))c/)499%&r   c                     | j                   sy t        |      }| j                  j                  | j                   |       || _         |S r
   )rZ   r)   rY   r@   )r   r+   rd   s      r   rb   z%PathGraphingAstVisitor.appendPathNode   s9    yyD>

499h/	r   c                 f    |j                   d}n|j                   }d|z  }| j                  |       y )Nr   zStmt %d)r8   rb   )r   r   r8   r+   s       r   visitSimpleStatementz+PathGraphingAstVisitor.visitSimpleStatement   s2    ;;F[[F6!D!r   c                     t        |t        j                        r| j                  |       y t	        t
        |   |g|  y r
   )
isinstancer   stmtrm   rT   rQ   r   )r   r   r   r   s      r   r   zPathGraphingAstVisitor.default   s4    dCHH%%%d+($7DtDr   c                 F    d|j                   z  }| j                  ||       y )NzLoop %dr8   	_subgraphr   r   r+   s      r   	visitLoopz PathGraphingAstVisitor.visitLoop   s    4;;&tT"r   c                 F    d|j                   z  }| j                  ||       y )NzIf %drr   rt   s      r   visitIfzPathGraphingAstVisitor.visitIf   s    $tT"r   c                 ^   | j                   }t        |||j                  |j                        | _         t	        |      }| j                  |||       | j                   | j                  | j                  |<   | j                          y| j                  |      }| j                  |||       y)z?create the subgraphs representing any `if` and `for` statementsN)
rY   r5   r8   ra   r)   _subgraph_parserV   rU   rW   rb   )r   r   r+   extra_blocksrd   s        r   rs   z PathGraphingAstVisitor._subgraph   s    ::"4t{{DOOLDJ~H  x>;?::DKK$..$78JJL**40H  x>r   c                 4   g }|| _         | j                  |j                         |j                  | j                          |D ]?  }|| _         | j                  |j                         |j                  | j                          A |j                  r>|| _         | j                  |j                         |j                  | j                          n|j                  |       |r8t        dd      }|D ]  }| j                  j                  ||         || _         yy)z@parse the body and any `else` block of `if` and `for` statementsrS   r_   r`   N)rZ   r]   rc   r=   orelser)   rY   r@   )r   r   rd   rz   
loose_endsextrare   les           r   ry   z&PathGraphingAstVisitor._subgraph_parse   s    
	499%$))$! 	)E DIuzz*dii(	) ;; DIt{{+dii(h'bw/F  /

""2v./DI	 r   c                 ^    d|j                   z  }| j                  |||j                         y )NzTryExcept %d)rz   )r8   rs   handlersrt   s      r   visitTryExceptz%PathGraphingAstVisitor.visitTryExcept   s&    +tT>r   c                 z    d|j                   z  }| j                  |       | j                  |j                         y )NzWith %d)r8   rb   r]   rc   rt   s      r   	visitWithz PathGraphingAstVisitor.visitWith   s0    4;;&D!499%r   )r'   )r   r$   r%   r&   r   rW   r]   rf   visitAsyncFunctionDefrj   rb   rm   r   ru   visitAsyncForvisitFor
visitWhilerw   rs   ry   r   visitTryr   visitAsyncWith__classcell__)r   s   @r   rQ   rQ   ^   sv     4 -'"E# -65M5Hz#?,? H&
 Nr   rQ   c                   P    e Zd ZdZdZeZdZdZdZ	d Z
ed        Zed        Zd	 Zy
)McCabeCheckerz%McCabe cyclomatic complexity checker.mccabeC901zC901 %r is too complex (%d)c                     || _         y r
   )r"   )r   r"   filenames      r   r   zMcCabeChecker.__init__   s	    	r   c                     d}ddt         ddd}t        |dd       }t        |t              r@|j	                  d        |j
                  |fi | |j                  j                  d	       y  |j
                  |fi | y )
Nz--max-complexityr   storezMcCabe complexity thresholdTrue)r   actiontypehelpparse_from_configconfig_optionsr   zmax-complexity)intr   ro   r:   pop
add_optionr   r=   )clsparserflagkwargsconfig_optss        r   add_optionszMcCabeChecker.add_options   s    !1!'
 f&6=k4(JJ*+Fd-f-!!(()9:Fd-f-r   c                 8    t        |j                        | _        y r
   )r   max_complexity)r   optionss     r   parse_optionszMcCabeChecker.parse_options  s     !7!78r   c              #     K   | j                   dk  ry t               }|j                  | j                  |       |j                  j                         D ]n  }|j                         | j                   kD  s!| j                  |j                  |j                         fz  }|j                  |j                  |t        |       f p y w)Nr   )r   rQ   r#   r"   rV   rJ   rO   _error_tmplr7   r8   r9   r   )r   r   rY   texts       r   runzMcCabeChecker.run  s     "(*G,^^**, 	CE!D$7$77''5<<9I9I9K*LLllELL$T
BB	Cs   A1C4ACN)r   r$   r%   r&   r+   __version__version_coder   r   r   classmethodr   r   r   r'   r   r   r   r      sQ    /DGE/KN . .$ 9 9Cr   r   c                    	 t        | |dt        j                        }g }|t        _	        t        ||      j                         D ]  \  }}}}	|j                  d|||fz           t        |      dk(  ryt        dj                  |             t        |      S # t        $ r@ t	        j
                         d   }t        j                  j                  d|d|d       Y yw xY w)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   r=   rK   r.   join)
code	thresholdr   r"   ecomplxr8   offsetr   checks
             r   get_code_complexityr     s    tXvs/@/@A F#,M '4T8'D'H'H'J @#emx&>>?@ 6{a	$))F
v;  LLN1

xCDs   B AC#"C#c                 4    t        |       }t        |||       S )z"Returns the complexity of a module)r   )_readr   )module_pathr   r   s      r   get_module_complexityr   $  s    DtYEEr   c                 h   dt         j                  cxk  rdk  r)n n&t        | d      5 }|j                         cd d d        S dt         j                  cxk  rdk  rdn y 	 	 t        | d      5 }t	        j
                  |j                        \  }}d d d        t        | d      5 }|j                         cd d d        S y # 1 sw Y   y xY w# 1 sw Y   >xY w# t        t        t        f$ r8 t        | d      5 }|j                         cd d d        cY S # 1 sw Y   nxY wY w xY w# 1 sw Y   y xY w)	N)rH      )   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% E ( 8 8 D1E (C(3 	q668	 	 
-	 	
E E[,7 	 h3  qvvx       	 	 	sY   C!C -#CC &D(C
CC !D%:D

D%D	D%$D%(D1c                 $   | t         j                  dd  } t        j                         }|j	                  ddddd       |j	                  dd	d
ddd       |j                  |       \  }}t        |d         }t        ||d   dt        j                        }t               }|j                  ||       |j                  rpt        d       |j                  j                         D ]<  }|j                   r|j#                         |j                   k\  s-|j%                          > t        d       y |j                  j                         D ]D  }|j#                         |j                   k\  s!t        |j&                  |j#                                F y )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 {rC   )r   argvoptparseOptionParserr   
parse_argsr   r   r   r   rQ   r#   r   r.   rV   rJ   r   rO   r0   r+   )r   oparr   r   r   r"   r   rY   s           r   mainr   ;  sZ   |xx|  "DOOD'5l  LOOD'8u   OOD)MGTa>D4a&#*;*;<D$&GT7#{{i^^**, 	E%%$$&'*;*;;	 	c
^^**, 	6E!W%6%66ejj%"2"2"45	6r   __main__r   )   stdin)r   r
   )r&   
__future__r   r   r   r   collectionsr   r   r   ImportErrorflake8.utilr   objectr   r)   r5   rQ   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