
    e"                        d Z ddlmZ ddlZddlmZ ddlmZ ddlZddlm	Z	 ddl
mZ ddlmZmZ dd	lmZmZ dd
lmZ  G d d      Z G d dee      Z G d de      Z G d d      Zy)zHHandle diagram generation options for class diagram or default diagrams.    )annotationsN)	Generator)Any)nodes)is_stdlib_module)ClassDiagramPackageDiagram)LinkerProject)LocalsVisitorc                      e Zd ZdZddZddZddZddZddZddZ	ddZ
	 	 	 	 	 	 dd	Z	 	 	 	 	 	 dd
Z	 	 	 	 	 	 	 	 ddZy)DiaDefGeneratorz"Handle diagram generation options.c                f    |j                   | _         d| _        | j                          || _        |  y)z&Common Diagram Handler initialization.FN)configmodule_names_set_default_optionslinkerselfr   handlers      =/usr/lib/python3/dist-packages/pylint/pyreverse/diadefslib.py__init__zDiaDefGenerator.__init__   s+    nn"'!!#    c                t    |j                   }| j                  r|j                         j                    d| }|S )zGet title for objects..)namer   root)r   nodetitles      r   	get_titlezDiaDefGenerator.get_title#   s6    		yy{''(%1Er   c                H    |t        | j                  j                        S |S )z4Activate some options if not explicitly deactivated.)boolr   classes)r   options     r   _set_optionzDiaDefGenerator._set_option*   s#     >++,,r   c                   | j                  | j                  j                        | _        | j                  | j                  j                        }| j                  | j                  j                        }d\  }}|rd}|rd}| j                  j
                  | j                  j
                  }| j                  j                  | j                  j                  }||c| _        | _        y)z7Set different default options with _default dictionary.)r   r   N)	r%   r   r   all_ancestorsall_associatedshow_ancestorsshow_associated	anc_levelassociation_level)r   r(   r)   r,   r-   s        r   r   z$DiaDefGenerator._set_default_options2   s     ,,T[[-E-EF(()B)BC))$++*D*DE'-$	$I ";;%%122I;;&&2 $ ; ;1:<M..r   c                2    | j                   | j                  fS )z Help function for search levels.)r,   r-   )r   s    r   _get_levelszDiaDefGenerator._get_levelsB   s    ~~t5555r   c                    |j                         j                  dk(  r| j                  j                  S t	        |j                         j                        r| j                  j
                  S y)z2Determine if node should be shown based on config.builtinsT)r   r   r   show_builtinr   show_stdlibr   r   s     r   	show_nodezDiaDefGenerator.show_nodeF   sM    99;z);;+++DIIK,,-;;***r   c                    | j                   j                  |       | j                  j                  | j	                  |      |       y)z&Visit one class and add it to diagram.N)r   visitclassdiagram
add_objectr    r4   s     r   	add_classzDiaDefGenerator.add_classP   s3    $$$T^^D%94@r   c              #  r   K   |dk(  ry|j                  d      D ]  }| j                  |      s|  yw)z&Return ancestor nodes of a class node.r   NF)recurs)	ancestorsr5   )r   r   levelancestors       r   get_ancestorszDiaDefGenerator.get_ancestorsU   s@      A:e4 	H>>(+N	s   57c              #  j  K   |dk(  ryt        |j                  j                               t        |j                  j                               z   D ]_  }|D ]X  }t	        |t
        j                        r|j                  }t	        |t        j                        r| j                  |      sU| Z a yw)z(Return associated nodes of a class node.r   N)listinstance_attrs_typevalueslocals_type
isinstanceastroidInstance_proxiedr   ClassDefr5   )r   
klass_noder>   association_nodesr   s        r   get_associatedzDiaDefGenerator.get_associated`   s      A:!%j&D&D&K&K&M!NQU""))+R
 "
 	 * dG$4$45==D"48T^^D=Q
	s   B1B3c                4   | j                   j                  |      s| j                  |      sy| j                  |       | j	                  ||      D ]  }| j                  ||dz
  |        | j                  ||      D ]  }| j                  |||dz
          y)z2Extract recursively classes related to klass_node.N   )r8   has_noder5   r:   r@   extract_classesrM   )r   rK   r,   r-   r?   r   s         r   rQ   zDiaDefGenerator.extract_classesp   s     %%j1
9Sz"**:yA 	MH  9q=:KL	M ''
4EF 	ID  y2Ca2GH	Ir   Nr   r
   r   DiadefsHandlerreturnNone)r   nodes.ClassDefrT   str)r$   zbool | NonerT   r"   )rT   rU   )rT   ztuple[int, int])r   rV   rT   r"   r   rV   rT   rU   )r   rV   r>   intrT   %Generator[nodes.ClassDef, None, None])rK   rV   r>   rY   rT   rZ   )rK   rV   r,   rY   r-   rY   rT   rU   )__name__
__module____qualname____doc__r   r    r%   r   r/   r5   r:   r@   rM   rQ    r   r   r   r      s    ,(N 6A
	"	+.		.	(14	. I(I58IMPI	Ir   r   c                  @    e Zd ZdZd	dZd
dZddZddZddZddZ	y)DefaultDiadefGeneratorzGenerate minimum diagram definition for the project :

    * a package diagram including project's modules
    * a class diagram including project's classes
    c                \    t         j                  | ||       t        j                  |        y N)r   r   r   r   s      r   r   zDefaultDiadefGenerator.__init__   s"      vw7t$r   c                    | j                   j                  }t        |j                        dkD  rt	        d|j
                   |      | _        nd| _        t        d|j
                   |      | _        y)z`Visit a pyreverse.utils.Project node.

        create a diagram definition for packages
        rO   z	packages Nzclasses )	r   modelenmodulesr	   r   
