I can define and eval BNF definitions

This commit is contained in:
2019-12-17 21:19:44 +01:00
parent c668cc46d2
commit 88cd3162be
25 changed files with 1099 additions and 569 deletions
+14 -15
View File
@@ -1,5 +1,3 @@
# from os import path
# import os
from datetime import datetime, date
import hashlib
import json
@@ -542,7 +540,7 @@ class SheerkaDataProvider:
self.set_snapshot(new_snapshot)
return new_snapshot
def get(self, entry, key=None):
def get(self, entry, key=None, load_origin=True):
"""
Retrieve an element by its key
:param entry:
@@ -560,11 +558,11 @@ class SheerkaDataProvider:
item = state.data[entry] if key is None else state.data[entry][key]
if isinstance(item, list):
return [self.load_ref_if_needed(i)[0] for i in item]
return [self.load_ref_if_needed(i, load_origin)[0] for i in item]
return self.load_ref_if_needed(item)[0]
return self.load_ref_if_needed(item, load_origin)[0]
def get_safe(self, entry, key=None):
def get_safe(self, entry, key=None, load_origin=True):
"""
Retrieve an element by its key. Return None if the element does not exist
:param entry:
@@ -582,9 +580,9 @@ class SheerkaDataProvider:
item = state.data[entry] if key is None else state.data[entry][key]
if isinstance(item, list):
return [self.load_ref_if_needed(i)[0] for i in item]
return [self.load_ref_if_needed(i, load_origin)[0] for i in item]
return self.load_ref_if_needed(item)[0]
return self.load_ref_if_needed(item, load_origin)[0]
def exists(self, entry, key=None, digest=None):
"""
@@ -676,7 +674,7 @@ class SheerkaDataProvider:
log.debug(f"...digest={digest}.")
return digest
def load_obj(self, digest):
def load_obj(self, digest, add_origin=True):
if digest is None:
return None
@@ -688,19 +686,20 @@ class SheerkaDataProvider:
obj = self.serializer.deserialize(f, SerializerContext(origin=digest))
# set the origin of the object
if isinstance(obj, dict):
obj[Serializer.ORIGIN] = digest
elif not isinstance(obj, str):
setattr(obj, Serializer.ORIGIN, digest)
if add_origin:
if isinstance(obj, dict):
obj[Serializer.ORIGIN] = digest
elif not isinstance(obj, str):
setattr(obj, Serializer.ORIGIN, digest)
return obj
def load_ref_if_needed(self, obj):
def load_ref_if_needed(self, obj, load_origin=True):
if not isinstance(obj, str):
return obj, False
if not obj.startswith(SheerkaDataProvider.REF_PREFIX):
return obj, False
resolved = self.load_obj(obj[len(SheerkaDataProvider.REF_PREFIX):])
resolved = self.load_obj(obj[len(SheerkaDataProvider.REF_PREFIX):], load_origin)
if resolved is None:
return obj, False