|
|
@ -165,7 +165,7 @@ class Diagram:
|
|
|
|
|
|
|
|
|
|
|
|
def connect(self, node: "Node", node2: "Node", edge: "Edge") -> None:
|
|
|
|
def connect(self, node: "Node", node2: "Node", edge: "Edge") -> None:
|
|
|
|
"""Connect the two Nodes."""
|
|
|
|
"""Connect the two Nodes."""
|
|
|
|
self.dot.edge(node.hashid, node2.hashid, **edge.to_dot())
|
|
|
|
self.dot.edge(node.hashid, node2.hashid, **edge.attrs())
|
|
|
|
|
|
|
|
|
|
|
|
def subgraph(self, dot: Digraph) -> None:
|
|
|
|
def subgraph(self, dot: Digraph) -> None:
|
|
|
|
"""Create a subgraph for clustering"""
|
|
|
|
"""Create a subgraph for clustering"""
|
|
|
@ -403,7 +403,7 @@ class Edge:
|
|
|
|
reverse: bool = False,
|
|
|
|
reverse: bool = False,
|
|
|
|
label: str = "",
|
|
|
|
label: str = "",
|
|
|
|
color: str = "",
|
|
|
|
color: str = "",
|
|
|
|
style: str = ""
|
|
|
|
style: str = "",
|
|
|
|
):
|
|
|
|
):
|
|
|
|
"""Edge represents an edge between two nodes.
|
|
|
|
"""Edge represents an edge between two nodes.
|
|
|
|
|
|
|
|
|
|
|
@ -420,9 +420,9 @@ class Edge:
|
|
|
|
self.node = node
|
|
|
|
self.node = node
|
|
|
|
self.forward = forward
|
|
|
|
self.forward = forward
|
|
|
|
self.reverse = reverse
|
|
|
|
self.reverse = reverse
|
|
|
|
self.label = label
|
|
|
|
|
|
|
|
self.color = color
|
|
|
|
# graphviz complains about using label for edges, so replacing it with xlabel
|
|
|
|
self.style = style
|
|
|
|
self._attrs = {"xlabel": label, "color": color, "style": style}
|
|
|
|
|
|
|
|
|
|
|
|
def __sub__(self, other: Union["Node", "Edge", List["Node"]]):
|
|
|
|
def __sub__(self, other: Union["Node", "Edge", List["Node"]]):
|
|
|
|
"""Implement Self - Node or Edge and Self - [Nodes]"""
|
|
|
|
"""Implement Self - Node or Edge and Self - [Nodes]"""
|
|
|
@ -454,15 +454,12 @@ class Edge:
|
|
|
|
result = []
|
|
|
|
result = []
|
|
|
|
for o in other:
|
|
|
|
for o in other:
|
|
|
|
if isinstance(o, Edge):
|
|
|
|
if isinstance(o, Edge):
|
|
|
|
o.color = self.color
|
|
|
|
|
|
|
|
o.label = self.label
|
|
|
|
|
|
|
|
o.style = self.style
|
|
|
|
|
|
|
|
o.forward = forward if forward is not None else o.forward
|
|
|
|
o.forward = forward if forward is not None else o.forward
|
|
|
|
o.reverse = forward if forward is not None else o.reverse
|
|
|
|
o.reverse = forward if forward is not None else o.reverse
|
|
|
|
|
|
|
|
self._attrs = o._attrs.copy()
|
|
|
|
result.append(o)
|
|
|
|
result.append(o)
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
result.append(Edge(o, forward=forward, reverse=reverse,
|
|
|
|
result.append(Edge(o, forward=forward, reverse=reverse, **self._attrs))
|
|
|
|
color=self.color, label=self.label, style=self.style))
|
|
|
|
|
|
|
|
return result
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
def connect(self, other: Union["Node", "Edge", List["Node"]]):
|
|
|
|
def connect(self, other: Union["Node", "Edge", List["Node"]]):
|
|
|
@ -471,9 +468,7 @@ class Edge:
|
|
|
|
self.node.connect(node, self)
|
|
|
|
self.node.connect(node, self)
|
|
|
|
return other
|
|
|
|
return other
|
|
|
|
elif isinstance(other, Edge):
|
|
|
|
elif isinstance(other, Edge):
|
|
|
|
self.label = other.label
|
|
|
|
self._attrs = other._attrs.copy()
|
|
|
|
self.color = other.color
|
|
|
|
|
|
|
|
self.style = other.style
|
|
|
|
|
|
|
|
return self
|
|
|
|
return self
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
if self.node is not None:
|
|
|
|
if self.node is not None:
|
|
|
@ -482,23 +477,17 @@ class Edge:
|
|
|
|
self.node = other
|
|
|
|
self.node = other
|
|
|
|
return self
|
|
|
|
return self
|
|
|
|
|
|
|
|
|
|
|
|
def to_dot(self) -> Dict:
|
|
|
|
def attrs(self) -> Dict:
|
|
|
|
dot = {}
|
|
|
|
|
|
|
|
if self.forward and self.reverse:
|
|
|
|
if self.forward and self.reverse:
|
|
|
|
dot['dir'] = 'both'
|
|
|
|
direction = 'both'
|
|
|
|
elif self.forward:
|
|
|
|
elif self.forward:
|
|
|
|
dot['dir'] = 'forward'
|
|
|
|
direction = 'forward'
|
|
|
|
elif self.reverse:
|
|
|
|
elif self.reverse:
|
|
|
|
dot['dir'] = 'back'
|
|
|
|
direction = 'back'
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
dot['dir'] = 'none'
|
|
|
|
direction = 'none'
|
|
|
|
if self.label:
|
|
|
|
|
|
|
|
dot['label'] = self.label
|
|
|
|
return {**self._attrs, 'dir': direction}
|
|
|
|
if self.color:
|
|
|
|
|
|
|
|
dot['color'] = self.color
|
|
|
|
|
|
|
|
if self.style:
|
|
|
|
|
|
|
|
dot['style'] = self.style
|
|
|
|
|
|
|
|
return dot
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Group = Cluster
|
|
|
|
Group = Cluster
|
|
|
|