From 312c9d82f69b245748254331b3a392fb94c99c8e Mon Sep 17 00:00:00 2001 From: nc9 Date: Tue, 26 May 2026 09:14:31 +1000 Subject: [PATCH] feat(models): expose fueltech and renewable columns on TimeSeriesColumns MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When calling get_network_data with secondary_grouping='fueltech' or secondary_grouping='renewable', the API returns the grouping value in the result's columns object — but the SDK model only declared unit_code/fueltech_group/network_region, dropping these on parse. Add fueltech: str | None and renewable: bool | None so users can read the grouping from columns directly instead of parsing it out of the series name. --- openelectricity/models/timeseries.py | 9 +++++++- tests/models/test_timeseries.py | 33 ++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/openelectricity/models/timeseries.py b/openelectricity/models/timeseries.py index dbe7a45..ce93468 100644 --- a/openelectricity/models/timeseries.py +++ b/openelectricity/models/timeseries.py @@ -31,10 +31,17 @@ def value(self) -> float | None: class TimeSeriesColumns(BaseModel): - """Column metadata for time series results.""" + """Column metadata for time series results. + + Populated according to the ``secondary_grouping`` used in the request: + ``fueltech`` / ``fueltech_group`` / ``renewable`` / ``unit_code`` / + ``network_region``. + """ unit_code: str | None = None + fueltech: str | None = None fueltech_group: str | None = None + renewable: bool | None = None network_region: str | None = None diff --git a/tests/models/test_timeseries.py b/tests/models/test_timeseries.py index 61b4efe..e6471f5 100644 --- a/tests/models/test_timeseries.py +++ b/tests/models/test_timeseries.py @@ -195,3 +195,36 @@ def test_invalid_interval(): "network_timezone_offset": "+10:00", } ) + + +def test_columns_fueltech_populated_when_grouping_by_fueltech() -> None: + """secondary_grouping=fueltech sets the fueltech column (issue surfaced + while validating #8).""" + result = TimeSeriesResult.model_validate( + { + "name": "energy_solar_rooftop", + "date_start": "2026-05-22T00:00:00+10:00", + "date_end": "2026-05-23T00:00:00+10:00", + "columns": {"fueltech": "solar_rooftop"}, + "data": [["2026-05-22T00:00:00+10:00", 48000.0]], + } + ) + assert result.columns.fueltech == "solar_rooftop" + assert result.columns.fueltech_group is None + assert result.columns.renewable is None + + +def test_columns_renewable_populated_when_grouping_by_renewable() -> None: + """secondary_grouping=renewable sets the renewable boolean column.""" + result = TimeSeriesResult.model_validate( + { + "name": "energy_True", + "date_start": "2026-05-22T00:00:00+10:00", + "date_end": "2026-05-23T00:00:00+10:00", + "columns": {"renewable": True}, + "data": [["2026-05-22T00:00:00+10:00", 250000.0]], + } + ) + assert result.columns.renewable is True + assert result.columns.fueltech is None + assert result.columns.fueltech_group is None