B
    A!p\#                 @   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
   8lib/python3.7/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__)N)r   r   r   r	   r   r
   r
   r
   r   r      s   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 )N)r   r   titlenode)r   r   r   r
   r
   r   r   '   s    
zDiagramEntity.__init__)r   N)r   r   r   r	   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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 )N)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 )N)r   Zfig_idr   )xr
   r
   r   <lambda>@   s    z0ClassDiagram.get_relationships.<locals>.<lambda>)key)sortedr   get)r   Z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   s2   x$| j |dD ]}|j|kr|S qW t|dS )z'return a relation ship or None
        r
   N)r   r#   r   KeyError)r   r   r   r'   r
   r
   r   get_relationshipI   s    
zClassDiagram.get_relationshipc             C   s   g }dd |  D }xbt|j  t|j   | D ]>\}}| |sLq8| |}|rld|d|f }|| q8W 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>U   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   attrsZ
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
   )r+   r,   r-   r   r6   r   )r.   r0   )r   r
   r   r1   i   s   z,ClassDiagram.get_methods.<locals>.<listcomp>c             S   s   | j S )N)r   )r/   r
   r
   r   r    o   s    z*ClassDiagram.get_methods.<locals>.<lambda>)r!   )valuesr"   )r   r   methodsr
   )r   r   get_methodsf   s    
zClassDiagram.get_methodsc             C   s2   || j kstt||}|| j |< | j| dS )z create a diagram object
        N)r   AssertionErrorr   r   r&   )r   r   r   Zentr
   r
   r   
add_objectq   s    

zClassDiagram.add_objectc             C   sb   g }xX|D ]P}t |tjr |j}t |tjr
t|dr
| |s
|j|kr
|j}|| q
W |S )z'return class names if needed in diagramr   )	r+   r,   Instance_proxiedClassDefhasattrhas_noder   r&   )r   nodesr;   r   r:   r
   r
   r   r7   y   s    



zClassDiagram.class_namesc             C   s
   | j  S )z,return the list of underlying nodes
        )r   keys)r   r
   r
   r   rG      s    zClassDiagram.nodesc             C   s
   || j kS )zAreturn true if the given node is included in the diagram
        )r   )r   r   r
   r
   r   rF      s    zClassDiagram.has_nodec             C   s
   | j | S )z1return the diagram object mapped to node
        )r   )r   r   r
   r
   r   object_from_node   s    zClassDiagram.object_from_nodec             C   s   dd | j D S )z%return all class nodes in the diagramc             S   s   g | ]}t |jtjr|qS r
   )r+   r   r,   rD   )r.   or
   r
   r   r1      s    z(ClassDiagram.classes.<locals>.<listcomp>)r   )r   r
   r
   r   classes   s    zClassDiagram.classesc             C   s.   x |   D ]}|jj|kr
|S q
W t|dS )z@return a class by its name, raise KeyError if not found
        N)rK   r   r   r)   )r   r   klassr
   r
   r   classe   s    zClassDiagram.classec             C   st  xl|   D ]^}|j}| ||_| ||_t|r@d|_nd|_xH|jddD ]8}y| 	|}| 
||d W qT tk
r   wTY qTX qTW xB|jD ]8}y| 	|}| 
||d W q tk
r   wY qX qW xt|j t|j  D ]v\}}xl|D ]d}	|	tjkrq t|	tjr(|	j}	y| 	|	}
| 
|
|d| W n tk
r`   w Y nX q W qW qW dS )	z<extract relation ships between nodes in the diagram
        Z	interfacer   F)ZrecursZspecialization
implementsZassociationN)rK   r   r<   r9   r?   r>   r   shapeZ	ancestorsrI   r(   r)   rN   r3   r4   r2   r5   r,   ZUninferabler+   rB   rC   )r   objr   Zpar_nodeZpar_objZ	impl_nodeZimpl_objr   r=   valueZassociated_objr
   r
   r   extract_relationships   s>    



z"ClassDiagram.extract_relationships)N)r   r   r   r	   TYPEr   r$   r(   r*   r<   r?   rA   r7   rG   rF   rI   rK   rM   rR   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   s   dd | j D S )z&return all module nodes in the diagramc             S   s   g | ]}t |jtjr|qS r
   )r+   r   r,   ZModule)r.   rJ   r
   r
   r   r1      s    z*PackageDiagram.modules.<locals>.<listcomp>)r   )r   r
   r
   r   modules   s    zPackageDiagram.modulesc             C   s.   x |   D ]}|jj|kr
|S q
W t|dS )zAreturn a module by its name, raise KeyError if not found
        N)rV   r   r   r)   )r   r   modr
   r
   r   module   s    zPackageDiagram.modulec             C   sp   xb|   D ]V}|jj}||kr"|S | j}|d||f kr@|S |d|ddd |f kr
|S q
W t|dS )zlreturn a module by its name, looking also for relative imports;
        raise KeyError if not found
        z%s.%s.   r   N)rV   r   r   rootrsplitr)   )r   r   r   rW   mod_namerU   r
   r
   r   
get_module   s    
zPackageDiagram.get_modulec             C   s2   |  j}| |}||jjkr.|jj| dS )z1add dependencies created by from-imports
        N)r[   r   rX   r   r   r&   )r   r   Zfrom_moduler]   rP   r
   r
   r   add_from_depend   s    

zPackageDiagram.add_from_dependc          
   C   s   t |  xJ|  D ]>}y"| |j }| ||d W q tk
rP   wY qX qW x`|  D ]T}d|_	xH|jj
D ]<}y| ||j}W n tk
r   wtY nX | ||d qtW q`W dS )z<extract relation ships between nodes in the diagram
        Z	ownershiprU   r   N)r   rR   rK   rI   r   r[   r(   r)   rV   rO   r   r^   )r   rP   rW   Zdep_nameZdepr
   r
   r   rR      s    
z$PackageDiagram.extract_relationshipsN)
r   r   r   r	   rS   rV   rX   r^   r_   rR   r
   r
   r
   r   rT      s   rT   )r	   r,   Zpylint.pyreverse.utilsr   r   Zpylint.checkers.utilsr   r   r   r   r   rT   r
   r
   r
   r   <module>   s   
 "