
    yIf:-                    &   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m	Z	 ddl
mZmZ ddl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util)decorated_with_propertyin_type_checking_block)FilterMixInc                      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    M/var/www/piapp/venv/lib/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                                                       || _        |pt          j        d d d d d           | _        | j        | _        d S )N)lineno
col_offset
end_linenoend_col_offsetparent)r(   r   r/   r   NodeNGr0   default_shapeshaper   r/   r0   r*   s      r   r   zDiagramEntity.__init__0   s`     	
"& #
%,+
 +
 +
	 '


r   )r.   N)r/   r#   r0   r1   r   r   r   r   r   r   r9   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   r9   r   r   r   r>   r>   ?   s        22MMMr   r>   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#   r0   nodes.ClassDefr   r   c                j    t                                          ||           g | _        g | _        d S )N)r/   r0   )r(   r   attrsmethodsr;   s      r   r   zClassEntity.__init__J   s2    u4000 "
02r   r/   r#   r0   rC   r   r   r<   r,   s   @r   rA   rA   E   sH        00M3 3 3 3 3 3 3 3 3 3r   rA   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.rB   r/   r#   moder   r   c                    t          j        | |           t                              |            || _        g | _        i | _        i | _        d S r'   )r
   r   r   r/   objectsrelationships_nodes)r   r/   rJ   s      r   r   zClassDiagram.__init__U   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>b   s    1=/1CD r   key)sortedrM   get)r   rO   s     r   get_relationshipszClassDiagram.get_relationships^   s5    ""4,,DD
 
 
 	
r   Nr   r    r!   r"   r$   r%   c                    t          ||||          }| j                            |g                               |           dS )zCreate a relationship.N)r   rM   
setdefaultappend)r   r   r!   r"   r$   rels         r   add_relationshipzClassDiagram.add_relationshipe   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   )rM   rX   r   KeyError)r   r   r"   r]   s       r   get_relationshipzClassDiagram.get_relationshipp   sO     %))-<< 	 	C+--


 .}%%%r   r0   rC   	list[str]c                   g }d |                                 D             }t          |j                                                   t          |j                                                   z   D ]\  }}||vr|||<   |                                 D ]a\  }}|                     |          s|                     |          }|r| dd                    |           }|                    |           bt          |          S )z4Return visible attributes, possibly with class name.c                l    i | ]1\  }}t          |t          j                  t          |          .||2S r   )
isinstancer   FunctionDefr   ).0
local_name
local_nodes      r   
<dictcomp>z*ClassDiagram.get_attrs.<locals>.<dictcomp>|   sS     
 
 
&
J*e&788
 (
33	


 
 
r   z : z, )	itemslistlocals_typeinstance_attrs_type	show_attrclass_namesjoinr\   rW   )	r   r0   rE   
properties	attr_name	attr_type	node_nameassociated_nodesnamess	            r   	get_attrszClassDiagram.get_attrsy   s,   
 
*.**,,
 
 

 %))9)?)?)A)A$B$BT$**,,F
 F
 %
 	2 	2 Iy 
**(1
9%+5+;+;+=+= 	$ 	$'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   )	re   r   rf   astroidrL   Propertyr   ro   r$   )rg   mr   s     r   
<listcomp>z,ClassDiagram.get_methods.<locals>.<listcomp>   s     
 
 
!U.//
 q'/":;;	

 ,A..
 qv&&

 
 
r   c                    | j         S r'   )r$   )ns    r   rT   z*ClassDiagram.get_methods.<locals>.<lambda>   s    QV r   rU   )valuesrW   )r   r0   rF   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)rN   rA   rL   r\   r   r/   r0   ents       r   
add_objectzClassDiagram.add_object   sL    4;&&&&%&&DC     r   	nodes_lstIterable[nodes.NodeNG]c                   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        }                    |           t          fdD                       S )z(Return class names if needed in diagram.r$   c              3  T   K   | ]!t          fd D                       V  "dS )c              3  ,   K   | ]}|vp|k    V  d S r'   r   )rg   otherr$   s     r   	<genexpr>z5ClassDiagram.class_names.<locals>.<genexpr>.<genexpr>   s1      II%4u$5IIIIIIr   N)all)rg   r$   rw   s    @r   r   z+ClassDiagram.class_names.<locals>.<genexpr>   s[       
 
IIII5IIIII

 
 
 
 
 
r   )re   r|   Instance_proxiedr   ClassDefName	SubscriptBinOphasattrhas_noder$   r\   rW   )r   r   r0   ru   rw   s       @r   rp   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.rN   r   r0   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   )re   rA   rg   os     r   r   z(ClassDiagram.classes.<locals>.<listcomp>   s'    FFFa:a+E+EFFFFr   rL   r   s    r   classeszClassDiagram.classes   s    FF4<FFFFr   rA   c                v    |                                  D ]}|j        j        |k    r|c S t          |          )z8Return a class by its name, raise KeyError if not found.)r   r0   r$   r`   )r   r$   klasss      r   classezClassDiagram.classe   sB    \\^^ 	 	Ez$&& 'tnnr   c           	        |                                  D ]\}|j        }|                     |          |_        |                     |          |_        d|_        |                    d          D ]?}	 |                     |          }| 	                    ||d           0# t          $ r Y <w xY wt          |j                                                  D ]"\  }}|D ]}|                     |||d           #|j                                        }|j                                        D ]\  }}||vr|||<   |                                D ]"\  }}|D ]}|                     |||d           #^dS )3Extract relationships between nodes in the diagram.rB   F)recursspecializationaggregationassociationN)r   r0   rx   rE   r   rF   r:   	ancestorsr   r^   r`   rl   aggregations_typerk   assign_association_relationshipassociations_typecopyrm   )	r   objr0   par_nodepar_objr$   r   valueassociationss	            r   extract_relationshipsz"ClassDiagram.extract_relationships   s   <<>> 	 	C8Dt,,CI**400CKCI NN%N88  "33H==G))#w8HIIII   H !%T%;%A%A%C%C D D  f#  E88sD-   
  16688L $ 0 6 6 8 8 0 0f|++)/L& , 2 2 4 4  f#  E88sD-   5	 	s   3,B  
