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
+5 -5
View File
@@ -8,9 +8,7 @@ from sheerkapickle import utils, tags, handlers
def encode(sheerka, obj):
pickler = SheerkaPickler(sheerka)
data = pickler.flatten(obj)
return json.dumps(data)
return json.dumps(SheerkaPickler(sheerka).flatten(obj))
class ToReduce:
@@ -41,6 +39,9 @@ class SheerkaPickler:
self.to_reduce.append(ToReduce(lambda o: isinstance(o, NotInitialized), lambda o: None))
def flatten(self, obj):
if utils.is_to_discard(obj):
return str(obj)
if utils.is_primitive(obj):
return obj
@@ -125,9 +126,8 @@ class SheerkaPickler:
if hasattr(obj, "__dict__"):
for k, v in obj.__dict__.items():
data[k] = self.flatten(v)
return data
return None
return data
def exist(self, obj):
try:
+6 -2
View File
@@ -5,8 +5,7 @@ from sheerkapickle import tags, utils, handlers
def decode(sheerka, obj):
decoded = SheerkaUnpickler(sheerka).restore(json.loads(obj))
return decoded
return SheerkaUnpickler(sheerka).restore(json.loads(obj))
class SheerkaUnpickler:
@@ -74,6 +73,11 @@ class SheerkaUnpickler:
self.objs.append(instance)
instance = handler.restore(obj, instance)
else:
# KSI 202011: Hack because Property is removed
# To suppress asap
if obj[tags.OBJECT] == "core.concept.Property":
return self.restore(obj["value"])
cls = core.utils.get_class(obj[tags.OBJECT])
instance = cls.__new__(cls)
self.objs.append(instance)
+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)
+15 -9
View File
@@ -21,36 +21,42 @@ def is_object(obj):
"""Returns True is obj is a reference to an object instance."""
return (isinstance(obj, object) and
not isinstance(obj, (type, types.FunctionType,
types.BuiltinFunctionType)))
not isinstance(obj, (type,
types.FunctionType,
types.BuiltinFunctionType,
types.GeneratorType)))
def is_to_discard(obj):
return isinstance(obj, (types.GeneratorType, types.CodeType))
def is_primitive(obj):
return type(obj) in PRIMITIVES
return isinstance(obj, PRIMITIVES)
def is_dictionary(obj):
return type(obj) is dict
return isinstance(obj, dict)
def is_list(obj):
return type(obj) is list
return isinstance(obj, list)
def is_set(obj):
return type(obj) is set
return isinstance(obj, set)
def is_bytes(obj):
return type(obj) is bytes
return isinstance(obj, bytes)
def is_tuple(obj):
return type(obj) is tuple
return isinstance(obj, tuple)
def is_class(obj):
return type(obj) is type
return isinstance(obj, type)
def b64encode(data):