B
    A!p\                 @   sZ   d Z ddlmZ ddlmZ ddlmZ G dd dZG dd deZG d	d
 d
eZ	dS )z+Utilities for creating VCG and Dot diagrams    )is_exception)
VCGPrinter)
DotBackendc               @   sP   e Zd Z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 )DiagramWriterz,base class for writing project diagrams
    c             C   s$   || _ |\| _| _| _| _d | _d S )N)config	pkg_edges	inh_edges	imp_edgesassociation_edgesprinter)selfr   styles r   6lib/python3.7/site-packages/pylint/pyreverse/writer.py__init__   s    zDiagramWriter.__init__c             C   sh   xb|D ]Z}|j  dd}d|| jjf }| || |jdkrN| | n
| | | 	  qW dS )z9write files for <project> according to <diadefs>
         _z%s.%sclassN)
titlestripreplacer   Zoutput_formatset_printerZTYPEwrite_classeswrite_packagesclose_graph)r   Zdiadefsdiagrambasename	file_namer   r   r   write   s    


zDiagramWriter.writec             C   sx   xBt t| dd dD ]&\}}| jj|| |dd ||_qW x.|dD ] }| jj|j	j|j
jf| j qPW dS )zwrite a package diagramc             S   s   | j S )N)r   )xr   r   r   <lambda>.   s    z.DiagramWriter.write_packages.<locals>.<lambda>)keybox)labelshapeZdependsN)	enumeratesortedmodulesr   	emit_node	get_titlefig_idget_relationships	emit_edgefrom_object	to_objectr   )r   r   iobjrelr   r   r   r   +   s    "
zDiagramWriter.write_packagesc             C   s   x>t t|jdd dD ]$\}}| jj|f| | ||_qW x.|dD ] }| jj|j	j|j
jf| j qLW x.|dD ] }| jj|j	j|j
jf| j q|W x8|dD ]*}| jj|j	j|j
jfd|ji| j qW dS )	zwrite a class diagramc             S   s   | j S )N)r   )r   r   r   r   r    :   s    z-DiagramWriter.write_classes.<locals>.<lambda>)r!   ZspecializationZ
implementsZassociationr#   N)r%   r&   Zobjectsr   r(   
get_valuesr*   r+   r,   r-   r.   r   r	   namer
   )r   r   r/   r0   r1   r   r   r   r   7   s     

zDiagramWriter.write_classesc             C   s   t dS )zset printerN)NotImplementedError)r   r   r   r   r   r   r   P   s    zDiagramWriter.set_printerc             C   s   t dS )zget project titleN)r4   )r   r0   r   r   r   r)   T   s    zDiagramWriter.get_titlec             C   s   t dS )z get label and shape for classes.N)r4   )r   r0   r   r   r   r2   X   s    zDiagramWriter.get_valuesc             C   s   t dS )zfinalize the graphN)r4   )r   r   r   r   r   \   s    zDiagramWriter.close_graphN)__name__
__module____qualname____doc__r   r   r   r   r   r)   r2   r   r   r   r   r   r      s   r   c               @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )	DotWriterz=write dot graphs from a diagram definition and a project
    c          	   C   sD   t dddt dddt ddddt ddd	d
dg}t| || d S )Nnoneopen)	arrowtail	arrowheademptynodeZdashed)r<   r=   stylegreenZdiamondsolid)	fontcolorr<   r=   r@   )dictr   r   )r   r   r   r   r   r   r   e   s    

zDotWriter.__init__c             C   s"   t dd}t||d| _|| _dS )z9initialize DotWriter and add options for layout.
        ZBT)Zrankdir)Zadditional_paramN)rD   r   r   r   )r   r   r   Zlayoutr   r   r   r   p   s    
zDotWriter.set_printerc             C   s   |j S )zget project title)r   )r   r0   r   r   r   r)   w   s    zDotWriter.get_titlec             C   s~   |j }|jdkrd| }| jjsZd|d|jf }x|jD ]}d||jf }q<W d| }t|j	rrt
d|dd	S t
|dd
S )z`get label and shape for classes.

        The label contains all attributes and methods
        	interfaceu   «interface»\n%sz%s|%s\l|z\lz%s%s()\lz{%s}Zredrecord)rC   r#   r$   )r#   r$   )r   r$   r   only_classnamesjoinattrsmethodsr3   r   r?   rD   )r   r0   r#   funcr   r   r   r2   {   s    

zDotWriter.get_valuesc             C   s   | j | j dS )z$print the dot graph into <file_name>N)r   Zgenerater   )r   r   r   r   r      s    zDotWriter.close_graphN)	r5   r6   r7   r8   r   r   r)   r2   r   r   r   r   r   r9   a   s   r9   c               @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )	VCGWriterz=write vcg graphs from a diagram definition and a project
    c             C   sH   t ddddt ddddt dddddt dddd	g}t| || d S )
NrB   r:   r   )
arrowstylebackarrowstylebackarrowsize
   Zdotted)rM   rN   Z	linestylerO   rA   )rM   rN   Z	textcolor)rD   r   r   )r   r   r   r   r   r   r      s    zVCGWriter.__init__c             C   sJ   t |d| _t| j| _| jj|ddddd | jj| j_| jj| j_dS )z$initialize VCGWriter for a UML graphzw+ZdfsZyesZno)r   ZlayoutalgorithmZlate_edge_labelsZport_sharingZmanhattan_edgesN)	r;   
graph_filer   r   Z
open_graphr?   r(   Zedger,   )r   r   r   r   r   r   r      s    zVCGWriter.set_printerc             C   s
   d|j  S )zget project title in vcg formatz\fb%s\fn)r   )r   r0   r   r   r   r)      s    zVCGWriter.get_titlec       
      C   s   t |jrd|j }n
d|j }|jdkr0d}nd}| jjs|j}dd |jD }tdd	 |jg| | D }d
|d  }d||f }x|D ]}d||f }qW |rd||f }x|D ]}	d||	f }qW t	||dS )z`get label and shape for classes.

        The label contains all attributes and methods
        z\fb\f09%s\fnz\fb%s\fnrE   Zellipser"   c             S   s   g | ]
}|j qS r   )r3   ).0rK   r   r   r   
<listcomp>   s    z(VCGWriter.get_values.<locals>.<listcomp>c             s   s   | ]}t |V  qd S )N)len)rR   r3   r   r   r   	<genexpr>   s    z'VCGWriter.get_values.<locals>.<genexpr>r      z%s\n\f%sz
%s\n\f08%sz%s\n\f10%s())r#   r$   )
r   r?   r   r$   r   rG   rI   rJ   maxrD   )
r   r0   r#   r$   rI   rJ   maxlenlineattrrK   r   r   r   r2      s&    




zVCGWriter.get_valuesc             C   s   | j   | j  dS )zclose graph and fileN)r   r   rQ   close)r   r   r   r   r      s    
zVCGWriter.close_graphN)	r5   r6   r7   r8   r   r   r)   r2   r   r   r   r   r   rL      s   rL   N)
r8   Zpylint.pyreverse.utilsr   Zpylint.pyreverse.vcgutilsr   Zpylint.graphr   r   r9   rL   r   r   r   r   <module>   s   L0