o
    g%                     @   s   d 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 dZG dd	 d	eZ	G d
d deZ
G dd de
ZG dd de
ZG dd deeZG dd deZdS )zdiagram objects
    N)nodes)decorated_with_property)FilterMixInis_interfacec                   @      e Zd ZdZdS )Figurezbase class for counter handlingN__name__
__module____qualname____doc__ r   r   W/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/pylint/pyreverse/diagrams.pyr          r   c                   @   s   e Zd ZdZdddZdS )Relationshipz8a relation ship from an object in the diagram to anotherNc                 C   s&   t |  || _|| _|| _|| _d S N)r   __init__from_object	to_objecttypename)selfr   r   relation_typer   r   r   r   r   "   s
   

zRelationship.__init__r   r	   r
   r   r   r   r   r   r   r   r          r   c                   @   s   e Zd ZdZdddZdS )DiagramEntityz<a diagram object, i.e. a label associated to an astroid nodeNo nameNc                 C   s   t |  || _|| _d S r   )r   r   titlenoder   r   r   r   r   r   r   -   s   

zDiagramEntity.__init__)r   Nr   r   r   r   r   r   *   r   r   c                   @   r   )PackageEntityz'A diagram object representing a packageNr   r   r   r   r   r    3   r   r    c                       s    e Zd ZdZ fddZ  ZS )ClassEntityz%A diagram object representing a classc                    s    t  j||d d | _d | _d S )N)r   r   )superr   attrsmethodsr   	__class__r   r   r   :   s   
zClassEntity.__init__)r	   r
   r   r   r   __classcell__r   r   r%   r   r!   7   s    r!   c                   @   s   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dS )!ClassDiagramzmain class diagram handlingclassc                 C   s8   t | | t|  || _g | _i | _i | _g | _d S r   )r   r   r   r   objectsrelationships_nodesdepends)r   r   moder   r   r   r   E   s   

zClassDiagram.__init__c                 C   s   t | j|ddd dS )Nr   c                 S   s   | j j| jjfS r   )r   fig_idr   )xr   r   r   <lambda>R   s    z0ClassDiagram.get_relationships.<locals>.<lambda>key)sortedr+   get)r   roler   r   r   get_relationshipsN   s   zClassDiagram.get_relationshipsNc                 C   s&   t ||||}| j|g | dS )zcreate a relation shipN)r   r+   
setdefaultappend)r   r   r   r   r   relr   r   r   add_relationshipU   s   zClassDiagram.add_relationshipc                 C   s.   | j |dD ]}|j|u r|  S qt|)zreturn a relation ship or Noner   )r+   r5   r   KeyError)r   r   r   r:   r   r   r   get_relationshipZ   s
   
zClassDiagram.get_relationshipc                 C   s   g }dd |  D }t|j  t|j   | D ] \}}| |s%q| |}|r6| dd| }|| qt|S )z3return visible attributes, possibly with class namec                 S   s,   g | ]\}}t |tjrt|r||fqS r   )
isinstancer   FunctionDefr   ).0nmr   r   r   
<listcomp>d   s    
z*ClassDiagram.get_attrs.<locals>.<listcomp>z : z, )	itemslistinstance_attrs_typelocals_type	show_attrclass_namesjoinr9   r4   )r   r   r#   
properties	node_nameassociated_nodesnamesr   r   r   	get_attrsa   s"   


zClassDiagram.get_attrsc                    s&    fdd|  D }t|dd dS )zreturn visible methodsc                    s0   g | ]}t |tjrt|s |jr|qS r   )r>   r   r?   r   rH   r   )r@   rB   r   r   r   rC   x   s    

z,ClassDiagram.get_methods.<locals>.<listcomp>c                 S   s   | j S r   )r   )rA   r   r   r   r1      s    z*ClassDiagram.get_methods.<locals>.<lambda>r2   )valuesr4   )r   r   r$   r   rP   r   get_methodsv   s   
zClassDiagram.get_methodsc                 C   s2   || j vsJ t||}|| j |< | j| dS )zcreate a diagram objectN)r,   r   r*   r9   )r   r   r   entr   r   r   
add_object   s   

