Files
Sheerka-Old/src/core/builtin_concepts.py
T

436 lines
15 KiB
Python

from core.builtin_concepts_ids import BuiltinConcepts
from core.concept import Concept, ConceptParts
from core.global_symbols import ErrorObj
class UserInputConcept(Concept):
ALL_ATTRIBUTES = ["text", "user_name"]
def __init__(self, text=None, user_name=None):
Concept.__init__(self,
BuiltinConcepts.USER_INPUT,
True,
False,
BuiltinConcepts.USER_INPUT, bound_body="text")
self.set_value("text", text)
self.set_value("user_name", user_name)
self._metadata.is_evaluated = True
def __repr__(self):
return f"({self.id}){self.name}: '{self.body}'"
class ErrorConcept(Concept, ErrorObj):
ALL_ATTRIBUTES = ["error"]
def __init__(self, error=None, concept_id=None):
Concept.__init__(self,
BuiltinConcepts.ERROR,
True,
False,
BuiltinConcepts.ERROR,
id=concept_id,
bound_body="error")
self.set_value("error", error)
self._metadata.is_evaluated = True
def __repr__(self):
return f"({self.id}){self.name}: {self.body}"
class UnknownConcept(Concept, ErrorObj):
ALL_ATTRIBUTES = ["concept_ref"]
def __init__(self, concept_ref=None):
Concept.__init__(self,
BuiltinConcepts.UNKNOWN_CONCEPT,
True,
False,
BuiltinConcepts.UNKNOWN_CONCEPT, bound_body="concept_ref")
self.set_value("concept_ref", concept_ref)
self._metadata.is_evaluated = True
def __repr__(self):
return f"({self.id}){self.name}: {self.body}"
class ReturnValueConcept(Concept):
"""
This class represents the result of a data flow processing
It's the main input for the evaluators
"""
ALL_ATTRIBUTES = ["who", "status", "value", "parents"]
def __init__(self, who=None, status=None, value=None, parents=None, concept_id=None):
Concept.__init__(self,
BuiltinConcepts.RETURN_VALUE,
True,
False,
BuiltinConcepts.RETURN_VALUE,
id=concept_id,
bound_body="value")
self.set_value("who", who)
self.set_value("status", status)
self.set_value("value", value)
self.set_value("parents", parents)
self._metadata.is_evaluated = True
def __repr__(self):
return f"ReturnValue(who={self.who}, status={self.status}, value={self.value})"
def __eq__(self, other):
if id(self) == id(other):
return True
if not isinstance(other, ReturnValueConcept):
return False
return self.who == other.who and \
self.status == other.status and \
self.value == other.value
def __hash__(self):
if hasattr(self.value, "__iter__") and not isinstance(self.value, str):
value_hash = hash(tuple(self.value))
else:
value_hash = hash(self.value)
return hash((self.who, self.status, value_hash))
class UnknownPropertyConcept(Concept, ErrorObj):
"""
This error is raised when, during sheerka.new(), an unknown property is asked
"""
ALL_ATTRIBUTES = ["property_name", "concept"]
def __init__(self, property_name=None, concept=None):
Concept.__init__(self,
BuiltinConcepts.UNKNOWN_PROPERTY,
True,
False,
BuiltinConcepts.UNKNOWN_PROPERTY,
bound_body="property_name")
self.set_value("property_name", property_name)
self.set_value("concept", concept)
self._metadata.is_evaluated = True
def __repr__(self):
return f"UnknownProperty(property={self.property_name}, concept={self.concept})"
class ParserResultConcept(Concept):
"""
Result of a parsing
"""
ALL_ATTRIBUTES = ["parser", "source", "tokens", "value", "try_parsed"]
def __init__(self, parser=None, source=None, tokens=None, value=None, try_parsed=None, concept_id=None):
Concept.__init__(self,
BuiltinConcepts.PARSER_RESULT,
True,
False,
BuiltinConcepts.PARSER_RESULT,
id=concept_id,
bound_body="value")
self.set_value("parser", parser)
self.set_value("source", source)
self.set_value("tokens", tokens)
self.set_value("value", value)
self.set_value("try_parsed", try_parsed)
self._metadata.is_evaluated = True
def __repr__(self):
text = f"ParserResult(parser={self.parser}"
text += f", source='{self.source}')" if self.source else f", body='{self.value}')"
return text
def __eq__(self, other):
if not isinstance(other, ParserResultConcept):
return False
self_parser_name = self.get_parser_name(self.parser)
other_parser_name = self.get_parser_name(other.parser)
return self.source == other.source and \
self_parser_name == other_parser_name and \
self.value == other.value
def __hash__(self):
return hash(self._metadata.name)
@staticmethod
def get_parser_name(parser):
from parsers.BaseParser import BaseParser
return parser.name if isinstance(parser, BaseParser) else str(parser)
class RuleEvaluationResultConcept(Concept):
"""
Result of the evaluation of a rule, using the Rete algorithm
"""
ALL_ATTRIBUTES = ["rule"]
def __init__(self, rule=None, concept_id=None):
Concept.__init__(self,
BuiltinConcepts.RULE_EVALUATION_RESULT,
True,
False,
BuiltinConcepts.RULE_EVALUATION_RESULT,
id=concept_id,
bound_body="rule")
self.set_value("rule", rule)
self._metadata.is_evaluated = True
def __repr__(self):
return f"RuleEvaluationResult(rule={self.rule})"
def __eq__(self, other):
if not isinstance(other, RuleEvaluationResultConcept):
return False
return self.rule == other.rule
def __hash__(self):
return hash((self._metadata.name, self.rule))
class InvalidReturnValueConcept(Concept, ErrorObj):
"""
Error returned when an evaluator is not correctly coded
The accepted return value are
ReturnValueConcept, list of ReturnValueConcept or None
"""
ALL_ATTRIBUTES = ["return_value", "evaluator"]
def __init__(self, return_value=None, evaluator=None):
super().__init__(
BuiltinConcepts.INVALID_RETURN_VALUE,
True,
False,
BuiltinConcepts.INVALID_RETURN_VALUE,
bound_body="return_value")
self.set_value("return_value", return_value)
self.set_value("evaluator", evaluator)
self._metadata.is_evaluated = True
class ConceptEvalError(Concept, ErrorObj):
ALL_ATTRIBUTES = ["error", "concept", "property_name"]
def __init__(self, error=None, concept=None, property_name=None):
super().__init__(BuiltinConcepts.CONCEPT_EVAL_ERROR,
True,
False,
BuiltinConcepts.CONCEPT_EVAL_ERROR,
bound_body="error")
self.set_value("error", error)
self.set_value("concept", concept)
self.set_value("property_name", property_name)
self._metadata.is_evaluated = True
def __repr__(self):
return f"ConceptEvalError(error={self.error}, concept={self.concept}, property={self.property_name})"
class ListConcept(Concept):
ALL_ATTRIBUTES = ["items"]
def __init__(self, items=None):
Concept.__init__(self,
BuiltinConcepts.LIST,
True,
False,
BuiltinConcepts.LIST,
bound_body="items")
self.set_value("items", items or [])
self._metadata.is_evaluated = True
def append(self, obj):
self.body.append(obj)
class FilteredConcept(Concept):
ALL_ATTRIBUTES = ["filtered", "iterable", "predicate"]
def __init__(self, filtered=None, iterable=None, predicate=None):
Concept.__init__(self,
BuiltinConcepts.FILTERED,
True,
False,
BuiltinConcepts.FILTERED,
bound_body="filtered")
self.set_value("filtered", filtered)
self.set_value("iterable", iterable)
self.set_value("predicate", predicate)
self._metadata.is_evaluated = True
class ConceptAlreadyInSet(Concept, ErrorObj):
ALL_ATTRIBUTES = ["concept", "concept_set"]
def __init__(self, concept=None, concept_set=None):
Concept.__init__(self,
BuiltinConcepts.CONCEPT_ALREADY_IN_SET,
True,
False,
BuiltinConcepts.CONCEPT_ALREADY_IN_SET,
bound_body="concept")
self.set_value("concept", concept)
self.set_value("concept_set", concept_set)
self._metadata.is_evaluated = True
def __repr__(self):
return f"ConceptAlreadyInSet(concept={self.concept}, concept_set={self.concept_set})"
class PropertyAlreadyDefined(Concept, ErrorObj):
ALL_ATTRIBUTES = ["property_name", "property_value", "concept"]
def __init__(self, property_name=None, property_value=None, concept=None):
Concept.__init__(self,
BuiltinConcepts.PROPERTY_ALREADY_DEFINED,
True,
False,
BuiltinConcepts.PROPERTY_ALREADY_DEFINED,
bound_body="property_name")
self.set_value("property_name", property_name)
self.set_value("property_value", property_value)
self.set_value("concept", concept)
self._metadata.is_evaluated = True
def __repr__(self):
return f"PropertyAlreadyDefined(property={self.property_name}, value={self.property_value}, concept={self.concept})"
class ConditionFailed(Concept, ErrorObj):
ALL_ATTRIBUTES = ["condition", "concept", "prop", "reason"]
def __init__(self, condition=None, concept=None, prop=None, reason=None):
Concept.__init__(self,
BuiltinConcepts.CONDITION_FAILED,
True,
False,
BuiltinConcepts.CONDITION_FAILED,
bound_body="condition")
self.set_value("condition", condition)
self.set_value("concept", concept)
self.set_value("prop", prop)
self.set_value("reason", reason)
self._metadata.is_evaluated = True
def __repr__(self):
return f"ConditionFailed(condition='{self.body}', concept='{self.concept}', prop='{self.prop}')"
class NotForMeConcept(Concept): # Not considered as an error ?
ALL_ATTRIBUTES = ["source", "reason"]
def __init__(self, source=None, reason=None):
Concept.__init__(self,
BuiltinConcepts.NOT_FOR_ME,
True,
False,
BuiltinConcepts.NOT_FOR_ME,
bound_body="source")
self.set_value("source", source)
self.set_value("reason", reason)
self._metadata.is_evaluated = True
def __repr__(self):
return f"NotForMeConcept(source={self.body}, reason={self.get_value('reason')})"
class ExplanationConcept(Concept):
ALL_ATTRIBUTES = ["digest", "command", "title", "instructions", "execution_result"]
def __init__(self, digest=None, command=None, title=None, instructions=None, execution_result=None):
Concept.__init__(self,
BuiltinConcepts.EXPLANATION,
True,
False,
BuiltinConcepts.EXPLANATION,
bound_body="execution_result")
self.set_value("digest", digest) # event digest
self.set_value("command", command) # explain command parameters
self.set_value("title", title) # a title to the explanation
self.set_value("instructions", instructions) # instructions for SheerkaPrint
self.set_value("execution_result", execution_result) # list of results
self._metadata.is_evaluated = True
class PythonSecurityError(Concept, ErrorObj):
ALL_ATTRIBUTES = ["prop", "source_code", "source", "line", "column"]
def __init__(self, prop=None, source_code=None, source=None, line=None, column=None):
Concept.__init__(self,
BuiltinConcepts.PYTHON_SECURITY_ERROR,
True,
False,
BuiltinConcepts.PYTHON_SECURITY_ERROR,
bound_body="source_code")
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("source_code", source_code) # code being executed
self._metadata.is_evaluated = True
class NotFoundConcept(Concept, ErrorObj):
ALL_ATTRIBUTES = []
def __init__(self, body=None):
Concept.__init__(self,
BuiltinConcepts.NOT_FOUND,
True,
False,
BuiltinConcepts.NOT_FOUND)
self.set_value(ConceptParts.BODY, body)
def __repr__(self):
return f"({self._metadata.id}){self._metadata.name}, body={self.get_value(ConceptParts.BODY)}"
class ToListConcept(Concept):
ALL_ATTRIBUTES = ["items", "recursion_depth", "recurse_on", "tab"]
def __init__(self, items=None, recursion_depth=None, recurse_on=None, tab=None):
Concept.__init__(self,
BuiltinConcepts.TO_LIST,
True,
False,
BuiltinConcepts.TO_LIST,
bound_body="items")
self.set_value("items", items) # items to display
self.set_value("recursion_depth", recursion_depth) # recursion depth when showing children
self.set_value("recurse_on", recurse_on) # which sub items should we display
self.set_value("tab", tab) # customise tab (content and length)
self._metadata.is_evaluated = True
class NewConceptConcept(Concept):
ALL_ATTRIBUTES = ["concept"]
def __init__(self, concept=None):
Concept.__init__(self,
BuiltinConcepts.NEW_CONCEPT,
True,
False,
BuiltinConcepts.NEW_CONCEPT,
bound_body="concept")
self.set_value("concept", concept)
self._metadata.is_evaluated = True
def __repr__(self):
if self.concept:
return f"NewConcept(concept={self.concept}, key='{self.concept.key}')"
else:
return super().__repr__()