
    e:-                        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y)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y)Figurez Base class for counter handling.c                    d| _         y )N )fig_id)selfs    ;/usr/lib/python3/dist-packages/pylint/pyreverse/diagrams.py__init__zFigure.__init__   s	        NreturnNone)__name__
__module____qualname____doc__r    r   r   r   r      s
    *r   r   c                  6     e Zd ZdZ	 d	 	 	 	 	 	 	 d fdZ xZS )Relationshipz8A relationship from an object in the diagram to another.c                Z    t         |           || _        || _        || _        || _        y N)superr   from_object	to_objecttypename)r   r!   r"   relation_typer$   	__class__s        r   r   zRelationship.__init__   s-     	&"!		r   r   )r!   DiagramEntityr"   r'   r%   strr$   
str | None)r   r   r   r   r   __classcell__r&   s   @r   r   r      s;    B  " ! 	
  r   r   c                  6     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   c                    t         |           || _        |xs t        j                  d d d d d       | _        | j                  | _        y )N)lineno
col_offset
end_linenoend_col_offsetparent)r    r   titler   NodeNGnodedefault_shapeshaper   r3   r5   r&   s      r   r   zDiagramEntity.__init__0   sL     	
"& #
%,,+
	 ''
r   )zNo nameN)r3   r(   r5   znodes.NodeNG | Noner   r   r   r   r   r   r6   r   r*   r+   s   @r   r'   r'   +   s4    GM CG((,?(	( (r   r'   c                      e Zd ZdZdZy)PackageEntityz(A diagram object representing a package.packageN)r   r   r   r   r6   r   r   r   r;   r;   ?   s
    2Mr   r;   c                  (     e Zd ZdZdZd fdZ xZS )ClassEntityz&A diagram object representing a class.classc                D    t         |   ||       g | _        g | _        y )N)r3   r5   )r    r   attrsmethodsr8   s      r   r   zClassEntity.__init__J   s#    u40 "
02r   r3   r(   r5   nodes.ClassDefr   r   r9   r+   s   @r   r>   r>   E   s    0M3 3r   r>   c                      e Zd ZdZdZddZddZ	 d	 	 	 	 	 	 	 	 	 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dZ	 	 	 	 	 	 	 	 	 	 d dZy)!ClassDiagramzMain class diagram handling.r?   c                    t        j                  | |       t        j                  |        || _        g | _        i | _        i | _        y r   )r
   r   r   r3   objectsrelationships_nodes)r   r3   modes      r   r   zClassDiagram.__init__U   s;    T4(
"$<>9;r   c                R    t        | j                  j                  |d      d       S )Nr   c                Z    | j                   j                  | j                  j                  fS r   )r!   r   r"   )xs    r   <lambda>z0ClassDiagram.get_relationships.<locals>.<lambda>b   s    1==//1C1CD r   key)sortedrI   get)r   roles     r   get_relationshipszClassDiagram.get_relationships^   s(    ""4,D
 	
r   Nc                v    t        ||||      }| j                  j                  |g       j                  |       y)zCreate a relationship.N)r   rI   
setdefaultappend)r   r!   r"   r%   r$   rels         r   add_relationshipzClassDiagram.add_relationshipe   s5     ;	=$G%%mR8??Dr   c                ~    | j                   j                  |d      D ]  }|j                  |u s|c S  t        |      )zReturn a relationship or None.r   )rI   rS   r!   KeyError)r   r!   r%   rY   s       r   get_relationshipzClassDiagram.get_relationshipp   sD     %%))-< 	C+-
	 }%%r   c                2   g }|j                         D ci c]-  \  }}t        |t        j                        rt	        |      r||/ }}}t        |j                  j                               t        |j                  j                               z   D ]  \  }}||vs|||<    |j                         D ]Q  \  }}	| j                  |      s| j                  |	      }
|
r| ddj                  |
       }|j                  |       S t        |      S c c}}w )z4Return visible attributes, possibly with class name.z : z, )items
