o
    g#                     @   s  U d Z ddlmZmZmZmZ ddlmZmZm	Z	m
Z
mZ dddddd	d
dZi ddddded ded ded ddddddded ded ddddded ddddd dd!ded ed" ed" ed" ed" ed" ed" ed" ed" ed" ed" d#Zdded ed ed ddded ed ddddd$Zi d%dd&dddd'ed( d)dd*dded ded d+ed d,ed d-dd.dd/ed0 d1ed0 ded d2dd3dddiZe
jd4e
jd4e
jd5iZee
ef ed6< ejed7d8dd9ejed7d8d:d9ejed7d8d;d:d<ejed7d8d=d>iZeeef ed?< ejd@ejdAejdBejdCiZ eeef edD< G dEdF dFeZ!dGS )HaF  Functions to generate files readable with Georg Sander's vcg
(Visualization of Compiler Graphs).
You can download vcg at https://rw4.cs.uni-sb.de/~sander/html/gshome.html
Note that vcg exists as a debian package.
See vcg's documentation for explanation about the different values that
maybe used for the functions parameters.
    )AnyDictMappingOptional)EdgeTypeLayoutNodePropertiesNodeTypePrinter)dfstreeminbackwardleft_to_rightright_to_lefttop_to_bottombottom_to_topmaxdepthmaxdepthslowmindepthmindepthslow	mindegreeminindegreeminoutdegree	maxdegreemaxindegreemaxoutdegree)yesno) blackwhiteblueredgreenyellowmagenta	lightgreycyandarkgreydarkbluedarkred	darkgreen
darkyellowdarkmagentadarkcyangold	lightbluelightred
lightgreenlightyellowlightmagenta	lightcyanlilac	turquoise
aquamarinekhakipurpleyellowgreenpinkorangeorchid)boxellipserhombtriangle)centerleft_justifyright_justify)solidlinenone)
continuousdasheddotted	invisible)algosbooleanscolorsshapes	textmodesarrowstyles
linestylestitlelabelcolorrN   	textcolorbordercolorwidth   heightborderwidthtextmoderP   shaperO   shrinkstretchorientationrL   vertical_orderhorizontal_orderxspaceyspacerM   )layoutalgorithmlate_edge_labelsdisplay_edge_labelsdirty_edge_labels
finetuningmanhattan_edgessmanhattan_edgesport_sharingedgesnodessplines)rS   rT   rU   rV   rW   rX   rZ   r[   r\   r]   r^   r_   ra   rb   
sourcename
targetname	linestylerR   class	thickness
arrowcolorbackarrowcolor	arrowsizebackarrowsize
arrowstylerQ   backarrowstylepriorityanchorr>   r?   SHAPESrE   rG   )ry   rz   rx   
   rJ   )ry   rz   rr   rx   r"   )ry   rz   rV   ARROWSr   r   r   r   ORIENTATIONc                   @   s   e Zd ZdddZdddZ	ddeded	ee ddfd
dZ	e
d	edefddZ	ddedededee ddf
ddZdeeef ddfddZdS )
VCGPrinterreturnNc                 C   sL   |  d |   | jt| jddddd | jr$| jtt| j d dS dS )zEmit the header lineszgraph:{
r   r   r   )rS   re   rf   rl   rj   )r`   N)emit_inc_indent_write_attributesGRAPH_ATTRSrS   layoutr   self r   Z/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/pylint/pyreverse/vcg_printer.py_open_graph   s   
zVCGPrinter._open_graphc                 C   s   |    | d dS )z2Emit the lines needed to properly close the graph.}N)_dec_indentr   r   r   r   r   _close_graph   s   zVCGPrinter._close_graphnametype_
propertiesc                 C   sb   |du r
t |d}n|jdu r||_| jd| ddd | jt| |t| d | d dS )	zDCreate a new node. Nodes can be classes, packages, participants etc.N)rT   znode: {title:""Fforce_newline)rT   r]   r   )r   rT   r   r   
NODE_ATTRS_build_label_for_noder}   )r   r   r   r   r   r   r   	emit_node   s   
zVCGPrinter.emit_nodec           
      C   s   | j dkrdnd}d| | j d}| jd u r| jd u r|S | jp"g }| jp'g }dd |D }tdd	 | jg| | D }d
|d  }| d| }|D ]	}| d| }qM|r`| d| }|D ]
}	| d|	 d}qb|S )Nr!   z09 z\fbz\fnc                 S   s   g | ]}|j qS r   )r   ).0funcr   r   r   
<listcomp>   s    z4VCGPrinter._build_label_for_node.<locals>.<listcomp>c                 s   s    | ]}t |V  qd S N)len)r   r   r   r   r   	<genexpr>   s    z3VCGPrinter._build_label_for_node.<locals>.<genexpr>_   z\n\fz\n\f08z\n\f10z())	fontcolorrT   attrsmethodsmax)
r   r   rT   r   r   method_namesmaxlenrF   attrr   r   r   r   r      s"   

z VCGPrinter._build_label_for_node	from_nodeto_noderT   c                 C   sP   | j d| d| ddd t| }|r||d< | jtfi | |  d dS )	zACreate an edge from one node to another to display relationships.zedge: {sourcename:"z" targetname:"r   Fr   rT   r   N)r   r   r   
EDGE_ATTRS)r   r   r   r   rT   
attributesr   r   r   	emit_edge   s   zVCGPrinter.emit_edgeattributes_dictc                 K   s   |  D ]`\}}z|| }W n ty' } ztd| d|  |d}~ww |s6| | d| d q|dkrH| | dt| d q||v rX| | d| d qtd	| d
| dt dS )z$write graph, node or edge attributeszno such attribute z
possible attributes are Nz:"z"
rY   :
zvalue z isn't correct for attribute z correct values are )itemsKeyError	Exceptionkeysr   inttype)r   r   argskeyvalue_typeer   r   r   r     s*   zVCGPrinter._write_attributes)r   Nr   )__name__
__module____qualname__r   r   strr	   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r      s8    

	

r   N)"__doc__typingr   r   r   r   pylint.pyreverse.printerr   r   r   r	   r
   	ATTRS_VALr   r   r   PACKAGECLASS	INTERFACEr}   r   __annotations__USESdictINHERITS
IMPLEMENTSASSOCIATIONr   LEFT_TO_RIGHTRIGHT_TO_LEFTTOP_TO_BOTTOMBOTTOM_TO_TOPr   r   r   r   r   r   <module>   s  "A	
	

