We can now use concept sets in BNF definitions

This commit is contained in:
2020-01-19 21:48:43 +01:00
parent a7b239c167
commit 821614a6c4
16 changed files with 643 additions and 93 deletions
+25 -3
View File
@@ -346,7 +346,7 @@ class SheerkaDataProvider:
def is_reference(obj):
return isinstance(obj, str) and obj.startswith(SheerkaDataProvider.REF_PREFIX)
def add(self, event_digest: str, entry, obj, allow_multiple=True, use_ref=False):
def add(self, event_digest: str, entry, obj, allow_multiple=True, use_ref=False, is_ref=False):
"""
Adds obj to the entry 'entry'
:param event_digest: digest of the event that triggers the modification of the state
@@ -359,6 +359,12 @@ class SheerkaDataProvider:
:return: (entry, key) to retrieve the object
"""
if use_ref and is_ref:
raise SheerkaDataProviderError("Cannot use use_ref and is_ref at the same time", None)
if is_ref and not isinstance(obj, dict):
raise SheerkaDataProviderError("is_ref can only be used with dictionaries", obj)
snapshot = self.get_snapshot()
state = self.load_state(snapshot)
@@ -387,6 +393,10 @@ class SheerkaDataProvider:
obj.set_digest(self.save_obj(obj.obj))
obj.obj = self.REF_PREFIX + obj.get_digest()
if is_ref:
for k, v in obj.obj.items():
obj.obj[k] = self.REF_PREFIX + v
state.update(entry, obj)
new_snapshot = self.save_state(state)
@@ -427,16 +437,24 @@ class SheerkaDataProvider:
self.set_snapshot(new_snapshot)
return (None if already_exist else entry), None
def set(self, event_digest, entry, obj, use_ref=False):
def set(self, event_digest, entry, obj, use_ref=False, is_ref=False):
"""
Add or replace an entry. The entry is reinitialized.
If the previous value was dict, all keys are lost
:param event_digest:
:param entry:
:param obj:
:param use_ref:
:param use_ref: Do not save obj in State (save it under objects), use_ref in State
:param is_ref: obj is supposed to be a reference
:return:
"""
if use_ref and is_ref:
raise SheerkaDataProviderError("Cannot use use_ref and is_ref at the same time", None)
if is_ref and not isinstance(obj, dict):
raise SheerkaDataProviderError("is_ref can only be used with dictionaries", obj)
snapshot = self.get_snapshot()
state = self.load_state(snapshot)
@@ -447,6 +465,10 @@ class SheerkaDataProvider:
key = self.get_obj_key(obj)
obj = self.save_ref_if_needed(use_ref, obj)
if is_ref:
for k, v in obj.items():
obj[k] = self.REF_PREFIX + v
state.data[entry] = obj if key is None else {key: obj}
new_snapshot = self.save_state(state)