Bläddra i källkod

Added Context abstract base class

Andrei Bondarenko 4 år sedan
förälder
incheckning
844586960a
1 ändrade filer med 59 tillägg och 0 borttagningar
  1. 59 0
      core/context/base.py

+ 59 - 0
core/context/base.py

@@ -0,0 +1,59 @@
+from abc import ABC, abstractmethod
+from state.base import State
+from core.element import Element, String
+
+
+class Context(ABC):
+    def __init__(self, state: State, model: Element, metamodel: Element):
+        self.state = state
+        self.model = model
+        self.metamodel = metamodel
+
+    @abstractmethod
+    def __enter__(self):
+        pass
+
+    @abstractmethod
+    def __exit__(self):
+        pass
+
+    @abstractmethod
+    def instantiate(self, type_name: String, instance_name: String):
+        pass
+
+    @abstractmethod
+    def instantiate_value(self, type_name: String, instance_name: String, value: Element):
+        pass
+
+    @abstractmethod
+    def instantiate_link(self, type_name: String, name: String, source: String, target: String):
+        pass
+
+    @abstractmethod
+    def delete_element(self, name: String):
+        pass
+
+    @abstractmethod
+    def verify(self):
+        pass
+
+    @abstractmethod
+    def list_elements(self):
+        pass
+
+    def list_types(self):
+        # can be implemented here since we assume that metamodel
+        # is always in graph fo, i.e. in the MV-state graph.
+        unsorted = []
+        model_root = self.state.read_dict(self.metamodel.id, "Model")
+        for elem_edge in self.state.read_outgoing(model_root):
+            # get element name
+            label_edge, = self.state.read_outgoing(elem_edge)
+            _, label_node = self.state.read_edge(label_edge)
+            label = self.state.read_value(label_node)
+            # find element type
+            elem_type_node = self.state.read_dict(label_node, "Type")
+            elem_type = self.state.read_value(elem_type_node)
+            unsorted.append(f"{label} : {elem_type if elem_type is not None else '_'}")
+        for i in sorted(unsorted):
+            print(i)