Enhanced ExecutionContext to keep track of the execution flow

This commit is contained in:
2020-01-07 15:47:43 +01:00
parent ffd98d7407
commit b4346b5af0
19 changed files with 966 additions and 190 deletions
+37 -5
View File
@@ -1,3 +1,4 @@
import dataclasses
import json
import pickle
import datetime
@@ -10,6 +11,9 @@ from enum import Enum
import core.utils
from core.concept import Concept
from core.tokenizer import Token
from parsers.BaseParser import Node
def json_default_converter(o):
"""
@@ -23,7 +27,13 @@ def json_default_converter(o):
return o.isoformat()
if isinstance(o, Enum):
return o.key
return o.name
raise Exception("Cannot serialize " + o.__class__.__name__)
# with open("json_encoding_error.txt", "a") as f:
# f.write(o.__class__.__name__ + "\n")
@dataclass()
@@ -51,6 +61,7 @@ class Serializer:
self.register(StateSerializer())
self.register(ConceptSerializer())
self.register(DictionarySerializer())
self.register(ExecutionContextSerializer())
def register(self, serializer):
"""
@@ -161,9 +172,9 @@ class EventSerializer(BaseSerializer):
return event
class ObjectSerializer(BaseSerializer):
class JsonSerializer(BaseSerializer):
def __init__(self, fully_qualified_name, name="O", version=1):
def __init__(self, fully_qualified_name, name="J", version=1):
BaseSerializer.__init__(self, name, version)
self.fully_qualified_name = fully_qualified_name
@@ -219,9 +230,9 @@ class StateSerializer(PickleSerializer):
1)
class ConceptSerializer(ObjectSerializer):
class ConceptSerializer(JsonSerializer):
def __init__(self):
ObjectSerializer.__init__(self, "core.concept.Concept", "C", 1)
JsonSerializer.__init__(self, "core.concept.Concept", "C", 1)
def matches(self, obj):
return isinstance(obj, Concept)
@@ -235,6 +246,27 @@ class DictionarySerializer(PickleSerializer):
"D",
1)
class ExecutionContextSerializer(BaseSerializer):
def __init__(self):
BaseSerializer.__init__(self, "R", 1)
def matches(self, obj):
return core.utils.get_full_qualified_name(obj) == "core.sheerka.ExecutionContext"
def dump(self, stream, obj, context):
as_json = obj.to_dict()
stream.write(json.dumps(as_json, default=json_default_converter).encode("utf-8"))
stream.seek(0)
return stream
def load(self, stream, context):
json_stream = stream.read().decode("utf-8")
json_message = json.loads(json_stream)
obj = core.utils.get_class("core.sheerka.ExecutionContext")()
obj.from_dict(json_message)
return obj
#
# class SheerkaSerializer(ObjectSerializer):
# def __init__(self):