Added DefaultParser

This commit is contained in:
2019-10-29 18:39:51 +01:00
parent 101319b8b6
commit 8107e149b9
18 changed files with 1581 additions and 376 deletions
+41 -13
View File
@@ -4,7 +4,7 @@ from datetime import datetime, date
import hashlib
import json
import zlib
from sdp.sheerkaSerializer import Serializer
from sdp.sheerkaSerializer import Serializer, SerializerContext
def json_default_converter(o):
@@ -38,15 +38,15 @@ class Event(object):
if not isinstance(self.message, str):
raise NotImplementedError
return hashlib.sha256(f"{self.user}{self.date}{self.message}".encode("utf-8")).hexdigest()
return hashlib.sha256(f"Event:{self.user}{self.date}{self.message}".encode("utf-8")).hexdigest()
def to_json(self):
return json.dumps(self.__dict__, default=json_default_converter)
def to_dict(self):
return self.__dict__
def from_json(self, json_message):
self.user = json_message["user"]
self.date = datetime.fromisoformat(json_message["date"])
self.message = json_message["message"]
def from_dict(self, as_dict):
self.user = as_dict["user"]
self.date = datetime.fromisoformat(as_dict["date"])
self.message = as_dict["message"]
class State:
@@ -120,6 +120,7 @@ class SheerkaDataProvider:
EventFolder = "events"
StateFolder = "state"
ObjectsFolder = "objects"
CacheFolder = "cache"
HeadFile = "HEAD"
KeysFile = "keys"
@@ -135,6 +136,9 @@ class SheerkaDataProvider:
self.serializer = Serializer()
def get_obj_path(self, object_type, digest):
path.join(self.root, object_type, digest[:24], digest)
def add(self, event: Event, entry, obj):
"""
Adds obj to the entry 'entry'
@@ -366,7 +370,7 @@ class SheerkaDataProvider:
os.makedirs(path.dirname(target_path))
with open(target_path, "wb") as f:
f.write(self.serializer.serialize(event).read())
f.write(self.serializer.serialize(event, None).read())
return digest
@@ -378,7 +382,7 @@ class SheerkaDataProvider:
"""
target_path = path.join(self.root, SheerkaDataProvider.EventFolder, digest[:24], digest)
with open(target_path, "rb") as f:
return self.serializer.deserialize(f)
return self.serializer.deserialize(f, None)
def save_state(self, state: State):
digest = state.get_digest()
@@ -390,7 +394,7 @@ class SheerkaDataProvider:
os.makedirs(path.dirname(target_path))
with open(target_path, "wb") as f:
f.write(self.serializer.serialize(state).read())
f.write(self.serializer.serialize(state, None).read())
return digest
@@ -400,7 +404,32 @@ class SheerkaDataProvider:
target_path = path.join(self.root, SheerkaDataProvider.StateFolder, digest[:24], digest)
with open(target_path, "rb") as f:
return self.serializer.deserialize(f)
return self.serializer.deserialize(f, None)
def save_obj(self, obj):
if hasattr(obj, "key") and hasattr(obj, "key_name") and obj.key is None:
obj.key = self.get_next_key(obj.key_name)
digest = obj.get_digest()
target_path = path.join(self.root, SheerkaDataProvider.ObjectsFolder, digest[:24], digest)
if path.exists(target_path):
return digest
if not path.exists(path.dirname(target_path)):
os.makedirs(path.dirname(target_path))
with open(target_path, "wb") as f:
f.write(self.serializer.serialize(obj, SerializerContext("kodjo", digest)).read())
return digest
def load_obj(self, digest):
if digest is None:
return State()
target_path = path.join(self.root, SheerkaDataProvider.ObjectsFolder, digest[:24], digest)
with open(target_path, "rb") as f:
return self.serializer.deserialize(f, SerializerContext("kodjo", digest))
def get_cache_params(self, category, key):
digest = hashlib.sha3_256(f"{category}:{key}".encode("utf-8")).hexdigest()
@@ -507,4 +536,3 @@ class SheerkaDataProvider:
keys[entry] = value
self.save_keys(keys)
return str(value)