Added first version of DebugManager. Implemented draft of the rule engine

This commit is contained in:
2020-11-20 13:41:45 +01:00
parent cd066881b4
commit 315f8ea09b
156 changed files with 8388 additions and 2852 deletions
+35 -32
View File
@@ -56,7 +56,7 @@ class TestSheerkaNonRegMemory(TestUsingMemoryBasedSheerka):
# sanity check
evaluated = sheerka.evaluate_concept(self.get_context(eval_body=True), return_value)
assert evaluated == simplec("un", simplec("one", BuiltinConcepts.NOT_INITIALIZED))
assert evaluated == simplec("un", simplec("one", NotInit))
def test_i_can_recognize_concept_with_no_body(self):
sheerka = self.get_sheerka()
@@ -95,9 +95,9 @@ as:
"""
expected = self.get_default_concept()
expected.metadata.id = "1001"
expected.metadata.desc = None
expected.metadata.variables = [("a", None), ("b", None)]
expected.get_metadata().id = "1001"
expected.get_metadata().desc = None
expected.get_metadata().variables = [("a", None), ("b", None)]
expected.init_key()
sheerka = self.get_sheerka(cache_only=False)
@@ -110,7 +110,7 @@ as:
concept_saved = res[0].value.body
for prop in PROPERTIES_TO_SERIALIZE:
assert getattr(concept_saved.metadata, prop) == getattr(expected.metadata, prop)
assert getattr(concept_saved.get_metadata(), prop) == getattr(expected.get_metadata(), prop)
# cache is up to date
assert sheerka.has_key(concept_saved.key)
@@ -136,7 +136,7 @@ as:
res = sheerka.evaluate_user_input("def concept a xx b as a plus b")
expected = Concept(name="a xx b", body="a plus b").def_var("a").def_var("b").init_key()
expected.metadata.id = "1001"
expected.get_metadata().id = "1001"
assert len(res) == 1
assert res[0].status
@@ -145,7 +145,7 @@ as:
concept_saved = res[0].value.body
for prop in PROPERTIES_TO_SERIALIZE:
assert getattr(concept_saved.metadata, prop) == getattr(expected.metadata, prop)
assert getattr(concept_saved.get_metadata(), prop) == getattr(expected.get_metadata(), prop)
assert sheerka.has_key(concept_saved.key)
@@ -212,9 +212,9 @@ as:
# sanity check
evaluated = sheerka.evaluate_concept(self.get_context(eval_body=True), res[0].value)
assert evaluated.body == "hello foo"
assert evaluated.metadata.is_evaluated
assert evaluated.get_metadata().is_evaluated
assert evaluated.get_value("a") == simplec("foo", "foo")
assert evaluated.get_value("a").metadata.is_evaluated
assert evaluated.get_value("a").get_metadata().is_evaluated
def test_i_can_recognize_duplicate_concepts_with_same_value(self):
# when multiple result, choose the one that is the more specific (that has the less variables)
@@ -227,7 +227,7 @@ as:
assert len(res) == 1
assert res[0].status
assert sheerka.isinstance(res[0].body, "hello foo")
assert res[0].value.body == BuiltinConcepts.NOT_INITIALIZED
assert res[0].value.body == NotInit
assert res[0].who == sheerka.get_evaluator_name(OneSuccessEvaluator.NAME)
def test_i_cannot_manage_duplicate_concepts_when_the_values_are_different(self):
@@ -297,9 +297,9 @@ as:
# sanity check
evaluated = sheerka.evaluate_concept(self.get_context(sheerka=sheerka, eval_body=True), return_value)
assert evaluated.body == "one three"
assert evaluated.metadata.is_evaluated
assert evaluated.get_metadata().is_evaluated
assert evaluated.get_value("a") == sheerka.new(concept_a.key, body="one").init_key()
assert evaluated.get_value("a").metadata.is_evaluated
assert evaluated.get_value("a").get_metadata().is_evaluated
@pytest.mark.parametrize("user_input", [
"def concept greetings from def hello a where a",
@@ -315,7 +315,7 @@ as:
concept_found = res[0].value
assert sheerka.isinstance(concept_found, greetings)
assert concept_found.get_value("a") == "foo"
assert concept_found.metadata.need_validation
assert concept_found.get_metadata().need_validation
res = sheerka.evaluate_user_input("greetings")
assert len(res) == 1
@@ -323,7 +323,7 @@ as:
concept_found = res[0].value
assert sheerka.isinstance(concept_found, greetings)
assert concept_found.get_value("a") == NotInit
assert not concept_found.metadata.need_validation
assert not concept_found.get_metadata().need_validation
@pytest.mark.parametrize("desc, definitions", [
("Simple form", [
@@ -718,7 +718,7 @@ as:
assert len(res) == 1
assert res[0].status
assert sheerka.isinstance(res[0].body, "foobar")
assert res[0].body.body == BuiltinConcepts.NOT_INITIALIZED
assert res[0].body.body == NotInit
res = sheerka.evaluate_user_input("eval foo bar")
assert len(res) == 1
@@ -871,14 +871,17 @@ as:
res = sheerka.evaluate_user_input("get_concepts_weights('some_prop')")
assert res[0].status
assert res[0].body == {'1001': 1, '1002': 2, '1003': 3}
assert res[0].body == {'c:one|1001:': 1, 'c:two|1002:': 2, 'c:three|1003:': 3}
# test i use a concept to define relation
sheerka.evaluate_user_input("def concept a > b as set_is_greater_than('some_prop', a, b)")
res = sheerka.evaluate_user_input("eval four > three")
assert res[0].status
assert sheerka.get_concepts_weights("some_prop") == {'1001': 1, '1002': 2, '1003': 3, '1004': 4}
assert sheerka.get_concepts_weights("some_prop") == {'c:one|1001:': 1,
'c:two|1002:': 2,
'c:three|1003:': 3,
'c:four|1004:': 4}
def test_i_can_evaluate_expression_when_using_token_concept(self):
sheerka, context, one, two, three, is_less_than = self.init_concepts(
@@ -899,14 +902,14 @@ as:
res = sheerka.evaluate_user_input(expression)
assert res[0].status
assert sheerka.isinstance(res[0].body, BuiltinConcepts.SUCCESS)
assert sheerka.get_concepts_weights("some_prop") == {'1001': 1, '1002': 2}
assert sheerka.get_concepts_weights("some_prop") == {'c:one|1001:': 1, 'c:two|1002:': 2}
# it now also works using the concepts names
expression = "eval two < three"
res = sheerka.evaluate_user_input(expression)
assert res[0].status
assert sheerka.isinstance(res[0].body, BuiltinConcepts.SUCCESS)
assert sheerka.get_concepts_weights("some_prop") == {'1001': 1, '1002': 2, '1003': 3}
assert sheerka.get_concepts_weights("some_prop") == {'c:one|1001:': 1, 'c:two|1002:': 2, 'c:three|1003:': 3}
def test_i_can_detect_multiple_errors_when_evaluating_a_concept(self):
sheerka, context, foo, plus_one = self.init_concepts(
@@ -918,7 +921,7 @@ as:
assert not res[0].status
assert context.sheerka.isinstance(res[0].body, BuiltinConcepts.CONCEPT_EVAL_ERROR)
assert context.sheerka.isinstance(res[0].body.body, BuiltinConcepts.TOO_MANY_ERRORS)
assert context.sheerka.isinstance(res[0].body.body, BuiltinConcepts.ERROR)
error0 = res[0].body.body.body[0]
assert isinstance(error0, PythonEvalError)
@@ -951,7 +954,7 @@ as:
# simulate that sheerka was stopped and restarted
sheerka.cache_manager.clear(sheerka.CONCEPTS_GRAMMARS_ENTRY)
sheerka.cache_manager.get(sheerka.CONCEPTS_BY_KEY_ENTRY, "twenties").compiled = {}
sheerka.cache_manager.get(sheerka.CONCEPTS_BY_KEY_ENTRY, "twenties").set_compiled({})
res = sheerka.evaluate_user_input("eval twenty one")
assert res[0].status
@@ -985,8 +988,8 @@ as:
plus = res[0].body
assert isinstance(plus, Concept)
assert plus.name == "plus"
assert plus.compiled["a"] == sheerka.new("one")
assert plus.compiled["b"] == CC(the, a=sheerka.new("one"))
assert plus.get_compiled()["a"] == sheerka.new("one")
assert plus.get_compiled()["b"] == CC(the, a=sheerka.new("one"))
res = sheerka.evaluate_user_input("eval one plus the one")
assert res[0].status
@@ -1063,7 +1066,7 @@ as:
"def concept q from q ? as question(q)",
"set_auto_eval(q)",
"def concept is_a from x is a y as isa(x,y) pre in_context(BuiltinConcepts.EVAL_QUESTION_REQUESTED)",
"set_is_greater_than(BuiltinConcepts.PRECEDENCE, c:is_a:, c:q:)",
"set_is_greater_than(BuiltinConcepts.PRECEDENCE, c:is_a:, c:q:, 'Sya')",
]
sheerka = self.init_scenario(init)
@@ -1185,20 +1188,20 @@ class TestSheerkaNonRegFile(TestUsingFileBasedSheerka):
saved_concept = sheerka.sdp.get(sheerka.CONCEPTS_BY_KEY_ENTRY, "plus")
assert saved_concept.key == "plus"
assert saved_concept.metadata.definition == "a ('plus' plus)?"
assert "a" in saved_concept.values
assert "plus" in saved_concept.values
assert saved_concept.get_metadata().definition == "a ('plus' plus)?"
assert "a" in saved_concept.values()
assert "plus" in saved_concept.values()
expected_bnf = Sequence(
ConceptExpression(concept_a, rule_name="a"),
Optional(Sequence(StrMatch("plus"), ConceptExpression("plus"))))
new_concept = res[0].value.body
assert new_concept.metadata.name == "plus"
assert new_concept.metadata.definition == "a ('plus' plus)?"
assert new_concept.bnf == expected_bnf
assert "a" in new_concept.values
assert "plus" in new_concept.values
assert new_concept.get_metadata().name == "plus"
assert new_concept.get_metadata().definition == "a ('plus' plus)?"
assert new_concept.get_bnf() == expected_bnf
assert "a" in new_concept.values()
assert "plus" in new_concept.values()
def test_i_can_recognize_bnf_definitions_from_separate_instances(self):
sheerka = self.get_sheerka()