Skip to content

Commit a828695

Browse files
committed
chore: add yaml definitions
Group reusable yaml under a definitions key
1 parent 5d91eae commit a828695

4 files changed

Lines changed: 43 additions & 26 deletions

File tree

src/libecalc/presentation/yaml/yaml_models/pyyaml_yaml_model.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from libecalc.presentation.yaml.yaml_models.exceptions import DuplicateKeyError, FileContext, YamlError
2727
from libecalc.presentation.yaml.yaml_models.yaml_model import YamlConfiguration, YamlValidator
2828
from libecalc.presentation.yaml.yaml_node import YamlDict, YamlList
29-
from libecalc.presentation.yaml.yaml_types.components.yaml_asset import YamlAsset
29+
from libecalc.presentation.yaml.yaml_types.components.yaml_asset import YamlAsset, YamlDefinitions
3030
from libecalc.presentation.yaml.yaml_types.components.yaml_installation import YamlInstallation
3131
from libecalc.presentation.yaml.yaml_types.facility_model.yaml_facility_model import YamlFacilityModel
3232
from libecalc.presentation.yaml.yaml_types.fuel_type.yaml_fuel_type import YamlFuelType
@@ -46,6 +46,7 @@
4646
from libecalc.presentation.yaml.yaml_validation_context import YamlModelValidationContext
4747

4848
# Top-level YAML keywords used only by experimental/new sections
49+
_DEFINITIONS_KEY = "DEFINITIONS"
4950
_PROCESS_UNITS_KEY = "PROCESS_UNITS"
5051
_PROCESS_PIPELINES_KEY = "PROCESS_PIPELINES"
5152
_INLET_STREAMS_KEY = "INLET_STREAMS"
@@ -54,10 +55,6 @@
5455
_ECALC_EVENTS_KEY = "ECALC_EVENTS"
5556
_PROCESS_EVENTS_KEY = "PROCESS_EVENTS"
5657
_PUMP_PROCESS_SIMULATIONS_KEY = "PUMP_PROCESS_SIMULATIONS"
57-
_NEW_SECTIONS_WITH_FILE_REFS: tuple[str, ...] = (
58-
"PROCESS_UNITS",
59-
"PROCESS_PIPELINES",
60-
)
6158
dt_adapter = TypeAdapter(datetime.datetime)
6259

6360

@@ -323,8 +320,14 @@ def facility_resource_names(self) -> list[str]:
323320
data.get(EcalcYamlKeywords.file) for data in resource_data if data.get(EcalcYamlKeywords.file) is not None
324321
]
325322

326-
# Pick up FILE references nested in the new YAML sections (PROCESS_UNITS, PROCESS_PIPELINES, ...).
327-
for section in _NEW_SECTIONS_WITH_FILE_REFS:
323+
# Pick up FILE references nested in the new YAML sections (DEFINITIONS.PROCESS_UNITS, PROCESS_PIPELINES, ...).
324+
definitions = (
325+
self._internal_datamodel.get(_DEFINITIONS_KEY, {}) if isinstance(self._internal_datamodel, dict) else {}
326+
)
327+
if isinstance(definitions, dict):
328+
for section in ("PROCESS_UNITS",):
329+
resource_names.extend(_find_file_references(definitions.get(section)))
330+
for section in ("PROCESS_PIPELINES",):
328331
resource_names.extend(_find_file_references(self._internal_datamodel.get(section)))
329332

330333
# Dedup while preserving order — the same CSV may be referenced by multiple charts.
@@ -451,16 +454,19 @@ def fluid_models(self) -> dict[str, YamlFluidModel]:
451454
return fluid_models
452455

453456
@property
454-
def process_units(self) -> dict[str, YamlProcessUnitDefinition]:
457+
def definitions(self) -> YamlDefinitions:
455458
process_units: dict[str, YamlProcessUnitDefinition] = {}
456-
raw = self._get_yaml_dict_or_empty(_PROCESS_UNITS_KEY)
459+
definitions = (
460+
self._internal_datamodel.get(_DEFINITIONS_KEY, {}) if isinstance(self._internal_datamodel, dict) else {}
461+
)
462+
raw = definitions.get(_PROCESS_UNITS_KEY, {}) if isinstance(definitions, dict) else {}
457463

458464
for name, unit_data in raw.items():
459465
try:
460466
process_units[name] = TypeAdapter(YamlProcessUnitDefinition).validate_python(unit_data)
461467
except PydanticValidationError:
462468
pass
463-
return process_units
469+
return YamlDefinitions(process_units=process_units)
464470

465471
@property
466472
def process_pipelines(self) -> dict[str, YamlProcessPipeline]:

