Skip to content

Commit

Permalink
fix: error message when variables are unsolvable
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
jsolaas committed Feb 27, 2025
1 parent 696a93e commit 218ab4a
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@
)


class InvalidVariablesException(Exception):
def __init__(self, message: str):
super().__init__(message)


@dataclass
class VariableProcessor:
reference_id: str
Expand Down Expand Up @@ -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)}"
)
Expand Down
15 changes: 15 additions & 0 deletions src/libecalc/presentation/yaml/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,15 @@
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 (
DtoValidationError,
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 (
Expand Down Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from libecalc.common.variables import VariablesMap
from libecalc.expression import Expression
from libecalc.presentation.yaml.mappers.variables_mapper.variables_mapper import (
InvalidVariablesException,
VariableProcessor,
_evaluate_variables,
)
Expand All @@ -14,7 +15,7 @@

class TestEvaluateVariables:
def test_unsolvable(self):
with pytest.raises(ValueError) as exc_info:
with pytest.raises(InvalidVariablesException) as exc_info:
_evaluate_variables(
variables={
"test_id": YamlSingleVariable(value=Expression.setup_from_expression("SIM1;TEST")),
Expand Down

0 comments on commit 218ab4a

Please sign in to comment.