Added first implementation of concepts ambiguity resolution + Jenkins file test
This commit is contained in:
@@ -15,7 +15,15 @@ class BuiltinConcepts(Enum):
|
||||
"""
|
||||
SHEERKA = "sheerka"
|
||||
|
||||
# Execution context actions
|
||||
# processing instructions during sheerka.execute()
|
||||
EVAL_BODY_REQUESTED = "eval body" # to evaluate the body
|
||||
EVAL_WHERE_REQUESTED = "eval where" # to evaluate the where clause
|
||||
RETURN_VALUE_REQUESTED = "return value" # returns the body of the concept instead of the concept itself
|
||||
REDUCE_REQUESTED = "reduce" # remove meaningless error when possible
|
||||
EVAL_UNTIL_SUCCESS_REQUESTED = "eval until success" # PythonEvaluator tries combination until True is found
|
||||
QUESTION_REQUESTED = "question" # a question is asked
|
||||
|
||||
# possible actions during sheerka.execute()
|
||||
INIT_SHEERKA = "init sheerka" #
|
||||
PROCESS_INPUT = "process input" # Processing user input or other input
|
||||
PROCESSING = "processing input" # Processing user input or other input
|
||||
@@ -30,22 +38,28 @@ class BuiltinConcepts(Enum):
|
||||
AFTER_RENDERING = "after rendering" # rendering the response from sheerka
|
||||
EVALUATE_CONCEPT = "evaluate concept" # a concept will be evaluated
|
||||
EVALUATING_CONCEPT = "evaluating concept" # a concept will be evaluated
|
||||
EVALUATING_ATTRIBUTE = "evaluating concept attribute" #
|
||||
VALIDATE_CONCEPT = "validate concept"
|
||||
VALIDATING_CONCEPT = "validating concept"
|
||||
INIT_COMPILED = "initializing concept compiled"
|
||||
INIT_BNF = "ensure bnf"
|
||||
INIT_BNF = "initialize bnf"
|
||||
MANAGE_INFINITE_RECURSION = "manage infinite recursion"
|
||||
PARSE_CODE = "execute source code"
|
||||
EXEC_CODE = "execute source code"
|
||||
TESTING = "testing"
|
||||
|
||||
USER_INPUT = "user input" # represent an input from an user
|
||||
SUCCESS = "success"
|
||||
ERROR = "error"
|
||||
# builtin attributes
|
||||
ISA = "is a" # when a concept is an instance of another one
|
||||
COMMAND = "command" # when the concept must be auto evaluated
|
||||
|
||||
# object
|
||||
USER_INPUT = "user input concept" # represent an input from an user
|
||||
SUCCESS = "success concept"
|
||||
ERROR = "error concept"
|
||||
UNKNOWN_CONCEPT = "unknown concept" # the request concept is not recognized
|
||||
CANNOT_RESOLVE_CONCEPT = "cannot resolve concept" # when too many concepts with the same name
|
||||
RETURN_VALUE = "return value" # a value is returned
|
||||
CONCEPT_TOO_LONG = "concept too long" # concept cannot be processed by exactConcept parser
|
||||
RETURN_VALUE = "return value concept" # a value is returned
|
||||
CONCEPT_TOO_LONG = "concept too long concept" # concept cannot be processed by exactConcept parser
|
||||
NEW_CONCEPT = "new concept" # when a new concept is added
|
||||
UNKNOWN_PROPERTY = "unknown property" # when requesting for a unknown property
|
||||
PARSER_RESULT = "parser result"
|
||||
@@ -64,15 +78,9 @@ class BuiltinConcepts(Enum):
|
||||
FILTERED = "filtered" # represents the result of a filtering
|
||||
CONCEPT_ALREADY_IN_SET = "concept already in set"
|
||||
EVALUATOR_PRE_PROCESS = "evaluator pre process" # used modify / tweak behaviour of evaluators
|
||||
EVAL_BODY_REQUESTED = "eval body requested" # to evaluate the body
|
||||
EVAL_WHERE_REQUESTED = "eval where requested" # to evaluate the where clause
|
||||
CONCEPT_VALUE_REQUESTED = "concept value requested" # returns the body of the concept instead of the concept itself
|
||||
REDUCE_REQUESTED = "reduce requested" # remove meaningless error when possible
|
||||
EVAL_SUCCESS_REQUESTED = "Try to find a successful evaluation" # PyhtonEvaluator tries combination until True is found
|
||||
NOT_A_SET = "not a set" # the concept has no entry in sets
|
||||
WHERE_CLAUSE_FAILED = "where clause failed" # failed to validate where clause during evaluation
|
||||
CONDITION_FAILED = "where clause failed" # failed to validate where clause during evaluation
|
||||
CHICKEN_AND_EGG = "chicken and egg" # infinite recursion when declaring concept
|
||||
ISA = "is a" # builtin concept to express that a concept is an instance of another one
|
||||
EXPLANATION = "explanation"
|
||||
PRECEDENCE = "precedence" # use to set priority among concepts when parsing
|
||||
ASSOCIATIVITY = "associativity" # use to set priority among concepts when parsing
|
||||
@@ -80,6 +88,7 @@ class BuiltinConcepts(Enum):
|
||||
NOT_FOUND = "not found" # when the wanted resource is not found
|
||||
FORMAT_INSTRUCTIONS = "format instructions" # to express how to print the concept
|
||||
NOT_IMPLEMENTED = "not implemented" # instead of raise an error
|
||||
PYTHON_SECURITY_ERROR = "security error" # when trying to execute statement when only expression is allowed
|
||||
|
||||
NODE = "node"
|
||||
GENERIC_NODE = "generic node"
|
||||
@@ -108,6 +117,16 @@ class BuiltinConcepts(Enum):
|
||||
|
||||
|
||||
BuiltinUnique = [
|
||||
BuiltinConcepts.EVAL_BODY_REQUESTED,
|
||||
BuiltinConcepts.EVAL_WHERE_REQUESTED,
|
||||
BuiltinConcepts.RETURN_VALUE_REQUESTED,
|
||||
BuiltinConcepts.REDUCE_REQUESTED,
|
||||
BuiltinConcepts.EVAL_UNTIL_SUCCESS_REQUESTED,
|
||||
BuiltinConcepts.QUESTION_REQUESTED,
|
||||
|
||||
BuiltinConcepts.INIT_SHEERKA,
|
||||
BuiltinConcepts.PROCESS_INPUT,
|
||||
BuiltinConcepts.PROCESSING,
|
||||
BuiltinConcepts.BEFORE_PARSING,
|
||||
BuiltinConcepts.PARSING,
|
||||
BuiltinConcepts.AFTER_PARSING,
|
||||
@@ -117,10 +136,20 @@ BuiltinUnique = [
|
||||
BuiltinConcepts.BEFORE_RENDERING,
|
||||
BuiltinConcepts.RENDERING,
|
||||
BuiltinConcepts.AFTER_RENDERING,
|
||||
BuiltinConcepts.SUCCESS,
|
||||
BuiltinConcepts.NOP,
|
||||
BuiltinConcepts.EVAL_BODY_REQUESTED,
|
||||
BuiltinConcepts.REDUCE_REQUESTED,
|
||||
BuiltinConcepts.EVALUATE_CONCEPT,
|
||||
BuiltinConcepts.EVALUATING_CONCEPT,
|
||||
BuiltinConcepts.EVALUATING_ATTRIBUTE,
|
||||
BuiltinConcepts.VALIDATE_CONCEPT,
|
||||
BuiltinConcepts.VALIDATING_CONCEPT,
|
||||
BuiltinConcepts.INIT_COMPILED,
|
||||
BuiltinConcepts.INIT_BNF,
|
||||
BuiltinConcepts.MANAGE_INFINITE_RECURSION,
|
||||
BuiltinConcepts.PARSE_CODE,
|
||||
BuiltinConcepts.EXEC_CODE,
|
||||
BuiltinConcepts.TESTING,
|
||||
|
||||
BuiltinConcepts.ISA,
|
||||
BuiltinConcepts.COMMAND,
|
||||
]
|
||||
|
||||
BuiltinErrors = [str(e) for e in {
|
||||
@@ -137,7 +166,7 @@ BuiltinErrors = [str(e) for e in {
|
||||
BuiltinConcepts.CONCEPT_EVAL_ERROR,
|
||||
BuiltinConcepts.CONCEPT_ALREADY_IN_SET,
|
||||
BuiltinConcepts.NOT_A_SET,
|
||||
BuiltinConcepts.WHERE_CLAUSE_FAILED,
|
||||
BuiltinConcepts.CONDITION_FAILED,
|
||||
BuiltinConcepts.CHICKEN_AND_EGG,
|
||||
BuiltinConcepts.NOT_INITIALIZED,
|
||||
BuiltinConcepts.NOT_FOUND
|
||||
@@ -194,7 +223,7 @@ class ReturnValueConcept(Concept):
|
||||
It's the main input for the evaluators
|
||||
"""
|
||||
|
||||
def __init__(self, who=None, status=None, value=None, message=None, parents=None):
|
||||
def __init__(self, who=None, status=None, value=None, message=None, parents=None, concept_id=None):
|
||||
super().__init__(BuiltinConcepts.RETURN_VALUE, True, False, BuiltinConcepts.RETURN_VALUE)
|
||||
self.set_value(ConceptParts.BODY, value)
|
||||
self.set_value("who", who)
|
||||
@@ -202,6 +231,7 @@ class ReturnValueConcept(Concept):
|
||||
self.set_value("message", message)
|
||||
self.set_value("parents", parents)
|
||||
self.metadata.is_evaluated = True
|
||||
self.metadata.id = concept_id
|
||||
|
||||
@property
|
||||
def who(self):
|
||||
@@ -429,21 +459,19 @@ class ConceptAlreadyInSet(Concept):
|
||||
return self.get_value("concept_set")
|
||||
|
||||
|
||||
class WhereClauseFailed(Concept):
|
||||
def __init__(self, concept=None):
|
||||
super().__init__(BuiltinConcepts.WHERE_CLAUSE_FAILED,
|
||||
class ConditionFailed(Concept):
|
||||
def __init__(self, condition=None, concept=None, prop=None):
|
||||
super().__init__(BuiltinConcepts.CONDITION_FAILED,
|
||||
True,
|
||||
False,
|
||||
BuiltinConcepts.WHERE_CLAUSE_FAILED)
|
||||
self.set_value(ConceptParts.BODY, concept)
|
||||
BuiltinConcepts.CONDITION_FAILED)
|
||||
self.set_value(ConceptParts.BODY, condition)
|
||||
self.set_value("concept", concept)
|
||||
self.set_value("prop", prop)
|
||||
self.metadata.is_evaluated = True
|
||||
|
||||
def __repr__(self):
|
||||
return f"WhereClauseFailed(concept={self.concept})"
|
||||
|
||||
@property
|
||||
def concept(self):
|
||||
return self.body
|
||||
return f"ConditionFailed(condition='{self.body}', concept='{self.concept}', prop='{self.prop}')"
|
||||
|
||||
|
||||
class NotForMeConcept(Concept):
|
||||
@@ -472,3 +500,18 @@ class ExplanationConcept(Concept):
|
||||
self.set_value("instructions", instructions) # instructions for SheerkaPrint
|
||||
self.set_value(ConceptParts.BODY, execution_result) # list of results
|
||||
self.metadata.is_evaluated = True
|
||||
|
||||
|
||||
class PythonSecurityError(Concept):
|
||||
def __init__(self, prop=None, source_code=None, source=None, line=None, column=None):
|
||||
super().__init__(BuiltinConcepts.PYTHON_SECURITY_ERROR,
|
||||
True,
|
||||
False,
|
||||
BuiltinConcepts.PYTHON_SECURITY_ERROR)
|
||||
|
||||
self.set_value("prop", prop) # property or variable that was evaluated
|
||||
self.set_value("source", source) # origin of the source code (eg. file name)
|
||||
self.set_value("line", line) # line number
|
||||
self.set_value("column", column) # column number
|
||||
self.set_value(ConceptParts.BODY, source_code) # code being executed
|
||||
self.metadata.is_evaluated = True
|
||||
|
||||
Reference in New Issue
Block a user