From fc9ac5bfae369ad7c2805951d4b3fd81fdd784e6 Mon Sep 17 00:00:00 2001 From: Bruno Meneguello <1322552+bkmeneguello@users.noreply.github.com> Date: Tue, 29 Dec 2020 11:33:21 -0300 Subject: [PATCH] Allow for empty "Node as Cluster" to render as Node --- diagrams/__init__.py | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/diagrams/__init__.py b/diagrams/__init__.py index 55f6389d..e9da8039 100644 --- a/diagrams/__init__.py +++ b/diagrams/__init__.py @@ -116,9 +116,10 @@ class Diagram: self.dot = Digraph(self.name, filename=self.filename) self._nodes = {} self._edges = {} + self._subgraphs = [] - self.dot.attr(compound="true") # Set attributes. + self.dot.attr(compound="true") for k, v in self._default_graph_attrs.items(): self.dot.graph_attr[k] = v self.dot.graph_attr["label"] = self.name @@ -156,6 +157,9 @@ class Diagram: def __exit__(self, exc_type, exc_value, traceback): for nodeid, node in self._nodes.items(): self.dot.node(nodeid, label=node['label'], **node['attrs']) + + for dot in self._subgraphs: + self.dot.subgraph(dot) for nodes, edge in self._edges.items(): node1, node2 = nodes @@ -210,7 +214,7 @@ class Diagram: def subgraph(self, dot: Digraph) -> None: """Create a subgraph for clustering""" - self.dot.subgraph(dot) + self._subgraphs.append(dot) def render(self) -> None: self.dot.render(format=self.outformat, view=self.show, quiet=True) @@ -261,6 +265,7 @@ class Cluster: self.dot = Digraph(self.name) self._nodes = {} + self._subgraphs = [] # Set attributes. for k, v in self._default_graph_attrs.items(): @@ -301,6 +306,9 @@ class Cluster: def __exit__(self, exc_type, exc_value, traceback): for nodeid, node in self._nodes.items(): self.dot.node(nodeid, label=node['label'], **node['attrs']) + + for dot in self._subgraphs: + self.dot.subgraph(dot) if self._parent: self._parent.subgraph(self.dot) @@ -323,7 +331,7 @@ class Cluster: del self._nodes[nodeid] def subgraph(self, dot: Digraph) -> None: - self.dot.subgraph(dot) + self._subgraphs.append(dot) class Node: @@ -400,15 +408,10 @@ class Node: self._diagram.node(self._id, self.label, **self._attrs) def __enter__(self): - if self._cluster: - self._cluster.remove_node(self._id) - else: - self._diagram.remove_node(self._id) - setcluster(self) - self._id = "cluster_" + self._id - self.dot = Digraph(self._id) + self.dot = Digraph() self._nodes = {} + self._subgraphs = [] # Set attributes. for k, v in self._default_graph_attrs.items(): @@ -432,8 +435,22 @@ class Node: return self def __exit__(self, exc_type, exc_value, traceback): + if not (self._nodes or self._subgraphs): + return + + if self._cluster: + self._cluster.remove_node(self._id) + else: + self._diagram.remove_node(self._id) + + self._id = "cluster_" + self._id + self.dot.name = self._id + for nodeid, node in self._nodes.items(): self.dot.node(nodeid, label=node['label'], **node['attrs']) + + for dot in self._subgraphs: + self.dot.subgraph(dot) if self._cluster: self._cluster.subgraph(self.dot) @@ -456,7 +473,7 @@ class Node: del self._nodes[nodeid] def subgraph(self, dot: Digraph) -> None: - self.dot.subgraph(dot) + self._subgraphs.append(dot) def __repr__(self): _name = self.__class__.__name__