3
^^{                 @   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    )
DotBackend)is_exception)
VCGPrinterc               @   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   9/tmp/pip-build-8app2_gc/pylint/pylint/pyreverse/writer.py__init__   s    zDiagramWriter.__init__c             C   sh   xb|D ]Z}|j j jdd}d|| jjf }| j|| |jdkrN| j| n
| j| | j	  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|j dd dD ]&\}}| jj|| j|dd ||_qW x.|j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shape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| j| ||_qW x.|jdD ] }| jj|j	j|j
jf| j qLW x.|jdD ] }| jj|j	j|j
jf| j q|W x8|j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'   objectsr   r)   
get_valuesr+   r,   r-   r.   r/   r   r	   namer
   )r   r   r0   r1   r2   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)r6   )r   r1   r   r   r   r*   T   s    zDiagramWriter.get_titlec             C   s   t dS )z get label and shape for classes.N)r6   )r   r1   r   r   r   r4   X   s    zDiagramWriter.get_valuesc             C   s   t dS )zfinalize the graphN)r6   )r   r   r   r   r   \   s    zDiagramWriter.close_graphN)__name__
__module____qualname____doc__r   r   r   r   r   r*   r4   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j| || d S )Nnoneopen)	arrowtail	arrowheademptynodeZdashed)r>   r?   stylegreenZdiamondsolid)	fontcolorr>   r?   rB   )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)rF   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   r1   r   r   r   r*   w   s    zDotWriter.get_titlec             C   s   |j }|jdkrd| }| jjstd|dj|jf }x6|jD ],}dd |jjD }d||jdj|f }q<W d	| }t	|j
rt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\lc             S   s   g | ]}|j d kr|j qS )r   )r5   ).0argr   r   r   
<listcomp>   s    z(DotWriter.get_values.<locals>.<listcomp>z
%s%s(%s)\lz, z{%s}Zredrecord)rE   r#   r$   )r#   r$   )r   r$   r   only_classnamesjoinattrsmethodsargsr5   r   rA   rF   )r   r1   r#   funcrP   r   r   r   r4   {   s    

zDotWriter.get_valuesc             C   s   | j j| j dS )z$print the dot graph into <file_name>N)r   generater   )r   r   r   r   r      s    zDotWriter.close_graphN)	r7   r8   r9   r:   r   r   r*   r4   r   r   r   r   r   r;   a   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 )	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j| || d S )
NrD   r<   r   )
arrowstylebackarrowstylebackarrowsize
   Zdotted)rT   rU   Z	linestylerV   rC   )rT   rU   Z	textcolor)rF   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+dfsyesno)r   ZlayoutalgorithmZlate_edge_labelsZport_sharingZmanhattan_edgesN)	r=   
graph_filer   r   Z
open_graphrA   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   r1   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\fnrG   Zellipser"   c             S   s   g | ]
}|j qS r   )r5   )rH   rQ   r   r   r   rJ      s    z(VCGWriter.get_values.<locals>.<listcomp>c             s   s   | ]}t |V  qd S )N)len)rH   r5   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   rA   r   r$   r   rL   rN   rO   maxrF   )
r   r1   r#   r$   rN   rO   maxlenlineattrrQ   r   r   r   r4      s&    




zVCGWriter.get_valuesc             C   s   | j j  | jj  dS )zclose graph and fileN)r   r   r[   close)r   r   r   r   r      s    
zVCGWriter.close_graphN)	r7   r8   r9   r:   r   r   r*   r4   r   r   r   r   r   rS      s   rS   N)
r:   Zpylint.graphr   Zpylint.pyreverse.utilsr   Zpylint.pyreverse.vcgutilsr   r   r;   rS   r   r   r   r   <module>   s   L1