140 lines
4.8 KiB
Python
140 lines
4.8 KiB
Python
import ast
|
|
|
|
from core.builtin_concepts import ReturnValueConcept, ParserResultConcept, BuiltinConcepts
|
|
from core.concept import Concept, DEFINITION_TYPE_BNF, DEFINITION_TYPE_DEF
|
|
from core.sheerka.ExecutionContext import ExecutionContext
|
|
from parsers.BnfNodeParser import StrMatch
|
|
from parsers.BnfParser import BnfParser
|
|
from sdp.sheerkaDataProvider import Event
|
|
|
|
|
|
class BaseTest:
|
|
def get_sheerka(self, **kwargs):
|
|
pass
|
|
|
|
def get_context(self, sheerka=None, eval_body=False, eval_where=False):
|
|
context = ExecutionContext("test", Event(), sheerka or self.get_sheerka())
|
|
if eval_body:
|
|
context.local_hints.add(BuiltinConcepts.EVAL_BODY_REQUESTED)
|
|
if eval_where:
|
|
context.local_hints.add(BuiltinConcepts.EVAL_WHERE_REQUESTED)
|
|
|
|
return context
|
|
|
|
def get_default_concept(self):
|
|
concept = Concept(
|
|
name="a + b",
|
|
where="isinstance(a, int) and isinstance(b, int)",
|
|
pre="isinstance(a, int) and isinstance(b, int)",
|
|
post="isinstance(res, int)",
|
|
body="def func(x,y):\n return x+y\nfunc(a,b)",
|
|
desc="specific description")
|
|
concept.def_var("a", "value1")
|
|
concept.def_var("b", "value2")
|
|
|
|
return concept
|
|
|
|
def dump_ast(self, node):
|
|
dump = ast.dump(node)
|
|
for to_remove in [", ctx=Load()", ", kind=None", ", type_ignores=[]"]:
|
|
dump = dump.replace(to_remove, "")
|
|
return dump
|
|
|
|
def init_concepts(self, *concepts, **kwargs):
|
|
sheerka = self.get_sheerka(**kwargs)
|
|
|
|
context_args = dict([(k, v) for k, v in kwargs.items() if k in ["sheerka", "eval_body", "eval_where"]])
|
|
context = self.get_context(sheerka, **context_args)
|
|
create_new = kwargs.get("create_new", None)
|
|
|
|
result = []
|
|
for c in concepts:
|
|
if isinstance(c, str):
|
|
c = Concept(c)
|
|
|
|
if c.metadata.definition and c.metadata.definition_type != DEFINITION_TYPE_DEF:
|
|
bnf_parser = BnfParser()
|
|
res = bnf_parser.parse(context, c.metadata.definition)
|
|
if res.status:
|
|
c.bnf = res.value.value
|
|
c.metadata.definition_type = DEFINITION_TYPE_BNF
|
|
else:
|
|
raise Exception(f"Error in bnf definition '{c.metadata.definition}'", sheerka.get_error(res))
|
|
|
|
if create_new:
|
|
sheerka.create_new_concept(context, c)
|
|
else:
|
|
c.init_key()
|
|
sheerka.set_id_if_needed(c, False)
|
|
sheerka.add_in_cache(c)
|
|
|
|
result.append(c)
|
|
|
|
return sheerka, context, *result
|
|
|
|
@staticmethod
|
|
def retval(obj, who="who", status=True):
|
|
"""ret_val"""
|
|
return ReturnValueConcept.ret(who, status, obj)
|
|
|
|
@staticmethod
|
|
def tretval(sheerka, obj, who="who"):
|
|
"""True ret_val + add concept in cache"""
|
|
if isinstance(obj, Concept):
|
|
obj.init_key()
|
|
if sheerka.has_key(obj.key):
|
|
sheerka.add_in_cache(obj)
|
|
return sheerka.ret(who, True, obj)
|
|
|
|
@staticmethod
|
|
def pretval(concept, source=None, parser="parsers.name"):
|
|
"""ParserResult ret_val (p stands for ParserResult)"""
|
|
return ReturnValueConcept(
|
|
"some_name",
|
|
True,
|
|
ParserResultConcept(parser=parser,
|
|
source=source or concept.name,
|
|
value=concept,
|
|
try_parsed=concept))
|
|
|
|
@staticmethod
|
|
def create_concept_lite(sheerka, name, variables=None, bnf=None):
|
|
concept = Concept(name) if isinstance(name, str) else name
|
|
if variables:
|
|
for v in variables:
|
|
concept.def_var(v)
|
|
if bnf:
|
|
concept.bnf = bnf
|
|
concept.metadata.definition_type = DEFINITION_TYPE_BNF
|
|
concept.init_key()
|
|
sheerka.set_id_if_needed(concept, False)
|
|
sheerka.add_in_cache(concept)
|
|
return concept
|
|
|
|
@staticmethod
|
|
def bnf_concept(concept, expression=None):
|
|
if isinstance(concept, Concept):
|
|
name = concept.name
|
|
else:
|
|
name = concept
|
|
concept = Concept(concept)
|
|
|
|
concept.bnf = expression or StrMatch(name)
|
|
concept.metadata.definition_type = DEFINITION_TYPE_BNF
|
|
return concept
|
|
|
|
@staticmethod
|
|
def def_concept(name, definition, variables=None, **kwargs):
|
|
concept = Concept(name=name, definition=definition, definition_type=DEFINITION_TYPE_DEF)
|
|
if variables:
|
|
for v in variables:
|
|
concept.def_var(v)
|
|
|
|
if kwargs:
|
|
for k, v in kwargs.items():
|
|
if k in ("body", "pre", "post", "where"):
|
|
setattr(concept.metadata, k, v)
|
|
else:
|
|
concept.metadata.variables[k] = v
|
|
return concept
|