305 lines
9.5 KiB
Python
305 lines
9.5 KiB
Python
from core.builtin_concepts import BuiltinConcepts
|
|
from core.concept import Concept
|
|
from core.sheerka import Sheerka, ExecutionContext, ExecutionContextIdManager
|
|
from core.sheerka_transform import SheerkaTransform, OBJ_TYPE_KEY, SheerkaTransformType, OBJ_ID_KEY
|
|
from sdp.sheerkaDataProvider import Event
|
|
|
|
|
|
def get_sheerka():
|
|
sheerka = Sheerka()
|
|
sheerka.initialize("mem://")
|
|
return sheerka
|
|
|
|
|
|
def get_context(sheerka):
|
|
return ExecutionContext("test", Event(), sheerka)
|
|
|
|
|
|
def test_i_can_transform_an_unknown_concept():
|
|
sheerka = get_sheerka()
|
|
|
|
foo = Concept("foo", body="body")
|
|
concept_with_sub = Concept("concept_with_sub", body=foo)
|
|
|
|
concept = Concept(
|
|
name="concept_name",
|
|
is_builtin=True,
|
|
is_unique=True,
|
|
key="concept_key",
|
|
body=concept_with_sub,
|
|
where=[foo, 1, "1", True, 1.0],
|
|
pre=foo,
|
|
post=None, # will not appear
|
|
definition="it is a definition",
|
|
definition_type="def type",
|
|
desc="this this the desc"
|
|
).set_prop("a", 10).set_prop("b", foo).set_prop("c", concept_with_sub)
|
|
|
|
st = SheerkaTransform(sheerka)
|
|
to_dict = st.to_dict(concept)
|
|
|
|
assert to_dict == {
|
|
OBJ_TYPE_KEY: SheerkaTransformType.Concept,
|
|
OBJ_ID_KEY: 0,
|
|
'name': 'concept_name',
|
|
'key': 'concept_key',
|
|
'is_builtin': True,
|
|
'is_unique': True,
|
|
'definition': 'it is a definition',
|
|
'definition_type': 'def type',
|
|
'desc': 'this this the desc',
|
|
'where': [{OBJ_TYPE_KEY: SheerkaTransformType.Concept,
|
|
OBJ_ID_KEY: 1,
|
|
'body': 'body',
|
|
'name': 'foo'}, 1, '1', True, 1.0],
|
|
'pre': {OBJ_TYPE_KEY: SheerkaTransformType.Reference, OBJ_ID_KEY: 1},
|
|
'body': {
|
|
OBJ_TYPE_KEY: SheerkaTransformType.Concept,
|
|
OBJ_ID_KEY: 2,
|
|
'name': 'concept_with_sub',
|
|
'body': {OBJ_TYPE_KEY: SheerkaTransformType.Reference, OBJ_ID_KEY: 1}},
|
|
'props': [
|
|
('a', 10),
|
|
('b', {OBJ_TYPE_KEY: SheerkaTransformType.Reference, OBJ_ID_KEY: 1}),
|
|
('c', {OBJ_TYPE_KEY: SheerkaTransformType.Reference, OBJ_ID_KEY: 2})
|
|
]
|
|
}
|
|
|
|
|
|
def test_i_can_transform_unknown_concept_with_almost_same_value():
|
|
sheerka = get_sheerka()
|
|
concept = Concept("foo")
|
|
|
|
st = SheerkaTransform(sheerka)
|
|
to_dict = st.to_dict(concept)
|
|
|
|
assert to_dict == {OBJ_TYPE_KEY: SheerkaTransformType.Concept, OBJ_ID_KEY: 0, 'name': 'foo'}
|
|
|
|
|
|
def test_i_can_transform_known_concept_when_the_values_are_the_same():
|
|
sheerka = get_sheerka()
|
|
|
|
concept = Concept(
|
|
name="concept_name",
|
|
is_builtin=True,
|
|
is_unique=False,
|
|
key="concept_key",
|
|
body="body definition",
|
|
where="where definition",
|
|
pre="pre definition",
|
|
post="post definition",
|
|
definition="it is a definition",
|
|
definition_type="def type",
|
|
desc="this this the desc"
|
|
).set_prop("a").set_prop("b")
|
|
sheerka.create_new_concept(get_context(sheerka), concept)
|
|
|
|
new_concept = sheerka.new(concept.key)
|
|
st = SheerkaTransform(sheerka)
|
|
to_dict = st.to_dict(new_concept)
|
|
|
|
assert to_dict == {OBJ_TYPE_KEY: SheerkaTransformType.Concept, OBJ_ID_KEY: 0, "id": "1001"}
|
|
|
|
|
|
def test_i_can_transform_known_concept_when_the_values_are_different():
|
|
sheerka = get_sheerka()
|
|
|
|
concept = Concept(
|
|
name="concept_name",
|
|
is_builtin=True,
|
|
is_unique=False,
|
|
key="concept_key",
|
|
body="body definition",
|
|
where="where definition",
|
|
pre="pre definition",
|
|
post="post definition",
|
|
definition="it is a definition",
|
|
definition_type="def type",
|
|
desc="this this the desc"
|
|
).set_prop("a").set_prop("b")
|
|
sheerka.create_new_concept(get_context(sheerka), concept)
|
|
|
|
new_concept = sheerka.new(concept.key, body="another", a=10, pre="another pre")
|
|
st = SheerkaTransform(sheerka)
|
|
to_dict = st.to_dict(new_concept)
|
|
|
|
assert to_dict == {
|
|
OBJ_TYPE_KEY: SheerkaTransformType.Concept,
|
|
OBJ_ID_KEY: 0,
|
|
"id": "1001",
|
|
'pre': 'another pre',
|
|
"body": "another",
|
|
'props': [('a', 10)]
|
|
}
|
|
|
|
|
|
def test_i_can_transform_concept_with_circular_reference():
|
|
sheerka = get_sheerka()
|
|
foo = Concept("foo", )
|
|
bar = Concept("bar", body=foo)
|
|
foo.metadata.body = bar
|
|
|
|
st = SheerkaTransform(sheerka)
|
|
to_dict = st.to_dict(foo)
|
|
|
|
assert to_dict == {
|
|
OBJ_TYPE_KEY: SheerkaTransformType.Concept,
|
|
OBJ_ID_KEY: 0,
|
|
'name': 'foo',
|
|
'body': {OBJ_TYPE_KEY: SheerkaTransformType.Concept,
|
|
OBJ_ID_KEY: 1,
|
|
'name': 'bar',
|
|
'body': {OBJ_TYPE_KEY: SheerkaTransformType.Reference,
|
|
OBJ_ID_KEY: 0},
|
|
},
|
|
}
|
|
|
|
|
|
def test_i_can_transform_concept_with_circular_reference_2():
|
|
sheerka = get_sheerka()
|
|
foo = Concept("foo", )
|
|
bar = Concept("foo", body=foo)
|
|
foo.metadata.body = bar
|
|
|
|
st = SheerkaTransform(sheerka)
|
|
to_dict = st.to_dict(foo)
|
|
|
|
assert to_dict == {
|
|
OBJ_TYPE_KEY: SheerkaTransformType.Concept,
|
|
OBJ_ID_KEY: 0,
|
|
'name': 'foo',
|
|
'body': {OBJ_TYPE_KEY: SheerkaTransformType.Concept,
|
|
OBJ_ID_KEY: 1,
|
|
'name': 'foo',
|
|
'body': {OBJ_TYPE_KEY: SheerkaTransformType.Reference,
|
|
OBJ_ID_KEY: 0},
|
|
},
|
|
}
|
|
|
|
|
|
def test_i_can_transform_the_unknown_concept():
|
|
sheerka = get_sheerka()
|
|
|
|
unknown = sheerka.new(BuiltinConcepts.UNKNOWN_CONCEPT)
|
|
|
|
st = SheerkaTransform(sheerka)
|
|
to_dict = st.to_dict(unknown)
|
|
|
|
assert len(to_dict) == 3
|
|
assert to_dict[OBJ_TYPE_KEY] == SheerkaTransformType.Concept
|
|
assert to_dict[OBJ_ID_KEY] == 0
|
|
assert "id" in to_dict
|
|
|
|
|
|
def test_i_can_transform_simple_execution_context():
|
|
sheerka = get_sheerka()
|
|
ExecutionContextIdManager.ids = {}
|
|
context = ExecutionContext("requester", Event(), sheerka, 'this is the desc')
|
|
|
|
st = SheerkaTransform(sheerka)
|
|
to_dict = st.to_dict(context)
|
|
|
|
assert to_dict == {
|
|
OBJ_TYPE_KEY: SheerkaTransformType.ExecutionContext,
|
|
OBJ_ID_KEY: 0,
|
|
'_parent': None,
|
|
'_id': 0,
|
|
'_tab': '',
|
|
'_bag': {},
|
|
'_start': 0,
|
|
'_stop': 0,
|
|
'who': 'requester',
|
|
'event': {OBJ_TYPE_KEY: SheerkaTransformType.Event, OBJ_ID_KEY: 1, 'digest': 'xxx'},
|
|
'desc': 'this is the desc',
|
|
'children': [],
|
|
'preprocess': None,
|
|
'inputs': {},
|
|
'values': {},
|
|
'obj': None,
|
|
'concepts': {}
|
|
}
|
|
|
|
|
|
def test_i_can_transform_list():
|
|
sheerka = get_sheerka()
|
|
ExecutionContextIdManager.ids = {}
|
|
context = ExecutionContext("requester", Event(), sheerka, 'this is the desc')
|
|
|
|
st = SheerkaTransform(sheerka)
|
|
to_dict = st.to_dict([context])
|
|
|
|
assert len(to_dict) == 1
|
|
assert isinstance(to_dict, list)
|
|
assert to_dict[0]["who"] == "requester"
|
|
assert to_dict[0]["desc"] == "this is the desc"
|
|
|
|
|
|
def test_i_can_transform_set():
|
|
sheerka = get_sheerka()
|
|
ExecutionContextIdManager.ids = {}
|
|
context = ExecutionContext("requester", Event(), sheerka, 'this is the desc')
|
|
|
|
st = SheerkaTransform(sheerka)
|
|
to_dict = st.to_dict({context})
|
|
|
|
assert len(to_dict) == 1
|
|
assert isinstance(to_dict, list)
|
|
assert to_dict[0]["who"] == "requester"
|
|
assert to_dict[0]["desc"] == "this is the desc"
|
|
|
|
|
|
def test_i_can_transform_dict():
|
|
sheerka = get_sheerka()
|
|
ExecutionContextIdManager.ids = {}
|
|
context = ExecutionContext("requester", Event(), sheerka, 'this is the desc')
|
|
known_concept = Concept("foo", body="foo").set_prop("a", "value_of_a").init_key()
|
|
sheerka.create_new_concept(get_context(sheerka), known_concept)
|
|
unknown_concept = Concept("bar")
|
|
known = sheerka.new("foo")
|
|
|
|
bag = {
|
|
"context": context,
|
|
"known_concept": known_concept,
|
|
"unknown_concept": unknown_concept,
|
|
"True": True,
|
|
"Number": 1.1,
|
|
"String": "a string value",
|
|
"None": None,
|
|
unknown_concept: "hello",
|
|
known: "world"
|
|
}
|
|
|
|
st = SheerkaTransform(sheerka)
|
|
to_dict = st.to_dict(bag)
|
|
|
|
assert isinstance(to_dict, dict)
|
|
assert to_dict['Number'] == 1.1
|
|
assert to_dict['String'] == 'a string value'
|
|
assert to_dict['True']
|
|
assert to_dict['None'] is None
|
|
assert to_dict["context"][OBJ_TYPE_KEY] == SheerkaTransformType.ExecutionContext
|
|
assert to_dict["known_concept"][OBJ_TYPE_KEY] == SheerkaTransformType.Concept
|
|
assert to_dict["known_concept"]["id"] == '1001'
|
|
assert to_dict["unknown_concept"][OBJ_TYPE_KEY] == SheerkaTransformType.Concept
|
|
assert to_dict["(None)bar"] == "hello"
|
|
assert to_dict["(1001)foo"] == "world"
|
|
|
|
|
|
def test_i_can_transform_when_circular_references():
|
|
sheerka = get_sheerka()
|
|
ExecutionContextIdManager.ids = {}
|
|
context = ExecutionContext("requester", Event(), sheerka, 'this is the desc')
|
|
context.push("another requester", "another desc")
|
|
|
|
st = SheerkaTransform(sheerka)
|
|
to_dict = st.to_dict(context)
|
|
|
|
assert isinstance(to_dict, dict)
|
|
assert to_dict[OBJ_TYPE_KEY] == SheerkaTransformType.ExecutionContext
|
|
assert len(to_dict["children"]) == 1
|
|
assert to_dict["children"][0][OBJ_TYPE_KEY] == SheerkaTransformType.ExecutionContext
|
|
assert to_dict["children"][0]['_parent'][OBJ_TYPE_KEY] == SheerkaTransformType.Reference
|
|
assert to_dict["children"][0]['_parent'][OBJ_ID_KEY] == 0
|
|
assert to_dict["children"][0]['event'][OBJ_TYPE_KEY] == SheerkaTransformType.Reference
|
|
assert to_dict["children"][0]['event'][OBJ_ID_KEY] == 1
|