§
    öyIfÒ  ã                  ó”   — d Z ddlmZ ddl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 dd
„Z G d„ d¦  «        Zdd„Z	 d d!d„Zd"d„ZdS )#z^Graph manipulation utilities.

(dot generation adapted from pypy/translator/tool/make_dot.py)
é    )ÚannotationsN)ÚSequence)ÚAnyÚfilenameÚstrÚreturnútuple[str, str, str]c                ó  — t           j                             | ¦  «        }t           j                             t           j                             | ¦  «        ¦  «        }t           j                             | ¦  «        d         dd…         }|||fS )zDTransforms /some/path/foo.png into ('/some/path', 'foo.png', 'png').éÿÿÿÿé   N)ÚosÚpathÚbasenameÚdirnameÚabspathÚsplitext)r   r   ÚstoredirÚtargets       ú@/var/www/piapp/venv/lib/python3.11/site-packages/pylint/graph.pyÚtarget_info_from_filenamer      sh   € åŒw×Ò Ñ)Ô)€HÝŒw�Š�rœwŸš¨xÑ8Ô8Ñ9Ô9€HÝŒW×Ò˜hÑ'Ô'¨Ô+¨A¨B¨BÔ/€FØ�X˜vÐ%Ð%ó    c                  ój   — e Zd ZdZ	 	 	 	 	 	 dd d„Zd!d„Z ee¦  «        Z	 d"d#d„Zd$d„Z	d%d„Z
d&d„ZdS )'Ú
DotBackendzDot File back-end.Núutf-8ÚdotÚ	graphnamer   Úrankdirú
str | NoneÚsizer   ÚratioÚcharsetÚrendererÚadditional_paramúdict[str, Any] | Noner   ÚNonec                ó*  — |€i }|| _         || _        g | _        d | _        |                      dt          |¦  «        › d�¦  «         |r|                      d|› �¦  «         |r|                      d|› �¦  «         |r|                      d|› d�¦  «         |r<|                     ¦   «         dv sJ d|› �¦   «         ‚|                      d	|› d�¦  «         |                     ¦   «         D ]*}|                      d
                     |¦  «        ¦  «         Œ+d S )Nzdigraph z {zrankdir=zratio=zsize="ú">   ú
iso-8859-1Úlatin1r   zunsupported charset z	charset="ú=)	r   r"   ÚlinesÚ_sourceÚemitÚnormalize_node_idÚlowerÚitemsÚjoin)	Úselfr   r   r   r    r!   r"   r#   Úparams	            r   Ú__init__zDotBackend.__init__    sf  € ð Ð#Ø!ÐØ"ˆŒØ ˆŒØ "ˆŒ
Ø#'ˆŒØ�	Š	Ð>Õ.¨yÑ9Ô9Ð>Ð>Ð>Ñ?Ô?Ð?Øð 	,Ø�IŠIÐ* Ð*Ð*Ñ+Ô+Ð+Øð 	(Ø�IŠIÐ&˜uÐ&Ð&Ñ'Ô'Ð'Øð 	(Ø�IŠIÐ&˜tÐ&Ð&Ð&Ñ'Ô'Ð'Øð 	.Ø—=’=‘?”?ð 'ð ð ð ð 0 gÐ/Ð/ñ	ô ð ð
 �IŠIÐ, 'Ð,Ð,Ð,Ñ-Ô-Ð-Ø%×+Ò+Ñ-Ô-ð 	'ð 	'ˆEØ�IŠI�c—h’h˜u‘o”oÑ&Ô&Ð&Ð&ð	'ð 	'r   c                óŠ   — | j         €6|                      d¦  «         d                     | j        ¦  «        | _         | `| j         S )zReturns self._source.Nz}
ú
)r,   r-   r1   r+   )r2   s    r   Ú
get_sourcezDotBackend.get_sourceA   s>   € àŒ<ÐØ�IŠI�eÑÔÐØŸ9š9 T¤ZÑ0Ô0ˆDŒLØ�
ØŒ|Ðr   Ú
outputfileÚmapfilec                ó0  — d}| j         }|€[d}t          j        d|¦  «        \  }}t          j        d|¦  «        \  }}t          j        |¦  «         t          j        |¦  «         nRt          |¦  «        \  }	}	}|s
d}|dz   |z   }||vr-t          j        d|¦  «        \  }}t          j        |¦  «         n|}t          j        |dd¬	¦  «        5 }
|
                     | j	        ¦  «         ddd¦  «         n# 1 swxY w Y   ||vr�t          j        | j        ¦  «        €t          d
