o
    b                     @   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   V/var/www/secure340b-portal/env/lib/python3.10/site-packages/pylint/pyreverse/writer.py__init__   s   
zDiagramWriter.__init__c                 C   sd   |D ]-}|j  dd}d|| jjf }| || |jdkr&| | n| | | 	  q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   st   t t| dd dD ]\}}| jj|| |dd ||_q|dD ]}| jj|j	j|j
jfi | j q%dS )zwrite a package diagramc                 S      | j S r   r   xr   r   r   <lambda>.       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   t t|jdd dD ]\}}| jj|fi | | ||_q|dD ]}| jj|j	j|j
jfi | j q%|dD ]}| jj|j	j|j
jfi | j q=|dD ]}| jj|j	j|j
jfd|ji| j qUdS )	zwrite a class diagramc                 S   r!   r   r"   r#   r   r   r   r%   :   r&   z-DiagramWriter.write_classes.<locals>.<lambda>r'   ZspecializationZ
implementsZassociationr+   N)r.   r/   objectsr   r1   
get_valuesr3   r4   r5   r6   r7   r	   r
   namer   r8   r   r   r   r   7   s2   zDiagramWriter.write_classesc                 C      t )zset printerNotImplementedErrorr   r   r   r   r   r   r   P      zDiagramWriter.set_printerc                 C   r?   zget project titler@   r   r:   r   r   r   r2   T   rC   zDiagramWriter.get_titlec                 C   r?   )z get label and shape for classes.r@   rE   r   r   r   r=   X   rC   zDiagramWriter.get_valuesc                 C   r?   )zfinalize the graphr@   r   r   r   r   r   \   rC   zDiagramWriter.close_graphN)__name__
__module____qualname____doc__r   r    r   r   r   r2   r=   r   r   r   r   r   r      s    r   c                   @   8   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)rO   rP   stylegreenZdiamondsolid)	fontcolorrO   rP   rS   dictr   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)rX   r   r   r   )r   r   r   Zlayoutr   r   r   r   p   s   

zDotWriter.set_printerc                 C   s   |j S rD   r"   rE   r   r   r   r2   w   s   zDotWriter.get_titlec                 C   sz   |j }|jdkrd| }| jjs+d|d|jf }|jD ]	}d||jf }qd| }t|j	r7t
d|dd	S t
|dd
S )`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}redrecord)rV   r+   r,   r*   )r   r,   r   only_classnamesjoinattrsmethodsr>   r   rR   rX   )r   r:   r+   funcr   r   r   r=   {   s   


zDotWriter.get_valuesc                 C   s   | j | j dS )z$print the dot graph into <file_name>N)r   generater   rF   r   r   r   r      s   zDotWriter.close_graphN	rG   rH   rI   rJ   r   r   r2   r=   r   r   r   r   r   rL   a   s    rL   c                   @   rK   )	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 )
NrU   rM   r   )
arrowstylebackarrowstylebackarrowsize
   Zdotted)re   rf   Z	linestylerg   rT   )re   rf   Z	textcolorrW   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)	rN   
graph_filer   r   Z
open_graphrR   r1   edger5   rB   r   r   r   r      s   zVCGWriter.set_printerc                 C   s
   d|j  S )zget project title in vcg format\fb%s\fnr"   rE   r   r   r   r2      s   
zVCGWriter.get_titlec           
      C   s   t |jrd|j }nd|j }|jdkrd}nd}| jjsb|j}dd |jD }tdd	 |jg| | D }d
|d  }d||f }|D ]}d||f }qF|rWd||f }|D ]}	d||	f }qYt	||dS )rY   z\fb\f09%s\fnrn   rZ   Zellipser)   c                 S   s   g | ]}|j qS r   )r>   ).0ra   r   r   r   
<listcomp>   s    z(VCGWriter.get_values.<locals>.<listcomp>c                 s   s    | ]}t |V  qd S r   )len)ro   r>   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   rR   r   r,   r   r]   r_   r`   maxrX   )
r   r:   r+   r,   r_   r`   maxlenlineattrra   r   r   r   r=      s&   


zVCGWriter.get_valuesc                 C   s   | j   | j  dS )zclose graph and fileN)r   r   rl   closerF   r   r   r   r      s   
zVCGWriter.close_graphNrc   r   r   r   r   rd      s    rd   N)
rJ   Zpylint.pyreverse.utilsr   Zpylint.pyreverse.vcgutilsr   Zpylint.graphr   r   rL   rd   r   r   r   r   <module>   s   L0