ó
'![c           @   s°   d  Z  d d l m Z d d l Z d d l m Z m Z d d l m Z e j	 Z
 d e f d „  ƒ  YZ d e e f d	 „  ƒ  YZ d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   sH   handle diagram generation options for class diagram or default diagrams
iÿÿÿÿ(   t   builtinsN(   t   PackageDiagramt   ClassDiagram(   t   LocalsVisitort   DiaDefGeneratorc           B   sh   e  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!   handle diagram generation optionsc         C   s,   | j  |  _  |  j ƒ  | |  _ d |  _ d S(   s%   common Diagram Handler initializationN(   t   configt   _set_default_optionst   linkert   Nonet   classdiagram(   t   selfR   t   handler(    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyt   __init__   s    
	c         C   s2   | j  } |  j r. d | j ƒ  j  | f } n  | S(   s   get title for objectss   %s.%s(   t   namet   module_namest   root(   R
   t   nodet   title(    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyt	   get_title&   s    		c         C   s    | d k r t |  j j ƒ S| S(   s3   activate some options if not explicitly deactivatedN(   R   t   boolR   t   classes(   R
   t   option(    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyt   _set_option-   s    c         C   sÅ   |  j  |  j j ƒ |  _ |  j  |  j j ƒ } |  j  |  j j ƒ } d \ } } | r] d } n  | rl d } n  |  j j d k	 r |  j j } n  |  j j d k	 r® |  j j } n  | | |  _ |  _	 d S(   s6   set different default options with _default dictionaryi    iÿÿÿÿN(   i    i    (
   R   R   R   t   all_ancestorst   all_associatedt   show_ancestorsR   t   show_associatedt	   anc_levelt	   ass_level(   R
   R   R   R   R   (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyR   5   s    		c         C   s   |  j  |  j f S(   s   help function for search levels(   R   R   (   R
   (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyt   _get_levelsE   s    c         C   s#   |  j  j r t S| j ƒ  j t k S(   s&   true if builtins and not show_builtins(   R   t   show_builtint   TrueR   R   t   BUILTINS_NAME(   R
   R   (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyt	   show_nodeI   s    c         C   s0   |  j  j | ƒ |  j j |  j | ƒ | ƒ d S(   s%   visit one class and add it to diagramN(   R   t   visitR	   t
   add_objectR   (   R
   R   (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyt	   add_classO   s    c         c   sK   | d k r d Sx4 | j  d t ƒ D]  } |  j | ƒ s> q# n  | Vq# Wd S(   s%   return ancestor nodes of a class nodei    Nt   recurs(   t	   ancestorst   FalseR!   (   R
   R   t   levelt   ancestor(    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyt   get_ancestorsT   s    c         c   s¢   | d k r d Sx‹ t  | j j ƒ  ƒ t  | j j ƒ  ƒ D]a } xX | D]P } t | t j ƒ rj | j } n  t | t j ƒ oˆ |  j	 | ƒ s‘ qF n  | VqF Wq9 Wd S(   s'   return associated nodes of a class nodei    N(
   t   listt   instance_attrs_typet   valuest   locals_typet
   isinstancet   astroidt   Instancet   _proxiedt   ClassDefR!   (   R
   t
   klass_nodeR(   t	   ass_nodest   ass_node(    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyt   get_associated]   s    c         C   sŸ   |  j  j | ƒ s" |  j | ƒ r& d S|  j | ƒ x1 |  j | | ƒ D] } |  j | | d | ƒ qF Wx1 |  j | | ƒ D] } |  j | | | d ƒ qz Wd S(   s1   extract recursively classes related to klass_nodeNi   (   R	   t   has_nodeR!   R$   R*   t   extract_classesR7   (   R
   R4   R   R   R)   R6   (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyR9   k   s    "(   t   __name__t
   __module__t   __doc__R   R   R   R   R   R!   R$   R*   R7   R9   (    (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyR      s   										t   DefaultDiadefGeneratorc           B   sD   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s¡   generate minimum diagram definition for the project :

    * a package diagram including project's modules
    * a class diagram including project's classes
    c         C   s$   t  j |  | | ƒ t j |  ƒ d  S(   N(   R   R   R   (   R
   R   R   (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyR      s    c         C   sc   |  j  j } t | j ƒ d k r= t d | j | ƒ |  _ n	 d |  _ t d | j | ƒ |  _	 d S(   s`   visit an pyreverse.utils.Project node

        create a diagram definition for packages
        i   s   packages %ss
   classes %sN(
   R   t   modet   lent   modulesR   R   t
   pkgdiagramR   R   R	   (   R
   R   R>   (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyt   visit_projectƒ   s
    	c         C   s#   |  j  r |  j  |  j f S|  j f S(   s`   leave the pyreverse.utils.Project node

        return the generated diagram definition
        (   RA   R	   (   R
   R   (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyt   leave_project   s    	c         C   s6   |  j  r2 |  j j | ƒ |  j  j | j | ƒ n  d S(   s_   visit an astroid.Module node

        add this class to the package diagram definition
        N(   RA   R   R"   R#   R   (   R
   R   (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyt   visit_module˜   s    	c         C   s)   |  j  ƒ  \ } } |  j | | | ƒ d S(   s\   visit an astroid.Class node

        add this class to the class diagram definition
        N(   R   R9   (   R
   R   R   R   (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyt   visit_classdef¡   s    c         C   s&   |  j  r" |  j  j | | j ƒ n  d S(   sH   visit astroid.ImportFrom  and catch modules for package diagram
        N(   RA   t   add_from_dependt   modname(   R
   R   (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyt   visit_importfrom©   s    	(	   R:   R;   R<   R   RB   RC   RD   RE   RH   (    (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyR=   x   s   							t   ClassDiadefGeneratorc           B   s    e  Z d  Z d „  Z d „  Z RS(   s[   generate a class diagram definition including all classes related to a
    given class
    c         C   s   t  j |  | | ƒ d  S(   N(   R   R   (   R
   R   R   (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyR   µ   s    c         C   s¸   t  | |  j j ƒ |  _ t | j ƒ d k rW | j d d ƒ \ } } | j | ƒ } n  | j d } | j d ƒ d } t	 | j
 | ƒ ƒ } |  j ƒ  \ } } |  j | | | ƒ |  j S(   s^   return a class diagram definition for the given klass and its
        related klasses
        i   t   .i    iÿÿÿÿ(   R   R   R>   R	   R?   R@   t   rsplitt
   get_modulet   splitt   nextt   ilookupR   R9   (   R
   t   projectt   klasst   moduleR   R   (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyt   class_diagram¸   s    (   R:   R;   R<   R   RS   (    (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyRI   °   s   	t   DiadefsHandlerc           B   s    e  Z d  Z d „  Z d „  Z RS(   sY   handle diagram definitions :

    get it from user (i.e. xml files) or generate them
    c         C   s   | |  _  d  S(   N(   R   (   R
   R   (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyR   Ò   s    c         C   s…   g  } t  | |  ƒ } x- |  j j D] } | j | j | | ƒ ƒ q" W| sf t | |  ƒ j | ƒ } n  x | D] } | j ƒ  qm W| S(   sv  Get the diagrams configuration data

        :param project:The pyreverse project
        :type project: pyreverse.utils.Project
        :param linker: The linker
        :type linker: pyreverse.inspector.Linker(IdGeneratorMixIn, LocalsVisitor)

        :returns: The list of diagram definitions
        :rtype: list(:class:`pylint.pyreverse.diagrams.ClassDiagram`)
        (   RI   R   R   t   appendRS   R=   R"   t   extract_relationships(   R
   RP   R   t   diagramst	   generatorRQ   t   diagram(    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyt   get_diadefsÕ   s    (   R:   R;   R<   R   RZ   (    (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyRT   Ì   s   	(   R<   t	   six.movesR    R0   t   pylint.pyreverse.diagramsR   R   t   pylint.pyreverse.utilsR   R:   R    t   objectR   R=   RI   RT   (    (    (    s:   lib/python2.7/site-packages/pylint/pyreverse/diadefslib.pyt   <module>   s   	\8