o
    b                     @   sd   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 ZG d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)
    Nc                 C   s2   t | }t t | }| dd }|||fS )zDTransforms /some/path/foo.png into ('/some/path', 'foo.png', 'png')..)ospbasenamedirnameabspathsplit)filenamer   storedirtarget r   K/var/www/secure340b-portal/env/lib/python3.10/site-packages/pylint/graph.pytarget_info_from_filename   s   

r   c                   @   sX   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 backend.Nutf-8dotc           	      C   s   |d u ri }|| _ || _g | _d | _| dt|  |r$| d|  |r-| d|  |r6| d|  |rK| dv sDJ d| | d|  | D ]
}| d| qOd S )	Nzdigraph %s {z
rankdir=%szratio=%sz	size="%s")r   z
iso-8859-1latin1zunsupported charset %szcharset="%s"=)		graphnamerendererlines_sourceemitnormalize_node_idloweritemsjoin)	selfr   Zrankdirsizeratiocharsetr   Zadditional_paramparamr   r   r   __init__    s*   
zDotBackend.__init__c                 C   s,   | j du r| d d| j| _ | `| j S )zreturns self._sourceNz}

)r   r   r   r   )r   r   r   r   
get_source?   s
   

zDotBackend.get_sourcec              
   C   s6  ddl }| j}|s|r|dr|}nd| }|dur;t|\}}}|dkr4td|\}	}
t|	 n#t	||}
nd}td|\}	}
td|\}}t|	 t| t
j|
dd	d
}	|	| j |	  |dkrtjdk}|r|j| jdd|d||
d|g	|d n|j| jd||
d|g|d t|
 |S )a)  Generates a graph file.

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

        :rtype: str
        :return: a path to the generated file
        r   Nz.dotz%s.dotr   Zpngz.pngwutf8)encodingwin32z-Tcmapxz-oz-T)shell)
subprocessr   endswithr   tempfilemkstemposcloser   r   codecsopenwritesourcesysplatformcallr   unlink)r   Z
outputfileZdotfileZmapfiler*   namer
   _r   ZpdotZdot_sourcepathZppngZ	use_shellr   r   r   generateI   sT   




zDotBackend.generatec                 C   s   | j | dS )zAdds <line> to final output.N)r   append)r   liner   r   r   r      s   zDotBackend.emitc              	   K   sF   dd |  D }t|t|}}| d||dt|f  dS )zwemit an edge from <name1> to <name2>.
        edge properties: see http://www.graphviz.org/doc/info/attrs.html
        c                 S      g | ]
\}}d ||f qS z%s="%s"r   .0propvaluer   r   r   
<listcomp>       z(DotBackend.emit_edge.<locals>.<listcomp>z%s -> %s [%s];, N)r   r   r   r   sorted)r   Zname1Zname2propsattrsZn_fromZn_tor   r   r   	emit_edge   s   "zDotBackend.emit_edgec                 K   s6   dd |  D }| dt|dt|f  dS )ztemit a node with given properties.
        node properties: see http://www.graphviz.org/doc/info/attrs.html
        c                 S   r=   r>   r   r?   r   r   r   rC      rD   z(DotBackend.emit_node.<locals>.<listcomp>z%s [%s];rE   N)r   r   r   r   rF   )r   r8   rG   rH   r   r   r   	emit_node   s   $zDotBackend.emit_node)NNNr   r   N)NNN)__name__
__module____qualname____doc__r"   r$   propertyr3   r:   r   rI   rJ   r   r   r   r   r      s    

<r   c                 C   s   d|  S )z)Returns a suitable DOT node id for `nid`.z"%s"r   )nidr   r   r   r      s   r   c                 C   s<   | sdS g }|du r|   }|D ]}t| g t || q|S )zgiven a dictionary representing an ordered graph (i.e. key are vertices
    and values is a list of destination vertices representing edges), return a
    list of detected cycles
    r   N)keys_get_cyclesset)
graph_dictZverticesresultverticer   r   r   
get_cycles   s   rW   c           	      C   s   ||v r=|g}|ddd D ]}||kr n| d| qt|}||}||d |d|  }||vr;|| dS || z| | D ]}||vrZt| |||| || qGW n	 tye   Y nw |  dS )z5recursive function doing the real work for get_cyclesNr   r   )insertminindexr;   rR   addKeyErrorpop)	rT   pathvisitedrU   rV   cyclenodeZ
start_fromrZ   r   r   r   rR      s0   



rR   )N)rN   os.pathr^   r   r.   r4   r,   r0   r   r   r   rW   rR   r   r   r   r   <module>   s   |
