From 590d0762d15a4db846420cb4bbcc2a6891478069 Mon Sep 17 00:00:00 2001 From: Jostein Solaas Date: Thu, 4 Jul 2024 08:36:01 +0200 Subject: [PATCH] refactor: move asset result classes Move asset result mapping and classes to presentation. Makes it more clear that this is a presentation layer, which exist to provide a json result to the user. --- src/ecalc_cli/io/cache.py | 2 +- src/ecalc_cli/io/output.py | 4 +- src/libecalc/core/result/base.py | 11 +++- src/libecalc/dto/result/base.py | 7 -- src/libecalc/dto/result/types.py | 16 ----- src/libecalc/infrastructure/file_utils.py | 2 +- .../presentation/json_result/__init__.py | 0 .../presentation/json_result/aggregators.py | 2 +- .../presentation/json_result/mapper.py | 66 ++++++++++--------- .../json_result}/result/__init__.py | 0 .../presentation/json_result/result/base.py | 13 ++++ .../json_result}/result/emission.py | 4 +- .../json_result}/result/results.py | 13 ++-- .../result/tabular_time_series.py | 2 +- .../presentation/simple_result/simple.py | 17 +++-- src/tests/ecalc_cli/test_cache.py | 2 +- .../test_requested_pressures_compressors.py | 2 +- .../integration/test_minimal_is_valid.py | 2 +- .../presentation/exporter/test_ltp.py | 2 +- .../json_result/test_aggregators.py | 2 +- 20 files changed, 93 insertions(+), 76 deletions(-) delete mode 100644 src/libecalc/dto/result/base.py delete mode 100644 src/libecalc/dto/result/types.py create mode 100644 src/libecalc/presentation/json_result/__init__.py rename src/libecalc/{dto => presentation/json_result}/result/__init__.py (100%) create mode 100644 src/libecalc/presentation/json_result/result/base.py rename src/libecalc/{dto => presentation/json_result}/result/emission.py (95%) rename src/libecalc/{dto => presentation/json_result}/result/results.py (96%) rename src/libecalc/{dto => presentation/json_result}/result/tabular_time_series.py (98%) diff --git a/src/ecalc_cli/io/cache.py b/src/ecalc_cli/io/cache.py index 9c18a16e1a..995c844b25 100644 --- a/src/ecalc_cli/io/cache.py +++ b/src/ecalc_cli/io/cache.py @@ -5,8 +5,8 @@ from libecalc.application.graph_result import EnergyCalculatorResult, GraphResult from libecalc.common.run_info import RunInfo from libecalc.dto.base import EcalcBaseModel -from libecalc.dto.result import EcalcModelResult from libecalc.presentation.json_result.mapper import get_asset_result +from libecalc.presentation.json_result.result import EcalcModelResult from ecalc_cli.logger import logger diff --git a/src/ecalc_cli/io/output.py b/src/ecalc_cli/io/output.py index fb603652be..dcc312fc1d 100644 --- a/src/ecalc_cli/io/output.py +++ b/src/ecalc_cli/io/output.py @@ -8,13 +8,15 @@ from libecalc.application.graph_result import GraphResult from libecalc.common.run_info import RunInfo from libecalc.common.time_utils import resample_time_steps -from libecalc.dto.result import EcalcModelResult as EcalcModelResultDTO from libecalc.infrastructure.file_utils import OutputFormat, get_result_output from libecalc.presentation.exporter.configs.configs import LTPConfig, STPConfig from libecalc.presentation.exporter.exporter import Exporter from libecalc.presentation.exporter.formatters.formatter import CSVFormatter from libecalc.presentation.exporter.handlers.handler import MultiFileHandler from libecalc.presentation.flow_diagram.EcalcModelMapper import EcalcModelMapper +from libecalc.presentation.json_result.result import ( + EcalcModelResult as EcalcModelResultDTO, +) from ecalc_cli.errors import EcalcCLIError diff --git a/src/libecalc/core/result/base.py b/src/libecalc/core/result/base.py index 74bb16e394..9b03b83f55 100644 --- a/src/libecalc/core/result/base.py +++ b/src/libecalc/core/result/base.py @@ -2,15 +2,22 @@ from enum import Enum +from pydantic import BaseModel, ConfigDict from typing_extensions import Self from libecalc.common.logger import logger +from libecalc.common.string.string_utils import to_camel_case from libecalc.common.utils.rates import TimeSeries from libecalc.dto import SingleSpeedChart, VariableSpeedChart -from libecalc.dto.base import EcalcBaseModel -class EcalcResultBaseModel(EcalcBaseModel): +class EcalcResultBaseModel(BaseModel): + model_config = ConfigDict( + extra="forbid", + alias_generator=to_camel_case, + populate_by_name=True, + ) + def extend(self, other: Self) -> Self: """This is used when merging different time slots when the energy function of a consumer changes over time. Append method covering all the basics. All additional extend methods needs to be covered in diff --git a/src/libecalc/dto/result/base.py b/src/libecalc/dto/result/base.py deleted file mode 100644 index 90b079e189..0000000000 --- a/src/libecalc/dto/result/base.py +++ /dev/null @@ -1,7 +0,0 @@ -from __future__ import annotations - -from libecalc.dto.base import EcalcBaseModel - - -class EcalcResultBaseModel(EcalcBaseModel): - pass diff --git a/src/libecalc/dto/result/types.py b/src/libecalc/dto/result/types.py deleted file mode 100644 index 3127d306c5..0000000000 --- a/src/libecalc/dto/result/types.py +++ /dev/null @@ -1,16 +0,0 @@ -from __future__ import annotations - -from enum import Enum -from typing import Optional - -opt_float = Optional[float] - - -class CompressorTrainCommonShaftFailureStatus(str, Enum): - TARGET_DISCHARGE_PRESSURE_TOO_HIGH = "TARGET_DISCHARGE_PRESSURE_TOO_HIGH" - TARGET_DISCHARGE_PRESSURE_TOO_LOW = "TARGET_DISCHARGE_PRESSURE_TOO_LOW" - SUCTION_PRESSURE_TOO_LOW = "SUCTION_PRESSURE_TOO_LOW" - ABOVE_MAXIMUM_FLOW_RATE = "ABOVE_MAXIMUM_FLOW_RATE" - BELOW_MINIMUM_FLOW_RATE = "BELOW_MINIMUM_FLOW_RATE" - ABOVE_MAXIMUM_POWER = "ABOVE_MAXIMUM_POWER" - NOT_CALCULATED = "NOT_CALCULATED" diff --git a/src/libecalc/infrastructure/file_utils.py b/src/libecalc/infrastructure/file_utils.py index 4dc331e7a3..633e7975f7 100644 --- a/src/libecalc/infrastructure/file_utils.py +++ b/src/libecalc/infrastructure/file_utils.py @@ -9,7 +9,7 @@ from libecalc.common.datetime.utils import DateTimeFormats from libecalc.common.logger import logger -from libecalc.dto.result import ComponentResult, EcalcModelResult +from libecalc.presentation.json_result.result import ComponentResult, EcalcModelResult from libecalc.presentation.simple_result import SimpleResultData diff --git a/src/libecalc/presentation/json_result/__init__.py b/src/libecalc/presentation/json_result/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/libecalc/presentation/json_result/aggregators.py b/src/libecalc/presentation/json_result/aggregators.py index fce3e95645..801932624e 100644 --- a/src/libecalc/presentation/json_result/aggregators.py +++ b/src/libecalc/presentation/json_result/aggregators.py @@ -6,7 +6,7 @@ from libecalc.common.utils.rates import ( TimeSeriesBoolean, ) -from libecalc.dto.result.emission import PartialEmissionResult +from libecalc.presentation.json_result.result.emission import PartialEmissionResult class HasIsValid(Protocol): diff --git a/src/libecalc/presentation/json_result/mapper.py b/src/libecalc/presentation/json_result/mapper.py index eccd2575f5..5dfc70554d 100644 --- a/src/libecalc/presentation/json_result/mapper.py +++ b/src/libecalc/presentation/json_result/mapper.py @@ -5,8 +5,9 @@ from functools import reduce from typing import Any, Dict, List, Optional, Union +from pydantic import TypeAdapter + import libecalc -from libecalc import dto from libecalc.application.graph_result import GraphResult from libecalc.common.component_info.component_level import ComponentLevel from libecalc.common.component_info.compressor import CompressorPressureType @@ -29,20 +30,23 @@ from libecalc.core.result.emission import EmissionResult from libecalc.dto import CompressorSystemConsumerFunction from libecalc.dto.base import ComponentType -from libecalc.dto.result.emission import EmissionIntensityResult, PartialEmissionResult -from libecalc.dto.result.results import ( +from libecalc.expression import Expression +from libecalc.presentation.json_result.aggregators import ( + aggregate_emissions, + aggregate_is_valid, +) +from libecalc.presentation.json_result.result.emission import ( + EmissionIntensityResult, + PartialEmissionResult, +) +from libecalc.presentation.json_result.result.results import ( + AssetResult, CompressorModelResult, CompressorModelStageResult, CompressorStreamConditionResult, PumpModelResult, TurbineModelResult, ) -from libecalc.expression import Expression -from libecalc.presentation.json_result.aggregators import ( - aggregate_emissions, - aggregate_is_valid, -) -from pydantic import TypeAdapter def get_operational_setting_used_id(timestep: datetime, operational_settings_used: TimeSeriesInt) -> int: @@ -160,7 +164,9 @@ def _compute_intensity( return emission_intensities -def _to_full_result(emissions: Dict[str, PartialEmissionResult]) -> Dict[str, libecalc.dto.result.EmissionResult]: +def _to_full_result( + emissions: Dict[str, PartialEmissionResult] +) -> Dict[str, libecalc.presentation.json_result.result.EmissionResult]: """ From the partial result, generate cumulatives for the full emissions result per installation Args: @@ -170,7 +176,7 @@ def _to_full_result(emissions: Dict[str, PartialEmissionResult]) -> Dict[str, li """ return { - key: libecalc.dto.result.EmissionResult( + key: libecalc.presentation.json_result.result.EmissionResult( name=key, timesteps=emissions[key].timesteps, rate=emissions[key].rate, @@ -216,7 +222,7 @@ def _convert_to_timeseries( def _parse_emissions( emissions: Dict[str, EmissionResult], regularity: TimeSeriesFloat -) -> Dict[str, libecalc.dto.result.EmissionResult]: +) -> Dict[str, libecalc.presentation.json_result.result.EmissionResult]: """ Convert emissions from core result format to dto result format. @@ -229,7 +235,7 @@ def _parse_emissions( """ return { - key: libecalc.dto.result.EmissionResult( + key: libecalc.presentation.json_result.result.EmissionResult( name=key, timesteps=emissions[key].timesteps, rate=TimeSeriesRate.from_timeseries_stream_day_rate( @@ -266,8 +272,8 @@ def _compute_aggregated_power( def _evaluate_installations( - graph_result: GraphResult, variables_map: dto.VariablesMap -) -> List[libecalc.dto.result.InstallationResult]: + graph_result: GraphResult, variables_map: libecalc.dto.VariablesMap +) -> List[libecalc.presentation.json_result.result.InstallationResult]: """ All subcomponents have already been evaluated, here we basically collect and aggregate the results @@ -364,7 +370,7 @@ def _evaluate_installations( ) installation_results.append( - libecalc.dto.result.InstallationResult( + libecalc.presentation.json_result.result.InstallationResult( id=installation.id, name=installation_node_info.name, parent=asset.id, @@ -402,11 +408,11 @@ def _evaluate_installations( return installation_results -def get_asset_result(graph_result: GraphResult) -> dto.result.EcalcModelResult: +def get_asset_result(graph_result: GraphResult) -> libecalc.presentation.json_result.result.results.EcalcModelResult: asset_id = graph_result.graph.root asset = graph_result.graph.get_node(asset_id) - if not isinstance(asset, dto.Asset): + if not isinstance(asset, libecalc.dto.Asset): raise ProgrammingError("Need an asset graph to get asset result") installation_results = _evaluate_installations( @@ -956,7 +962,7 @@ def get_asset_result(graph_result: GraphResult) -> dto.result.EcalcModelResult: else: models.extend( [ - TypeAdapter(libecalc.dto.result.ConsumerModelResult).validate_python( + TypeAdapter(libecalc.presentation.json_result.result.ConsumerModelResult).validate_python( { **model.model_dump(), "parent": consumer_id, @@ -987,9 +993,9 @@ def get_asset_result(graph_result: GraphResult) -> dto.result.EcalcModelResult: ] ) - obj: libecalc.dto.result.ComponentResult + obj: libecalc.presentation.json_result.result.ComponentResult if consumer_node_info.component_type == ComponentType.GENERATOR_SET: - obj = dto.result.results.GeneratorSetResult( + obj = libecalc.presentation.json_result.result.results.GeneratorSetResult( name=consumer_node_info.name, parent=graph_result.graph.get_predecessor(consumer_id), component_level=consumer_node_info.component_level, @@ -1028,7 +1034,7 @@ def get_asset_result(graph_result: GraphResult) -> dto.result.EcalcModelResult: is_valid=consumer_result.component_result.is_valid, ) elif consumer_node_info.component_type == ComponentType.PUMP: - obj = dto.result.results.PumpResult( + obj = libecalc.presentation.json_result.result.results.PumpResult( name=consumer_node_info.name, parent=graph_result.graph.get_predecessor(consumer_id), component_level=consumer_node_info.component_level, @@ -1071,7 +1077,7 @@ def get_asset_result(graph_result: GraphResult) -> dto.result.EcalcModelResult: streams=consumer_result.component_result.streams, ) elif consumer_node_info.component_type == ComponentType.COMPRESSOR: - obj = dto.result.results.CompressorResult( + obj = libecalc.presentation.json_result.result.results.CompressorResult( name=consumer_node_info.name, parent=graph_result.graph.get_predecessor(consumer_id), component_level=consumer_node_info.component_level, @@ -1113,7 +1119,7 @@ def get_asset_result(graph_result: GraphResult) -> dto.result.EcalcModelResult: streams=consumer_result.component_result.streams, ) elif consumer_node_info.component_type == ComponentType.ASSET: - obj = dto.result.results.AssetResult( + obj = libecalc.presentation.json_result.result.results.AssetResult( name=consumer_node_info.name, parent=graph_result.graph.get_predecessor(consumer_id), component_level=consumer_node_info.component_level, @@ -1153,7 +1159,7 @@ def get_asset_result(graph_result: GraphResult) -> dto.result.EcalcModelResult: is_valid=consumer_result.component_result.is_valid, ) elif consumer_node_info.component_type == ComponentType.INSTALLATION: - obj = dto.result.results.InstallationResult( + obj = libecalc.presentation.json_result.result.results.InstallationResult( name=consumer_node_info.name, parent=graph_result.graph.get_predecessor(consumer_id), component_level=consumer_node_info.component_level, @@ -1190,7 +1196,7 @@ def get_asset_result(graph_result: GraphResult) -> dto.result.EcalcModelResult: is_valid=consumer_result.component_result.is_valid, ) elif consumer_node_info.component_type == ComponentType.CONSUMER_SYSTEM_V2: - obj = dto.result.ConsumerSystemResult( + obj = libecalc.presentation.json_result.result.ConsumerSystemResult( id=consumer_result.component_result.id, is_valid=consumer_result.component_result.is_valid, timesteps=consumer_result.component_result.timesteps, @@ -1236,7 +1242,7 @@ def get_asset_result(graph_result: GraphResult) -> dto.result.EcalcModelResult: if consumer_id in graph_result.emission_results else {} ) - obj = TypeAdapter(libecalc.dto.result.ComponentResult).validate_python( + obj = TypeAdapter(libecalc.presentation.json_result.result.ComponentResult).validate_python( { **consumer_result.component_result.model_dump(exclude={"typ"}), "name": consumer_node_info.name, @@ -1301,7 +1307,7 @@ def get_asset_result(graph_result: GraphResult) -> dto.result.EcalcModelResult: for venting_emitter in installation.venting_emitters: energy_usage = time_series_zero sub_components.append( - libecalc.dto.result.VentingEmitterResult( + libecalc.presentation.json_result.result.VentingEmitterResult( id=venting_emitter.id, name=venting_emitter.name, componentType=venting_emitter.component_type, @@ -1401,7 +1407,7 @@ def get_asset_result(graph_result: GraphResult) -> dto.result.EcalcModelResult: asset_energy_usage_cumulative = asset_energy_usage_core.to_volumes().cumulative() asset_node_info = graph_result.graph.get_node_info(asset_id) - asset_result_dto = libecalc.dto.result.AssetResult( + asset_result_dto = AssetResult( id=asset.id, name=asset_node_info.name, component_level=asset_node_info.component_level, @@ -1433,7 +1439,7 @@ def get_asset_result(graph_result: GraphResult) -> dto.result.EcalcModelResult: ) return Numbers.format_results_to_precision( - libecalc.dto.result.EcalcModelResult( + libecalc.presentation.json_result.result.results.EcalcModelResult( component_result=asset_result_dto, sub_components=sub_components, models=models, diff --git a/src/libecalc/dto/result/__init__.py b/src/libecalc/presentation/json_result/result/__init__.py similarity index 100% rename from src/libecalc/dto/result/__init__.py rename to src/libecalc/presentation/json_result/result/__init__.py diff --git a/src/libecalc/presentation/json_result/result/base.py b/src/libecalc/presentation/json_result/result/base.py new file mode 100644 index 0000000000..e617568c48 --- /dev/null +++ b/src/libecalc/presentation/json_result/result/base.py @@ -0,0 +1,13 @@ +from __future__ import annotations + +from pydantic import BaseModel, ConfigDict + +from libecalc.common.string.string_utils import to_camel_case + + +class EcalcResultBaseModel(BaseModel): + model_config = ConfigDict( + extra="forbid", + alias_generator=to_camel_case, + populate_by_name=True, + ) diff --git a/src/libecalc/dto/result/emission.py b/src/libecalc/presentation/json_result/result/emission.py similarity index 95% rename from src/libecalc/dto/result/emission.py rename to src/libecalc/presentation/json_result/result/emission.py index 93cece727d..d5ab0601e6 100644 --- a/src/libecalc/dto/result/emission.py +++ b/src/libecalc/presentation/json_result/result/emission.py @@ -13,7 +13,9 @@ TimeSeriesVolumesCumulative, ) from libecalc.core.result.emission import EmissionResult as EmissionCoreResult -from libecalc.dto.result.tabular_time_series import TabularTimeSeries +from libecalc.presentation.json_result.result.tabular_time_series import ( + TabularTimeSeries, +) class EmissionResult(TabularTimeSeries): diff --git a/src/libecalc/dto/result/results.py b/src/libecalc/presentation/json_result/result/results.py similarity index 96% rename from src/libecalc/dto/result/results.py rename to src/libecalc/presentation/json_result/result/results.py index fa21fd43a0..16c5bd2bb1 100644 --- a/src/libecalc/dto/result/results.py +++ b/src/libecalc/presentation/json_result/result/results.py @@ -1,8 +1,8 @@ from __future__ import annotations -from operator import attrgetter from typing import Any, Dict, List, Literal, Optional, Union +from _operator import attrgetter from pydantic import Field, field_validator from pydantic_core.core_schema import ValidationInfo from typing_extensions import Annotated @@ -25,9 +25,14 @@ ) from libecalc.dto.base import ComponentType from libecalc.dto.models import SingleSpeedChart, VariableSpeedChart -from libecalc.dto.result.base import EcalcResultBaseModel -from libecalc.dto.result.emission import EmissionIntensityResult, EmissionResult -from libecalc.dto.result.tabular_time_series import TabularTimeSeries +from libecalc.presentation.json_result.result.base import EcalcResultBaseModel +from libecalc.presentation.json_result.result.emission import ( + EmissionIntensityResult, + EmissionResult, +) +from libecalc.presentation.json_result.result.tabular_time_series import ( + TabularTimeSeries, +) class NodeInfo(EcalcResultBaseModel): diff --git a/src/libecalc/dto/result/tabular_time_series.py b/src/libecalc/presentation/json_result/result/tabular_time_series.py similarity index 98% rename from src/libecalc/dto/result/tabular_time_series.py rename to src/libecalc/presentation/json_result/result/tabular_time_series.py index 403ee38d1e..8aec8552a4 100644 --- a/src/libecalc/dto/result/tabular_time_series.py +++ b/src/libecalc/presentation/json_result/result/tabular_time_series.py @@ -14,7 +14,7 @@ TimeSeriesRate, TimeSeriesVolumesCumulative, ) -from libecalc.dto.result.base import EcalcResultBaseModel +from libecalc.presentation.json_result.result.base import EcalcResultBaseModel class TabularTimeSeries(ABC, EcalcResultBaseModel): diff --git a/src/libecalc/presentation/simple_result/simple.py b/src/libecalc/presentation/simple_result/simple.py index a0b8338508..568d3fc841 100644 --- a/src/libecalc/presentation/simple_result/simple.py +++ b/src/libecalc/presentation/simple_result/simple.py @@ -1,20 +1,25 @@ from datetime import datetime from typing import Dict, List, NamedTuple, Optional, Tuple -from pydantic import ConfigDict, model_validator +from pydantic import BaseModel, ConfigDict, model_validator from libecalc.common.component_info.component_level import ComponentLevel from libecalc.common.errors.exceptions import ProgrammingError from libecalc.common.logger import logger +from libecalc.common.string.string_utils import to_camel_case from libecalc.common.units import Unit from libecalc.dto.base import ComponentType -from libecalc.dto.result import ComponentResult, EcalcModelResult -from libecalc.dto.result.base import EcalcResultBaseModel -from libecalc.dto.result.types import opt_float +from libecalc.presentation.json_result.result import ComponentResult, EcalcModelResult +opt_float = Optional[float] -class SimpleBase(EcalcResultBaseModel): - model_config = ConfigDict(extra="ignore") + +class SimpleBase(BaseModel): + model_config = ConfigDict( + extra="ignore", + alias_generator=to_camel_case, + populate_by_name=True, + ) class SimpleEmissionResult(SimpleBase): diff --git a/src/tests/ecalc_cli/test_cache.py b/src/tests/ecalc_cli/test_cache.py index 38497236a0..07a8d1197b 100644 --- a/src/tests/ecalc_cli/test_cache.py +++ b/src/tests/ecalc_cli/test_cache.py @@ -3,7 +3,7 @@ import pytest from ecalc_cli.io.cache import Cache, CacheData -from libecalc.dto.result import EcalcModelResult +from libecalc.presentation.json_result.result import EcalcModelResult @pytest.fixture diff --git a/src/tests/libecalc/dto/results/model/test_requested_pressures_compressors.py b/src/tests/libecalc/dto/results/model/test_requested_pressures_compressors.py index 5e4a98fd06..1c0a7b244e 100644 --- a/src/tests/libecalc/dto/results/model/test_requested_pressures_compressors.py +++ b/src/tests/libecalc/dto/results/model/test_requested_pressures_compressors.py @@ -6,8 +6,8 @@ from libecalc.application.graph_result import EcalcModelResult, GraphResult from libecalc.common.units import Unit from libecalc.common.utils.rates import TimeSeriesFloat -from libecalc.dto.result.results import CompressorModelResult from libecalc.presentation.json_result.mapper import get_asset_result +from libecalc.presentation.json_result.result.results import CompressorModelResult @pytest.fixture diff --git a/src/tests/libecalc/integration/test_minimal_is_valid.py b/src/tests/libecalc/integration/test_minimal_is_valid.py index 9be1fc223b..fb3540bf30 100644 --- a/src/tests/libecalc/integration/test_minimal_is_valid.py +++ b/src/tests/libecalc/integration/test_minimal_is_valid.py @@ -4,8 +4,8 @@ from libecalc.application.energy_calculator import EnergyCalculator from libecalc.application.graph_result import GraphResult from libecalc.dto import VariablesMap -from libecalc.dto.result import EcalcModelResult from libecalc.presentation.json_result.mapper import get_asset_result +from libecalc.presentation.json_result.result import EcalcModelResult @pytest.fixture diff --git a/src/tests/libecalc/presentation/exporter/test_ltp.py b/src/tests/libecalc/presentation/exporter/test_ltp.py index 31fc04db66..8e294e5fc9 100644 --- a/src/tests/libecalc/presentation/exporter/test_ltp.py +++ b/src/tests/libecalc/presentation/exporter/test_ltp.py @@ -10,7 +10,6 @@ from libecalc.common.time_utils import calculate_delta_days from libecalc.common.units import Unit from libecalc.common.utils.rates import RateType -from libecalc.dto.result.results import EcalcModelResult from libecalc.fixtures.cases import ltp_export, venting_emitters from libecalc.fixtures.cases.ltp_export.installation_setup import ( expected_boiler_fuel_consumption, @@ -48,6 +47,7 @@ venting_emitter_yaml_factory, ) from libecalc.presentation.json_result.mapper import get_asset_result +from libecalc.presentation.json_result.result import EcalcModelResult from libecalc.presentation.yaml.validation_errors import DtoValidationError from libecalc.presentation.yaml.yaml_keywords import EcalcYamlKeywords from libecalc.presentation.yaml.yaml_types.yaml_stream_conditions import ( diff --git a/src/tests/libecalc/presentation/json_result/test_aggregators.py b/src/tests/libecalc/presentation/json_result/test_aggregators.py index b40f0ac888..32f5b5e685 100644 --- a/src/tests/libecalc/presentation/json_result/test_aggregators.py +++ b/src/tests/libecalc/presentation/json_result/test_aggregators.py @@ -11,10 +11,10 @@ TimeSeriesStreamDayRate, ) from libecalc.core.result.emission import EmissionResult -from libecalc.dto.result.emission import PartialEmissionResult from libecalc.expression import Expression from libecalc.presentation.json_result.aggregators import aggregate_emissions from libecalc.presentation.json_result.mapper import get_asset_result +from libecalc.presentation.json_result.result.emission import PartialEmissionResult def get_installation(