|› d| j        › d�¦  «        ‚|r%t          j        | j        dd|d||d|g	d¬¦  «         n!t          j        | j        d||d|gd¬¦  «         t          j        |¦  «         |S )a+  Generates a graph file.

        :param str outputfile: filename and path [defaults to graphname.png]
        :param str mapfile: filename and path

        :rtype: str
        :return: a path to the generated file
        :raises RuntimeError: if the executable for rendering was not found
        )r   ÚgvNÚpngz.gvz.pngú.ÚwÚutf8)ÚencodingzCannot generate `z` because 'zg' executable not found. Install graphviz, or specify a `.gv` outputfile to produce the DOT source code.z-Tcmapxz-oz-TT)Úcheck)r   ÚtempfileÚmkstempr   Úcloser   ÚcodecsÚopenÚwriteÚsourceÚshutilÚwhichr"   ÚRuntimeErrorÚ
subprocessÚrunÚunlink)r2   r8   r9   Úgraphviz_extensionsÚnamer   ÚpdotÚdot_sourcepathÚppngÚ_Úfiles              r   ÚgeneratezDotBackend.generateK   s:  € ð ,ÐØŒ~ˆØÐØˆFÝ#+Ô#3°E¸4Ñ#@Ô#@Ñ ˆD�.Ý'Ô/°¸Ñ=Ô=ÑˆD�*ÝŒH�T‰NŒNˆNÝŒH�T‰NŒNˆNˆNå4°ZÑ@Ô@‰LˆAˆq�&Øð 7Ø�Ø'¨#Ñ-°Ñ6�
ØÐ0Ð0Ð0Ý'/Ô'7¸¸tÑ'DÔ'DÑ$��nÝ”˜‘”��à!+�ÝŒ[˜¨°vÐ>Ñ>Ô>ð 	$À$Ø�JŠJ�t”{Ñ#Ô#Ð#ð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$àÐ,Ð,Ð,ÝŒ|˜DœMÑ*Ô*Ð2Ý"ðA¨
ð Að A¸t¼}ð Að Að Añô ð ð
 ð Ý”àœØ!ØØØØØ&ØØ"ð
ð ðñ ô ð ð õ ”Ø”] D¨&°.À$È
ÐSØðñ ô ð õ ŒI�nÑ%Ô%Ð%ØÐs   ÃC7Ã7C;Ã>C;Úlinec                ó:   — | j                              |¦  «         dS )zAdds <line> to final output.N)r+   Úappend)r2   rW   s     r   r-   zDotBackend.emitŠ   s   € àŒ
×Ò˜$ÑÔÐÐÐr   Úname1Úname2Úpropsc                óú   — d„ |                      ¦   «         D ¦   «         }t          |¦  «        t          |¦  «        }}|                      |› d|› dd                     t	          |¦  «        ¦  «        › d�¦  «         dS )z}Emit an edge from <name1> to <name2>.

        For edge properties: see https://www.graphviz.org/doc/info/attrs.html
        c                ó$   — g | ]\  }}|› d |› d�‘ŒS ©z="r'   © ©Ú.0ÚpropÚvalues      r   ú
