
    eq                       U d Z ddlmZ ddlZddlZddlZddlmZ ddl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  G d	 d
e      Z ed      Zded<   ej0                  dej2                  diZded<   ej6                  dddej8                  dddddej:                  dddddej<                  dddej>                  ddddiZ ded<    G d d e      Z!y)!zNClass to generate files in dot format and image formats supported by Graphviz.    )annotationsN)Enum)Path)nodes)EdgeTypeLayoutNodePropertiesNodeTypePrinter)get_annotation_labelc                      e Zd ZdZy)
HTMLLabelsz<br ALIGN="LEFT"/>N)__name__
__module____qualname__LINEBREAK_LEFT     >/usr/lib/python3/dist-packages/pylint/pyreverse/dot_printer.pyr   r      s    )Nr   r   )utf-8z
iso-8859-1latin1zfrozenset[str]ALLOWED_CHARSETSboxrecordzdict[NodeType, str]SHAPESnoneempty)	arrowtail	arrowheadgreendiamondsolid)	fontcolorr   r   styleodiamondopendashed)r   r   r$   zdict[EdgeType, dict[str, str]]ARROWSc                       e Zd ZdZ	 	 d
	 	 	 	 	 d fdZddZ	 d	 	 	 	 	 	 	 ddZddZddZ	 d	 	 	 	 	 	 	 	 	 ddZ	ddZ
dd	Z xZS )
DotPrinterblackc                ^    |xs t         j                  }d| _        t        |   |||       y )Nr   )r   BOTTOM_TO_TOPcharsetsuper__init__)selftitlelayoutuse_automatic_namespace	__class__s       r   r0   zDotPrinter.__init__9   s.     /6//(?@r   c                j   | j                  d| j                   d       | j                  r(| j                  d| j                  j                          | j                  rT| j                  j                         t        v sJ d| j                          | j                  d| j                   d       yy)zEmit the header lines.z	digraph "z" {zrankdir=zunsupported charset z	charset=""N)emitr2   r3   valuer.   lowerr   r1   s    r   _open_graphzDotPrinter._open_graphC   s    		Idjj\./;;II!2!2 345<<""$(885%dll^458II	$,,q12	 r   c                X   |t        |      }t        |   }|j                  |j                  n| j                  }|| j                  k7  rdnd}| j	                  |      }|rd| dnd}|j
                  rd|j
                   d	nd}	| j                  d	| d
| d	|	 | d| d| d       y)zVCreate a new node.

        Nodes can be classes, packages, participants etc.
        N)labelfilledr"   z	, label=<> z, fontcolor="r7   z
" [color="z	, shape="z
", style="z"];)r	   r   colorDEFAULT_COLOR_build_label_for_noder#   r8   )
r1   nametype_
propertiesshaperB   r$   r>   
label_partfontcolor_parts
             r   	emit_nodezDotPrinter.emit_nodeN   s     'd3Ju$.$4$4$@
  dFXFX!T%7%77W**:6-2yq)
7A7K7KmJ0013QS 	 			vZwa'7
|9UGS]^c]ddgh	
r   c                   |j                   sy|j                   }|j                  |j                  |S |j                  xs g }t        j                  j
                   j                  d |D              }d| d| t        j                  j
                   d}|j                  xs g }|D ]  }dj                  | j                  |            j                  dd      }|j                         rd|j                   dn|j                   }|| d	| d
z  }|j                  r,t        |j                        }	|d| j                  |	      z   z  }|t        j                  j
                   z  } |dz  }|S )NrA   c              3  @   K   | ]  }|j                  d d        yw)|\|Nreplace).0attrs     r   	<genexpr>z3DotPrinter._build_label_for_node.<locals>.<genexpr>q   s"      B
)-DLLe$B
s   {rN   , rO   z<I>z</I>()z: })r>   attrsmethodsr   r   r9   join_get_method_argumentsrQ   is_abstractrE   returnsr   _escape_annotation_label)
r1   rG   r>   rZ   attrs_stringr[   funcargsmethod_nameannotation_labels
             r   rD   z DotPrinter._build_label_for_nodef   s~   %%#
(:(:(BL &++1r%44::;AA B
16B
 
 eWAl^J,E,E,K,K+LAN ,6+=+=+C 		;D99T77=>FFsERD)-)9)9);#dii[%DII;  QtfA..E||#7#E  = =>N OOO22889:E		; 	r   c                *    |j                  dd      }|S )NrN   rO   rP   )r1   re   s     r   r`   z#DotPrinter._escape_annotation_label   s     ,33C?r   c                   t         |   }|j                         D cg c]  \  }}| d| d }}}|r|j                  d| d       | j                  d| d| ddj	                  t        |             d       yc c}}w )	zACreate an edge from one node to another to display relationships.z="r7   zlabel="z" -> "z" [rV   z];N)r(   itemsappendr8   r\   sorted)	r1   	from_nodeto_noderF   r>   
arrowstylepropr9   rZ   s	            r   	emit_edgezDotPrinter.emit_edge   s     E]
8B8H8H8JKuD6E7!$KKLL75'+,		Ai[wis499VE]3K2LBOP Ls   A=c                   | j                          d}| j                  }|_d}t        j                  d|      \  }}t        j                  d|      \  }}t	        j
                  |       t	        j
                  |       net        |      j                  j                  d      }|s
d}|dz   |z   }||vr/t        j                  d|      \  }}t	        j
                  |       n|}t        |dd      5 }|j                  | j                         d d d        ||vr3t        j                  d	d
||d|gd       t	        j                  |       y y # 1 sw Y   AxY w)N)dotgvpngz.gvz.png.wutf8)encodingrq   z-Tz-oT)check)_close_graphr2   tempfilemkstemposcloser   suffixlstripr&   
writelineslines
subprocessrununlink)	r1   
outputfilegraphviz_extensionsrE   targetpdotdot_sourcepathppngoutfiles	            r   generatezDotPrinter.generate   s=   +zzF#+#3#3E4#@ D.'//=D*HHTNHHTN*%,,33C8F'#-6
00'/'7'7t'D$n!+.#7 	+7tzz*	+,,NNfndJGt IIn%	 -	+ 	+s   3EEc                &    | j                  d       y)z2Emit the lines needed to properly close the graph.z}
N)r8   r;   s    r   ry   zDotPrinter._close_graph   s    		%r   )NN)r2   strr3   zLayout | Noner4   zbool | None)returnNone)N)rE   r   rF   r
   rG   zNodeProperties | Noner   r   )rG   r	   r   r   )re   r   r   r   )
rk   r   rl   r   rF   r   r>   z
str | Noner   r   )r   r   r   r   )r   r   r   rC   r0   r<   rK   rD   r`   ro   r   ry   __classcell__)r5   s   @r   r*   r*   6   s    M
 !%/3	AA A "-	A	3 -1	

 
 *	

 

0>  !QQ Q 	Q
 Q 
Q&8r   r*   )"__doc__
__future__r   r|   r   rz   enumr   pathlibr   astroidr   pylint.pyreverse.printerr   r   r	   r
   r   pylint.pyreverse.utilsr   r   	frozensetr   __annotations__PACKAGECLASSr   INHERITSASSOCIATIONAGGREGATIONUSESTYPE_DEPENDENCYr(   r*   r   r   r   <module>r      s   
 U " 	      X X 7* * $--N#O . OeNNH  V'B	 	 MMf=*& .B Br   