Added first version of DebugManager. Implemented draft of the rule engine
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user