ó
'![c           @@  s´   d  Z  d d l m Z d d l m Z m Z d d l m	 Z	 d d l
 m Z d d l m Z m Z d e f d „  ƒ  YZ d	 e f d
 „  ƒ  YZ d e	 j f d „  ƒ  YZ d „  Z d S(   s/   Module to add McCabe checker class for pylint. i    (   t   absolute_import(   t	   PathGrapht   PathGraphingAstVisitor(   t   checkers(   t   check_messages(   t   HIGHt   IAstroidCheckerR   c           B@  s   e  Z d  „  Z RS(   c         C@  s2   t  t |  ƒ j d d d d d d ƒ | |  _ d  S(   Nt   namet    t   entityt   linenoi   (   t   superR   t   __init__t   root(   t   selft   node(    (    s7   lib/python2.7/site-packages/pylint/extensions/mccabe.pyR      s    %(   t   __name__t
   __module__R   (    (    (    s7   lib/python2.7/site-packages/pylint/extensions/mccabe.pyR      s   R   c           B@  s®   e  Z d  „  Z d „  Z d „  Z d „  Z e Z d „  Z e Z Z	 Z
 Z Z Z Z Z Z Z Z Z Z Z Z Z Z d „  Z e Z d „  Z d	 d „ Z d „  Z RS(
   c         C@  s    t  t |  ƒ j ƒ  d |  _ d  S(   Ni    (   R   R   R   t   _bottom_counter(   R   (    (    s7   lib/python2.7/site-packages/pylint/extensions/mccabe.pyR      s    c         G@  s+   x$ | j  ƒ  D] } |  j | | Œ q Wd  S(   N(   t   get_childrent   dispatch(   R   R   t   argst   child(    (    s7   lib/python2.7/site-packages/pylint/extensions/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__t   _cachet   gett   NoneR   t   getattrt   visitorR   (   R   R   R   t   klasst   metht	   className(    (    s7   lib/python2.7/site-packages/pylint/extensions/mccabe.pyR   "   s    			c         C@  sÞ   |  j  d  k	 rˆ |  j | ƒ } | |  _ |  j | j ƒ d |  j } |  j d 7_ |  j  j |  j | ƒ |  j  j | | ƒ | |  _ nR t | ƒ |  _  | |  _ |  j | j ƒ |  j  |  j	 d |  j
 | j f <|  j ƒ  d  S(   Ns   %si   s   %s%s(   t   graphR   t   _append_nodet   tailt   dispatch_listt   bodyR   t   connectR   t   graphst	   classnameR   t   reset(   R   R   t   pathnodet   bottom(    (    s7   lib/python2.7/site-packages/pylint/extensions/mccabe.pyt   visitFunctionDef,   s    		 c         C@  s   |  j  | ƒ d  S(   N(   R#   (   R   R   (    (    s7   lib/python2.7/site-packages/pylint/extensions/mccabe.pyt   visitSimpleStatement@   s    c         C@  s!   |  j  | ƒ |  j | j ƒ d  S(   N(   R#   R%   R&   (   R   R   (    (    s7   lib/python2.7/site-packages/pylint/extensions/mccabe.pyt	   visitWithH   s    c         C@  s0   |  j  s d  S|  j j |  j  | ƒ | |  _  | S(   N(   R$   R   R"   R'   (   R   R   (    (    s7   lib/python2.7/site-packages/pylint/extensions/mccabe.pyR#   N   s
    		c         C@  s   |  j  d k r[ 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   t   _subgraph_parseR(   R)   R*   R#   (   R   R   R   t   extra_blocks(    (    s7   lib/python2.7/site-packages/pylint/extensions/mccabe.pyt	   _subgraphU   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ý d |  j } |  j d 7_ x! | D] } |  j j | | ƒ qÔ W| |  _  n  d S(   s@   parse the body and any `else` block of `if` and `for` statementss   %si   N(   R$   R%   R&   t   appendt   orelseR   R"   R'   (   R   R   R+   R1   t
   loose_endst   extraR,   t   le(    (    s7   lib/python2.7/site-packages/pylint/extensions/mccabe.pyR0   a   s&    				(    (   R   R   R   R   R   R-   t   visitAsyncFunctionDefR.   t   visitAssertt   visitAssignt   visitAugAssignt   visitDeletet
   visitPrintt
   visitRaiset
   visitYieldt   visitImportt	   visitCallt   visitSubscriptt	   visitPasst   visitContinuet
   visitBreakt   visitGlobalt   visitReturnt	   visitExprt
   visitAwaitR/   t   visitAsyncWithR#   R2   R0   (    (    (    s7   lib/python2.7/site-packages/pylint/extensions/mccabe.pyR      s   			
		F		t   McCabeMethodCheckerc           B@  sg   e  Z d  Z e Z d Z i d d 6Z d i d d 6d	 d
 6d d 6d d 6f f Z e d ƒ d „  ƒ Z	 RS(   so   Checks McCabe complexity cyclomatic threshold in methods and functions
    to validate a too complex code.
    t   designs*   %s is too complex. The McCabe rating is %ds   too-complexsS   Used when a method or function is too complex based on McCabe Complexity Cyclomatict   R1260s   max-complexityi
   R   t   intt   types   <int>t   metavars&   McCabe complexity cyclomatic thresholdt   helpc      
   C@  sÒ   t  ƒ  } x! | j D] } | j | | ƒ q Wxž | j j ƒ  D] } | j ƒ  } | j } t | d ƒ rw d | j } n d | j	 j
 j ƒ  } | |  j j k r¥ q= n  |  j d d | d t d | | f ƒq= Wd S(	   s‡   visit an astroid.Module node to check too complex rating and
        add message if is greather than max_complexity stored from optionsR   s   '%s's	   This '%s's   too-complexR   t
   confidenceR   N(   R   R&   t   preorderR(   t   valuest
   complexityR   t   hasattrR   R   R   t   lowert   configt   max_complexityt   add_messageR   (   R   R   R   R   R"   RU   t	   node_name(    (    s7   lib/python2.7/site-packages/pylint/extensions/mccabe.pyt   visit_module‘   s    		(   s*   %s is too complex. The McCabe rating is %ds   too-complexsS   Used when a method or function is too complex based on McCabe Complexity Cyclomatic(
   R   R   t   __doc__R   t   __implements__R   t   msgst   optionsR   R\   (    (    (    s7   lib/python2.7/site-packages/pylint/extensions/mccabe.pyRK   y   s     
c         C@  s   |  j  t |  ƒ ƒ d S(   s   Required method to auto register this checker.

    :param linter: Main interface object for Pylint plugins
    :type linter: Pylint object
    N(   t   register_checkerRK   (   t   linter(    (    s7   lib/python2.7/site-packages/pylint/extensions/mccabe.pyt   register¦   s    N(   R]   t
   __future__R    t   mccabeR   t   Mccabe_PathGraphR   t   Mccabe_PathGraphingAstVisitort   pylintR   t   pylint.checkers.utilsR   t   pylint.interfacesR   R   t   BaseCheckerRK   Rc   (    (    (    s7   lib/python2.7/site-packages/pylint/extensions/mccabe.pyt   <module>   s   `-