ó
'![c           @   s­   d  Z  d d l Z d d l m Z m Z d d l m Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ	 d	 e f d
 „  ƒ  YZ
 d e e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   s   diagram objects
iÿÿÿÿN(   t   is_interfacet   FilterMixIn(   t   decorated_with_propertyt   Figurec           B   s   e  Z d  Z RS(   s   base class for counter handling(   t   __name__t
   __module__t   __doc__(    (    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyR      s   t   Relationshipc           B   s   e  Z d  Z d d „ Z RS(   s=   a relation ship from an object in the diagram to another
    c         C   s5   t  j |  ƒ | |  _ | |  _ | |  _ | |  _ d  S(   N(   R   t   __init__t   from_objectt	   to_objectt   typet   name(   t   selfR	   R
   t   relation_typeR   (    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyR      s
    			N(   R   R   R   t   NoneR   (    (    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyR      s   t   DiagramEntityc           B   s   e  Z d  Z d d d „ Z RS(   sA   a diagram object, i.e. a label associated to an astroid node
    s   No namec         C   s#   t  j |  ƒ | |  _ | |  _ d  S(   N(   R   R   t   titlet   node(   R   R   R   (    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyR   $   s    	N(   R   R   R   R   R   (    (    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyR   !   s   t   ClassDiagramc           B   s•   e  Z d  Z d Z d „  Z d „  Z d d „ Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s    main class diagram handling
    t   classc         C   sN   t  j |  | ƒ t j |  ƒ | |  _ g  |  _ i  |  _ i  |  _ g  |  _ d  S(   N(   R   R   R   R   t   objectst   relationshipst   _nodest   depends(   R   R   t   mode(    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyR   .   s    				c         C   s"   t  |  j j | d ƒ d d „  ƒS(   Nt   keyc         S   s   |  j  j |  j j f S(   N(   R	   t   fig_idR
   (   t   x(    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyt   <lambda>:   s    (    (   t   sortedR   t   get(   R   t   role(    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyt   get_relationships7   s    c         C   s5   t  | | | | ƒ } |  j j | g  ƒ j | ƒ d S(   s   create a relation ship
        N(   R   R   t
   setdefaultt   append(   R   R	   R
   R   R   t   rel(    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyt   add_relationship<   s    c         C   sC   x0 |  j  j | d ƒ D] } | j | k r | Sq Wt | ƒ ‚ d S(   s'   return a relation ship or None
        N(    (   R   R   R	   t   KeyError(   R   R	   R   R$   (    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyt   get_relationshipC   s    c   	      C   sé   g  } g  | j  ƒ  D]6 \ } } t | t j ƒ r t | ƒ r | | f ^ q } x t | j j  ƒ  ƒ t | j j  ƒ  ƒ | D]_ \ } } |  j | ƒ s q| n  |  j	 | ƒ } | rÎ d | d j
 | ƒ f } n  | j | ƒ q| Wt | ƒ S(   s3   return visible attributes, possibly with class names   %s : %ss   , (   t   itemst
   isinstancet   astroidt   FunctionDefR   t   listt   instance_attrs_typet   locals_typet	   show_attrt   class_namest   joinR#   R   (	   R   R   t   attrst   nt   mt
   propertiest	   node_namet	   ass_nodest   names(    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyt	   get_attrsK   s    6c         C   sc   g  | j  ƒ  D]= } t | t j ƒ r t | ƒ r |  j | j ƒ r | ^ q } t | d d „  ƒS(   s   return visible methodsR   c         S   s   |  j  S(   N(   R   (   R3   (    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyR   e   s    (   t   valuesR)   R*   R+   R   R/   R   R   (   R   R   R4   t   methods(    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyt   get_methods]   s
    c         C   sE   | |  j  k s t ‚ t | | ƒ } | |  j  | <|  j j | ƒ d S(   s    create a diagram object
        N(   R   t   AssertionErrorR   R   R#   (   R   R   R   t   ent(    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyt
   add_objectg   s    c         C   s•   g  } xˆ | D]€ } t  | t j ƒ r1 | j } n  t  | t j ƒ r t | d ƒ r |  j | ƒ r | j | k r | j } | j | ƒ q q q W| S(   s'   return class names if needed in diagramR   (	   R)   R*   t   Instancet   _proxiedt   ClassDeft   hasattrt   has_nodeR   R#   (   R   t   nodesR8   t   ass_nodet   ass_name(    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyR0   o   s    	c         C   s   |  j  j ƒ  S(   s,   return the list of underlying nodes
        (   R   t   keys(   R   (    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyRE   |   s    c         C   s   | |  j  k S(   sA   return true if the given node is included in the diagram
        (   R   (   R   R   (    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyRD      s    c         C   s   |  j  | S(   s1   return the diagram object mapped to node
        (   R   (   R   R   (    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyt   object_from_node†   s    c         C   s/   g  |  j  D]! } t | j t j ƒ r
 | ^ q
 S(   s%   return all class nodes in the diagram(   R   R)   R   R*   RB   (   R   t   o(    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyt   classes‹   s    c         C   s=   x* |  j  ƒ  D] } | j j | k r | Sq Wt | ƒ ‚ d S(   s@   return a class by its name, raise KeyError if not found
        N(   RK   R   R   R&   (   R   R   t   klass(    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyt   classe   s    c         C   sÑ  xÊ|  j  ƒ  D]¼} | j } |  j | ƒ | _ |  j | ƒ | _ t | ƒ rX d | _ n	 d | _ xW | j d t	 ƒ D]C } y& |  j
 | ƒ } |  j | | d ƒ Wqt t k
 r¶ qt qt Xqt WxN | j D]C } y& |  j
 | ƒ } |  j | | d ƒ WqÅ t k
 rqÅ qÅ XqÅ Wxº t | j j ƒ  ƒ t | j j ƒ  ƒ D] \ } } x | D]y }	 |	 t j k rcqHn  t |	 t j ƒ r|	 j }	 n  y) |  j
 |	 ƒ }
 |  j |
 | d | ƒ WqHt k
 rÀqHqHXqHWq5Wq Wd S(   s<   extract relation ships between nodes in the diagram
        t	   interfaceR   t   recurst   specializationt
   implementst   associationN(   RK   R   R9   R2   R<   R;   R    t   shapet	   ancestorst   FalseRI   R%   R&   RQ   R,   R-   R(   R.   R*   t   YESR)   R@   RA   (   R   t   objR   t   par_nodet   par_objt	   impl_nodet   impl_objR   R:   t   valuet   ass_obj(    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyt   extract_relationships—   s>    		 N(   R   R   R   t   TYPER   R!   R   R%   R'   R9   R<   R?   R0   RE   RD   RI   RK   RM   R^   (    (    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyR   *   s    						
							t   PackageDiagramc           B   sA   e  Z d  Z d Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s   package diagram handling
    t   packagec         C   s/   g  |  j  D]! } t | j t j ƒ r
 | ^ q
 S(   s&   return all module nodes in the diagram(   R   R)   R   R*   t   Module(   R   RJ   (    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyt   modulesÅ   s    c         C   s=   x* |  j  ƒ  D] } | j j | k r | Sq Wt | ƒ ‚ d S(   sA   return a module by its name, raise KeyError if not found
        N(   Rc   R   R   R&   (   R   R   t   mod(    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyt   moduleÉ   s    c         C   s–   xƒ |  j  ƒ  D]u } | j j } | | k r/ | S| j ƒ  j } | d | | f k rX | S| d | j d d ƒ d | f k r | Sq Wt | ƒ ‚ d S(   sl   return a module by its name, looking also for relative imports;
        raise KeyError if not found
        s   %s.%st   .i   i    N(   Rc   R   R   t   roott   rsplitR&   (   R   R   R   Rd   t   mod_nameRa   (    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyt
   get_moduleÑ   s    &c         C   sJ   | j  ƒ  j } |  j | ƒ } | | j j k rF | j j j | ƒ n  d S(   s1   add dependencies created by from-imports
        N(   Rg   R   Re   R   R   R#   (   R   R   t   from_moduleRi   RW   (    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyt   add_from_dependá   s    c         C   sè   t  j |  ƒ xZ |  j ƒ  D]L } y/ |  j | j j ƒ  ƒ } |  j | | d ƒ Wq t k
 re q q Xq Wxw |  j ƒ  D]i } d | _	 xW | j j
 D]I } y |  j | | j ƒ } Wn t k
 rÈ q“ n X|  j | | d ƒ q“ Wqw Wd S(   s<   extract relation ships between nodes in the diagram
        t	   ownershipRa   R   N(   R   R^   RK   RI   R   Rg   R%   R&   Rc   RS   R   Rj   (   R   RW   Rd   t   dep_namet   dep(    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyR^   é   s    	(	   R   R   R   R_   Rc   Re   Rj   Rl   R^   (    (    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyR`   À   s   				(   R   R*   t   pylint.pyreverse.utilsR    R   t   pylint.checkers.utilsR   t   objectR   R   R   R   R`   (    (    (    s8   lib/python2.7/site-packages/pylint/pyreverse/diagrams.pyt   <module>   s   	–