Added basic implementation for Python code evaluation

This commit is contained in:
2019-11-07 17:18:07 +01:00
parent b818c992ec
commit 448ebc696a
18 changed files with 501 additions and 156 deletions
+19 -42
View File
@@ -5,6 +5,9 @@ import struct
import io
from dataclasses import dataclass
import logging
import core.utils
from core.concept import Concept
log = logging.getLogger(__name__)
@@ -43,8 +46,6 @@ class Serializer:
self.register(EventSerializer())
self.register(StateSerializer())
self.register(ConceptSerializer())
self.register(SheerkaSerializer())
def register(self, serializer):
"""
@@ -62,7 +63,7 @@ class Serializer:
:param obj:
:return:
"""
serializers = [s for s in self._cache if s.match(obj)]
serializers = [s for s in self._cache if s.matches(obj)]
if not serializers:
raise TypeError(f"Don't know how to serialize {type(obj)}")
@@ -104,7 +105,7 @@ class BaseSerializer:
self.name = name
self.version = version
def match(self, obj):
def matches(self, obj):
"""
Returns true if self can serialize obj
:param obj:
@@ -131,33 +132,6 @@ class BaseSerializer:
"""
pass
@staticmethod
def get_class(kls):
"""
Loads a class from its string full qualified name
:param kls:
:return:
"""
parts = kls.split('.')
module = ".".join(parts[:-1])
m = __import__(module)
for comp in parts[1:]:
m = getattr(m, comp)
return m
@staticmethod
def get_full_qualified_name(obj):
"""
Returns the full qualified name of a class (including its module name )
:param obj:
:return:
"""
module = obj.__class__.__module__
if module is None or module == str.__class__.__module__:
return obj.__class__.__name__ # Avoid reporting __builtin__
else:
return module + '.' + obj.__class__.__name__
def __repr__(self):
return self.__class__.__name__ + ' (' + self.name + ", version=" + str(self.version) + ")"
@@ -166,8 +140,8 @@ class EventSerializer(BaseSerializer):
def __init__(self):
BaseSerializer.__init__(self, "E", 1)
def match(self, obj):
return BaseSerializer.get_full_qualified_name(obj) == "sdp.sheerkaDataProvider.Event"
def matches(self, obj):
return core.utils.get_full_qualified_name(obj) == "sdp.sheerkaDataProvider.Event"
def dump(self, stream, obj, context):
stream.write(json.dumps(obj.to_dict(), default=json_default_converter).encode("utf-8"))
@@ -177,7 +151,7 @@ class EventSerializer(BaseSerializer):
def load(self, stream, context):
json_stream = stream.read().decode("utf-8")
as_dict = json.loads(json_stream)
event = BaseSerializer.get_class("sdp.sheerkaDataProvider.Event")()
event = core.utils.get_class("sdp.sheerkaDataProvider.Event")()
event.from_dict(as_dict)
return event
@@ -188,8 +162,8 @@ class ObjectSerializer(BaseSerializer):
BaseSerializer.__init__(self, name, version)
self.fully_qualified_name = fully_qualified_name
def match(self, obj):
return BaseSerializer.get_full_qualified_name(obj) == self.fully_qualified_name
def matches(self, obj):
return core.utils.get_full_qualified_name(obj) == self.fully_qualified_name
def dump(self, stream, obj, context):
as_json = obj.to_dict()
@@ -206,7 +180,7 @@ class ObjectSerializer(BaseSerializer):
def load(self, stream, context):
json_stream = stream.read().decode("utf-8")
json_message = json.loads(json_stream)
obj = BaseSerializer.get_class(self.fully_qualified_name)()
obj = core.utils.get_class(self.fully_qualified_name)()
obj.from_dict(json_message)
setattr(obj, Serializer.HISTORY, json_message[Serializer.HISTORY])
@@ -219,7 +193,7 @@ class PickleSerializer(BaseSerializer):
BaseSerializer.__init__(self, name, version)
self.predicate = predicate
def match(self, obj):
def matches(self, obj):
return self.predicate(obj)
def dump(self, stream, obj, context):
@@ -233,7 +207,7 @@ class PickleSerializer(BaseSerializer):
class StateSerializer(PickleSerializer):
def __init__(self, ):
PickleSerializer.__init__(self, lambda obj: BaseSerializer.get_full_qualified_name(
PickleSerializer.__init__(self, lambda obj: core.utils.get_full_qualified_name(
obj) == "sdp.sheerkaDataProvider.State", "S", 1)
@@ -241,7 +215,10 @@ class ConceptSerializer(ObjectSerializer):
def __init__(self):
ObjectSerializer.__init__(self, "core.concept.Concept", "C", 1)
def matches(self, obj):
return isinstance(obj, Concept)
class SheerkaSerializer(ObjectSerializer):
def __init__(self):
ObjectSerializer.__init__(self, "core.sheerka.Sheerka", "C", 1)
#
# class SheerkaSerializer(ObjectSerializer):
# def __init__(self):
# ObjectSerializer.__init__(self, "core.sheerka.Sheerka", "C", 1)