Fixed #18 : Parsing and evaluating Python

This commit is contained in:
2023-05-14 12:12:29 +02:00
parent e41094f908
commit 09a0246420
46 changed files with 2084 additions and 165 deletions
+101
View File
@@ -0,0 +1,101 @@
import pytest
from base import BaseTest
from common.global_symbols import NotInit
from conftest import NewOntology
from core.concept import ConceptDefaultProps
from core.python_fragment import PythonFragment
from helpers import define_new_concept, get_metadata
from services.SheerkaConceptEvaluator import ConceptEvaluator
from services.SheerkaPython import EvaluationRef
class TestConceptManager(BaseTest):
@pytest.fixture()
def service(self, sheerka) -> ConceptEvaluator:
return sheerka.services[ConceptEvaluator.NAME]
def test_i_can_build_concept(self, context, service):
metadata = get_metadata(
name="foo",
where="isinstance(x, Concept)",
pre="in_context(IS_QUESTION)",
body="one + a",
post="'post parameter'",
ret="self",
variables=(("a", "1"), ("b", "NotInit"))
)
compiled = service.build(context, metadata)
pf = getattr(compiled, ConceptDefaultProps.WHERE)
assert isinstance(pf, PythonFragment)
assert pf.source_code == metadata.where
pf = getattr(compiled, ConceptDefaultProps.PRE)
assert isinstance(pf, PythonFragment)
assert pf.source_code == metadata.pre
pf = getattr(compiled, ConceptDefaultProps.BODY)
assert isinstance(pf, PythonFragment)
assert pf.source_code == metadata.body
pf = getattr(compiled, ConceptDefaultProps.POST)
assert isinstance(pf, PythonFragment)
assert pf.source_code == metadata.post
pf = getattr(compiled, ConceptDefaultProps.RET)
assert isinstance(pf, PythonFragment)
assert pf.source_code == metadata.ret
pf = getattr(compiled, "a")
assert isinstance(pf, PythonFragment)
assert pf.source_code == metadata.variables[0][1]
pf = getattr(compiled, "b")
assert isinstance(pf, PythonFragment)
assert pf.source_code == metadata.variables[1][1]
def test_i_can_manage_when_no_source_code(self, context, service):
metadata = get_metadata(name="foo")
compiled = service.build(context, metadata)
assert getattr(compiled, ConceptDefaultProps.WHERE) is None
assert getattr(compiled, ConceptDefaultProps.PRE) is None
assert getattr(compiled, ConceptDefaultProps.BODY) is None
assert getattr(compiled, ConceptDefaultProps.POST) is None
assert getattr(compiled, ConceptDefaultProps.RET) is None
def test_i_can_detect_when_requested_names_are_concept_variables(self, context, service):
metadata = get_metadata(
name="foo",
body="one + a",
variables=(("a", "1"), ("b", "NotInit")))
compiled = service.build(context, metadata)
pf = getattr(compiled, ConceptDefaultProps.BODY)
assert isinstance(pf, PythonFragment)
assert pf.namespace == {"a": EvaluationRef("self", "a"),
"b": EvaluationRef("self", "b")}
def test_i_can_eval_concept_attributes(self, context, service):
with NewOntology(context, "test_i_can_eval_concept_attributes"):
foo_metadata = get_metadata(name="foo",
where="isinstance(a, int)",
pre="True",
body="2 + a",
post="'post parameter'",
ret="self",
variables=(("a", "1"), ("b", "NotInit")))
foo = define_new_concept(context, foo_metadata)
res = service.evaluate_concept(context, foo)
assert context.sheerka.isinstance(res, foo)
assert res.get_value("a") == 1
assert res.get_value("b") == NotInit
assert res.get_value(ConceptDefaultProps.WHERE) is True
assert res.get_value(ConceptDefaultProps.PRE) is True
assert res.get_value(ConceptDefaultProps.BODY) == 3
assert res.get_value(ConceptDefaultProps.POST) == "post parameter"
assert res.get_value(ConceptDefaultProps.RET) == res