
    c"                        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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dS )zHHandle diagram generation options for class diagram or default diagrams.    )annotationsN)	Generator)Any)nodes)ClassDiagramPackageDiagram)LinkerProject)LocalsVisitorc                  b    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dS )*DiaDefGeneratorz"Handle diagram generation options.linkerr	   handlerDiadefsHandlerreturnNonec                f    |j         | _         d| _        |                                  || _        |  dS )z&Common Diagram Handler initialization.FN)configmodule_names_set_default_optionsr   selfr   r   s      ;lib/python3.11/site-packages/pylint/pyreverse/diadefslib.py__init__zDiaDefGenerator.__init__   s8    n"'!!###'''    nodenodes.ClassDefstrc                ^    |j         }| j        r|                                j          d| }|S )zGet title for objects..)namer   root)r   r   titles      r   	get_titlezDiaDefGenerator.get_title"   s7    	 	2yy{{'11%11Er   optionbool | Noneboolc                <    |t          | j        j                  S |S )z4Activate some options if not explicitly deactivated.)r'   r   classes)r   r%   s     r   _set_optionzDiaDefGenerator._set_option)   s$      	-+,,,r   c                b   |                      | j        j                  | _        |                      | j        j                  }|                      | j        j                  }d\  }}|rd}|rd}| j        j        | j        j        }| j        j        | j        j        }||c| _        | _        dS )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.   r1   r2   s        r   r   z$DiaDefGenerator._set_default_options1   s     ,,T[-EFF(()BCC))$+*DEE'-$	$ 	I 	# ";% 	32I;& 	< $ ;1:<M....r   tuple[int, int]c                    | j         | j        fS )z Help function for search levels.)r1   r2   )r   s    r   _get_levelszDiaDefGenerator._get_levelsA   s    ~t555r   c                X    | j         j        rdS |                                j        dk    S )z'True if builtins and not show_builtins.Tbuiltins)r   show_builtinr"   r!   r   r   s     r   	show_nodezDiaDefGenerator.show_nodeE   s*    ;# 	4yy{{:--r   c                    | j                             |           | j                            |                     |          |           dS )z&Visit one class and add it to diagram.N)r   visitclassdiagram
add_objectr$   r9   s     r   	add_classzDiaDefGenerator.add_classK   sC    $$$T^^D%9%94@@@@@r   levelint%Generator[nodes.ClassDef, None, None]c              #     K   |dk    rdS |                     d          D ]}|                     |          s|V  dS )z&Return ancestor nodes of a class node.r   NF)recurs)	ancestorsr:   )r   r   r@   ancestors       r   get_ancestorszDiaDefGenerator.get_ancestorsP   sb       A: 	Fe44 	 	H>>(++ NNNN	 	r   
klass_nodec              #  n  K   |dk    rdS t          |j                                                  t          |j                                                  z   D ]\}|D ]W}t	          |t
          j                  r|j        }t	          |t          j	                  r| 
                    |          sS|V  X]dS )z(Return associated nodes of a class node.r   N)listinstance_attrs_typevalueslocals_type
isinstanceastroidInstance_proxiedr   ClassDefr:   )r   rH   r@   association_nodesr   s        r   get_associatedzDiaDefGenerator.get_associated[   s       A: 	F!%j&D&K&K&M&M!N!NQU"))++R
 R
 "
 	 	 *  dG$455 )=D"488 T^^D=Q=Q 



	 	r   r1   r2   c                ^   | j                             |          s|                     |          sdS |                     |           |                     ||          D ]}|                     ||dz
  |           |                     ||          D ]}|                     |||dz
             dS )z2Extract recursively classes related to klass_node.N   )r=   has_noder:   r?   rG   extract_classesrT   )r   rH   r1   r2   rF   r   s         r   rX   zDiaDefGenerator.extract_classesk   s     %%j11 	