<listcomp>z(DotBackend.emit_edge.<locals>.<listcomp>“   ó-   € ÐFÐFÐF©¨¨u�DÐ$Ð$˜EÐ$Ð$Ð$ÐFÐFÐFr   z -> ú [ú, ú];N)r0   r.   r-   r1   Úsorted)r2   rZ   r[   r\   ÚattrsÚn_fromÚn_tos          r   Ú	emit_edgezDotBackend.emit_edgeŽ   s}   € ð
 GÐF¸¿º¹¼ÐFÑFÔFˆÝ(¨Ñ/Ô/Õ1BÀ5Ñ1IÔ1I�ˆØ�	Š	�VÐEÐE ÐEÐE¨¯ªµ6¸%±=´=Ñ)AÔ)AÐEÐEÐEÑFÔFÐFÐFÐFr   rP   c           	     óÒ   — d„ |                      ¦   «         D ¦   «         }|                      t          |¦  «        › dd                     t	          |¦  «        ¦  «        › d�¦  «         dS )zzEmit a node with given properties.

        For node properties: see https://www.graphviz.org/doc/info/attrs.html
        c                ó$   — g | ]\  }}|› d |› d�‘ŒS r_   r`   ra   s      r   re   z(DotBackend.emit_node.<locals>.<listcomp>œ   rf   r   rg   rh   ri   N)r0   r-   r.   r1   rj   )r2   rP   r\   rk   s       r   Ú	emit_nodezDotBackend.emit_node—   sd   € ð
 GÐF¸¿º¹¼ÐFÑFÔFˆØ�	Š	Õ& tÑ,Ô,ÐLÐL°·	²	½&À¹-¼-Ñ0HÔ0HÐLÐLÐLÑMÔMÐMÐMÐMr   )NNNr   r   N)r   r   r   r   r   r   r    r   r!   r   r"   r   r#   r$   r   r%   )r   r   )NN)r8   r   r9   r   r   r   )rW   r   r   r%   )rZ   r   r[   r   r\   r   r   r%   )rP   r   r\   r   r   r%   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r4   r7   ÚpropertyrH   rV   r-   rn   rq   r`   r   r   r   r      sÔ   € € € € € ØÐð
 #ØØØØØ26ð'ð 'ð 'ð 'ð 'ðBð ð ð ð ˆX�jÑ!Ô!€Fð DHð=ð =ð =ð =ð =ð~ ð  ð  ð  ðGð Gð Gð GðNð Nð Nð Nð Nð Nr   r   Únidc                ó   — d| › d�S )z)Returns a suitable DOT node id for `nid`.r'   r`   )rw   s    r   r.   r.       s   € àˆsˆ:ˆ:ˆ:Ðr   Ú
graph_dictúdict[str, set[str]]Úverticesúlist[str] | NoneúSequence[list[str]]c                ó    — | sdS g }|€!t          |                      ¦   «         ¦  «        }|D ]!}t          | g t          ¦   «         ||¦  «         Œ"|S )z�Return a list of detected cycles based on an ordered graph (i.e. keys are
    vertices and values are lists of destination vertices representing edges).
    r`   )ÚlistÚkeysÚ_get_cyclesÚset)ry   r{   ÚresultÚvertices       r   Ú
get_cyclesr…   ¥   sd   € ð ð ØˆrØ €FØÐÝ˜
ŸšÑ)Ô)Ñ*Ô*ˆØð <ð <ˆÝ�J ¥C¡E¤E¨6°7Ñ;Ô;Ð;Ð;Ø€Mr   r   ú	list[str]Úvisitedúset[str]rƒ   úlist[list[str]]r„   r%   c                óø  — ||v rƒ|g}|ddd…         D ] }||k    r n|                      d|¦  «         Œ!t          |¦  «        }|                     |¦  «        }||d…         |d|…         z   }||vr|                     |¦  «         dS |                     |¦  «         	 | |         D ].}||vr(t	          | ||||¦  «         |                     |¦  «         Œ/n# t          $ r Y nw xY w|                     ¦   «          dS )z6Recursive function doing the real work for get_cycles.Nr   r   )ÚinsertÚminÚindexrY   r�   ÚaddÚKeyErrorÚpop)	ry   r   r‡   rƒ   r„   ÚcycleÚnodeÚ
start_fromr�   s	            r   r�   r�   µ   sA  € ð �$€€Ø�	ˆØ˜˜˜2˜”Jð 	"ð 	"ˆDØ�wŠˆØ�Ø�LŠL˜˜DÑ!Ô!Ð!Ð!å˜‘Z”Zˆ
Ø—’˜JÑ'Ô'ˆØ�e�f�f”  a¨ g¤Ñ.ˆà˜ÐÐØ�MŠM˜%Ñ Ô Ð ØˆØ‡K‚K�ÑÔÐðØ˜wÔ'ð 	"ð 	"ˆDà˜7Ð"Ð"Ý˜J¨¨g°v¸tÑDÔDÐDØ—’˜DÑ!Ô!Ð!øð		"øõ
 ð ð ð Øˆðøøøà‡H‚H�J„J€J€J€Js   Â7C Ã
C#Ã"C#)r   r   r   r	   )rw   r   r   r   )N)ry   rz   r{   r|   r   r}   )ry   rz   r   r†   r‡   rˆ   rƒ   r‰   r„   r   r   r%   )ru   Ú
__future__r   rE   r   rI   rL   rB   Úcollections.abcr   Útypingr   r   r   r.   r…   r�   r`   r   r   ú<module>r—      s  ðð
ð ð
 #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø €€€Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð ð&ð &ð &ð &ð@Nð @Nð @Nð @Nð @Nñ @Nô @Nð @NðFð ð ð ð CGðð ð ð ð ð ð ð ð ð ð r   