Minor code enhancements

This commit is contained in:
2020-01-11 16:03:30 +01:00
parent 40416ac337
commit 73a6d4e6c2
5 changed files with 75 additions and 34 deletions
+4 -3
View File
@@ -933,19 +933,20 @@ class Sheerka(Concept):
defs = self.sdp.get(self.CONCEPTS_DEFINITIONS_ENTRY) defs = self.sdp.get(self.CONCEPTS_DEFINITIONS_ENTRY)
self.log.info(defs) self.log.info(defs)
def dump_desc(self, concept_name): def dump_desc(self, *concept_names):
first = True
for concept_name in concept_names:
if isinstance(concept_name, Concept): if isinstance(concept_name, Concept):
concepts = concept_name concepts = concept_name
else: else:
concepts = self.get(concept_name) concepts = self.get(concept_name)
if self.isinstance(concepts, BuiltinConcepts.UNKNOWN_CONCEPT): if self.isinstance(concepts, BuiltinConcepts.UNKNOWN_CONCEPT):
self.log.error("Concept unknown") self.log.error(f"Concept '{concept_name}' is unknown")
return False return False
if not hasattr(concepts, "__iter__"): if not hasattr(concepts, "__iter__"):
concepts = [concepts] concepts = [concepts]
first = True
for c in concepts: for c in concepts:
if not first: if not first:
self.log.info("") self.log.info("")
+6 -1
View File
@@ -59,7 +59,12 @@ class PythonEvaluator(OneReturnValueEvaluator):
return sheerka.ret(self.name, False, error, parents=[return_value]) return sheerka.ret(self.name, False, error, parents=[return_value])
def get_locals(self, context, node): def get_locals(self, context, node):
my_locals = {"sheerka": context.sheerka} my_locals = {
"sheerka": context.sheerka,
"desc": context.sheerka.dump_desc,
"concepts": context.sheerka.dump_concepts,
"definitions": context.sheerka.dump_definitions,
}
if context.obj: if context.obj:
context.log(self.verbose_log, context.log(self.verbose_log,
f"Concept '{context.obj}' is in context. Adding its properties to locals if any.", self.name) f"Concept '{context.obj}' is in context. Adding its properties to locals if any.", self.name)
+7 -11
View File
@@ -1,8 +1,11 @@
from core.builtin_concepts import BuiltinConcepts from core.builtin_concepts import BuiltinConcepts
from parsers.BaseParser import BaseParser from parsers.BaseParser import BaseParser
from parsers.ConceptLexerParser import UnrecognizedTokensNode, ConceptNode from parsers.ConceptLexerParser import ConceptNode
from parsers.MultipleConceptsParser import MultipleConceptsParser
from parsers.PythonParser import PythonParser from parsers.PythonParser import PythonParser
multiple_concepts_parser = MultipleConceptsParser()
class PythonWithConceptsParser(BaseParser): class PythonWithConceptsParser(BaseParser):
def __init__(self, **kwargs): def __init__(self, **kwargs):
@@ -22,16 +25,10 @@ class PythonWithConceptsParser(BaseParser):
if not sheerka.isinstance(text, BuiltinConcepts.PARSER_RESULT): if not sheerka.isinstance(text, BuiltinConcepts.PARSER_RESULT):
return None return None
if not text.parser == multiple_concepts_parser:
return None
nodes = text.body nodes = text.body
if not isinstance(nodes, list):
return None
if len(nodes) == 0:
return None
if not isinstance(nodes[0], (ConceptNode, UnrecognizedTokensNode)):
return None
source = "" source = ""
to_parse = "" to_parse = ""
identifiers = {} identifiers = {}
@@ -107,7 +104,6 @@ class PythonWithConceptsParser(BaseParser):
if id(concept) in self.identifiers: if id(concept) in self.identifiers:
return self.identifiers[id(concept)] return self.identifiers[id(concept)]
identifier = "__C__" + (concept.key or concept.name) identifier = "__C__" + (concept.key or concept.name)
if concept.id: if concept.id:
identifier += "__" + concept.id identifier += "__" + concept.id
+4 -1
View File
@@ -7,10 +7,13 @@ from core.concept import Concept
from core.sheerka import Sheerka, ExecutionContext from core.sheerka import Sheerka, ExecutionContext
from core.tokenizer import Token, TokenKind, Tokenizer from core.tokenizer import Token, TokenKind, Tokenizer
from parsers.ConceptLexerParser import ConceptNode, UnrecognizedTokensNode from parsers.ConceptLexerParser import ConceptNode, UnrecognizedTokensNode
from parsers.MultipleConceptsParser import MultipleConceptsParser
from parsers.PythonParser import PythonNode, PythonErrorNode from parsers.PythonParser import PythonNode, PythonErrorNode
from parsers.PythonWithConceptsParser import PythonWithConceptsParser from parsers.PythonWithConceptsParser import PythonWithConceptsParser
from sdp.sheerkaDataProvider import Event from sdp.sheerkaDataProvider import Event
multiple_concepts_parser = MultipleConceptsParser()
def get_context(): def get_context():
sheerka = Sheerka(skip_builtins_in_db=True) sheerka = Sheerka(skip_builtins_in_db=True)
@@ -31,7 +34,7 @@ def get_ret_from(*args):
result.append(UnrecognizedTokensNode(index, index + len(tokens) - 1, tokens)) result.append(UnrecognizedTokensNode(index, index + len(tokens) - 1, tokens))
index += len(tokens) index += len(tokens)
return ReturnValueConcept("who", False, ParserResultConcept(parser="name", value=result)) return ReturnValueConcept("who", False, ParserResultConcept(parser=multiple_concepts_parser, value=result))
def to_str_ast(expression): def to_str_ast(expression):
+36
View File
@@ -427,6 +427,42 @@ def test_i_can_eval_a_mix_with_bnf_and_python_when_rule_name():
assert res[0].status assert res[0].status
assert res[0].body == 22 assert res[0].body == 22
res = sheerka.evaluate_user_input("twenty one + twenty two")
assert len(res) == 1
assert res[0].status
assert res[0].body == 43
res = sheerka.evaluate_user_input("twenty one + one")
assert len(res) == 1
assert res[0].status
assert res[0].body == 22
def test_i_can_eval_a_mix_with_bnf_and_python_when_rule_name_2():
sheerka = get_sheerka()
sheerka.evaluate_user_input("def concept one as 1")
sheerka.evaluate_user_input("def concept two as 2")
sheerka.evaluate_user_input("def concept twenty as 20")
sheerka.evaluate_user_input("def concept twenties from bnf twenty (one | two)=unit as twenty + unit")
assert sheerka.evaluate_user_input("eval twenty one")[0].body == 21
res = sheerka.evaluate_user_input("twenty one + 1")
assert len(res) == 1
assert res[0].status
assert res[0].body == 22
res = sheerka.evaluate_user_input("twenty one + twenty two")
assert len(res) == 1
assert res[0].status
assert res[0].body == 43
res = sheerka.evaluate_user_input("twenty one + one")
assert len(res) == 1
assert res[0].status
assert res[0].body == 22
def test_i_can_eval_a_more_complicated_mix_with_bnf_and_python(): def test_i_can_eval_a_more_complicated_mix_with_bnf_and_python():
sheerka = get_sheerka() sheerka = get_sheerka()