o
    gW                     @   s"  U d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	m
Z
mZ ddlmZ ddlmZmZmZmZmZ ddlmZmZ edZe	e ed	< ejd
ejdejdiZeeef ed< eje dddej!e ddddej"e dddddej#e dddiZ$eeef ed< G dd deZ%dS )zP
Class to generate files in dot format and image formats supported by Graphviz.
    N)Path)Dict	FrozenSetListOptional)nodes)EdgeTypeLayoutNodePropertiesNodeTypePrinter)check_graphviz_availabilityget_annotation_label)utf-8z
iso-8859-1latin1ALLOWED_CHARSETSboxrecordSHAPESnoneempty)	arrowtail	arrowheadnodedashed)r   r   stylegreendiamondsolid)	fontcolorr   r   r   openARROWSc                       s   e Zd ZdZ		ddedee dee f fddZdd	d
Z		d dede
dee ddfddZ	d!dede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ddfddZdddZ  ZS )"
DotPrinterblackNtitlelayoutuse_automatic_namespacec                    s$   |pt j}d| _t ||| d S )Nr   )r	   BOTTOM_TO_TOPcharsetsuper__init__)selfr$   r%   r&   	__class__ Z/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/pylint/pyreverse/dot_printer.pyr*   ,   s   
zDotPrinter.__init__returnc                 C   sn   |  d| j d | jr|  d| jj  | jr5| j tv s)J d| j |  d| j d dS dS )zEmit the header linesz	digraph "z" {zrankdir=zunsupported charset z	charset=""N)emitr$   r%   valuer(   lowerr   r+   r.   r.   r/   _open_graph6   s   
zDotPrinter._open_graphnametype_
propertiesc           
      C   s   |du r	t |d}t| }|jdur|jn| j}|| jkrdnd}| |}|r.d| dnd}|jr:d|j dnd}	| d| d	| d|	 | d
| d| d dS )zDCreate a new node. Nodes can be classes, packages, participants etc.N)labelfilledr   z	, label="r1    z, fontcolor="z
" [color="z	, shape="z
", style="z"];)r
   r   colorDEFAULT_COLOR_build_label_for_noder   r2   )
r+   r7   r8   r9   shaper=   r   r:   
label_partfontcolor_partr.   r.   r/   	emit_nodeA   s   

&zDotPrinter.emit_nodeFis_interfacec                 C   s   |j sdS |j }|rd| }|jd u r|jd u r|S |jpg }d| d d| d }|jp0g }|D ]%}| |}||j dd| d	7 }|jrT|d
t|j 7 }|d7 }q3|d7 }|S )Nr<   z<<interface>>\n{|z\lz\l|(, )z: })r:   attrsmethodsjoin_get_method_argumentsr7   returnsr   )r+   r9   rD   r:   rK   rL   funcargsr.   r.   r/   r?   V   s$   



z DotPrinter._build_label_for_node	from_nodeto_noder:   c                 C   s\   t | }dd | D }|r|d| d | d| d| ddt| d d	S )
zACreate an edge from one node to another to display relationships.c                 S   s    g | ]\}}| d | dqS )z="r1   r.   ).0propr3   r.   r.   r/   
<listcomp>}   s     z(DotPrinter.emit_edge.<locals>.<listcomp>zlabel="r1   z" -> "z" [rH   z];N)r!   itemsappendr2   rM   sorted)r+   rR   rS   r8   r:   
arrowstylerK   r.   r.   r/   	emit_edget   s
   ,zDotPrinter.emit_edge
outputfilec           
      C   s  |    d}| j}|d u r*d}td|\}}td|\}}t| t| n&t|jd}|s<d}|d | }||vrNtd|\}}t| n|}t	|ddd}|
| j W d    n1 shw   Y  ||vrt  tjd	k}	tjd
d||d|g|	d t| d S d S )N)dotgvpngz.gvz.png.wutf8)encodingwin32r]   z-Tz-o)shell)_close_graphr$   tempfilemkstemposcloser   suffixlstripr    
writelineslinesr   sysplatform
subprocesscallunlink)
r+   r\   graphviz_extensionsr7   targetpdotdot_sourcepathppngoutfile	use_shellr.   r.   r/   generate   s:   

zDotPrinter.generatec                 C   s   |  d dS )z2Emit the lines needed to properly close the graph.z}
N)r2   r5   r.   r.   r/   rf      s   zDotPrinter._close_graph)NN)r0   N)N)F)__name__
__module____qualname__r>   strr   r	   boolr*   r6   r   r
   rC   r?   r   r[   r{   rf   __classcell__r.   r.   r,   r/   r"   )   sX    



#
r"   )&__doc__ri   rq   ro   rg   pathlibr   typingr   r   r   r   astroidr   pylint.pyreverse.printerr   r	   r
   r   r   pylint.pyreverse.utilsr   r   	frozensetr   r   __annotations__PACKAGE	INTERFACECLASSr   INHERITSdict
IMPLEMENTSASSOCIATIONUSESr!   r"   r.   r.   r.   r/   <module>   s.   	
