bgdZddlmZddlZddlZddlZddlZddlZddlm Z ddl m Z dd Z Gd d Z ddZ d d!dZd"dZdS)#z^Graph manipulation utilities. (dot generation adapted from pypy/translator/tool/make_dot.py) ) annotationsN)Sequence)Anyfilenamestrreturntuple[str, str, str]ctj|}tjtj|}tj|ddd}|||fS)zDTransforms /some/path/foo.png into ('/some/path', 'foo.png', 'png').N)ospathbasenamedirnameabspathsplitext)rrstoredirtargets ]/builddir/build/BUILD/cloudlinux-venv-1.0.7/venv/lib/python3.11/site-packages/pylint/graph.pytarget_info_from_filenamershw))Hwrwx8899H W  h ' ' +ABB /F Xv %%cjeZdZdZ dd dZd!dZeeZ d"d#dZd$dZ d%dZ d&dZ dS)' DotBackendzDot File back-end.Nutf-8dot graphnamerrankdir str | Nonesizerratiocharsetrendereradditional_paramdict[str, Any] | NonerNonec*|i}||_||_g|_d|_|dt |d|r|d||r|d||r|d|d|r<|dvs Jd||d |d|D]*}|d |+dS) Nzdigraph z {zrankdir=zratio=zsize=""> iso-8859-1latin1rzunsupported charset z charset="=) rr"lines_sourceemitnormalize_node_idloweritemsjoin) selfrrrr r!r"r#params r__init__zDotBackend.__init__ sf  #! "  " #'  >.y99>>>???  , II*** + + +  ( II&u&& ' ' '  ( II&t&&& ' ' '  .==??'0g//  II,',,, - - -%++-- ' 'E IIchhuoo & & & & ' 'rc|j6|dd|j|_|`|jS)zReturns self._source.Nz}  )r,r-r1r+)r2s r get_sourcezDotBackend.get_sourceAs> <  IIe   99TZ00DL |r outputfilemapfilec 0d}|j}|[d}tjd|\}}tjd|\}}tj|tj|nRt |\} } }|s d}|dz|z}||vr-tjd|\}}tj|n|}t j|dd 5} | |j dddn #1swxYwY||vrtj |j td |d |j d |r%tj|j d d|d||d|g dn!tj|j d||d|gdtj||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 )rgvNpngz.gvz.png.wutf8)encodingzCannot 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)rtempfilemkstempr closercodecsopenwritesourceshutilwhichr" RuntimeError subprocessrununlink) r2r8r9graphviz_extensionsnamerpdotdot_sourcepathppng_files rgeneratezDotBackend.generateKs:,~  F#+#3E4#@#@ D.'/== D* HTNNN HTNNNN4Z@@LAq& 7'#-6 000'/'7t'D'D$n!+ [v > > > $$ JJt{ # # # $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ , , ,|DM**2"A AAt}AAA   !&"      ]D&.$ S In % % %sC77C;>C;linec:|j|dS)zAdds to final output.N)r+append)r2rWs rr-zDotBackend.emits $rname1name2propsc d|D}t|t|}}||d|ddt |ddS)z}Emit an edge from to . For edge properties: see https://www.graphviz.org/doc/info/attrs.html c$g|] \}}|d|dSz="r'.0propvalues r z(DotBackend.emit_edge..-FFFuD$$E$$$FFFrz ->  [, ];N)r0r.r-r1sorted)r2rZr[r\attrsn_fromn_tos r emit_edgezDotBackend.emit_edges} GF FFF(//1B51I1I VEEEE6%==)A)AEEEFFFFFrrPc d|D}|t|ddt |ddS)zzEmit a node with given properties. For node properties: see https://www.graphviz.org/doc/info/attrs.html c$g|] \}}|d|dSr_r`ras rrez(DotBackend.emit_node..rfrrgrhriN)r0r-r.r1rj)r2rPr\rks r emit_nodezDotBackend.emit_nodesd GF FFF &t,,LL &--0H0HLLLMMMMMr)NNNrrN)rrrrrrr rr!rr"rr#r$rr%)rr)NN)r8rr9rrr)rWrrr%)rZrr[rr\rrr%)rPrr\rrr%) __name__ __module__ __qualname____doc__r4r7propertyrHrVr-rnrqr`rrrrs #26'''''BXj ! !FDH=====~    GGGGNNNNNNrrnidcd|dS)z)Returns a suitable DOT node id for `nid`.r'r`)rws rr.r.s s:::r graph_dictdict[str, set[str]]verticeslist[str] | NoneSequence[list[str]]c|sdSg}|!t|}|D]!}t|gt||"|S)zReturn 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`)listkeys _get_cyclesset)ryr{resultvertices r get_cyclesrsd r F ))**<<JCEE67;;;; Mrr list[str]visitedset[str]rlist[list[str]]rr%c||vr|g}|dddD] }||krn|d|!t|}||}||d|d|z}||vr||dS|| ||D].}||vr(t |||||||/n#t $rYnwxYw|dS)z6Recursive function doing the real work for get_cycles.Nr r)insertminindexrYraddKeyErrorpop) ryrrrrcyclenode start_fromrs rrrsA$ 2J " "Dw LLD ! ! ! !ZZ  J''eff ag.    MM% KK w' " "D7""JgvtDDD D!!!  "      HHJJJJJs7C C#"C#)rrrr )rwrrr)N)ryrzr{r|rr}) ryrzrrrrrrrrrr%)ru __future__rrEr rIrLrBcollections.abcrtypingrrrr.rrr`rrrs  #""""" $$$$$$&&&&@N@N@N@N@N@N@N@NF CG      r