zClassDiagram.add_objectc                 C   sh   g }|D ]-}t |tjr|j}t |tjtjtjfr1t|dr1| 	|s1|j
|vr1|j
}|| q|S )z'return class names if needed in diagramr   )r>   astroidInstance_proxiedr   ClassDefName	Subscripthasattrhas_noder   r9   )r   	nodes_lstrN   r   rL   r   r   r   rI      s   

zClassDiagram.class_namesc                 C   s
   | j  S )z#return the list of underlying nodes)r,   keysrP   r   r   r   r         
zClassDiagram.nodesc                 C   s
   || j v S )z8return true if the given node is included in the diagramr,   r   r   r   r   r   r\      r_   zClassDiagram.has_nodec                 C   s
   | j | S )z(return the diagram object mapped to noder`   ra   r   r   r   object_from_node   r_   zClassDiagram.object_from_nodec                 C      dd | j D S )z%return all class nodes in the diagramc                 S      g | ]}t |jtjr|qS r   )r>   r   r   rX   r@   or   r   r   rC          z(ClassDiagram.classes.<locals>.<listcomp>r*   rP   r   r   r   classes      zClassDiagram.classesc                 C   *   |   D ]}|jj|kr|  S qt|)z7return a class by its name, raise KeyError if not found)ri   r   r   r<   )r   r   klassr   r   r   classe   
   zClassDiagram.classec                 C   s>  |   D ]}|j}| ||_| ||_t|rd|_nd|_|jddD ]}z| 	|}| 
||d W q& ty?   Y q&w |jD ]}z| 	|}| 
||d W qC ty\   Y qCw t|j t|j  D ]0\}}|D ])}	|	tju ryqqt|	tjr|	j}	z| 	|	}
| 
|
|d| W qq ty   Y qqw qkqdS )	3extract relation ships between nodes in the diagram	interfacer)   F)recursspecialization
implementsassociationN)ri   r   rO   r#   rR   r$   r   shape	ancestorsrb   r;   r<   rs   rE   rF   rD   rG   rU   Uninferabler>   rV   rW   )r   objr   par_nodepar_obj	impl_nodeimpl_objr   rQ   valueassociated_objr   r   r   extract_relationships   sL   




z"ClassDiagram.extract_relationshipsr   )r	   r
   r   r   TYPEr   r7   r;   r=   rO   rR   rT   rI   r   r\   rb   ri   rm   r   r   r   r   r   r(   @   s"    	
r(   c                   @   s<   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dS )PackageDiagramzpackage diagram handlingpackagec                 C   rc   )z&return all module nodes in the diagramc                 S   rd   r   )r>   r   r   Modulere   r   r   r   rC      rg   z*PackageDiagram.modules.<locals>.<listcomp>rh   rP   r   r   r   modules   rj   zPackageDiagram.modulesc                 C   rk   )z8return a module by its name, raise KeyError if not found)r   r   r   r<   )r   r   modr   r   r   module   rn   zPackageDiagram.modulec                 C   sx   |   D ]3}|jj}||kr|  S | j}|| d| kr$|  S ||ddd  d| kr7|  S qt|)zlreturn a module by its name, looking also for relative imports;
        raise KeyError if not found
        .   r   )r   r   r   rootrsplitr<   )r   r   r   r   mod_namer   r   r   r   
get_module   s   
zPackageDiagram.get_modulec                 C   s6   |  j}| |}||jjvr|jj| dS dS )z(add dependencies created by from-importsN)r   r   r   r   r-   r9   )r   r   from_moduler   rx   r   r   r   add_from_depend   s
   

zPackageDiagram.add_from_dependc              
   C   s   t |  |  D ]}z| |j }| ||d W q	 ty%   Y q	w |  D ]&}d|_	|jj
D ]}z	| ||j}W n	 tyG   Y q3w | ||d q3q*dS )ro   	ownershipr   r-   N)r(   r   ri   rb   r   r   r;   r<   r   ru   r-   r   )r   rx   r   dep_namedepr   r   r   r      s&   
z$PackageDiagram.extract_relationshipsN)
r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r      s    r   )r   rU   r   pylint.checkers.utilsr   pylint.pyreverse.utilsr   r   r   r   r   r    r!   r(   r   r   r   r   r   <module>   s   		 