from abc import ABCMeta, abstractmethod
_nameSeparator = '.'
def _parent(id):
idx = id.rfind(_nameSeparator)
if idx > -1: return id[:idx]
[docs]class Slot:
def __init__(self, **data): self.data = data
[docs] def type(self): return self.data['type'] if 'type' in self.data else None
[docs] def name(self): return self.data['name'] if 'name' in self.data else None
[docs] def parent(self, graph):
pid = _parent(graph.slotId(self))
if pid: return graph.nodes[pid]
[docs]class Node:
def __init__(self, **data): self.data = data
[docs] def type(self): return self.data['type'] if 'type' in self.data else None
[docs] def name(self): return self.data['name'] if 'name' in self.data else None
[docs] def slots(self, graph):
slots = []
nid = graph.nodeId(self)
for k, v in graph.slots:
if k.startswith(nid):
slots.append(v)
return slots
[docs] def parent(self, graph):
pid = _parent(graph.nodeId(self))
if pid: return graph.groups[pid]
[docs]class Group:
def __init__(self, **data): self.data = data
[docs] def name(self): return self.data['name'] if 'name' in self.data else None
[docs] def nodes(self, graph):
nodes = []
gid = graph.gropuId(self)
for k, v in graph.nodes:
if k.startswith(gid):
nodes.append(v)
return nodes
[docs] def groups(self, graph):
groups = []
gid = graph.gropuId(self)
for k, v in graph.groups:
if k == gid: continue
if k.startswith(gid):
groups.append(v)
return groups
[docs] def parent(self, graph):
pid = _parent(graph.groupId(self))
if pid: return graph.groups[pid]
[docs]class Edge:
def __init__(self, src, dst, **data):
self.src = src
self.dst = dst
self.data = data
####################################################
[docs]class Graph(metaclass = ABCMeta):
def __init__(self):
self.groups = {}
self.nodes = {}
self.slots = {}
self.edges = {}
[docs] def groupId(self, group):
for k, v in self.groups:
if v == group:
return k
[docs] def nodeId(self, node):
for k, v in self.nodes:
if v == node:
return k
[docs] def slotId(self, slot):
for k, v in self.slots:
if v == slot:
return k
@abstractmethod
[docs] def generateGroupId(self): pass
@abstractmethod
[docs] def generateNodepId(self): pass
@abstractmethod
[docs] def generateSlotId(self): pass
@abstractmethod
[docs] def generateEdgeId(self): pass
[docs] def addGroup(self, **data):
gid = self.generateGroupId()
self.groups[gid] = Group(**data)
[docs] def addNode(self, **data):
nid = self.generateNodeId()
self.nodes[nid] = Node(**data)
[docs] def addSlot(self, **data):
sid = self.generateSlotId()
self.slots[sid] = Slot(**data)
[docs] def addEdge(self, src, dst, **data):
eid = self.generateEdgeId()
self.edges[eid] = Edge(src, dst, **data)