src/libecalc/presentation/yaml/yaml_models/yaml_model.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
ResourceStream,
1212
)
1313
from libecalc.presentation.yaml.yaml_keywords import EcalcYamlKeywords
14-
from libecalc.presentation.yaml.yaml_types.components.yaml_asset import YamlAsset
14+
from libecalc.presentation.yaml.yaml_types.components.yaml_asset import YamlAsset, YamlDefinitions
1515
from libecalc.presentation.yaml.yaml_types.components.yaml_installation import YamlInstallation
1616
from libecalc.presentation.yaml.yaml_types.facility_model.yaml_facility_model import YamlFacilityModel
1717
from libecalc.presentation.yaml.yaml_types.fuel_type.yaml_fuel_type import YamlFuelType
@@ -23,7 +23,6 @@
2323
YamlProcessSimulation,
2424
YamlPumpProcessSimulation,
2525
)
26-
from libecalc.presentation.yaml.yaml_types.process.yaml_process_units import YamlProcessUnitDefinition
2726
from libecalc.presentation.yaml.yaml_types.streams.yaml_inlet_stream import YamlInletStream
2827
from libecalc.presentation.yaml.yaml_types.time_series.yaml_time_series import (
2928
YamlTimeSeriesCollection,
@@ -90,7 +89,7 @@ def inlet_streams(self) -> dict[str, YamlInletStream]:
9089

9190
@property
9291
@abc.abstractmethod
93-
def process_units(self) -> dict[str, YamlProcessUnitDefinition]:
92+
def definitions(self) -> YamlDefinitions:
9493
pass
9594

9695
@property

src/libecalc/presentation/yaml/yaml_reference_service.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737

3838
YamlModel = YamlConsumerModel | YamlFacilityModel
3939

40-
ReferenceType = (
40+
type ReferenceType = (
4141
YamlModel
4242
| YamlFuelType
4343
| YamlInletStream
@@ -77,7 +77,7 @@ def _model_parsing_order(model: YamlModel) -> int:
7777
raise EcalcError(title="Invalid model", message=msg) from e
7878

7979

80-
Reference = str
80+
type Reference = str
8181

8282

8383
class YamlReferenceService(ReferenceService):
@@ -111,10 +111,8 @@ def __init__(
111111
references[stream.name] = stream
112112
reference_yaml_context[stream.name] = stream_path
113113

114-
process_units_path = YamlPath(keys=("PROCESS_UNITS",))
115-
for process_unit_key, process_unit in configuration.process_units.items():
116-
# TODO: We have both a name attribute (on compressor only) and they key in the dict
117-
# It is unnecessary to have both atm, so just using key for now
114+
process_units_path = YamlPath(keys=("DEFINITIONS", "PROCESS_UNITS"))
115+
for process_unit_key, process_unit in configuration.definitions.process_units.items():
118116
process_unit_path = process_units_path.append(process_unit_key)
119117
references[process_unit_key] = process_unit
120118
reference_yaml_context[process_unit_key] = process_unit_path

src/libecalc/presentation/yaml/yaml_types/components/yaml_asset.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,32 @@
2222
from libecalc.presentation.yaml.yaml_validation_context import YamlModelValidationContextNames
2323

2424

25+
class YamlDefinitions(YamlBase):
26+
"""Definitions section of an eCalc™ yaml file, containing reusable definitions."""
27+
28+
model_config = ConfigDict(
29+
title="Definitions",
30+
)
31+
32+
process_units: dict[str, YamlProcessUnitDefinition] = Field(
33+
default_factory=dict,
34+
title="PROCESS_UNITS",
35+
description="Defines process units used in PROCESS_PIPELINES.",
36+
)
37+
38+
2539
class YamlAsset(YamlBase):
2640
"""An eCalc™ yaml file"""
2741

2842
model_config = ConfigDict(
2943
title="Asset",
3044
)
3145

46+
definitions: YamlDefinitions = Field(
47+
default_factory=YamlDefinitions,
48+
title="DEFINITIONS",
49+
description="Contains reusable definitions such as process units.",
50+
)
3251
time_series: list[YamlTimeSeriesCollection] = Field(
3352
default_factory=list,
3453
title="TIME_SERIES",
@@ -69,11 +88,6 @@ class YamlAsset(YamlBase):
6988
description="Defines variables used in an energy usage model by means of expressions or constants."
7089
"\n\n$ECALC_DOCS_KEYWORDS_URL/VARIABLES",
7190
)
72-
process_units: dict[str, YamlProcessUnitDefinition] = Field(
73-
default_factory=dict,
74-
title="PROCESS_UNITS",
75-
description="Defines process units used in PROCESS_PIPELINES.",
76-
)
7791
process_pipelines: dict[str, YamlProcessPipeline] = Field(
7892
default_factory=dict,
7993
title="PROCESS_PIPELINES",
@@ -188,8 +202,8 @@ def validate_unique_references(self):
188202
if self.process_pipelines is not None:
189203
references.extend(self.process_pipelines.keys())
190204

191-
if self.process_units is not None:
192-
references.extend(self.process_units.keys())
205+
if self.definitions and self.definitions.process_units is not None:
206+
references.extend(self.definitions.process_units.keys())
193207

194208
if self.process_simulations is not None:
195209
for process_simulation in self.process_simulations:

0 commit comments

Comments
 (0)