9S9S 	Fz"""**:yAA 	M 	MH  9q=:KLLLL''
4EFF 	I 	ID  y2Ca2GHHHH	I 	Ir   Nr   r	   r   r   r   r   )r   r   r   r   )r%   r&   r   r'   )r   r   )r   r3   )r   r   r   r'   r   r   r   r   )r   r   r@   rA   r   rB   )rH   r   r@   rA   r   rB   )rH   r   r1   rA   r2   rA   r   r   )__name__
__module____qualname____doc__r   r$   r*   r   r5   r:   r?   rG   rT   rX    r   r   r   r      s        ,,( ( ( (      N N N N 6 6 6 6. . . .A A A A
	 	 	 	    I I I I I Ir   r   c                  B    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S )DefaultDiadefGeneratorzGenerate minimum diagram definition for the project :

    * a package diagram including project's modules
    * a class diagram including project's classes
    r   r	   r   r   r   r   c                f    t                               | ||           t          j        |            d S N)r   r   r   r   s      r   r   zDefaultDiadefGenerator.__init__   s1      vw777t$$$$$r   r   r
   c                    | j         j        }t          |j                  dk    rt	          d|j         |          | _        nd| _        t          d|j         |          | _        dS )z`Visit a pyreverse.utils.Project node.

        create a diagram definition for packages
        rV   z	packages Nzclasses )	r   modelenmodulesr   r!   
pkgdiagramr   r=   )r   r   re   s      r   visit_projectz$DefaultDiadefGenerator.visit_project   ss    
 {t|q  	#5C'DI''6 6DOO #DO()?DI)?)?FFr   _r   c                <    | j         r| j         | j        fS | j        fS )zaLeave the pyreverse.utils.Project node.

        return the generated diagram definition
        )rh   r=   )r   rj   s     r   leave_projectz$DefaultDiadefGenerator.leave_project   s*    
 ? 	6?D$555!##r   nodes.Modulec                    | j         r<| j                            |           | j                             |j        |           dS dS )z`Visit an astroid.Module node.

        add this class to the package diagram definition
        N)rh   r   r<   r>   r!   r9   s     r   visit_modulez#DefaultDiadefGenerator.visit_module   sN    
 ? 	8Kd###O&&ty$77777	8 	8r   r   c                b    |                                  \  }}|                     |||           dS )z]Visit an astroid.Class node.

        add this class to the class diagram definition
        N)r5   rX   )r   r   r1   r2   s       r   visit_classdefz%DefaultDiadefGenerator.visit_classdef   s:    
 (,'7'7'9'9$	$T9.?@@@@@r   nodes.ImportFromc                X    | j         r"| j                             ||j                   dS dS )z@Visit astroid.ImportFrom  and catch modules for package diagram.N)rh   add_from_dependmodnamer9   s     r   visit_importfromz'DefaultDiadefGenerator.visit_importfrom   s9    ? 	@O++D$,?????	@ 	@r   NrY   )r   r
   r   r   )rj   r
   r   r   )r   rm   r   r   rZ   )r   rr   r   r   )
r[   r\   r]   r^   r   ri   rl   ro   rq   rv   r_   r   r   ra   ra   z   s         % % % %G G G G$ $ $ $8 8 8 8A A A A@ @ @ @ @ @r   ra   c                      e Zd ZdZd
dZd	S )ClassDiadefGeneratorz\Generate a class diagram definition including all classes related to a
    given class.
    projectr
   klassr   r   r   c                   t          || j        j                  | _        t	          |j                  dk    r/|                    dd          \  }}|                    |          }n(|j        d         }|                    d          d         }t          |
                    |                    }|                                 \  }}|                     |||           | j        S )zDReturn a class diagram definition for the class and related classes.rV   r    r   r,   )r   r   re   r=   rf   rg   rsplit
get_modulesplitnextilookupr5   rX   )r   ry   rz   moduler1   r2   s         r   class_diagramz"ClassDiadefGenerator.class_diagram   s    (0@AAw!# 	)!LLa00MFE''//FF_Q'FKK$$R(EV^^E**++'+'7'7'9'9$	$UI/@AAA  r   N)ry   r
   rz   r   r   r   )r[   r\   r]   r^   r   r_   r   r   rx   rx      s2         ! ! ! ! ! !r   rx   c                  "    e Zd ZdZddZddZdS )r   zDGet diagram definitions from user (i.e. xml files) or generate them.r   argparse.Namespacer   r   c                    || _         d S rc   )r   )r   r   s     r   r   zDiadefsHandler.__init__   s    r   ry   r
   r   r	   list[ClassDiagram]c                   g }t          ||           }| j        j        D ]+}|                    |                    ||                     ,|s#t          ||                               |          }|D ]}|                                 |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`)
        )rx   r   r)   appendr   ra   r<   extract_relationships)r   ry   r   diagrams	generatorrz   diagrams          r   get_diadefszDiadefsHandler.get_diadefs   s     (66	[( 	E 	EEOOI33GUCCDDDD 	K-fd;;AA'JJH 	, 	,G))++++r   N)r   r   r   r   )ry   r
   r   r	   r   r   )r[   r\   r]   r^   r   r   r_   r   r   r   r      sB        NN        r   r   )r^   
__future__r   argparsecollections.abcr   typingr   rO   r   pylint.pyreverse.diagramsr   r   pylint.pyreverse.inspectorr	   r
   pylint.pyreverse.utilsr   r   ra   rx   r   r_   r   r   <module>r      st  
 O N " " " " " "  % % % % % %              B B B B B B B B 6 6 6 6 6 6 6 6 0 0 0 0 0 0
`I `I `I `I `I `I `I `IF6@ 6@ 6@ 6@ 6@]O 6@ 6@ 6@r! ! ! ! !? ! ! !0         r   