From 936b0afc4288bd3b53b0004836e11c0059ab57c9 Mon Sep 17 00:00:00 2001 From: Jostein Solaas Date: Wed, 26 Feb 2025 21:38:37 +0100 Subject: [PATCH] fix: error message when variables are unsolvable Catch the error and convert it to an expected error. Further improvement could be to evaluate variables when needed, but it would still be nice if we could make sure we _can_ solve in validating. --- .../mappers/variables_mapper/variables_mapper.py | 7 ++++++- src/libecalc/presentation/yaml/model.py | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/libecalc/presentation/yaml/mappers/variables_mapper/variables_mapper.py b/src/libecalc/presentation/yaml/mappers/variables_mapper/variables_mapper.py index 1ff647b2d6..2651361daa 100644 --- a/src/libecalc/presentation/yaml/mappers/variables_mapper/variables_mapper.py +++ b/src/libecalc/presentation/yaml/mappers/variables_mapper/variables_mapper.py @@ -12,6 +12,11 @@ ) +class InvalidVariablesException(Exception): + def __init__(self, message: str): + super().__init__(message) + + @dataclass class VariableProcessor: reference_id: str @@ -87,7 +92,7 @@ def _evaluate_variables(variables: dict[str, YamlVariable], variables_map: Varia } ) unsolvable_variables = sorted([variable.reference_id for variable in variables_to_process]) - raise ValueError( + raise InvalidVariablesException( f"Could not evaluate all variables, unable to resolve references in {', '.join(unsolvable_variables)}. " f"Missing references are {', '.join(missing_references)}" ) diff --git a/src/libecalc/presentation/yaml/model.py b/src/libecalc/presentation/yaml/model.py index cbfc4a4d3e..579e3c2735 100644 --- a/src/libecalc/presentation/yaml/model.py +++ b/src/libecalc/presentation/yaml/model.py @@ -19,6 +19,7 @@ from libecalc.presentation.yaml.mappers.create_references import create_references from libecalc.presentation.yaml.mappers.variables_mapper import map_yaml_to_variables from libecalc.presentation.yaml.mappers.variables_mapper.get_global_time_vector import get_global_time_vector +from libecalc.presentation.yaml.mappers.variables_mapper.variables_mapper import InvalidVariablesException from libecalc.presentation.yaml.model_validation_exception import ModelValidationException from libecalc.presentation.yaml.resource_service import ResourceService from libecalc.presentation.yaml.validation_errors import ( @@ -26,6 +27,7 @@ Location, ModelValidationError, ) +from libecalc.presentation.yaml.yaml_keywords import EcalcYamlKeywords from libecalc.presentation.yaml.yaml_models.exceptions import DuplicateKeyError, YamlError from libecalc.presentation.yaml.yaml_models.yaml_model import YamlValidator from libecalc.presentation.yaml.yaml_validation_context import ( @@ -208,5 +210,18 @@ def validate_for_run(self) -> Self: # Validate and create the graph used for evaluating the energy model self.get_graph() return self + except InvalidVariablesException as e: + # TODO: Variables are evaluated when setting up ExpressionEvaluator. This seems unnecessary. + # We could evaluate when needed instead. + raise ModelValidationException( + errors=[ + ModelValidationError( + location=Location(keys=[EcalcYamlKeywords.variables]), + message=str(e), + data=None, + file_context=None, + ) + ], + ) from e except (DtoValidationError, ComponentValidationException) as e: raise ModelValidationException(errors=e.errors()) from e