ó
'![c           @  sx  d  Z  d d l m Z d d l Z d d l Z d d l Z d Z d „  Z d „  Z e j	 d ƒ Z
 e j	 d ƒ Z e j	 d	 ƒ Z d
 „  Z e j	 d ƒ Z e j	 d ƒ Z d „  Z d „  Z d „  Z d „  Z d Z d Z d Z d Z i d d 6e e e d 6e d 6e e d 6Z i e d 6e d 6e d 6d d 6Z d e f d „  ƒ  YZ d  e f d! „  ƒ  YZ d" e f d# „  ƒ  YZ d S($   s9   
generic classes/functions for pyreverse core/extensions
iÿÿÿÿ(   t   print_functionNs   .pyreversercc          C  sm   g  }  t  j j d d ƒ } | ri t  j j | t ƒ } y t | ƒ j ƒ  j ƒ  }  Wqi t	 k
 re qi Xn  |  S(   s5   
    Read config file and return list of options
    t   HOMEt    (
   t   ost   environt   gett   patht   joint   RCFILEt   opent   readt   splitt   IOError(   t   optionst   homet   rcfile(    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyt   get_default_options   s    c          C  s;   t  ƒ  }  |  j ƒ  x! |  D] } t j j d | ƒ q Wd S(   s'   insert default options to sys.argv
    i   N(   R   t   reverset   syst   argvt   insert(   R   t   arg(    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyt   insert_default_options'   s    	
s   ^__[A-Za-z0-9]+[A-Za-z0-9_]*__$s   ^__[_A-Za-z0-9]*[A-Za-z0-9]+_?$s   ^_[_A-Za-z0-9]*$c         C  sR   t  j |  ƒ r d } n6 t j |  ƒ r0 d } n t j |  ƒ rH d } n d } | S(   sM   return the visibility from a name: public, protected, private or special
    t   specialt   privatet	   protectedt   public(   t   SPECIALt   matcht   PRIVATEt	   PROTECTED(   t   namet
   visibility(    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyt   get_visibility7   s    			s   ^.*Abstract.*s	   ^[A-Z_]*$c         C  s   t  j |  j ƒ S(   sW   return true if the given class node correspond to an abstract class
    definition
    (   t   ABSTRACTR   R   (   t   node(    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyt   is_abstractH   s    c         C  s   t  j |  j ƒ S(   sT   return true if the given class/function node correspond to final
    definition
    (   t   FINALR   R   (   R#   (    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyt   is_finalN   s    c         C  s   |  j  d k S(   Nt	   interface(   t   type(   R#   (    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyt   is_interfaceT   s    c         C  s   |  j  d k S(   Nt	   exception(   R(   (   R#   (    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyt   is_exceptionX   s    i   i   i   i   i    t   ALLt   PUB_ONLYR   t   OTHERR   R   R   R   t   FilterMixInc           B  s    e  Z d  Z d „  Z d „  Z RS(   s;   filter nodes according to a mode and nodes' visibility
    c         C  sl   d } xV | j  d ƒ D]E } y | t | 7} Wq t k
 rZ } t d | d t j ƒq Xq W| |  _ d S(   s   init filter modesi    t   +s   Unknown filter mode %st   fileN(   R   t   MODESt   KeyErrort   printR   t   stderrt   _FilterMixIn__mode(   t   selft   modeR6   t   nummodt   ex(    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyt   __init__p   s    c         C  s(   t  t | d | ƒ ƒ } |  j t | @S(   s2   return true if the node should be treated
        R   (   R!   t   getattrR6   t   VIS_MOD(   R7   R#   R    (    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyt	   show_attr{   s    (   t   __name__t
   __module__t   __doc__R;   R>   (    (    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyR/   m   s   	t	   ASTWalkerc           B  s>   e  Z d  Z d „  Z d d „ Z d „  Z d „  Z d „  Z RS(   s  a walker visiting a tree in preorder, calling on the handler:

    * visit_<class name> on entering a node, where class name is the class of
    the node in lower case

    * leave_<class name> on leaving a node, where class name is the class of
    the node in lower case
    c         C  s   | |  _  i  |  _ d  S(   N(   t   handlert   _cache(   R7   RC   (    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyR;   Œ   s    	c         C  s¾   | d k r t ƒ  } n  | | k rE t t | ƒ | | j f ƒ ‚ n  | j | ƒ |  j | ƒ x6 | j ƒ  D]( } | | k	 s„ t ‚ |  j | | ƒ ql W|  j	 | ƒ | j | k	 sº t ‚ d S(   s<   walk on the tree from <node>, getting callbacks from handlerN(
   t   Nonet   sett   AssertionErrort   idt   parentt   addt   visitt   get_childrent   walkt   leave(   R7   R#   t   _donet
   child_node(    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyRM      s    !c         C  s¯   | j  } |  j j | ƒ } | d k r™ |  j } | j j ƒ  } t | d | t | d d ƒ ƒ } t | d | t | d d ƒ ƒ } | | f |  j | <n | \ } } | | f S(   s/   get callbacks from handler for the visited nodes   visit_%st   visit_defaults   leave_%st   leave_defaultN(   t	   __class__RD   R   RE   RC   R?   t   lowerR<   (   R7   R#   t   klasst   methodsRC   t   kidt   e_methodt   l_method(    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyt   get_callbacksž   s    		c         C  s0   |  j  | ƒ d } | d k	 r, | | ƒ n  d S(   s<   walk on the tree from <node>, getting callbacks from handleri    N(   RZ   RE   (   R7   R#   t   method(    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyRK   ®   s    c         C  s0   |  j  | ƒ d } | d k	 r, | | ƒ n  d S(   s<   walk on the tree from <node>, getting callbacks from handleri   N(   RZ   RE   (   R7   R#   R[   (    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyRN   ´   s    N(	   R?   R@   RA   R;   RE   RM   RZ   RK   RN   (    (    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyRB   ‚   s   			t   LocalsVisitorc           B  s    e  Z d  Z d „  Z d „  Z RS(   s3   visit a project by traversing the locals dictionaryc         C  s   t  j |  |  ƒ i  |  _ d  S(   N(   RB   R;   t   _visited(   R7   (    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyR;   ½   s    c         C  s¨   | |  j  k r d Sd |  j  | <|  j | ƒ } | d d k	 rP | d | ƒ n  t | d ƒ r† x$ | j ƒ  D] } |  j | ƒ ql Wn  | d d k	 r¤ | d | ƒ Sd S(   s-   launch the visit starting from the given nodei   i    t   localsN(   R]   RE   RZ   t   hasattrt   valuesRK   (   R7   R#   RV   t
   local_node(    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyRK   Á   s    (   R?   R@   RA   R;   RK   (    (    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyR\   »   s   	(   RA   t
   __future__R    R   t   reR   R   R   R   t   compileR   R   R   R!   R"   R%   R$   R&   R)   R+   t   _CONSTRUCTORt   _SPECIALt
   _PROTECTEDt   _PRIVATER2   R=   t   objectR/   RB   R\   (    (    (    s5   lib/python2.7/site-packages/pylint/pyreverse/utils.pyt   <module>   s>   							9