Added basic implementation for Python code evaluation
This commit is contained in:
+19
-42
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user