pkgdiagramr   r8   )r   r   re   s      r   visit_projectz$DefaultDiadefGenerator.visit_project   sc    
 {{t||q 5CDII;'6DO #DO(8DII;)?Fr   c                d    | j                   r| j                   | j                  fS | j                  fS )zaLeave the pyreverse.utils.Project node.

        return the generated diagram definition
        )rh   r8   )r   _s     r   leave_projectz$DefaultDiadefGenerator.leave_project   s/    
 ????D$5$555!!##r   c                    | j                   rB| j                  j                  |       | j                   j                  |j                  |       yy)z`Visit an astroid.Module node.

        add this class to the package diagram definition
        N)rh   r   r7   r9   r   r4   s     r   visit_modulez#DefaultDiadefGenerator.visit_module   s:    
 ??KKd#OO&&tyy$7 r   c                P    | j                         \  }}| j                  |||       y)z]Visit an astroid.Class node.

        add this class to the class diagram definition
        N)r/   rQ   )r   r   r,   r-   s       r   visit_classdefz%DefaultDiadefGenerator.visit_classdef   s+    
 (,'7'7'9$	$T9.?@r   c                j    | j                   r'| j                   j                  ||j                         yy)z@Visit astroid.ImportFrom  and catch modules for package diagram.N)rh   add_from_dependmodnamer4   s     r   visit_importfromz'DefaultDiadefGenerator.visit_importfrom   s&    ??OO++D$,,? r   NrR   )r   r   rT   rU   )rk   r   rT   r   )r   znodes.ModulerT   rU   rX   )r   znodes.ImportFromrT   rU   )
r[   r\   r]   r^   r   ri   rl   rn   rp   rt   r_   r   r   ra   ra      s(    %G$8A@r   ra   c                      e Zd ZdZddZy)ClassDiadefGeneratorz\Generate a class diagram definition including all classes related to a
    given class.
    c                   t        || j                  j                        | _        t	        |j
                        dkD  r'|j                  dd      \  }}|j                  |      }n#|j
                  d   }|j                  d      d   }t        |j                  |            }| j                         \  }}| j                  |||       | j                  S )zDReturn a class diagram definition for the class and related classes.rO   r   r   r'   )r   r   re   r8   rf   rg   rsplit
get_modulesplitnextilookupr/   rQ   )r   projectklassmoduler,   r-   s         r   class_diagramz"ClassDiadefGenerator.class_diagram   s    (0@0@Aw!#!LLa0MFE''/F__Q'FKK$R(EV^^E*+'+'7'7'9$	$UI/@A   r   N)r}   r   r~   rV   rT   r   )r[   r\   r]   r^   r   r_   r   r   rv   rv      s    !r   rv   c                       e Zd ZdZddZddZy)rS   zDGet diagram definitions from user (i.e. xml files) or generate them.c                    || _         y rc   )r   )r   r   s     r   r   zDiadefsHandler.__init__   s	    r   c                   g }t        ||       }| j                  j                  D ]#  }|j                  |j	                  ||             % |st        ||       j                  |      }|D ]  }|j                           |S )ax  Get the diagram's 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`)
        )rv   r   r#   appendr   ra   r7   extract_relationships)r   r}   r   diagrams	generatorr~   diagrams          r   get_diadefszDiadefsHandler.get_diadefs   s     (6	[[(( 	EEOOI33GUCD	E-fd;AA'JH 	,G))+	,r   N)r   zargparse.NamespacerT   rU   )r}   r   r   r
   rT   zlist[ClassDiagram])r[   r\   r]   r^   r   r   r_   r   r   rS   rS      s    Nr   rS   )r^   
__future__r   argparsecollections.abcr   typingr   rG   r   astroid.modutilsr   pylint.pyreverse.diagramsr   r	   pylint.pyreverse.inspectorr
   r   pylint.pyreverse.utilsr   r   ra   rv   rS   r_   r   r   <module>r      s_   
 O "  %    - B 6 0
dI dIN6@]O 6@r!? !0 r   