ó
„¾^Yc           @€  s\  d  Z  d d l m Z d d l Z d d l Z d d l Z d d l m Z y  d d l Z d d l m	 Z	 Wn' e
 k
 r“ d d l m Z m	 Z	 n Xd Z d e f d	 „  ƒ  YZ d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d d d „ Z d d „ Z d „  Z d d „ Z e d k rXe e j d ƒ n  d S(   s—    Meager code path measurement tool.
    Ned Batchelder
    http://nedbatchelder.com/blog/200803/python_code_complexity_microtool.html
    MIT License.
iÿÿÿÿ(   t   with_statementN(   t   defaultdict(   t   iter_child_nodes(   t   astR   s   0.6.1t
   ASTVisitorc           B€  s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s'   Performs a depth-first walk of the AST.c         C€  s   d  |  _ i  |  _ d  S(   N(   t   Nonet   nodet   _cache(   t   self(    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   __init__   s    	c         G€  s+   x$ t  | ƒ D] } |  j | | Œ q Wd  S(   N(   R   t   dispatch(   R   R   t   argst   child(    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   default   s    c         G€  sr   | |  _  | j } |  j j | ƒ } | d  k re | j } t |  j d | |  j ƒ } | |  j | <n  | | | Œ S(   Nt   visit(	   R   t	   __class__R   t   getR   t   __name__t   getattrt   visitorR   (   R   R   R   t   klasst   metht	   className(    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyR
   !   s    			c         G€  s)   | |  _  |  j | _ |  j | | Œ d S(   s&   Do preorder walk of tree using visitorN(   R   R
   R   (   R   t   treeR   R   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   preorder+   s    	(   R   t
   __module__t   __doc__R	   R   R
   R   (    (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyR      s
   			
t   PathNodec           B€  s&   e  Z d  d „ Z d „  Z d „  Z RS(   t   circlec         C€  s   | |  _  | |  _ d  S(   N(   t   namet   look(   R   R   R   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyR	   3   s    	c         C€  s"   d |  j  |  j |  j ƒ  f GHd  S(   Ns   node [shape=%s,label="%s"] %d;(   R   R   t   dot_id(   R   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   to_dot7   s    c         C€  s
   t  |  ƒ S(   N(   t   id(   R   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyR   ;   s    (   R   R   R	   R    R   (    (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyR   2   s   	t	   PathGraphc           B€  s/   e  Z d  d „ Z d „  Z d „  Z d „  Z RS(   i    c         C€  s7   | |  _  | |  _ | |  _ | |  _ t t ƒ |  _ d  S(   N(   R   t   entityt   linenot   columnR   t   listt   nodes(   R   R   R#   R$   R%   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyR	   @   s
    				c         C€  s%   |  j  | j | ƒ g  |  j  | <d  S(   N(   R'   t   append(   R   t   n1t   n2(    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   connectG   s    c         C€  sx   d GHx |  j  D] } | j ƒ  q WxI |  j  j ƒ  D]8 \ } } x) | D]! } d | j ƒ  | j ƒ  f GHqF Wq3 Wd GHd  S(   Ns
   subgraph {s	   %s -- %s;t   }(   R'   R    t   itemsR   (   R   R   t   nextst   next(    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyR    L   s    #c         C€  sI   t  g  |  j j ƒ  D] } t | ƒ ^ q ƒ } t |  j ƒ } | | d S(   sG    Return the McCabe complexity for the graph.
            V-E+2
        i   (   t   sumR'   t   valuest   len(   R   t   nt	   num_edgest	   num_nodes(    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt
   complexityU   s    .(   R   R   R	   R+   R    R6   (    (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyR"   ?   s   			t   PathGraphingAstVisitorc           B€  s¯   e  Z d  Z d „  Z d „  Z d „  Z d „  Z e Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z e Z Z Z d
 „  Z d d „ Z d „  Z d „  Z e Z d „  Z e Z RS(   s\    A visitor for a parsed Abstract Syntax Tree which finds executable
        statements.
    c         C€  s3   t  t |  ƒ j ƒ  d |  _ i  |  _ |  j ƒ  d  S(   Nt    (   t   superR7   R	   t	   classnamet   graphst   reset(   R   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyR	   c   s    		c         C€  s   d  |  _ d  |  _ d  S(   N(   R   t   grapht   tail(   R   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyR<   i   s    	c         C€  s"   x | D] } |  j  | ƒ q Wd  S(   N(   R
   (   R   t	   node_listR   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   dispatch_listm   s    c         C€  s3  |  j  r" d |  j  | j f } n	 | j } d | j | j | f } |  j d  k	 rÂ |  j | ƒ } | |  _ |  j | j	 ƒ t
 d d d ƒ} |  j j |  j | ƒ |  j j | | ƒ | |  _ nm t | | | j | j ƒ |  _ t
 | ƒ } | |  _ |  j | j	 ƒ |  j |  j d |  j  | j f <|  j ƒ  d  S(   Ns   %s%ss	   %d:%d: %rR8   R   t   point(   R:   R   R$   t
   col_offsetR=   R   t   appendPathNodeR>   R@   t   bodyR   R+   R"   R;   R<   (   R   R   R#   R   t   pathnodet   bottom(    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   visitFunctionDefq   s$    				 c         C€  s<   |  j  } |  j  | j d 7_  |  j | j ƒ | |  _  d  S(   Nt   .(   R:   R   R@   RD   (   R   R   t   old_classname(    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   visitClassDef   s    	c         C€  s<   |  j  s d  St | ƒ } |  j j |  j  | ƒ | |  _  | S(   N(   R>   R   R=   R+   (   R   R   RE   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyRC   “   s    		c         C€  s<   | j  d  k r d } n	 | j  } d | } |  j | ƒ d  S(   Ni    s   Stmt %d(   R$   R   RC   (   R   R   R$   R   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   visitSimpleStatement›   s
    		
c         G€  s?   t  | t j ƒ r" |  j | ƒ n t t |  ƒ j | | Œ d  S(   N(   t
   isinstanceR   t   stmtRK   R9   R7   R   (   R   R   R   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyR   £   s    c         C€  s!   d | j  } |  j | | ƒ d  S(   Ns   Loop %d(   R$   t	   _subgraph(   R   R   R   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt	   visitLoop©   s    c         C€  s!   d | j  } |  j | | ƒ d  S(   Ns   If %d(   R$   RN   (   R   R   R   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   visitIf¯   s    c         C€  sœ   |  j  d k rv t | | | j | j ƒ |  _  t | ƒ } |  j | | | ƒ |  j  |  j d |  j | f <|  j	 ƒ  n" |  j
 | ƒ } |  j | | | ƒ d S(   s?   create the subgraphs representing any `if` and `for` statementss   %s%sN(   R=   R   R"   R$   RB   R   t   _subgraph_parseR;   R:   R<   RC   (   R   R   R   t   extra_blocksRE   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyRN   ³   s    c         C€  s÷   g  } | |  _  |  j | j ƒ | j |  j  ƒ x7 | D]/ } | |  _  |  j | j ƒ | j |  j  ƒ q6 W| j rž | |  _  |  j | j ƒ | j |  j  ƒ n | j | ƒ | ró t d d d ƒ} x! | D] } |  j j | | ƒ qÊ W| |  _  n  d S(   s@   parse the body and any `else` block of `if` and `for` statementsR8   R   RA   N(   R>   R@   RD   R(   t   orelseR   R=   R+   (   R   R   RE   RR   t
   loose_endst   extraRF   t   le(    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyRQ   À   s$    				c         C€  s*   d | j  } |  j | | d | j ƒd  S(   Ns   TryExcept %dRR   (   R$   RN   t   handlers(   R   R   R   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   visitTryExceptÖ   s    c         C€  s.   d | j  } |  j | ƒ |  j | j ƒ d  S(   Ns   With %d(   R$   RC   R@   RD   (   R   R   R   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt	   visitWithÜ   s    (    (   R   R   R   R	   R<   R@   RG   t   visitAsyncFunctionDefRJ   RC   RK   R   RO   t   visitAsyncFort   visitFort
   visitWhileRP   RN   RQ   RX   t   visitTryRY   t   visitAsyncWith(    (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyR7   ^   s&   													t   McCabeCheckerc           B€  s\   e  Z d  Z d Z e Z d Z d Z d Z d „  Z	 e
 d „  ƒ Z e
 d „  ƒ Z d „  Z RS(	   s%   McCabe cyclomatic complexity checker.t   mccabet   C901s   C901 %r is too complex (%d)iÿÿÿÿc         C€  s   | |  _  d  S(   N(   R   (   R   R   t   filename(    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyR	   ì   s    c         C€  s”   d } i d d 6d d 6d d 6d d	 6d
 d 6} t  | d d  ƒ } t | t ƒ r€ | j d ƒ | j | |  | j j d ƒ n | j | |  d  S(   Ns   --max-complexityiÿÿÿÿR   t   storet   actiont   intt   types   McCabe complexity thresholdt   helpt   Truet   parse_from_configt   config_optionss   max-complexity(   R   R   RL   R&   t   popt
   add_optionRk   R(   (   t   clst   parsert   flagt   kwargst   config_opts(    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   add_optionsï   s    
c         C€  s   t  | j ƒ |  _ d  S(   N(   Rf   t   max_complexity(   Rn   t   options(    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   parse_options  s    c         c€  sž   |  j  d k  r d  St ƒ  } | j |  j | ƒ xh | j j ƒ  D]W } | j ƒ  |  j  k r? |  j | j | j ƒ  f } | j	 | j
 | t |  ƒ f Vq? q? Wd  S(   Ni    (   Rt   R7   R   R   R;   R1   R6   t   _error_tmplR#   R$   R%   Rg   (   R   R   R=   t   text(    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   run  s    	(   R   R   R   R   t   __version__t   versiont   _codeRw   Rt   R	   t   classmethodRs   Rv   Ry   (    (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyR`   ä   s   	i   t   stdinc   
      C€  sÞ   y t  |  | d t j ƒ } Wn< t k
 rZ t j ƒ  d } t j j d | | f ƒ d SXg  } | t _	 xC t | | ƒ j
 ƒ  D], \ } } } }	 | j d | | | f ƒ q€ Wt | ƒ d k rÆ d Sd j | ƒ GHt | ƒ S(   Nt   execi   s   Unable to parse %s: %s
i    s   %s:%d:1: %ss   
(   t   compileR   t   PyCF_ONLY_ASTt   SyntaxErrort   syst   exc_infot   stderrt   writeR`   Rt   Ry   R(   R2   t   join(
   t   codet	   thresholdRc   R   t   et   complxR$   t   offsetRx   t   check(    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   get_code_complexity  s    	(c         C€  s7   t  |  d ƒ  } | j ƒ  } Wd QXt | | d |  ƒS(   s"   Returns the complexity of a modulet   rUNRc   (   t   opent   readRŽ   (   t   module_pathR‰   t   modRˆ   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   get_module_complexity$  s    c         C€  s  d t  j k  o d k  n rD t |  d ƒ  } | j ƒ  SWd  QXnÀ d t  j k o^ d k  n ry4 t |  d ƒ  } t j | j ƒ \ } } Wd  QXWn? t t t	 f k
 rØ t |  d d	 ƒ } | j ƒ  SWd  QXn Xt |  d
 d | ƒ } | j ƒ  SWd  QXn  d  S(   Ni   i   i   i    R   i   t   rbt   encodings   latin-1t   r(   i   i   (   i   i    (   i   i    (   i   i    (
   Rƒ   t   version_infoR   R‘   t   tokenizet   detect_encodingt   readlinet   LookupErrorR‚   t   UnicodeError(   Rc   t   fR–   t   _(    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   _read+  s    "c         C€  sr  |  d  k r t j d }  n  t j ƒ  } | j d d d d d d d d	 ƒ| j d
 d d d d d d d d d ƒ| j |  ƒ \ } } t | d ƒ } t | | d d t	 j
 ƒ } t ƒ  } | j | | ƒ | j r(d GHxC | j j ƒ  D]2 } | j s| j ƒ  | j k rê | j ƒ  qê qê Wd GHnF xC | j j ƒ  D]2 } | j ƒ  | j k r8| j | j ƒ  f GHq8q8Wd  S(   Ni   s   -ds   --dott   destt   dotRh   s   output a graphviz dot fileRe   t
   store_trues   -ms   --minR‰   s   minimum complexity for outputRg   Rf   R   i    R   s   graph {R,   (   R   Rƒ   t   argvt   optparset   OptionParserRm   t
   parse_argsR    R€   R   R   R7   R   R¢   R;   R1   R‰   R6   R    R   (   R¤   t   oparRu   R   Rˆ   R   R   R=   (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   main<  s.    		
t   __main__i   (   R   t
   __future__R    R¥   Rƒ   R™   t   collectionsR   R   R   t   ImportErrort   flake8.utilRz   t   objectR   R   R"   R7   R`   RŽ   R”   R    R   R©   R   R¤   (    (    (    s&   /tmp/pip-build-EndXZ2/mccabe/mccabe.pyt   <module>   s,   †-	