
    cm*                    "   d Z ddlm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  G d	 d
          Z G d de          Z G d de          Z G d de          Z G d de          Z G d dee          Z G d de          ZdS )zDiagram objects.    )annotations)Iterable)AnyN)nodes)decorated_with_property)FilterMixInis_interfacec                      e Zd ZdZddZdS )Figurez Base class for counter handling.returnNonec                    d| _         d S )N )fig_idselfs    9lib/python3.11/site-packages/pylint/pyreverse/diagrams.py__init__zFigure.__init__   s        Nr   r   )__name__
__module____qualname____doc__r    r   r   r   r      s.        **     r   r   c                  (     e Zd ZdZ	 dd fd
Z xZS )Relationshipz8A relationship from an object in the diagram to another.Nfrom_objectDiagramEntity	to_objectrelation_typestrname
str | Nonec                    t                                                       || _        || _        || _        || _        d S N)superr   r   r    typer#   )r   r   r    r!   r#   	__class__s        r   r   zRelationship.__init__   s<     	&"!				r   r&   )r   r   r    r   r!   r"   r#   r$   )r   r   r   r   r   __classcell__r)   s   @r   r   r      sM        BB            r   r   c                  ,     e Zd ZdZdZ	 dd fdZ xZS )r   z=A diagram object, i.e. a label associated to an astroid node.r   No nameNtitler"   nodenodes.NodeNG | Noner   r   c                    t                                                       || _        |r|nt          j                    | _        | j        | _        d S r&   )r'   r   r.   r   NodeNGr/   default_shapeshaper   r.   r/   r)   s      r   r   zDiagramEntity.__init__0   sF     	
*."B$$ELNN	'


r   )r-   N)r.   r"   r/   r0   r   r   r   r   r   r   r3   r   r*   r+   s   @r   r   r   +   sT        GGM CG( ( ( ( ( ( ( ( ( ( (r   r   c                      e Zd ZdZdZdS )PackageEntityz(A diagram object representing a package.packageN)r   r   r   r   r3   r   r   r   r8   r8   9   s        22MMMr   r8   c                  (     e Zd ZdZdZd
 fd	Z xZS )ClassEntityz&A diagram object representing a class.classr.   r"   r/   nodes.ClassDefr   r   c                j    t                                          ||           g | _        g | _        d S )N)r.   r/   )r'   r   attrsmethodsr5   s      r   r   zClassEntity.__init__D   s2    u4000 "
02r   r.   r"   r/   r=   r   r   r6   r+   s   @r   r;   r;   ?   sH        00M3 3 3 3 3 3 3 3 3 3r   r;   c                      e Zd ZdZdZd.dZd/dZ	 d0d1dZd2dZd3dZ	d4dZ
d5dZd6dZd7d"Zd8d#Zd9d%Zd:d'Zd;d(Zd<d-ZdS )=ClassDiagramzMain class diagram handling.r<   r.   r"   moder   r   c                    t          j        | |           t                              |            || _        g | _        i | _        i | _        d S r&   )r   r   r   r.   objectsrelationships_nodes)r   r.   rD   s      r   r   zClassDiagram.__init__O   sH    T4(((
"$<>9;r   roleIterable[Relationship]c                X    t          | j                            |d          d           S )Nr   c                2    | j         j        | j        j        fS r&   )r   r   r    )xs    r   <lambda>z0ClassDiagram.get_relationships.<locals>.<lambda>\   s    1=/1CD r   key)sortedrG   get)r   rI   s     r   get_relationshipszClassDiagram.get_relationshipsX   s5    ""4,,DD
 
 
 	
r   Nr   r   r    r!   r#   r$   c                    t          ||||          }| j                            |g                               |           dS )zCreate a relationship.N)r   rG   
setdefaultappend)r   r   r    r!   r#   rels         r   add_relationshipzClassDiagram.add_relationship_   sD     ;	=$GG%%mR88??DDDDDr   r   c                v    | j                             |d          D ]}|j        |u r|c S t          |          )zReturn a relationship or None.r   )rG   rR   r   KeyError)r   r   r!   rW   s       r   get_relationshipzClassDiagram.get_relationshipj   sQ     %))-<< 	 	C+- 


}%%%r   r/   r=   	list[str]c                   g }d |                                 D             }t          |j                                                   t          |j                                                   z   |z   D ]a\  }}|                     |          s|                     |          }|r| dd                    |           }|                    |           bt          |          S )z4Return visible attributes, possibly with class name.c                n    g | ]2\  }}t          |t          j                  t          |          .||f3S r   )
isinstancer   FunctionDefr   ).0nms      r   
<listcomp>z*ClassDiagram.get_attrs.<locals>.<listcomp>v   sV     
 
 
1!U.//
 5LA4N4N