B-,B-r   astroid.NodeNGr   type_relationshipc                    t          |t          j                  rd S t          |t          j                  r|j        }	 |                     |          }|                     ||||           d S # t          $ r Y d S w xY wr'   )	re   r   UninferableBaser|   r   r   r   r^   r`   )r   r   r   r$   r   associated_objs         r   r   z,ClassDiagram.assign_association_relationship   s     eT122 	FeW-.. 	#NE	!22599N!!.#7H$OOOOO 	 	 	FF	s   -A. .
A<;A<)r/   r#   rJ   r#   r   r   )rO   r#   r   rP   r'   )
r   r    r!   r    r"   r#   r$   r%   r   r   )r   r    r"   r#   r   r   )r0   rC   r   rb   )r0   rC   r   ry   rG   )r   r   r   rb   )r0   r   r   r   )r0   r   r   r    )r   r   )r$   r#   r   rA   r   )
r   r   r   rA   r$   r#   r   r#   r   r   )r   r   r   r   TYPEr   rY   r^   ra   rx   r   r   rp   r   r   r   r   r   r   r   r   r   rI   rI   P   sK       &&D< < < <
 
 
 
  	E 	E 	E 	E 	E& & & &   0
5 
5 
5 
5! ! ! !
 
 
 
.# # # #! ! ! !G G G G          D     r   rI   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.r?   r   list[PackageEntity]c                $    d | j         D             S )z'Return all module nodes in the diagram.c                <    g | ]}t          |t                    |S r   )re   r>   r   s     r   r   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#   r>   c                v    |                                  D ]}|j        j        |k    r|c S t          |          )z9Return a module by its name, raise KeyError if not found.)r   r0   r$   r`   )r   r$   mods      r   modulezPackageDiagram.module  sB    <<>> 	 	Cx}$$


 %tnnr   r/   r0   nodes.Moduler   c                    || j         vsJ t          ||          }|| j         |<   | j                            |           dS r   )rN   r>   rL   r\   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   r0   r$   rootrsplitr`   )r   r$   r0   r   mod_namer?   s         r   
get_modulezPackageDiagram.get_module  s     <<>> 		 		Cx}H4


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


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


 Atnnr   nodes.ImportFromfrom_modulec                "   |                                 j        }|                     |          j        }||j        v rdS t          |          s|j                            |           dS ||j        vr|j                            |           dS dS )z)Add dependencies created by from-imports.N)r   r$   r   r0   dependsr	   r\   type_depends)r   r0   r   r   r?   s        r   add_from_dependzPackageDiagram.add_from_depend%  s    99;;#++h'','/))F%d++ 	5O"";///// 444 ''44444 54r   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|j        j        D ]F}	 |                     ||j                  }n# t          $ r Y +w xY w|                     ||d           GdS )r   	ownershipr?   r   r   N)r(   r   r   r   r0   r   r^   r`   r   r:   r   r   r   )r   	class_objr   package_objdep_namedepr*   s         r   r   z$PackageDiagram.extract_relationships2  s   %%''' 	 	I++IN,?,?,A,ABB%%ikBBBB   <<>> 	H 	HK )K',4 C C//(K4DEECC   H%%k3	BBBB',9 H H//(K4DEECC   H%%k3GGGGH	H 	Hs6   AA==
B
	B
9C
C"!C"D((
D54D5)r   r   )r$   r#   r   r>   )r/   r#   r0   r   r   r   )r$   r#   r0   r   r   r>   )r0   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   ! ! ! !    5 5 5 5H H H H H H H H H Hr   r   )r   
__future__r   collections.abcr   typingr   r|   r   r   pylint.checkers.utilsr   r	   pylint.pyreverse.utilsr
   r   r   r    r>   rA   rI   r   r   r   r   <module>r      s  
   " " " " " " $ $ $ $ $ $                Q Q Q Q Q Q Q Q . . . . . .           6   "( ( ( ( (F ( ( ((    M   3 3 3 3 3- 3 3 3k k k k k6; k k k\MH MH MH MH MH\ MH MH MH MH MHr   