Fixed #51 : I can compile simple recognize
This commit is contained in:
@@ -1154,7 +1154,7 @@ isinstance(var, Concept) and var.key == 'hello __var__0'""" + \
|
||||
),
|
||||
|
||||
])
|
||||
def test_i_can_get_rete_using_recognized_function(self, test_name, expression, variable_name, expected_as_str):
|
||||
def test_i_can_get_rete_using_recognize_function(self, test_name, expression, variable_name, expected_as_str):
|
||||
sheerka, context, greetings, foo = self.init_test().with_concepts(
|
||||
Concept("greetings", definition="hello a", definition_type=DEFINITION_TYPE_DEF).def_var("a"),
|
||||
Concept("foo"),
|
||||
@@ -1290,42 +1290,13 @@ isinstance(var, Concept) and var.key == 'hello __var__0'""" + \
|
||||
matches = list(network.matches)
|
||||
assert len(matches) == 1
|
||||
|
||||
def test_i_can_get_compiled_conditions_when_testing_data_existence(self):
|
||||
sheerka, context = self.init_test().unpack()
|
||||
expression = "__ret"
|
||||
|
||||
parser = ExpressionParser()
|
||||
error_sink = ErrorSink()
|
||||
parser_input = ParserInput(expression)
|
||||
parser.reset_parser_input(parser_input, error_sink)
|
||||
parsed = parser.parse_input(context, parser_input, error_sink)
|
||||
|
||||
visitor = PythonConditionExprVisitor(context)
|
||||
conditions = visitor.get_conditions(parsed)
|
||||
|
||||
assert len(conditions) == 1
|
||||
assert isinstance(conditions[0], CompiledCondition)
|
||||
assert conditions[0].evaluator_type is None
|
||||
assert conditions[0].return_value is None
|
||||
assert conditions[0].concept is None
|
||||
assert conditions[0].variables == {"__ret"}
|
||||
|
||||
# check against SheerkaEvaluateRules
|
||||
evaluate_rules_service = sheerka.services[SheerkaEvaluateRules.NAME]
|
||||
bag = {"__ret": ReturnValueConcept("Test", True, None)}
|
||||
rule = Rule(name="test_i_can_get_compiled_conditions", predicate=expression)
|
||||
rule.compiled_conditions = conditions
|
||||
res = evaluate_rules_service.evaluate_rule(context, rule, bag)
|
||||
assert res.status
|
||||
assert self.sheerka.is_success(self.sheerka.objvalue(res))
|
||||
|
||||
@pytest.mark.parametrize("expression", [
|
||||
"__ret",
|
||||
"__ret.status == True",
|
||||
"__ret.status",
|
||||
"__ret and __ret.status",
|
||||
@pytest.mark.parametrize("expression, expected_compiled", [
|
||||
("__ret", None),
|
||||
("__ret.status == True", "__ret.status == True"),
|
||||
("__ret.status", "__ret.status == True"),
|
||||
("__ret and __ret.status", "__ret.status == True")
|
||||
])
|
||||
def test_i_can_get_compiled_conditions(self, expression):
|
||||
def test_i_can_get_compiled_conditions(self, expression, expected_compiled):
|
||||
sheerka, context = self.init_test().unpack()
|
||||
|
||||
parser = ExpressionParser()
|
||||
@@ -1337,25 +1308,155 @@ isinstance(var, Concept) and var.key == 'hello __var__0'""" + \
|
||||
visitor = PythonConditionExprVisitor(context)
|
||||
conditions = visitor.get_conditions(parsed)
|
||||
|
||||
ast_ = ast.parse(expression, "<source>", 'eval')
|
||||
expected_python_node = PythonNode(expression, ast_)
|
||||
|
||||
assert len(conditions) == 1
|
||||
assert isinstance(conditions[0], CompiledCondition)
|
||||
assert conditions[0].evaluator_type == PYTHON_EVALUATOR_NAME
|
||||
assert sheerka.isinstance(conditions[0].return_value, BuiltinConcepts.RETURN_VALUE)
|
||||
assert sheerka.objvalue(conditions[0].return_value) == expected_python_node
|
||||
if expected_compiled:
|
||||
ast_ = ast.parse(expected_compiled, "<source>", 'eval')
|
||||
expected_python_node = PythonNode(expected_compiled, ast_)
|
||||
assert conditions[0].evaluator_type == PYTHON_EVALUATOR_NAME
|
||||
assert sheerka.isinstance(conditions[0].return_value, BuiltinConcepts.RETURN_VALUE)
|
||||
assert sheerka.objvalue(conditions[0].return_value) == expected_python_node
|
||||
else:
|
||||
assert conditions[0].evaluator_type is None
|
||||
assert conditions[0].return_value is None
|
||||
assert conditions[0].concept is None
|
||||
assert conditions[0].variables == {"__ret"}
|
||||
|
||||
# check against SheerkaEvaluateRules
|
||||
evaluate_rules_service = sheerka.services[SheerkaEvaluateRules.NAME]
|
||||
bag = {"__ret": ReturnValueConcept("Test", True, None)}
|
||||
rule = Rule(name="test_i_can_get_compiled_conditions", predicate=expression)
|
||||
rule.compiled_conditions = conditions
|
||||
res = evaluate_rules_service.evaluate_rule(context, rule, bag)
|
||||
assert res.status
|
||||
assert self.sheerka.is_success(self.sheerka.objvalue(res))
|
||||
with context.push(BuiltinConcepts.RULES_EVALUATION, bag, desc="Evaluating rules...") as sub_context:
|
||||
sub_context.sheerka.add_many_to_short_term_memory(sub_context, bag)
|
||||
rule = Rule(name="test_i_can_get_compiled_conditions", predicate=expression)
|
||||
rule.compiled_conditions = conditions
|
||||
res = evaluate_rules_service.evaluate_rule(sub_context, rule, bag)
|
||||
assert res.status
|
||||
assert self.sheerka.is_success(self.sheerka.objvalue(res))
|
||||
|
||||
@pytest.mark.parametrize("expression, variable_name, expected_compiled", [
|
||||
(
|
||||
"recognize(__ret.body, greetings)",
|
||||
None,
|
||||
"__x_00__ = __ret.body\nisinstance(__x_00__, Concept) and __x_00__.name == 'greetings'"
|
||||
),
|
||||
# (
|
||||
# "recognize(__ret.body, c:|1001:)",
|
||||
# None,
|
||||
# ["#__x_00__|__name__|'__ret'",
|
||||
# "#__x_00__|body|#__x_01__",
|
||||
# "#__x_01__|__is_concept__|True",
|
||||
# "#__x_01__|id|'1001'"]
|
||||
# ),
|
||||
# (
|
||||
# "recognize(__ret.body, c:greetings:)",
|
||||
# None,
|
||||
# ["#__x_00__|__name__|'__ret'",
|
||||
# "#__x_00__|body|#__x_01__",
|
||||
# "#__x_01__|__is_concept__|True",
|
||||
# "#__x_01__|name|'greetings'"]
|
||||
# ),
|
||||
# (
|
||||
# "recognize(__ret.body, greetings) and __ret.body.a == 'my friend'",
|
||||
# "my friend",
|
||||
# ["#__x_00__|__name__|'__ret'",
|
||||
# "#__x_00__|body|#__x_01__",
|
||||
# "#__x_01__|__is_concept__|True",
|
||||
# "#__x_01__|name|'greetings'",
|
||||
# "#__x_01__|a|'my friend'"]
|
||||
# ),
|
||||
# (
|
||||
# "recognize(__ret.body, greetings) and __ret.body.a == sheerka",
|
||||
# "sheerka",
|
||||
# ["#__x_00__|__name__|'__ret'",
|
||||
# "#__x_00__|body|#__x_01__",
|
||||
# "#__x_01__|__is_concept__|True",
|
||||
# "#__x_01__|name|'greetings'",
|
||||
# "#__x_01__|a|'__sheerka__'"]
|
||||
# ),
|
||||
# (
|
||||
# "recognize(__ret.body, greetings) and __ret.body.a == foo",
|
||||
# "foo",
|
||||
# ["#__x_00__|__name__|'__ret'",
|
||||
# "#__x_00__|body|#__x_01__",
|
||||
# "#__x_01__|__is_concept__|True",
|
||||
# "#__x_01__|name|'greetings'",
|
||||
# "#__x_01__|a|#__x_02__",
|
||||
# "#__x_02__|__is_concept__|True",
|
||||
# "#__x_02__|key|'foo'"]
|
||||
# ),
|
||||
# (
|
||||
# "recognize(__ret.body, hello sheerka)",
|
||||
# "sheerka",
|
||||
# ["#__x_00__|__name__|'__ret'",
|
||||
# "#__x_00__|body|#__x_01__",
|
||||
# "#__x_01__|__is_concept__|True",
|
||||
# "#__x_01__|key|'hello __var__0'",
|
||||
# "#__x_01__|a|'__sheerka__'"]
|
||||
# ),
|
||||
# (
|
||||
# "recognize(__ret.body, hello 'my friend')",
|
||||
# "my friend",
|
||||
# ["#__x_00__|__name__|'__ret'",
|
||||
# "#__x_00__|body|#__x_01__",
|
||||
# "#__x_01__|__is_concept__|True",
|
||||
# "#__x_01__|key|'hello __var__0'",
|
||||
# "#__x_01__|a|'my friend'"]
|
||||
# ),
|
||||
# (
|
||||
# "recognize(__ret.body, hello foo)",
|
||||
# "foo",
|
||||
# ["#__x_00__|__name__|'__ret'",
|
||||
# "#__x_00__|body|#__x_01__",
|
||||
# "#__x_01__|__is_concept__|True",
|
||||
# "#__x_01__|key|'hello __var__0'",
|
||||
# "#__x_01__|a|#__x_02__",
|
||||
# "#__x_02__|__is_concept__|True",
|
||||
# "#__x_02__|key|'foo'",
|
||||
# ]
|
||||
# ),
|
||||
|
||||
])
|
||||
def test_i_can_get_compiled_using_recognize_function(self, expression, variable_name, expected_compiled):
|
||||
sheerka, context, greetings, foo = self.init_test().with_concepts(
|
||||
Concept("greetings", definition="hello a", definition_type=DEFINITION_TYPE_DEF).def_var("a"),
|
||||
Concept("foo"),
|
||||
).unpack()
|
||||
|
||||
parser = ExpressionParser()
|
||||
error_sink = ErrorSink()
|
||||
parser_input = ParserInput(expression)
|
||||
parser.reset_parser_input(parser_input, error_sink)
|
||||
parsed = parser.parse_input(context, parser_input, error_sink)
|
||||
|
||||
visitor = PythonConditionExprVisitor(context)
|
||||
conditions = visitor.get_conditions(parsed)
|
||||
|
||||
assert len(conditions) == 1
|
||||
assert isinstance(conditions[0], CompiledCondition)
|
||||
if expected_compiled:
|
||||
ast_ = ast.parse(expected_compiled, "<source>", 'exec')
|
||||
expected_python_node = PythonNode(expected_compiled, ast_, expected_compiled)
|
||||
assert conditions[0].evaluator_type == PYTHON_EVALUATOR_NAME
|
||||
assert sheerka.isinstance(conditions[0].return_value, BuiltinConcepts.RETURN_VALUE)
|
||||
assert sheerka.objvalue(conditions[0].return_value) == expected_python_node
|
||||
else:
|
||||
assert conditions[0].evaluator_type is None
|
||||
assert conditions[0].return_value is None
|
||||
assert conditions[0].concept is None
|
||||
assert conditions[0].variables == {"__ret"}
|
||||
|
||||
# check against SheerkaEvaluateRules
|
||||
evaluate_rules_service = sheerka.services[SheerkaEvaluateRules.NAME]
|
||||
variable = foo if variable_name == "foo" else sheerka if variable_name == "sheerka" else variable_name
|
||||
to_recognize = sheerka.new_from_template(greetings, greetings.key, a=variable)
|
||||
bag = {"__ret": ReturnValueConcept("Test", True, to_recognize)}
|
||||
with context.push(BuiltinConcepts.RULES_EVALUATION, bag, desc="Evaluating rules...") as sub_context:
|
||||
sub_context.sheerka.add_many_to_short_term_memory(sub_context, bag)
|
||||
rule = Rule(name="test_i_can_get_compiled_using_recognize_function", predicate=expression)
|
||||
rule.compiled_conditions = conditions
|
||||
res = evaluate_rules_service.evaluate_rule(sub_context, rule, bag)
|
||||
assert res.status
|
||||
assert self.sheerka.is_success(self.sheerka.objvalue(res))
|
||||
|
||||
|
||||
class TestSheerkaRuleManagerUsingFileBasedSheerka(TestUsingFileBasedSheerka):
|
||||
|
||||
Reference in New Issue
Block a user