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