F
 
 
r   z : z, )	itemslistinstance_attrs_typelocals_type	show_attrclass_namesjoinrV   rQ   )r   r/   r?   
properties	node_nameassociated_nodesnamess          r   	get_attrszClassDiagram.get_attrss   s    
 



 
 

 )//11224#))++,,-
	$ 
	$'I'
 >>),, $$%566E @(??TYYu-=-=??	LL####e}}r   list[nodes.FunctionDef]c                h      fd|                                 D             }t          |d           S )zReturn visible methods.c                    g | ]f}t          |t          j                  t          |t          j        j                  ;t          |          J                    |j                  d|gS r   )	r_   r   r`   astroidrF   Propertyr   ri   r#   )ra   rc   r   s     r   rd   z,ClassDiagram.get_methods.<locals>.<listcomp>   s     
 
 
!U.//
 q'/":;;	

 ,A..
 qv&&

 
 
r   c                    | j         S r&   )r#   )rb   s    r   rN   z*ClassDiagram.get_methods.<locals>.<lambda>   s    QV r   rO   )valuesrQ   )r   r/   r@   s   `  r   get_methodszClassDiagram.get_methods   sL    
 
 
 
[[]]
 
 
 g#3#34444r   c                    || j         vsJ t          ||          }|| j         |<   | j                            |           dS zCreate a diagram object.N)rH   r;   rF   rV   r   r.   r/   ents       r   
add_objectzClassDiagram.add_object   sL    4;&&&&%&&DC     r   	nodes_lstIterable[nodes.NodeNG]c                b   g }|D ]}t          |t          j                  r|j        }t          |t          j        t          j        t          j        t          j        f          rJt          |d          r:| 
                    |          s%|j        |vr|j        }|                    |           |S )z(Return class names if needed in diagram.r#   )r_   rt   Instance_proxiedr   ClassDefName	SubscriptBinOphasattrhas_noder#   rV   )r   r~   ro   r/   rm   s        r   rj   zClassDiagram.class_names   s     	, 	,D$ 011 %}5>5:uT 	, D&))		,
 d++	, 9E) , $	ILL+++r   nodes.NodeNGboolc                    || j         v S )z9Return true if the given node is included in the diagram.rH   r   r/   s     r   r   zClassDiagram.has_node   s    t{""r   c                    | j         |         S )z)Return the diagram object mapped to node.r   r   s     r   object_from_nodezClassDiagram.object_from_node   s    {4  r   list[ClassEntity]c                $    d | j         D             S )z&Return all class nodes in the diagram.c                <    g | ]}t          |t                    |S r   )r_   r;   ra   os     r   rd   z(ClassDiagram.classes.<locals>.<listcomp>   s'    FFFa:a+E+EFFFFr   rF   r   s    r   classeszClassDiagram.classes   s    FF4<FFFFr   r;   c                v    |                                  D ]}|j        j        |k    r|c S t          |          )z8Return a class by its name, raise KeyError if not found.)r   r/   r#   rZ   )r   r#   klasss      r   classezClassDiagram.classe   sD    \\^^ 	 	Ez$& tnnr   c           	        |                                  D ]}|j        }|                     |          |_        |                     |          |_        t          |          rd|_        nd|_        |                    d          D ]?}	 | 	                    |          }| 
                    ||d           0# t          $ r Y <w xY w|j        D ]?}	 | 	                    |          }| 
                    ||d           0# t          $ r Y <w xY wt          |j                                                  D ]"\  }}|D ]}	|                     |	||d           #t          |j                                                  t          |j                                                  z   D ]"\  }}|D ]}	|                     |	||d           #d	S )
3Extract relationships between nodes in the diagram.	interfacer<   F)recursspecialization
implementsaggregationassociationN)r   r/   rp   r?   rx   r@   r	   r4   	ancestorsr   rX   rZ   r   rf   aggregations_typere   assign_association_relationshipassociations_typerh   )
r   objr/   par_nodepar_obj	impl_nodeimpl_objr#   rw   values
             r   extract_relationshipsz"ClassDiagram.extract_relationships   sA   <<>> %	 %	C8Dt,,CI**400CKD!! $'		#	 NN%N88  "33H==G))#w8HIIII   H "_  	#44Y??H))#xFFFF   H !%T%;%A%A%C%C D D  f#  E88sD-   
 !%T%;%A%A%C%C D Dt &&((H H !  f $  E88sD-   ?%	 %	s$   
,B77
CC,C>>
D
Dr   astroid.NodeNGr   type_relationshipc                    |t           j        u rd S t          |t           j                  r|j        }	 |                     |          }|                     ||||           d S # t          $ r Y d S w xY wr&   )rt   Uninferabler_   r   r   r   rX   rZ   )r   r   r   r#   r   associated_objs         r   r   z,ClassDiagram.assign_association_relationship   s     G'' 	FeW-.. 	#NE	!22599N!!.#7H$OOOOO 	 	 	FF	s   -A" "
A0/A0)r.   r"   rD   r"   r   r   )rI   r"   r   rJ   r&   )
r   r   r    r   r!   r"   r#   r$   r   r   )r   r   r!   r"   r   r   )r/   r=   r   r\   )r/   r=   r   rq   rA   )r~   r   r   r\   )r/   r   r   r   )r/   r   r   r   )r   r   )r#   r"   r   r;   r   )
r   r   r   r;   r#   r"   r   r"   r   r   )r   r   r   r   TYPEr   rS   rX   r[   rp   rx   r}   rj   r   r   r   r   r   r   r   r   r   rC   rC   J   sK       &&D< < < <
 
 
 
  	E 	E 	E 	E 	E& & & &   *
