from core.builtin_concepts import BuiltinConcepts from evaluators.AddConceptEvaluator import AddConceptEvaluator from evaluators.BaseEvaluator import AllReturnValuesEvaluator from parsers.BaseParser import BaseParser from sdp.sheerkaDataProvider import SheerkaDataProviderDuplicateKeyError class DuplicateConceptEvaluator(AllReturnValuesEvaluator): """ Use to recognize when we tried to add the same concept twice """ NAME = "DuplicateConcept" def __init__(self): super().__init__(self.NAME, 10) self.already_defined = None def matches(self, context, return_values): sheerka = context.sheerka parsing = False add_concept_in_error = False only_parsers = True for ret in return_values: if sheerka.isinstance(ret.value, BuiltinConcepts.AFTER_EVALUATION): if ret.status: parsing = True elif ret.who == sheerka.get_evaluator_name(AddConceptEvaluator.NAME): if not ret.status and isinstance(ret.value.body, SheerkaDataProviderDuplicateKeyError): add_concept_in_error = True self.already_defined = ret.value.body.obj else: if not ret.who.startswith(BaseParser.PREFIX): only_parsers = False return parsing and add_concept_in_error and only_parsers def eval(self, context, return_values): sheerka = context.sheerka return sheerka.ret( self.name, False, sheerka.new(BuiltinConcepts.CONCEPT_ALREADY_DEFINED, body=self.already_defined), parents=return_values)