From c429bb8d56ca0b1d6fc479777ca7bd4af2c4def1 Mon Sep 17 00:00:00 2001 From: russ Date: Mon, 3 Mar 2014 14:44:21 -0500 Subject: [PATCH 1/6] added rudimentary style support to nodes --- dotter/dotter.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dotter/dotter.py b/dotter/dotter.py index 9c6295b..e27bb9b 100644 --- a/dotter/dotter.py +++ b/dotter/dotter.py @@ -170,12 +170,14 @@ def add_edge(self, node1, node2, label=None): fmt += ' [label="{0}"]'.format(label) self.execute(fmt.format(Dotter.escape(node1), Dotter.escape(node2))) - def add_node(self, node, font=None, fontsize=None, label=None, shape=None, url=None): + def add_node(self, node, font=None, fontsize=None, label=None, shape=None, + url=None, style=None): self.execute('{0}'.format(Dotter.escape(node))) self.set_label(node, label if label else node) - self.node_attributes(node, font, fontsize, shape, url) + self.node_attributes(node, font, fontsize, shape, url, style) - def node_attributes(self, node, font=None, fontsize=None, shape=None, url=None): + def node_attributes(self, node, font=None, fontsize=None, shape=None, + url=None, style=None): if font: cmd = '{0} [fontname="{1}"]'.format(Dotter.escape(node), font) self.execute(cmd) @@ -188,6 +190,9 @@ def node_attributes(self, node, font=None, fontsize=None, shape=None, url=None): if url: cmd = '{0} [URL="{1}"]'.format(Dotter.escape(node), url) self.execute(cmd) + if style: + cmd = '{0} [style="{1}"]'.format(Dotter.escape(node), style) + self.execute(cmd) def set_label(self, node, label): self.execute('{0} [label="{1}"]'.format(Dotter.escape(node), label)) From af07611eb7a62206c99d75c8fc2a6962732f00f5 Mon Sep 17 00:00:00 2001 From: russ Date: Mon, 3 Mar 2014 21:45:33 -0500 Subject: [PATCH 2/6] Converted node styles to match convention set by other properties (like Shape); Added a basic unit test --- dotter/dotter.py | 26 ++++++++++++++++++++++---- tests/test_dotter.py | 21 ++++++++++++--------- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/dotter/dotter.py b/dotter/dotter.py index e27bb9b..34b7455 100644 --- a/dotter/dotter.py +++ b/dotter/dotter.py @@ -103,6 +103,23 @@ class Shape: Utr = 'utr' +class Style: + + """ + These values can be used as valid node style values. + See http://www.graphviz.org/doc/info/shapes.html#d:style for more info. + + """ + Bold = 'bold' + Dashed = 'dashed' + Diagonals = 'diagonals' + Dotted = 'dotted' + Filled = 'filled' + Invisible = 'invisible' + Rounded = 'rounded' + Solid = 'solid' + + class Dotter: def __init__(self, directed=True, output_to_file=True, @@ -171,13 +188,13 @@ def add_edge(self, node1, node2, label=None): self.execute(fmt.format(Dotter.escape(node1), Dotter.escape(node2))) def add_node(self, node, font=None, fontsize=None, label=None, shape=None, - url=None, style=None): + url=None, styles=None): self.execute('{0}'.format(Dotter.escape(node))) self.set_label(node, label if label else node) - self.node_attributes(node, font, fontsize, shape, url, style) + self.node_attributes(node, font, fontsize, shape, url, styles) def node_attributes(self, node, font=None, fontsize=None, shape=None, - url=None, style=None): + url=None, styles=None): if font: cmd = '{0} [fontname="{1}"]'.format(Dotter.escape(node), font) self.execute(cmd) @@ -190,7 +207,8 @@ def node_attributes(self, node, font=None, fontsize=None, shape=None, if url: cmd = '{0} [URL="{1}"]'.format(Dotter.escape(node), url) self.execute(cmd) - if style: + if styles: + style = ", ".join(styles) cmd = '{0} [style="{1}"]'.format(Dotter.escape(node), style) self.execute(cmd) diff --git a/tests/test_dotter.py b/tests/test_dotter.py index f217d1a..36a9bb3 100644 --- a/tests/test_dotter.py +++ b/tests/test_dotter.py @@ -48,6 +48,18 @@ def test_addnode_label(): assert expected == dotter.commands +def test_addnode_styles(): + dotter = Dotter() + dotter.add_node('a', styles=["diagonals", "filled", "bold"]) + expected = ['digraph', + ' {', + 'gb', + 'gb [label="a"]', + 'gb [style="diagonals, filled, bold"]', + ] + assert expected == dotter.commands + + def test_set_position(): dotter = Dotter(program=Program.Neato) dotter.add_node('a') @@ -89,15 +101,6 @@ def test_output(): assert output == expected -def test_nodes_attributes(): - dotter = Dotter() - dotter.nodes_attributes(shape=Shape.Box) - dotter.nodes_attributes(font='MyFont') - expected = ['digraph', ' {', 'node [shape="box"]', - 'node [fontname="MyFont"]'] - assert dotter.commands == expected - - def test_output_to_file(): dotter = Dotter(output_filename='test.pdf') expected = ['dot', '-o', 'test.pdf', '-Tpdf'] From 0a1bf1bbf40747e921124f374756552ac2d26079 Mon Sep 17 00:00:00 2001 From: Friedrich Paetzke Date: Sat, 8 Mar 2014 19:41:21 +0100 Subject: [PATCH 3/6] Cosmetics --- dotter/dotter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotter/dotter.py b/dotter/dotter.py index 34b7455..301c714 100644 --- a/dotter/dotter.py +++ b/dotter/dotter.py @@ -208,7 +208,7 @@ def node_attributes(self, node, font=None, fontsize=None, shape=None, cmd = '{0} [URL="{1}"]'.format(Dotter.escape(node), url) self.execute(cmd) if styles: - style = ", ".join(styles) + style = ', '.join(styles) cmd = '{0} [style="{1}"]'.format(Dotter.escape(node), style) self.execute(cmd) From b76c0609f3f43c025011154a351862c6e28300d7 Mon Sep 17 00:00:00 2001 From: Friedrich Paetzke Date: Sat, 8 Mar 2014 19:41:32 +0100 Subject: [PATCH 4/6] Add test --- tests/test_dotter.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/test_dotter.py b/tests/test_dotter.py index 36a9bb3..1d60a66 100644 --- a/tests/test_dotter.py +++ b/tests/test_dotter.py @@ -101,6 +101,15 @@ def test_output(): assert output == expected +def test_nodes_attributes(): + dotter = Dotter() + dotter.nodes_attributes(shape=Shape.Box) + dotter.nodes_attributes(font='MyFont') + expected = ['digraph', ' {', 'node [shape="box"]', + 'node [fontname="MyFont"]'] + assert dotter.commands == expected + + def test_output_to_file(): dotter = Dotter(output_filename='test.pdf') expected = ['dot', '-o', 'test.pdf', '-Tpdf'] From da80335923abae850fd601fe12439124c4bd1d24 Mon Sep 17 00:00:00 2001 From: Friedrich Paetzke Date: Sat, 8 Mar 2014 19:42:16 +0100 Subject: [PATCH 5/6] Export/import class Style --- dotter/__init__.py | 2 +- tests/test_dotter.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/dotter/__init__.py b/dotter/__init__.py index d3d2f54..65a0a23 100644 --- a/dotter/__init__.py +++ b/dotter/__init__.py @@ -6,7 +6,7 @@ All rights reserved. """ -from .dotter import Dotter, Program, RankType, Shape +from .dotter import Dotter, Program, RankType, Shape, Style __version__ = '0.3.0' __author__ = 'Friedrich Paetzke' diff --git a/tests/test_dotter.py b/tests/test_dotter.py index 1d60a66..2fc6ccf 100644 --- a/tests/test_dotter.py +++ b/tests/test_dotter.py @@ -8,9 +8,10 @@ """ import os -from dotter import Dotter, Program, RankType, Shape from pytest import raises +from dotter import Dotter, Program, RankType, Shape, Style + def load_data(filename): test_data = os.path.dirname(os.path.abspath(os.path.dirname(__file__))) From 7030c5b80bac2ff1dc34bd7a3cec02116f30a8ba Mon Sep 17 00:00:00 2001 From: Friedrich Paetzke Date: Sat, 8 Mar 2014 19:42:40 +0100 Subject: [PATCH 6/6] Use also Style class value --- tests/test_dotter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_dotter.py b/tests/test_dotter.py index 2fc6ccf..784af40 100644 --- a/tests/test_dotter.py +++ b/tests/test_dotter.py @@ -51,7 +51,7 @@ def test_addnode_label(): def test_addnode_styles(): dotter = Dotter() - dotter.add_node('a', styles=["diagonals", "filled", "bold"]) + dotter.add_node('a', styles=["diagonals", "filled", Style.Bold]) expected = ['digraph', ' {', 'gb',