5 
5 
5 
5! ! ! !   $# # # #! ! ! !G G G G   ' ' ' 'R     r   rC   c                  P     e Zd ZdZdZddZdd	ZddZddZddZ	d fdZ
 xZS )PackageDiagramzPackage diagram handling.r9   r   list[PackageEntity]c                $    d | j         D             S )z'Return all module nodes in the diagram.c                <    g | ]}t          |t                    |S r   )r_   r8   r   s     r   rd   z*PackageDiagram.modules.<locals>.<listcomp>   s'    HHHa:a+G+GHHHHr   r   r   s    r   moduleszPackageDiagram.modules   s    HH4<HHHHr   r#   r"   r8   c                v    |                                  D ]}|j        j        |k    r|c S t          |          )z9Return a module by its name, raise KeyError if not found.)r   r/   r#   rZ   )r   r#   mods      r   modulezPackageDiagram.module   sD    <<>> 	 	Cx}$ 


tnnr   r.   r/   nodes.Moduler   c                    || j         vsJ t          ||          }|| j         |<   | j                            |           dS rz   )rH   r8   rF   rV   r{   s       r   r}   zPackageDiagram.add_object  sL    4;&&&&E4((DC     r   c                   |                                  D ]i}|j        j        }||k    r|c S |                                j        }|| d| k    r|c S ||                    dd          d          d| k    r|c S jt          |          )zmReturn a module by its name, looking also for relative imports;
        raise KeyError if not found.
        .   r   )r   r/   r#   rootrsplitrZ   )r   r#   r/   r   mod_namer9   s         r   
get_modulezPackageDiagram.get_module  s     <<>> 		 		Cx}H4 


iikk&Gg..... 


gnnS!44Q7@@$@@@ 


tnnr   nodes.ImportFromfrom_modulec                    |                                 j        }|                     |          }||j        j        vr!|j        j                            |           dS dS )z)Add dependencies created by from-imports.N)r   r#   r   r/   dependsrV   )r   r/   r   r   r   s        r   add_from_dependzPackageDiagram.add_from_depend  s^    99;;#kk(##ch.. 	1H##K00000	1 	1r   c                    t                                                       |                                 D ]V}	 |                     |j                                                  }|                     ||d           G# t          $ r Y Sw xY w|                                 D ]\}d|_	        |j        j
        D ]F}	 |                     ||j                  }n# t          $ r Y +w xY w|                     ||d           G]dS )r   	ownershipr9   r   N)r'   r   r   r   r/   r   rX   rZ   r   r4   r   r   )r   	class_objr   package_objdep_namedepr)   s         r   r   z$PackageDiagram.extract_relationships%  s3   %%''' 	 	I++IN,?,?,A,ABB%%ikBBBB   <<>> 	C 	CK )K',4 C C//(K4DEECC   H%%k3	BBBBC	C 	Cs$   AA==
B
	B
9C
C"!C")r   r   )r#   r"   r   r8   )r.   r"   r/   r   r   r   )r#   r"   r/   r   r   r8   )r/   r   r   r"   r   r   r   )r   r   r   r   r   r   r   r}   r   r   r   r*   r+   s   @r   r   r      s        ##DI I I I   ! ! ! !    1 1 1 1C C C C C C C C C Cr   r   )r   
__future__r   collections.abcr   typingr   rt   r   pylint.checkers.utilsr   pylint.pyreverse.utilsr   r	   r   r   r   r8   r;   rC   r   r   r   r   <module>r      s  
   " " " " " " $ $ $ $ $ $              9 9 9 9 9 9 < < < < < < < <           6   "( ( ( ( (F ( ( (    M   3 3 3 3 3- 3 3 3j j j j j6; j j jZ@C @C @C @C @C\ @C @C @C @C @Cr   