isinstancer   FunctionDefr   listlocals_typeinstance_attrs_type	show_attrclass_namesjoinrX   rR   )r   r5   rA   
local_name
local_node
properties	attr_name	attr_type	node_nameassociated_nodesnamess              r   	get_attrszClassDiagram.get_attrsy   s$    +/**,
&
J*e&7&78'
3 
"

 
 %))9)9)?)?)A$BT$$**,F
 %
 	2 Iy 
*(1
9%		2 ,6+;+;+= 	$'I'>>),$$%56E(kTYYu-=,>?	LL#	$ e}'
s   2Dc                *   |j                         D cg c]h  }t        |t        j                        rLt        |t        j
                  j                        s(t        |      s| j                  |j                        r|j }}t        |d       S c c}w )zReturn visible methods.c                    | j                   S r   )r$   )ns    r   rO   z*ClassDiagram.get_methods.<locals>.<lambda>   s
    QVV r   rP   )valuesr`   r   ra   astroidrH   Propertyr   re   r$   rR   )r   r5   mrB   s       r   get_methodszClassDiagram.get_methods   sx     [[]
!U../q'//":":;+A.qvv& 
 
 g#344
s   A-Bc                    || j                   vsJ t        ||      }|| j                   |<   | j                  j                  |       yzCreate a diagram object.N)rJ   r>   rH   rX   r   r3   r5   ents       r   
add_objectzClassDiagram.add_object   s@    4;;&&&%&DC r   c                   g |D ]  }t        |t        j                        r|j                  }t        |t        j
                  t        j                  t        j                  t        j                  f      srt        |d      s| j                  |      r|j                  vs|j                  }j                  |        t        fdD              S )z(Return class names if needed in diagram.r$   c              3  L   K   | ]  t        fd D              r  yw)c              3  4   K   | ]  }|vxs |k(    y wr   r   ).0otherr$   s     r   	<genexpr>z5ClassDiagram.class_names.<locals>.<genexpr>.<genexpr>   s"     I%4u$55Is   N)all)r   r$   ro   s    @r   r   z+ClassDiagram.class_names.<locals>.<genexpr>   s'      
I5II 
s    $)r`   ru   Instance_proxiedr   ClassDefName	SubscriptBinOphasattrhas_noder$   rX   rR   )r   	nodes_lstr5   rm   ro   s       @r   rf   zClassDiagram.class_names   s     	,D$ 0 01}}5>>5::uT D&)d+99E) $		ILL+	,  

 
 	
r   c                    || j                   v S )z9Return true if the given node is included in the diagram.rJ   r   r5   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   c                b    | j                   D cg c]  }t        |t              s| c}S c c}w )z&Return all class nodes in the diagram.)rH   r`   r>   r   os     r   classeszClassDiagram.classes   s#    <<Fa:a+EFFF   ,,c                |    | j                         D ]  }|j                  j                  |k(  s|c S  t        |      )z8Return a class by its name, raise KeyError if not found.)r   r5   r$   r\   )r   r$   klasss      r   classezClassDiagram.classe   s8    \\^ 	Ezz$&	 tnr   c           	        | j                         D ]=  }|j                  }| j                  |      |_        | j	                  |      |_        d|_        |j                  d      D ]'  }	 | j                  |      }| j                  ||d       ) t        |j                  j                               D ]   \  }}|D ]  }| j                  |||d        " |j                  j!                         }|j"                  j                         D ]  \  }}||vs|||<    |j                         D ]   \  }}|D ]  }| j                  |||d        " @ y# t        $ r Y w xY w)3Extract relationships between nodes in the diagram.r?   F)recursspecializationaggregationassociationN)r   r5   rp   rA   rx   rB   r7   	ancestorsr   rZ   r\   rb   aggregations_typer_   assign_association_relationshipassociations_typecopyrc   )	r   objr5   par_nodepar_objr$   rt   valueassociationss	            r   extract_relationshipsz"ClassDiagram.extract_relationships   s|   <<> 	C88Dt,CI**40CKCI NN%N8 "33H=G))#w8HI !%T%;%;%A%A%C D f# E88sD-  11668L $ 0 0 6 6 8 0f|+)/L&0 !- 2 2 4 f# E88sD-5	   s   *$E	EEc                    t        |t        j                        ry t        |t        j                        r|j
                  }	 | j                  |      }| j                  ||||       y # t        $ r Y y w xY wr   )	r`   r   UninferableBaseru   r   r   r   rZ   r\   )r   r   r   r$   type_relationshipassociated_objs         r   r   z,ClassDiagram.assign_association_relationship   sl     eT112eW--.NNE	!2259N!!.#7H$O 		s   %A) )	A54A5)r3   r(   rK   r(   r   r   )rT   r(   r   zIterable[Relationship]r   )
r!   r'   r"   r'   r%   r(   r$   r)   r   r   )r!   r'   r%   r(   r   r   )r5   rD   r   	list[str])r5   rD   r   zlist[nodes.FunctionDef]rC   )r   zIterable[nodes.NodeNG]r   r   )r5   nodes.NodeNGr   bool)r5   r   r   r'   )r   zlist[ClassEntity])r$   r(   r   r>   r   )
r   zastroid.NodeNGr   r>   r$   r(   r   r(   r   r   )r   r   r   r   TYPEr   rU   rZ   r]   rp   rx   r}   rf   r   r   r   r   r   r   r   r   r   rF   rF   P   s    &D<
  	E"	E !	E 		E
 	E 
	E&(&9<&	&0
5!
.#!G D#*5=@UX	r   rF   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<   c                b    | j                   D cg c]  }t        |t              s| c}S c c}w )z'Return all module nodes in the diagram.)rH   r`   r;   r   s     r   moduleszPackageDiagram.modules  s#    <<Ha:a+GHHHr   c                |    | j                         D ]  }|j                  j                  |k(  s|c S  t        |      )z9Return a module by its name, raise KeyError if not found.)r   r5   r$   r\   )r   r$   mods      r   modulezPackageDiagram.module  s8    <<> 	Cxx}}$
	 tnr   c                    || j                   vsJ t        ||      }|| j                   |<   | j                  j                  |       yrz   )rJ   r;   rH   rX   r{   s       r   r}   zPackageDiagram.add_object  s@    4;;&&&E4(DC r   c                   | j                         D ]j  }|j                  j                  }||k(  r|c S |j                         j                  }|| d| k(  r|c S ||j	                  dd      d    d| k(  sh|c S  t        |      )zmReturn a module by its name, looking also for relative imports;
        raise KeyError if not found.
        .   r   )r   r5   r$   rootrsplitr\   )r   r$   r5   r   mod_namer<   s         r   
get_modulezPackageDiagram.get_module  s     <<> 		Cxx}}H4
iik&&GgYav..
gnnS!4Q78$@@
		 tnr   c                .   |j                         j                  }| j                  |      j                  }||j                  v ryt        |      s|j                  j                  |       y||j                  vr|j                  j                  |       yy)z)Add dependencies created by from-imports.N)r   r$   r   r5   dependsr	   rX   type_depends)r   r5   from_moduler   r<   s        r   add_from_dependzPackageDiagram.add_from_depend%  sw    99;##++h',,'//)%d+OO"";/ 4 44  ''4 5r   c                   t         |           | j                         D ]?  }	 | j                  |j                  j                               }| j                  ||d       A | j                         D ]  }d|_	        |j                  j                  D ]2  }	 | j                  ||j                        }| j                  ||d       4 |j                  j                  D ]2  }	 | j                  ||j                        }| j                  ||d       4  y# t        $ r Y w xY w# t        $ r Y w xY w# t        $ r Y bw xY w)r   	ownershipr<   r   r   N)r    r   r   r   r5   r   rZ   r\   r   r7   r   r   r   )r   	class_objr   package_objdep_namedepr&   s         r   r   z$PackageDiagram.extract_relationships2  sL   %' 	I++INN,?,?,AB%%ikB		  <<> 	HK )K',,44 C//(K4D4DEC %%k3	BC (,,99 H//(K4D4DEC %%k3GH	H        s5   <DD%!D4	D"!D"%	D10D14	E ?E )r   zlist[PackageEntity])r$   r(   r   r;   )r3   r(   r5   nodes.Moduler   r   )r$   r(   r5   r   r   r;   )r5   znodes.ImportFromr   r(   r   r   r   )r   r   r   r   r   r   r   r}   r   r   r   r*   r+   s   @r   r   r      s1    #DI! 5H Hr   r   )r   
__future__r   collections.abcr   typingr   ru   r   r   pylint.checkers.utilsr   r	   pylint.pyreverse.utilsr
   r   r   r'   r;   r>   rF   r   r   r   r   <module>r      sz   
  " $    Q . 6 "(F ((M 3- 3k6; k\MH\ MHr   