Index: tools/telemetry/third_party/altgraph/altgraph/Dot.py |
diff --git a/tools/telemetry/third_party/altgraph/altgraph/Dot.py b/tools/telemetry/third_party/altgraph/altgraph/Dot.py |
deleted file mode 100644 |
index 49a471e4daba145a650dd02f76591ab5c3366ec7..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/third_party/altgraph/altgraph/Dot.py |
+++ /dev/null |
@@ -1,299 +0,0 @@ |
-''' |
-altgraph.Dot - Interface to the dot language |
-============================================ |
- |
-The :py:mod:`~altgraph.Dot` module provides a simple interface to the |
-file format used in the `graphviz <http://www.research.att.com/sw/tools/graphviz/>`_ |
-program. The module is intended to offload the most tedious part of the process |
-(the **dot** file generation) while transparently exposing most of its features. |
- |
-To display the graphs or to generate image files the `graphviz <http://www.research.att.com/sw/tools/graphviz/>`_ |
-package needs to be installed on the system, moreover the :command:`dot` and :command:`dotty` programs must |
-be accesible in the program path so that they can be ran from processes spawned |
-within the module. |
- |
-Example usage |
-------------- |
- |
-Here is a typical usage:: |
- |
- from altgraph import Graph, Dot |
- |
- # create a graph |
- edges = [ (1,2), (1,3), (3,4), (3,5), (4,5), (5,4) ] |
- graph = Graph.Graph(edges) |
- |
- # create a dot representation of the graph |
- dot = Dot.Dot(graph) |
- |
- # display the graph |
- dot.display() |
- |
- # save the dot representation into the mydot.dot file |
- dot.save_dot(file_name='mydot.dot') |
- |
- # save dot file as gif image into the graph.gif file |
- dot.save_img(file_name='graph', file_type='gif') |
- |
-Directed graph and non-directed graph |
-------------------------------------- |
- |
-Dot class can use for both directed graph and non-directed graph |
-by passing ``graphtype`` parameter. |
- |
-Example:: |
- |
- # create directed graph(default) |
- dot = Dot.Dot(graph, graphtype="digraph") |
- |
- # create non-directed graph |
- dot = Dot.Dot(graph, graphtype="graph") |
- |
-Customizing the output |
----------------------- |
- |
-The graph drawing process may be customized by passing |
-valid :command:`dot` parameters for the nodes and edges. For a list of all |
-parameters see the `graphviz <http://www.research.att.com/sw/tools/graphviz/>`_ |
-documentation. |
- |
-Example:: |
- |
- # customizing the way the overall graph is drawn |
- dot.style(size='10,10', rankdir='RL', page='5, 5' , ranksep=0.75) |
- |
- # customizing node drawing |
- dot.node_style(1, label='BASE_NODE',shape='box', color='blue' ) |
- dot.node_style(2, style='filled', fillcolor='red') |
- |
- # customizing edge drawing |
- dot.edge_style(1, 2, style='dotted') |
- dot.edge_style(3, 5, arrowhead='dot', label='binds', labelangle='90') |
- dot.edge_style(4, 5, arrowsize=2, style='bold') |
- |
- |
-.. note:: |
- |
- dotty (invoked via :py:func:`~altgraph.Dot.display`) may not be able to |
- display all graphics styles. To verify the output save it to an image file |
- and look at it that way. |
- |
-Valid attributes |
----------------- |
- |
- - dot styles, passed via the :py:meth:`Dot.style` method:: |
- |
- rankdir = 'LR' (draws the graph horizontally, left to right) |
- ranksep = number (rank separation in inches) |
- |
- - node attributes, passed via the :py:meth:`Dot.node_style` method:: |
- |
- style = 'filled' | 'invisible' | 'diagonals' | 'rounded' |
- shape = 'box' | 'ellipse' | 'circle' | 'point' | 'triangle' |
- |
- - edge attributes, passed via the :py:meth:`Dot.edge_style` method:: |
- |
- style = 'dashed' | 'dotted' | 'solid' | 'invis' | 'bold' |
- arrowhead = 'box' | 'crow' | 'diamond' | 'dot' | 'inv' | 'none' | 'tee' | 'vee' |
- weight = number (the larger the number the closer the nodes will be) |
- |
- - valid `graphviz colors <http://www.research.att.com/~erg/graphviz/info/colors.html>`_ |
- |
- - for more details on how to control the graph drawing process see the |
- `graphviz reference <http://www.research.att.com/sw/tools/graphviz/refs.html>`_. |
-''' |
-import os |
-import warnings |
- |
-from altgraph import GraphError |
- |
- |
-class Dot(object): |
- ''' |
- A class providing a **graphviz** (dot language) representation |
- allowing a fine grained control over how the graph is being |
- displayed. |
- |
- If the :command:`dot` and :command:`dotty` programs are not in the current system path |
- their location needs to be specified in the contructor. |
- ''' |
- |
- def __init__(self, graph=None, nodes=None, edgefn=None, nodevisitor=None, edgevisitor=None, name="G", dot='dot', dotty='dotty', neato='neato', graphtype="digraph"): |
- ''' |
- Initialization. |
- ''' |
- self.name, self.attr = name, {} |
- |
- assert graphtype in ['graph', 'digraph'] |
- self.type = graphtype |
- |
- self.temp_dot = "tmp_dot.dot" |
- self.temp_neo = "tmp_neo.dot" |
- |
- self.dot, self.dotty, self.neato = dot, dotty, neato |
- |
- # self.nodes: node styles |
- # self.edges: edge styles |
- self.nodes, self.edges = {}, {} |
- |
- if graph is not None and nodes is None: |
- nodes = graph |
- if graph is not None and edgefn is None: |
- def edgefn(node, graph=graph): |
- return graph.out_nbrs(node) |
- if nodes is None: |
- nodes = () |
- |
- seen = set() |
- for node in nodes: |
- if nodevisitor is None: |
- style = {} |
- else: |
- style = nodevisitor(node) |
- if style is not None: |
- self.nodes[node] = {} |
- self.node_style(node, **style) |
- seen.add(node) |
- if edgefn is not None: |
- for head in seen: |
- for tail in (n for n in edgefn(head) if n in seen): |
- if edgevisitor is None: |
- edgestyle = {} |
- else: |
- edgestyle = edgevisitor(head, tail) |
- if edgestyle is not None: |
- if head not in self.edges: |
- self.edges[head] = {} |
- self.edges[head][tail] = {} |
- self.edge_style(head, tail, **edgestyle) |
- |
- def style(self, **attr): |
- ''' |
- Changes the overall style |
- ''' |
- self.attr = attr |
- |
- def display(self, mode='dot'): |
- ''' |
- Displays the current graph via dotty |
- ''' |
- |
- if mode == 'neato': |
- self.save_dot(self.temp_neo) |
- neato_cmd = "%s -o %s %s" % (self.neato, self.temp_dot, self.temp_neo) |
- os.system(neato_cmd) |
- else: |
- self.save_dot(self.temp_dot) |
- |
- plot_cmd = "%s %s" % (self.dotty, self.temp_dot) |
- os.system(plot_cmd) |
- |
- def node_style(self, node, **kwargs): |
- ''' |
- Modifies a node style to the dot representation. |
- ''' |
- if node not in self.edges: |
- self.edges[node] = {} |
- self.nodes[node] = kwargs |
- |
- def all_node_style(self, **kwargs): |
- ''' |
- Modifies all node styles |
- ''' |
- for node in self.nodes: |
- self.node_style(node, **kwargs) |
- |
- def edge_style(self, head, tail, **kwargs): |
- ''' |
- Modifies an edge style to the dot representation. |
- ''' |
- if tail not in self.nodes: |
- raise GraphError("invalid node %s" % (tail,)) |
- |
- try: |
- if tail not in self.edges[head]: |
- self.edges[head][tail]= {} |
- self.edges[head][tail] = kwargs |
- except KeyError: |
- raise GraphError("invalid edge %s -> %s " % (head, tail) ) |
- |
- def iterdot(self): |
- # write graph title |
- if self.type == 'digraph': |
- yield 'digraph %s {\n' % (self.name,) |
- elif self.type == 'graph': |
- yield 'graph %s {\n' % (self.name,) |
- |
- else: |
- raise GraphError("unsupported graphtype %s" % (self.type,)) |
- |
- # write overall graph attributes |
- for attr_name, attr_value in sorted(self.attr.items()): |
- yield '%s="%s";' % (attr_name, attr_value) |
- yield '\n' |
- |
- # some reusable patterns |
- cpatt = '%s="%s",' # to separate attributes |
- epatt = '];\n' # to end attributes |
- |
- # write node attributes |
- for node_name, node_attr in sorted(self.nodes.items()): |
- yield '\t"%s" [' % (node_name,) |
- for attr_name, attr_value in sorted(node_attr.items()): |
- yield cpatt % (attr_name, attr_value) |
- yield epatt |
- |
- # write edge attributes |
- for head in sorted(self.edges): |
- for tail in sorted(self.edges[head]): |
- if self.type == 'digraph': |
- yield '\t"%s" -> "%s" [' % (head, tail) |
- else: |
- yield '\t"%s" -- "%s" [' % (head, tail) |
- for attr_name, attr_value in sorted(self.edges[head][tail].items()): |
- yield cpatt % (attr_name, attr_value) |
- yield epatt |
- |
- # finish file |
- yield '}\n' |
- |
- def __iter__(self): |
- return self.iterdot() |
- |
- def save_dot(self, file_name=None): |
- ''' |
- Saves the current graph representation into a file |
- ''' |
- |
- if not file_name: |
- warnings.warn(DeprecationWarning, "always pass a file_name") |
- file_name = self.temp_dot |
- |
- fp = open(file_name, "w") |
- try: |
- for chunk in self.iterdot(): |
- fp.write(chunk) |
- finally: |
- fp.close() |
- |
- def save_img(self, file_name=None, file_type="gif", mode='dot'): |
- ''' |
- Saves the dot file as an image file |
- ''' |
- |
- if not file_name: |
- warnings.warn(DeprecationWarning, "always pass a file_name") |
- file_name = "out" |
- |
- if mode == 'neato': |
- self.save_dot(self.temp_neo) |
- neato_cmd = "%s -o %s %s" % (self.neato, self.temp_dot, self.temp_neo) |
- os.system(neato_cmd) |
- plot_cmd = self.dot |
- else: |
- self.save_dot(self.temp_dot) |
- plot_cmd = self.dot |
- |
- file_name = "%s.%s" % (file_name, file_type) |
- create_cmd = "%s -T%s %s -o %s" % (plot_cmd, file_type, self.temp_dot, file_name) |
- os.system(create_cmd) |