o
    b#                     @   s|   d Z ddlZddlmZmZ ddlmZ G dd d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)is_interfaceFilterMixIn)decorated_with_propertyc                   @   s   e Zd ZdZdS )Figurezbase class for counter handlingN)__name__
__module____qualname____doc__ r
   r
   X/var/www/secure340b-portal/env/lib/python3.10/site-packages/pylint/pyreverse/diagrams.pyr      s    r   c                   @   s   e Zd ZdZdddZdS )Relationshipz=a relation ship from an object in the diagram to another
    Nc                 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 )DiagramEntityzAa 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                   @   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   3   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   Zfig_idr   )xr
   r
   r   <lambda>@   s    z0ClassDiagram.get_relationships.<locals>.<lambda>key)sortedr   get)r   roler
   r
   r   get_relationships<   s   zClassDiagram.get_relationshipsNc                 C   s&   t ||||}| j|g | dS )zcreate a relation ship
        N)r   r   
setdefaultappend)r   r   r   r   r   relr
   r
   r   add_relationshipC   s   zClassDiagram.add_relationshipc                 C   s.   | j |dD ]}|j|u r|  S qt|)z'return a relation ship or None
        r
   )r   r'   r   KeyError)r   r   r   r,   r
   r
   r   get_relationshipI   s
   
zClassDiagram.get_relationshipc                 C   s~   g }dd |  D }t|j  t|j   | D ]\}}| |s%q| |}|r5d|d|f }|| qt|S )z3return visible attributes, possibly with class namec                 S   s,   g | ]\}}t |tjrt|r||fqS r
   )
isinstanceastroidFunctionDefr   ).0nmr
   r
   r   
<listcomp>T   s    
z*ClassDiagram.get_attrs.<locals>.<listcomp>z%s : %sz, )	itemslistinstance_attrs_typelocals_type	show_attrclass_namesjoinr+   r&   )r   r   attrs
properties	node_nameZassociated_nodesnamesr
   r
   r   	get_attrsQ   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
   )r0   r1   r2   r   r;   r   )r3   r5   r   r
   r   r6   h   s    

z,ClassDiagram.get_methods.<locals>.<listcomp>c                 S   s   | j S r   )r   )r4   r
   r
   r   r#   o   s    z*ClassDiagram.get_methods.<locals>.<lambda>r$   )valuesr&   )r   r   methodsr
   rC   r   get_methodsf   s   
zClassDiagram.get_methodsc                 C   s2   || j vsJ t||}|| j |< | j| dS )z create a diagram object
        N)r   r   r   r+   )r   r   r   entr
   r
   r   
add_objectq   s   

zClassDiagram.add_objectc                 C   s^   g }|D ](}t |tjr|j}t |tjr,t|dr,| |s,|j|vr,|j}|| q|S )z'return class names if needed in diagramr   )	r0   r1   Instance_proxiedClassDefhasattrhas_noder   r+   )r   nodesrA   r   r@   r
   r
   r   r<   y   s   


zClassDiagram.class_namesc                 C   s
   | j  S )z,return the list of underlying nodes
        )r   keysrC   r
   r
   r   rN         
zClassDiagram.nodesc                 C   s
   || j v S )zAreturn true if the given node is included in the diagram
        r   r   r   r
   r
   r   rM      rP   zClassDiagram.has_nodec                 C   s
   | j | S )z1return the diagram object mapped to node
        rQ   rR   r
   r
   r   object_from_node   rP   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
   )r0   r   r1   rK   r3   or
   r
   r   r6          z(ClassDiagram.classes.<locals>.<listcomp>r   rC   r
   r
   r   classes      zClassDiagram.classesc                 C   *   |   D ]}|jj|kr|  S qt|)z@return a class by its name, raise KeyError if not found
        )rZ   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 )	<extract relation ships between nodes in the diagram
        Z	interfacer   F)ZrecursZspecialization
implementsZassociationN)rZ   r   rB   r>   rF   rE   r   shapeZ	ancestorsrS   r-   r.   ra   r8   r9   r7   r:   r1   ZUninferabler0   rI   rJ   )r   objr   Zpar_nodeZpar_objZ	impl_nodeZimpl_objr   rD   valueZassociated_objr
   r
   r   extract_relationships   sL   




z"ClassDiagram.extract_relationshipsr   )r   r   r   r	   TYPEr   r)   r-   r/   rB   rF   rH   r<   rN   rM   rS   rZ   r^   re   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   rT   )z&return all module nodes in the diagramc                 S   rU   r
   )r0   r   r1   ModulerV   r
   r
   r   r6      rX   z*PackageDiagram.modules.<locals>.<listcomp>rY   rC   r
   r
   r   modules   r[   zPackageDiagram.modulesc                 C   r\   )zAreturn a module by its name, raise KeyError if not found
        )rj   r   r   r.   )r   r   modr
   r
   r   module   r_   zPackageDiagram.modulec                 C   st   |   D ]1}|jj}||kr|  S | j}|d||f kr#|  S |d|ddd |f kr5|  S qt|)zlreturn a module by its name, looking also for relative imports;
        raise KeyError if not found
        z%s.%s.   r   )rj   r   r   rootrsplitr.   )r   r   r   rk   mod_namerh   r
   r
   r   
get_module   s   
zPackageDiagram.get_modulec                 C   s6   |  j}| |}||jjvr|jj| dS dS )z1add dependencies created by from-imports
        N)ro   r   rl   r   r    r+   )r   r   Zfrom_modulerq   rc   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 )r`   Z	ownershiprh   r    N)r   re   rZ   rS   r   ro   r-   r.   rj   rb   r    rr   )r   rc   rk   dep_namedepr
   r
   r   re      s&   
z$PackageDiagram.extract_relationshipsN)
r   r   r   r	   rf   rj   rl   rr   rs   re   r
   r
   r
   r   rg      s    rg   )r	   r1   Zpylint.pyreverse.utilsr   r   Zpylint.checkers.utilsr   r   r   r   r   rg   r
   r
   r
   r   <module>   s   

 "