Added first version of DebugManager. Implemented draft of the rule engine

This commit is contained in:
2020-11-20 13:41:45 +01:00
parent cd066881b4
commit 315f8ea09b
156 changed files with 8388 additions and 2852 deletions
+66 -21
View File
@@ -1,14 +1,20 @@
import core.utils
from core.builtin_concepts import UserInputConcept, ReturnValueConcept, BuiltinConcepts
from core.concept import Concept, PROPERTIES_TO_SERIALIZE as CONCEPT_PROPERTIES_TO_SERIALIZE, ConceptParts, NotInit, \
get_concept_attrs
from core.rule import Rule
from core.sheerka.ExecutionContext import ExecutionContext, PROPERTIES_TO_SERIALIZE as CONTEXT_PROPERTIES_TO_SERIALIZE
from core.sheerka.Sheerka import Sheerka
from core.sheerka.services.SheerkaExecute import ParserInput
from evaluators.BaseEvaluator import BaseEvaluator
from parsers.BaseParser import BaseParser
from parsers.PythonParser import PythonNode
from sheerkapickle.handlers import BaseHandler, registry
from core.concept import Concept, PROPERTIES_TO_SERIALIZE as CONCEPT_PROPERTIES_TO_SERIALIZE, ConceptParts, NotInit
from core.sheerka.ExecutionContext import ExecutionContext, PROPERTIES_TO_SERIALIZE as CONTEXT_PROPERTIES_TO_SERIALIZE
default_concept = Concept()
default_concept_values = default_concept.values()
CONCEPT_ID = "concept/id"
RULE_ID = "rule/id"
class ConceptHandler(BaseHandler):
@@ -17,28 +23,28 @@ class ConceptHandler(BaseHandler):
pickler = self.context
sheerka = self.sheerka
if obj.metadata.full_serialization:
if obj.get_metadata().full_serialization:
ref = default_concept
ref_values = default_concept_values
else:
ref = sheerka.get_by_id(obj.id)
ref_values = ref.values()
data[CONCEPT_ID] = (obj.key, obj.id)
# transform metadata
for name in CONCEPT_PROPERTIES_TO_SERIALIZE:
value = getattr(obj.metadata, name)
ref_value = getattr(ref.metadata, name)
value = getattr(obj.get_metadata(), name)
ref_value = getattr(ref.get_metadata(), name)
if value != ref_value:
value_to_use = [list(t) for t in value] if name == "variables" else value
data["meta." + name] = pickler.flatten(value_to_use)
# # transform values
for name in obj.values:
value = obj.get_value(name)
if name not in ref.values or value != ref.get_value(name):
for name, value in obj.values().items():
if name not in ref_values or value != ref_values[name]:
if "values" not in data:
data["values"] = []
key_to_use = "cParts." + name.value if isinstance(name, ConceptParts) else name
data["values"].append((pickler.flatten(key_to_use), pickler.flatten(value)))
data["values"].append((pickler.flatten(name), pickler.flatten(value)))
return data
@@ -62,16 +68,15 @@ class ConceptHandler(BaseHandler):
for prop_name, prop_value in resolved_value:
instance.def_var(prop_name, prop_value)
else:
setattr(instance.metadata, resolved_prop, resolved_value)
setattr(instance.get_metadata(), resolved_prop, resolved_value)
elif key == "values":
# get properties
for prop_name, prop_value in resolved_value:
key_to_use = ConceptParts(prop_name[7:]) if isinstance(prop_name, str) and prop_name.startswith("cParts.") else prop_name
instance.set_value(key_to_use, NotInit if prop_value is None else prop_value)
instance.set_value(prop_name, NotInit if prop_value is None else prop_value)
else:
raise Exception("Sanity check as it's not possible yet")
instance.freeze_definition_hash()
# instance.freeze_definition_hash()
return instance
@@ -80,9 +85,9 @@ class UserInputHandler(ConceptHandler):
def flatten(self, obj: UserInputConcept, data):
data[CONCEPT_ID] = (obj.key, obj.id)
data["user_name"] = obj.user_name
data["text"] = BaseParser.get_text_from_tokens(obj.text) if isinstance(obj.text, list) else \
data["text"] = core.utils.get_text_from_tokens(obj.text) if isinstance(obj.text, list) else \
obj.text.as_text() if isinstance(obj.text, ParserInput) else \
obj.text
obj.text
return data
def new(self, data):
@@ -90,8 +95,8 @@ class UserInputHandler(ConceptHandler):
def restore(self, data, instance):
instance.__init__(data["text"], data["user_name"])
instance.metadata.key = data[CONCEPT_ID][0]
instance.metadata.id = data[CONCEPT_ID][1]
instance.get_metadata().key = data[CONCEPT_ID][0]
instance.get_metadata().id = data[CONCEPT_ID][1]
instance.freeze_definition_hash()
return instance
@@ -121,8 +126,8 @@ class ReturnValueHandler(BaseHandler):
if "parents" in data:
instance.parents = pickler.restore(data["parents"])
instance.metadata.key = data[CONCEPT_ID][0]
instance.metadata.id = data[CONCEPT_ID][1]
instance.get_metadata().key = data[CONCEPT_ID][0]
instance.get_metadata().id = data[CONCEPT_ID][1]
instance.freeze_definition_hash()
return instance
@@ -156,7 +161,7 @@ class ExecutionContextHandler(BaseHandler):
return data
def new(self, data):
return ExecutionContext(data["who"], None, None, BuiltinConcepts.NOP, None)
return ExecutionContext(data["who"], None, self.sheerka, BuiltinConcepts.NOP, None)
def restore(self, data, instance):
pickler = self.context
@@ -169,9 +174,49 @@ class ExecutionContextHandler(BaseHandler):
return instance
class RuleContextHandler(BaseHandler):
def flatten(self, obj, data):
data[RULE_ID] = obj.id
data["name"] = obj.metadata.name
data["predicate"] = obj.metadata.predicate
data["action_type"] = obj.metadata.action_type
data["action"] = obj.metadata.action
return data
def new(self, data):
return Rule(data["action_type"], data["name"], data["predicate"], data["action"])
def restore(self, data, instance):
instance.metadata.id = data[RULE_ID]
return instance
class PythonNodeHandler(BaseHandler):
def flatten(self, obj, data):
pickler = self.context
data["source"] = obj.source
data["objects"] = pickler.flatten(obj.objects)
return data
def new(self, data):
return PythonNode.__new__(PythonNode)
def restore(self, data, instance):
pickler = self.context
instance.__init__(data["source"], objects=pickler.restore(data["objects"]))
return instance
def initialize_pickle_handlers():
registry.register(Concept, ConceptHandler, True)
registry.register(UserInputConcept, UserInputHandler, True)
registry.register(ReturnValueConcept, ReturnValueHandler, True)
registry.register(Sheerka, SheerkaHandler, True)
registry.register(ExecutionContext, ExecutionContextHandler, True)
registry.register(Rule, RuleContextHandler, True)
registry.register(PythonNode, PythonNodeHandler, True)