From df34a30517a090b7bcb52b357c8532160ace18e0 Mon Sep 17 00:00:00 2001 From: KULcoder Date: Tue, 17 Feb 2026 15:01:17 -0800 Subject: [PATCH 1/5] fix: trying to solve the wind model issue --- src/geodata/model/_base.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/geodata/model/_base.py b/src/geodata/model/_base.py index 7589c8c..713a1a1 100644 --- a/src/geodata/model/_base.py +++ b/src/geodata/model/_base.py @@ -345,6 +345,8 @@ def prepare(self, force: bool = False): result.ref_files, engine=engine, parallel=parallel, + combine="nested", + concat_dim="time", ) as ds: prepared_ds = self._prepare_dataset(ds) result.register(prepared_ds) From 75844466454b94c47e5740483ae937a39debe2a5 Mon Sep 17 00:00:00 2001 From: KULcoder Date: Wed, 18 Feb 2026 12:51:35 -0800 Subject: [PATCH 2/5] Revert "fix: trying to solve the wind model issue" This reverts commit df34a30517a090b7bcb52b357c8532160ace18e0. --- src/geodata/model/_base.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/geodata/model/_base.py b/src/geodata/model/_base.py index 713a1a1..7589c8c 100644 --- a/src/geodata/model/_base.py +++ b/src/geodata/model/_base.py @@ -345,8 +345,6 @@ def prepare(self, force: bool = False): result.ref_files, engine=engine, parallel=parallel, - combine="nested", - concat_dim="time", ) as ds: prepared_ds = self._prepare_dataset(ds) result.register(prepared_ds) From 29eb06aba3f701f0f0577ef1438dd3b1640fe177 Mon Sep 17 00:00:00 2001 From: KULcoder Date: Wed, 18 Mar 2026 16:49:23 -0700 Subject: [PATCH 3/5] fix: fixing the coordinate problem with pvlib model and the wind model --- src/geodata/model/pvlib/_base.py | 38 ++++++++++++++++++---- src/geodata/model/wind/interpolate.py | 47 ++++++++++++++++++--------- tests/pr/test_era5_windsolar.py | 23 +++++++++++++ 3 files changed, 87 insertions(+), 21 deletions(-) diff --git a/src/geodata/model/pvlib/_base.py b/src/geodata/model/pvlib/_base.py index 6cbc898..521fd7e 100644 --- a/src/geodata/model/pvlib/_base.py +++ b/src/geodata/model/pvlib/_base.py @@ -434,8 +434,24 @@ def _process_single_coordinate(args): 'eta': eta } progress_dict['should_log'] = True - - return (y, x), subset + + # Re-pack results into a MultiIndex so that + # xr.Dataset.from_dataframe() reconstructs x and y as dimensions. + # + # `subset` is currently indexed only by `time` (x/y were reset into columns), + # which would otherwise cause the output to have only `time` as a coordinate. + subset_out = subset[['ac', 'pv']].copy() + subset_out = subset_out.assign(y=y, x=x) + subset_out = subset_out.reset_index() + + # After reset_index(), the time column name can vary (e.g. 'time' vs 'index'). + if subset.index.name is None: + subset_out = subset_out.rename(columns={'index': 'time'}) + elif subset.index.name != 'time': + subset_out = subset_out.rename(columns={subset.index.name: 'time'}) + + subset_out = subset_out.set_index(['time', 'x', 'y']) + return (y, x), subset_out except Exception as e: logger.error(f"Error processing coordinate ({y}, {x}): {str(e)}") @@ -444,8 +460,9 @@ def _process_single_coordinate(args): class Pvlib(BaseModel): """The pvlib model""" - - type: str = "pvlib" + @property + def type(self) -> str: + return "pvlib" SUPPORTED_WEATHER_DATA_CONFIGS = ("wind_solar_hourly",) @@ -739,6 +756,11 @@ def estimate(self, if 'time' in combined_result.coords: combined_result = combined_result.sortby('time') + # Standardize output dimension order across models: + # `("time", "x", "y")`. + desired_order = ("time", "x", "y") + if all(d in combined_result.dims for d in desired_order): + combined_result = combined_result.transpose(*desired_order) return combined_result def _prepare_pvlib_ds(self, ds: xr.Dataset, *varnames: str) -> xr.Dataset: @@ -1069,9 +1091,13 @@ def progress_monitor(): f"({elapsed_total/total_coords:.2f}s per coordinate on average)" ) - weather_data_final = pd.concat(coord_subsets) + weather_data_final = pd.concat(coord_subsets).sort_index() - return xr.Dataset.from_dataframe(weather_data_final) + out = xr.Dataset.from_dataframe(weather_data_final) + desired_order = ("time", "x", "y") + if all(d in out.dims for d in desired_order): + out = out.transpose(*desired_order) + return out def _prepare_dataset(self, source: xr.Dataset) -> xr.Dataset: """This will never be called, but must be implemented (abstract method).""" diff --git a/src/geodata/model/wind/interpolate.py b/src/geodata/model/wind/interpolate.py index 76cb2c5..f16e568 100644 --- a/src/geodata/model/wind/interpolate.py +++ b/src/geodata/model/wind/interpolate.py @@ -15,6 +15,7 @@ import logging from typing import Hashable +from typing import cast import numpy as np import scipy.interpolate as sinterp @@ -196,8 +197,8 @@ def _splev_ker(c: np.ndarray, t: np.ndarray, k: int, height: np.ndarray) -> np.n return np.atleast_1d(sinterp.splev(height, (t, c, k))) -def _splev(da: xr.DataArray, height: float) -> xr.DataArray: - height = np.atleast_1d(height) +def _splev(da: xr.Dataset, height: float) -> xr.DataArray: + height_arr = np.atleast_1d(height) return xr.apply_ufunc( _splev_ker, da["c"], @@ -206,7 +207,7 @@ def _splev(da: xr.DataArray, height: float) -> xr.DataArray: vectorize=True, dask="parallelized", output_dtypes=[da["c"].dtype], - kwargs={"t": da.attrs["t"], "k": da.attrs["k"], "height": height}, + kwargs={"t": da.attrs["t"], "k": da.attrs["k"], "height": height_arr}, ) @@ -226,11 +227,11 @@ class WindInterpolationModel(WindBaseModel): >>> model.estimate(height=12, xs=slice(1, 2), ys=slice(1, 2), years=slice(2010, 2010), months=slice(1, 2)) """ - SUPPORTED_WEATHER_DATA_CONFIGS = {"wind_3d_hourly"} + SUPPORTED_WEATHER_DATA_CONFIGS = ("wind_3d_hourly",) def _prepare_dataset( self, - ds: xr.Dataset, + source: xr.Dataset, half_precision: bool = True, ) -> xr.Dataset: """Compute wind speed using the ERA5 3D dataset. @@ -244,20 +245,20 @@ def _prepare_dataset( """ assert ( - "model_level" in ds.coords + "model_level" in source.coords ), "Dataset does not contain model levels. Please double-check the dataset." - ds.coords["model_level"] = np.array( - [LEVEL_TO_HEIGHT[int(level)] for level in ds["model_level"].values] + source.coords["model_level"] = np.array( + [LEVEL_TO_HEIGHT[int(level)] for level in source["model_level"].values] ) - ds = ( - ds.rename({"model_level": "height"}) + source = ( + source.rename({"model_level": "height"}) .transpose("height", ...) .sortby("height") ) - logger.debug("Shape of heights: %s", ds["height"].shape) - speeds = (ds["u"] ** 2 + ds["v"] ** 2) ** 0.5 + logger.debug("Shape of heights: %s", source["height"].shape) + speeds = (source["u"] ** 2 + source["v"] ** 2) ** 0.5 logger.debug(f"[_prepare_dataset] Computed speeds, shape: {speeds.shape}, dims: {speeds.dims}, " f"is dask: {isinstance(speeds.data, array_type('dask'))}") @@ -269,7 +270,23 @@ def _prepare_dataset( return params - def _estimate_dataset(self, params: xr.Dataset, height: float) -> xr.Dataset: + def _estimate_dataset(self, params: xr.Dataset, **kwargs) -> xr.DataArray: + height = float(kwargs["height"]) params = params.transpose("height", ...) - params = rechunk_dataset(params, force_full_chunk_dims=["height"]) - return _splev(params, height) + params = cast( + xr.Dataset, + rechunk_dataset(params, force_full_chunk_dims=["height"]), + ) + result = _splev(params, height) + + # Some upstream ERA5 pipelines historically use `valid_time` for the time-like + # coordinate. Normalize to `time` so we can enforce consistent dims. + if "valid_time" in result.dims or "valid_time" in result.coords: + result = result.rename({"valid_time": "time"}) + + # Standardize output dimension order across wind models: + # `("time", "x", "y")` (wind interpolation should match pvlib). + desired_order = ("time", "x", "y") + if all(d in result.dims for d in desired_order): + result = result.transpose(*desired_order) + return result diff --git a/tests/pr/test_era5_windsolar.py b/tests/pr/test_era5_windsolar.py index d8d6edc..2f6646c 100644 --- a/tests/pr/test_era5_windsolar.py +++ b/tests/pr/test_era5_windsolar.py @@ -21,6 +21,7 @@ from geodata.datasets import load_dataset from geodata.logging import logger from geodata.model.pvlib import Pvlib +from geodata.model.wind import WindInterpolationModel # Set logger to DEBUG level to see all debug messages logger.setLevel(logging.DEBUG) @@ -107,6 +108,28 @@ def test_wind_solar_workflow(): assert ac_power_and_pv_capacity_global is not None, "Capacity factor estimation should return a result" assert isinstance(ac_power_and_pv_capacity_global, (xr.DataArray, xr.Dataset)), \ "Capacity factor should be an xarray DataArray or Dataset" + + # pvlib output should preserve spatial dimensions like the wind models. + # We enforce the exact dimension order: ("time", "x", "y"). + assert list(ac_power_and_pv_capacity_global.dims) == ['time', 'x', 'y'], \ + "pvlib output dims must be ordered exactly as (time, x, y)" + + # Also enforce the same dim order for wind interpolation output. + wind_ds_cls = load_dataset("wind_3d_hourly") + wind_ds = wind_ds_cls(years=years, months=months, testing=True) + wind_ds.download() + assert wind_ds.downloaded, "Wind dataset should be downloaded successfully" + + wind_model = WindInterpolationModel(wind_ds) + wind_model.prepare() + + wind_speed = wind_model.estimate( + years=years, months=months, xs=xs, ys=ys, height=12 + ) + assert list(wind_speed.dims) == ['time', 'x', 'y'], \ + "windinterpolation output dims must be ordered exactly as (time, x, y)" + assert 'valid_time' not in wind_speed.dims and 'valid_time' not in wind_speed.coords, \ + "windinterpolation output must use `time` (not `valid_time`)" # TODO: design correct output test specific regard to the pvlib output From 37cad4ba87b0266e5a51e1dc06e990ca872ecdaa Mon Sep 17 00:00:00 2001 From: KULcoder Date: Sat, 18 Apr 2026 14:47:17 -0700 Subject: [PATCH 4/5] feat: removing the dependency to for api to download dataset, using a fixture instead --- .../offline-era5-fixture-datasets.md | 82 ++++++++ docs/source/index.rst | 7 + src/geodata/datasets/era5/__init__.py | 4 +- src/geodata/datasets/era5/fixture.py | 145 ++++++++++++++ src/geodata/model/_base.py | 5 +- src/geodata/model/pvlib/_base.py | 2 +- src/geodata/model/wind/interpolate.py | 2 +- .../era5/wind_3d_hourly_test/2016/01/01.nc | Bin 0 -> 100751 bytes .../era5/wind_solar_hourly_test/2016/01.nc | Bin 0 -> 199111 bytes tests/pr/test_era5_wind3d.py | 107 +++++----- tests/pr/test_era5_windsolar.py | 188 ++++++++---------- 11 files changed, 377 insertions(+), 165 deletions(-) create mode 100644 docs/source/development/offline-era5-fixture-datasets.md create mode 100644 src/geodata/datasets/era5/fixture.py create mode 100644 tests/fixtures/era5/wind_3d_hourly_test/2016/01/01.nc create mode 100644 tests/fixtures/era5/wind_solar_hourly_test/2016/01.nc diff --git a/docs/source/development/offline-era5-fixture-datasets.md b/docs/source/development/offline-era5-fixture-datasets.md new file mode 100644 index 0000000..74018c3 --- /dev/null +++ b/docs/source/development/offline-era5-fixture-datasets.md @@ -0,0 +1,82 @@ +# Offline ERA5 fixture datasets (`*_test` weather configs) + +This document records the **design and implementation plan** for small, committed NetCDF fixtures used in automated tests—without calling the CDS API or relying on `DATASET_ROOT_PATH` downloads. + +## Goals + +- Ship **minimal** ERA5-shaped files in the repository for CI and local testing. +- Expose them via **`load_dataset("…_test")`** so code paths mirror production (`wind_3d_hourly`, `wind_solar_hourly`) while staying **offline**. +- Avoid coupling tests to arbitrary year/month ranges: fixture datasets should use a **fixed catalog** (typically a single file) even if `BaseDataset.__init__` still requires `years` / `months` arguments (those values can be **ignored** for catalog construction in test configs). + +## Non-goals + +- The legacy **`geodata.dataset.Dataset`** (`module=` + `weather_data_config=` dict) is **not** in scope; the plan targets **`load_dataset` + `BaseDataset` subclasses** used by models and current tests. + +## Current fixture layout (repository) + +Fixtures live under **`tests/fixtures/`** so they stay close to pytest and do not inflate the installable package unless explicitly packaged later. + +| Test weather config (planned) | Mirrors production config | On-disk layout under `tests/fixtures/era5/` | +|-------------------------------|---------------------------|---------------------------------------------| +| `wind_3d_hourly_test` | `wind_3d_hourly` (`frequency="daily"`) | `wind_3d_hourly_test/2016/01/01.nc` | +| `wind_solar_hourly_test` | `wind_solar_hourly` (default `frequency="monthly"`) | `wind_solar_hourly_test/2016/01.nc` | + +Production datasets store files under: + +`DATASET_ROOT_PATH / / / …` + +with: + +- **Daily** (3D wind): `…///.nc` +- **Monthly** (wind/solar hourly): `…//.nc` + +The fixture tree **matches those relative paths** so `AtomicDataset.path` resolution stays aligned with the real datasets. + +## Registry and naming + +- Each test variant is a **`BaseDataset` subclass** with `weather_config = "wind_3d_hourly_test"` or `"wind_solar_hourly_test"`. +- Subclasses are registered automatically via `BaseDataset.__init_subclass__` into `geodata.datasets.registry`. +- Callers use **`load_dataset("wind_3d_hourly_test")`** (same pattern as production). + +## Behavioral contract + +### Storage root + +Fixture classes should set **`storage_root`** to the directory that contains the fixture tree for that config—for example, the absolute path to `tests/fixtures/era5/wind_3d_hourly_test` resolved at runtime (repo-relative or via `importlib.resources` if fixtures are ever packaged). + +### Catalog + +Override **`catalog`** so it returns **only** the `AtomicDataset` entries that refer to committed files (commonly **one** file): + +- 3D wind: one daily file, e.g. `(year=2016, month=1, day=1)` → `…/2016/01/01.nc` +- Wind/solar: one monthly file, e.g. `(year=2016, month=1)` → `…/2016/01.nc` + +Constructor arguments **`years` / `months`** may remain required by `BaseDataset.__init__` but **need not drive** the fixture catalog. + +### Download + +- **`download()`** must **not** call CDS: implement as a no-op or raise a clear error if invoked. +- **`_download_file`** should not perform network I/O. + +### Prepared state + +`downloaded` should become **`True`** when fixture files exist (the default `_check_downloaded()` loop over `catalog` is sufficient if paths resolve correctly). + +## Models and `SUPPORTED_WEATHER_DATA_CONFIGS` + +`BaseModel` validates both **`weather_config`** and **`source.downloaded`**. Any model that should run on fixtures must **allow** the `*_test` config names—e.g. extend `SUPPORTED_WEATHER_DATA_CONFIGS` on `WindInterpolationModel`, pvlib-related models, and any other entry points used in tests—to include `wind_3d_hourly_test` / `wind_solar_hourly_test` (or document a single shared alias strategy). + +## Implementation checklist + +1. Add **`ERA5Wind3DHourlyTestDataset`** / **`ERA5WindSolarHourlyTestDataset`** (names may vary) beside the existing ERA5 hourly classes, or in a small `fixture.py` module imported from `era5` packages so subclasses register on import. +2. Wire **`storage_root`** to `tests/fixtures/era5//` (resolve path robustly from the repo root or test layout). +3. Override **`catalog`** to the fixed fixture file(s); ignore user `years`/`months` for catalog purposes (documented). +4. Override **`download`** / **`_download_file`** to prevent CDS usage. +5. Update **`SUPPORTED_WEATHER_DATA_CONFIGS`** on affected models. +6. Add or adjust tests: `load_dataset("…_test")`, assert `downloaded`, **no** `download()`, then run the intended model or pipeline assertion. + +## References (code) + +- Registry: `geodata.datasets._base.BaseDataset.__init_subclass__` +- Paths: `AtomicDataset.path` in `geodata.datasets._base` +- Legacy downloader: `geodata.dataset.Dataset` (separate from this plan) diff --git a/docs/source/index.rst b/docs/source/index.rst index 8683603..9c19e82 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -65,6 +65,13 @@ Welcome to Geodata's documentation! .. application/* +.. toctree:: + :maxdepth: 1 + :caption: Development + :hidden: + + development/offline-era5-fixture-datasets + .. toctree:: :maxdepth: 1 :caption: API Reference diff --git a/src/geodata/datasets/era5/__init__.py b/src/geodata/datasets/era5/__init__.py index 1a1d476..a1afc8b 100644 --- a/src/geodata/datasets/era5/__init__.py +++ b/src/geodata/datasets/era5/__init__.py @@ -13,6 +13,6 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -from . import wind_3d, wind_solar +from . import fixture, wind_3d, wind_solar -__all__ = ["wind_3d", "wind_solar"] +__all__ = ["fixture", "wind_3d", "wind_solar"] diff --git a/src/geodata/datasets/era5/fixture.py b/src/geodata/datasets/era5/fixture.py new file mode 100644 index 0000000..28f58d0 --- /dev/null +++ b/src/geodata/datasets/era5/fixture.py @@ -0,0 +1,145 @@ +# Copyright 2025 Michael Davidson (UCSD), Xiqiang Liu (UCSD), Keyu Long (UCSD) + +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +"""Offline ERA5 datasets backed by committed NetCDF files under ``tests/fixtures/``. + +On construction, small template files are **copied** into +``DATASET_ROOT_PATH / era5 / / …`` so paths stay compatible with +model code that uses :meth:`~geodata.model.results.BaseModelResult.ref_path`. + +Importing this module registers ``wind_3d_hourly_test`` and ``wind_solar_hourly_test`` +in :data:`geodata.datasets.registry`. +""" + +from __future__ import annotations + +import logging +import shutil +from pathlib import Path + +from geodata.config import DATASET_ROOT_PATH + +from .._base import AtomicDataset +from .wind_3d.hourly import ERA5Wind3DHourlyDataset +from .wind_solar.hourly import ERA5WindSolarHourlyDataset + +logger = logging.getLogger(__name__) + +# Paths must match tests/fixtures/era5//... +_FIXTURE_YEAR = 2016 +_FIXTURE_MONTH = 1 +_FIXTURE_DAY = 1 + + +def _resolve_fixture_root(config_dirname: str) -> Path: + """Return ``tests/fixtures/era5/`` by walking parents of this file. + + Works for editable installs where the repo contains ``tests/fixtures``. Wheel-only + installs without that tree raise ``FileNotFoundError``. + """ + here = Path(__file__).resolve() + for root in [here.parent, *here.parents]: + candidate = root / "tests" / "fixtures" / "era5" / config_dirname + if candidate.is_dir(): + return candidate + raise FileNotFoundError( + f"Could not find tests/fixtures/era5/{config_dirname} starting from {here}. " + "Offline fixture datasets need the repository tests/fixtures tree (e.g. editable install)." + ) + + +def _copy_fixture_into_storage(template_root: Path, storage_root: Path, relative: Path) -> None: + src = template_root / relative + if not src.is_file(): + raise FileNotFoundError(f"Expected fixture NetCDF at {src}") + dest = storage_root / relative + dest.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(src, dest) + + +class ERA5Wind3DHourlyTestDataset(ERA5Wind3DHourlyDataset): + """Same schema as :class:`ERA5Wind3DHourlyDataset`, but points at a single local file. + + ``years`` / ``months`` passed to :meth:`__init__` do not expand the catalog; the + catalog is always the fixture for ``{_FIXTURE_YEAR}/{_FIXTURE_MONTH:02d}/{_FIXTURE_DAY:02d}.nc``. + """ + + weather_config = "wind_3d_hourly_test" + + def _extra_setup(self, **kwargs): + template_root = _resolve_fixture_root("wind_3d_hourly_test") + self.storage_root = DATASET_ROOT_PATH / self.module / self.weather_config + rel = ( + Path(str(_FIXTURE_YEAR)) + / f"{_FIXTURE_MONTH:02d}" + / f"{_FIXTURE_DAY:02d}.nc" + ) + _copy_fixture_into_storage(template_root, self.storage_root, rel) + + @property + def catalog(self) -> list[AtomicDataset]: + return [AtomicDataset(self, _FIXTURE_YEAR, _FIXTURE_MONTH, _FIXTURE_DAY)] + + def get_monthly_catalog(self, year: int, month: int) -> list[AtomicDataset]: + """Only the committed fixture day exists under ``ref_path``; do not list full month.""" + if not isinstance(year, int): + raise ValueError("year must be an integer") + if not isinstance(month, int): + raise ValueError("month must be an integer") + if not 1 <= month <= 12: + raise ValueError("month must be between 1 and 12") + if not self.years.start <= year <= self.years.stop: + raise ValueError( + f"year must be between {self.years.start} and {self.years.stop}" + ) + if not self.months.start <= month <= self.months.stop: + raise ValueError( + f"month must be between {self.months.start} and {self.months.stop}" + ) + if year == _FIXTURE_YEAR and month == _FIXTURE_MONTH: + return [AtomicDataset(self, year, month, _FIXTURE_DAY)] + return [] + + def _download_file(self, file: AtomicDataset): + raise RuntimeError( + f"{self.weather_config} uses committed fixtures under tests/fixtures; download is disabled." + ) + + +class ERA5WindSolarHourlyTestDataset(ERA5WindSolarHourlyDataset): + """Same schema as :class:`ERA5WindSolarHourlyDataset`, but points at one monthly fixture file.""" + + weather_config = "wind_solar_hourly_test" + + def _extra_setup(self, **kwargs): + template_root = _resolve_fixture_root("wind_solar_hourly_test") + self.storage_root = DATASET_ROOT_PATH / self.module / self.weather_config + rel = Path(str(_FIXTURE_YEAR)) / f"{_FIXTURE_MONTH:02d}.nc" + _copy_fixture_into_storage(template_root, self.storage_root, rel) + + @property + def catalog(self) -> list[AtomicDataset]: + return [AtomicDataset(self, _FIXTURE_YEAR, _FIXTURE_MONTH)] + + def _download_file(self, file: AtomicDataset): + raise RuntimeError( + f"{self.weather_config} uses committed fixtures under tests/fixtures; download is disabled." + ) + + +__all__ = [ + "ERA5Wind3DHourlyTestDataset", + "ERA5WindSolarHourlyTestDataset", +] diff --git a/src/geodata/model/_base.py b/src/geodata/model/_base.py index 7589c8c..4c301f6 100644 --- a/src/geodata/model/_base.py +++ b/src/geodata/model/_base.py @@ -19,7 +19,8 @@ import os import platform import shutil -from typing import Optional +from collections.abc import Collection +from typing import ClassVar, Optional import xarray as xr from tqdm.auto import tqdm @@ -158,7 +159,7 @@ class BaseModel(abc.ABC): **kwargs: Additional keyword arguments to pass to the model. """ - SUPPORTED_WEATHER_DATA_CONFIGS: tuple[str] + SUPPORTED_WEATHER_DATA_CONFIGS: ClassVar[Collection[str]] def __init__(self, source: BaseDataset, **kwargs): if source.weather_config not in self.SUPPORTED_WEATHER_DATA_CONFIGS: diff --git a/src/geodata/model/pvlib/_base.py b/src/geodata/model/pvlib/_base.py index 521fd7e..13bb680 100644 --- a/src/geodata/model/pvlib/_base.py +++ b/src/geodata/model/pvlib/_base.py @@ -464,7 +464,7 @@ class Pvlib(BaseModel): def type(self) -> str: return "pvlib" - SUPPORTED_WEATHER_DATA_CONFIGS = ("wind_solar_hourly",) + SUPPORTED_WEATHER_DATA_CONFIGS = ("wind_solar_hourly", "wind_solar_hourly_test") @property def prepared(self) -> bool: diff --git a/src/geodata/model/wind/interpolate.py b/src/geodata/model/wind/interpolate.py index f16e568..28f96fd 100644 --- a/src/geodata/model/wind/interpolate.py +++ b/src/geodata/model/wind/interpolate.py @@ -227,7 +227,7 @@ class WindInterpolationModel(WindBaseModel): >>> model.estimate(height=12, xs=slice(1, 2), ys=slice(1, 2), years=slice(2010, 2010), months=slice(1, 2)) """ - SUPPORTED_WEATHER_DATA_CONFIGS = ("wind_3d_hourly",) + SUPPORTED_WEATHER_DATA_CONFIGS = ("wind_3d_hourly", "wind_3d_hourly_test") def _prepare_dataset( self, diff --git a/tests/fixtures/era5/wind_3d_hourly_test/2016/01/01.nc b/tests/fixtures/era5/wind_3d_hourly_test/2016/01/01.nc new file mode 100644 index 0000000000000000000000000000000000000000..1fa4d084209a9d095a50606e3ec0b71c0ef8b373 GIT binary patch literal 100751 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%0A*r;2P-`%&Te~`r6_1i< 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�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 z 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%0DATcMLQ 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/era5/wind_solar_hourly_test/2016/01.nc b/tests/fixtures/era5/wind_solar_hourly_test/2016/01.nc new file mode 100644 index 0000000000000000000000000000000000000000..901d16ed07d2a2d2bb430c555a24f24a8aa2a169 GIT binary patch literal 199111 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. import logging -from dask.distributed import Client import xarray as xr +from dask.distributed import Client from geodata.datasets import load_dataset +from geodata.datasets._base import BaseDataset from geodata.logging import logger from geodata.model.wind import WindInterpolationModel -# Set logger to DEBUG level to see all debug messages logger.setLevel(logging.DEBUG) +def _fixture_xy_slices(dataset: BaseDataset) -> tuple[slice, slice]: + """Build ``xs``, ``ys`` slices on the fixture grid (``x``/``y`` or ERA5 ``longitude``/``latitude``).""" + path = dataset.catalog[0].path + with xr.open_dataset(path, engine="h5netcdf") as opened: + if "x" in opened.coords: + xv = opened["x"].values + yv = opened["y"].values + else: + xv = opened["longitude"].values + yv = opened["latitude"].values + xs = slice(float(xv[0]), float(xv[-1])) + ys = slice(float(yv[0]), float(yv[-1])) + return xs, ys + + def test_wind_interpolation_workflow(): - """Test that the wind interpolation workflow completes without errors. - - This test verifies: - - Dataset can be loaded and downloaded + """Wind interpolation workflow using offline ``wind_3d_hourly_test`` fixtures (no CDS). + + Verifies: + - Fixture dataset is registered and on disk - Model can be created and prepared - - Capacity factor estimation works (globally and with bounds) - - Wind speed estimation works at a specific height - - Results can be computed and have valid values + - Capacity factor and wind-speed estimates run on the fixture extent """ - client = Client(processes=True, threads_per_worker=1) - years = slice(2016, 2016) months = slice(1, 1) - ds_cls = load_dataset("wind_3d_hourly") - ds = ds_cls(years=years, months=months, testing=True) - - ds.download() - assert ds.downloaded, "Dataset should be downloaded successfully" - - # Create model with the dataset - model = WindInterpolationModel(ds) - assert model is not None, "Model should be created successfully" - - # Force re-preparation to see debug logs (comment out if you want to skip preparation) - model.prepare(force=True) - - turbine_name = "Enercon_E126_7500kW" - china_bbox = (73.5, 18.2, 135.1, 53.6) # China bounding box - xs = slice(china_bbox[0], china_bbox[2]) - ys = slice(china_bbox[3], china_bbox[1]) - - # Test capacity factor estimation globally - cf_global = model.estimate(turbine=turbine_name) - assert cf_global is not None, "Capacity factor estimation should return a result" - assert isinstance(cf_global, (xr.DataArray, xr.Dataset)), \ - "Capacity factor should be an xarray DataArray or Dataset" - - # Test capacity factor estimation for China only - cf_china = model.estimate(turbine=turbine_name, xs=xs, ys=ys) - assert cf_china is not None, "Capacity factor estimation with bounds should return a result" - assert isinstance(cf_china, (xr.DataArray, xr.Dataset)), \ - "Capacity factor with bounds should be an xarray DataArray or Dataset" - - # Test wind speed estimation at specific height - speed = model.estimate(height=100.0, xs=xs, ys=ys) - assert speed is not None, "Wind speed estimation should return a result" - assert isinstance(speed, xr.DataArray), \ - "Wind speed should be an xarray DataArray" - - # Test that results can be computed - cf_computed = cf_china.compute() - assert cf_computed is not None, "Computed capacity factor should not be None" - - # Test that max value can be calculated (verifies data is valid and operations work) - max_cf = cf_computed.max() - assert max_cf is not None, "Max capacity factor should be calculable" - - client.close() \ No newline at end of file + with Client(processes=True, threads_per_worker=1): + ds_cls = load_dataset("wind_3d_hourly_test") + ds = ds_cls(years=years, months=months) + assert ds.downloaded, "Fixture NetCDF should be present" + + xs, ys = _fixture_xy_slices(ds) + + model = WindInterpolationModel(ds) + assert model is not None + model.prepare(force=True) + + turbine_name = "Enercon_E126_7500kW" + + cf_global = model.estimate(turbine=turbine_name) + assert cf_global is not None + assert isinstance(cf_global, (xr.DataArray, xr.Dataset)) + + cf_region = model.estimate(turbine=turbine_name, xs=xs, ys=ys) + assert cf_region is not None + assert isinstance(cf_region, (xr.DataArray, xr.Dataset)) + + speed = model.estimate(height=100.0, xs=xs, ys=ys) + assert speed is not None + assert isinstance(speed, xr.DataArray) + + cf_computed = cf_region.compute() + assert cf_computed is not None + max_cf = cf_computed.max() + assert max_cf is not None diff --git a/tests/pr/test_era5_windsolar.py b/tests/pr/test_era5_windsolar.py index 2f6646c..6c3c00b 100644 --- a/tests/pr/test_era5_windsolar.py +++ b/tests/pr/test_era5_windsolar.py @@ -14,123 +14,105 @@ # along with this program. If not, see . import logging -from dask.distributed import Client import xarray as xr +from dask.distributed import Client from geodata.datasets import load_dataset +from geodata.datasets._base import BaseDataset from geodata.logging import logger from geodata.model.pvlib import Pvlib from geodata.model.wind import WindInterpolationModel -# Set logger to DEBUG level to see all debug messages logger.setLevel(logging.DEBUG) -def test_wind_solar_workflow(): - """Test that the wind interpolation workflow completes without errors. - - This test verifies: - - Dataset can be loaded and downloaded - - Model can be created and prepared - - Capacity factor estimation works (globally and with bounds) - - Wind speed estimation works at a specific height - - Results can be computed and have valid values - """ - - client = Client(processes=True, threads_per_worker=1) - - years = slice(2016, 2016) - months = slice(1, 1) - ds_cls = load_dataset("wind_solar_hourly") - ds = ds_cls(years=years, months=months, testing=True) +def _fixture_xy_slices(dataset: BaseDataset) -> tuple[slice, slice]: + """Build ``xs``, ``ys`` slices on the fixture grid (``x``/``y`` or ERA5 ``longitude``/``latitude``).""" + path = dataset.catalog[0].path + with xr.open_dataset(path, engine="h5netcdf") as opened: + if "x" in opened.coords: + xv = opened["x"].values + yv = opened["y"].values + else: + xv = opened["longitude"].values + yv = opened["latitude"].values + xs = slice(float(xv[0]), float(xv[-1])) + ys = slice(float(yv[0]), float(yv[-1])) + return xs, ys - ds.download() - assert ds.downloaded, "Dataset should be downloaded successfully" - # Create model with the dataset - model = Pvlib(ds) - assert model is not None, "Model should be created successfully" - - # TODO: use a smaller region for testing - # china_bbox = (73.5, 18.2, 135.1, 53.6) # China bounding box - # xs = slice(china_bbox[0], china_bbox[2]) - # ys = slice(china_bbox[3], china_bbox[1]) - - # Central Europe (Germany/Switzerland border - definitely on land) - xs = slice(8, 10) # 2 degrees longitude (8°E to 10°E) - ys = slice(48, 46) # 2 degrees latitude (48°N to 46°N, north to south) +def test_wind_solar_workflow(): + """Pvlib + wind interpolation using offline ``*_test`` fixtures (no CDS).""" years = slice(2016, 2016) months = slice(1, 1) - # TODO: add a test here to test that - # the model must not estimate without pv_system and model_config - - # create the pv_system - n_mods = 50 - n_strings = 1 - cec_modules = model.retrieve_sam('CECMod') - module = cec_modules['Kaneka_U_SA105'] - inv = model.retrieve_sam("CECInverter")['Fronius_USA__CL_33_3_Delta__208V_'] - model.init_pv_system( - arrays = None, - surface_tilt=35, - surface_azimuth=180, - racking_model = 'open_rack', - module_parameters=module, - modules_per_string = n_mods, - module_type = 'glass_polymer', - module = 'Kaneka_U_SA105', - strings_per_inverter = n_strings, - inverter_parameters=inv - ) - - assert model.pv_system is not None, "pv_system should be seccesfully created" - # TODO: assert it to the correct type - - # create the model_config - model.init_model_config( - clearsky_model= 'haurwitz', - transposition_model='perez', - solar_position_method= 'nrel_numpy', - airmass_model= 'kastenyoung1989', - dc_model='cec', - ac_model='sandia', - aoi_model="physical", - spectral_model='first_solar', - dc_ohmic_model='no_loss' - ) - assert model.config is not None, "model config should be successfully created" - - # Test capacity factor estimation globally - ac_power_and_pv_capacity_global = model.estimate(years=years, months=months, xs=xs, ys=ys) - assert ac_power_and_pv_capacity_global is not None, "Capacity factor estimation should return a result" - assert isinstance(ac_power_and_pv_capacity_global, (xr.DataArray, xr.Dataset)), \ - "Capacity factor should be an xarray DataArray or Dataset" - - # pvlib output should preserve spatial dimensions like the wind models. - # We enforce the exact dimension order: ("time", "x", "y"). - assert list(ac_power_and_pv_capacity_global.dims) == ['time', 'x', 'y'], \ - "pvlib output dims must be ordered exactly as (time, x, y)" - - # Also enforce the same dim order for wind interpolation output. - wind_ds_cls = load_dataset("wind_3d_hourly") - wind_ds = wind_ds_cls(years=years, months=months, testing=True) - wind_ds.download() - assert wind_ds.downloaded, "Wind dataset should be downloaded successfully" - - wind_model = WindInterpolationModel(wind_ds) - wind_model.prepare() - - wind_speed = wind_model.estimate( - years=years, months=months, xs=xs, ys=ys, height=12 - ) - assert list(wind_speed.dims) == ['time', 'x', 'y'], \ - "windinterpolation output dims must be ordered exactly as (time, x, y)" - assert 'valid_time' not in wind_speed.dims and 'valid_time' not in wind_speed.coords, \ - "windinterpolation output must use `time` (not `valid_time`)" - - # TODO: design correct output test specific regard to the pvlib output - - client.close() \ No newline at end of file + with Client(processes=True, threads_per_worker=1): + ds_cls = load_dataset("wind_solar_hourly_test") + ds = ds_cls(years=years, months=months) + assert ds.downloaded, "Fixture NetCDF should be present" + + xs, ys = _fixture_xy_slices(ds) + + model = Pvlib(ds) + assert model is not None + + n_mods = 50 + n_strings = 1 + cec_modules = model.retrieve_sam("CECMod") + module = cec_modules["Kaneka_U_SA105"] + inv = model.retrieve_sam("CECInverter")["Fronius_USA__CL_33_3_Delta__208V_"] + model.init_pv_system( + arrays=None, + surface_tilt=35, + surface_azimuth=180, + racking_model="open_rack", + module_parameters=module, + modules_per_string=n_mods, + module_type="glass_polymer", + module="Kaneka_U_SA105", + strings_per_inverter=n_strings, + inverter_parameters=inv, + ) + assert model.pv_system is not None + + model.init_model_config( + clearsky_model="haurwitz", + transposition_model="perez", + solar_position_method="nrel_numpy", + airmass_model="kastenyoung1989", + dc_model="cec", + ac_model="sandia", + aoi_model="physical", + spectral_model="first_solar", + dc_ohmic_model="no_loss", + ) + assert model.config is not None + + ac_power_and_pv_capacity_global = model.estimate( + years=years, months=months, xs=xs, ys=ys + ) + assert ac_power_and_pv_capacity_global is not None + assert isinstance( + ac_power_and_pv_capacity_global, (xr.DataArray, xr.Dataset) + ) + assert list(ac_power_and_pv_capacity_global.dims) == ["time", "x", "y"] + + wind_ds_cls = load_dataset("wind_3d_hourly_test") + wind_ds = wind_ds_cls(years=years, months=months) + assert wind_ds.downloaded, "Wind fixture NetCDF should be present" + + wxs, wys = _fixture_xy_slices(wind_ds) + + wind_model = WindInterpolationModel(wind_ds) + wind_model.prepare() + + wind_speed = wind_model.estimate( + years=years, months=months, xs=wxs, ys=wys, height=12 + ) + assert list(wind_speed.dims) == ["time", "x", "y"] + assert ( + "valid_time" not in wind_speed.dims + and "valid_time" not in wind_speed.coords + ) From a6ecdbacd9878a99ccbfcd29e15f6a6a008eb2f6 Mon Sep 17 00:00:00 2001 From: KULcoder Date: Sat, 18 Apr 2026 15:09:46 -0700 Subject: [PATCH 5/5] fix: disable the CDS download feature defaultly --- tests/pr/test_dataset_comprehensive.py | 119 +++++++++++++++++++------ tests/pr/test_era5_lengthy.py | 12 ++- 2 files changed, 100 insertions(+), 31 deletions(-) diff --git a/tests/pr/test_dataset_comprehensive.py b/tests/pr/test_dataset_comprehensive.py index 63c7bf3..9f0ff39 100644 --- a/tests/pr/test_dataset_comprehensive.py +++ b/tests/pr/test_dataset_comprehensive.py @@ -70,6 +70,7 @@ """ import logging +import os from typing import Optional import xarray as xr @@ -78,6 +79,10 @@ logging.basicConfig(level=logging.INFO) +# PRs should run with zero CDS calls. Enable integration download tests only via: +# GEODATA_RUN_CDS_TESTS=1 +RUN_CDS_TESTS = os.getenv("GEODATA_RUN_CDS_TESTS") == "1" + # ============================================================================ # TEST CONFIGURATION HELPERS @@ -85,22 +90,25 @@ def get_data_configs() -> list[str]: """Get list of dataset configurations to test.""" - return ["wind_3d_hourly"] + # Default to offline fixtures for PR safety. + return ["wind_3d_hourly"] if RUN_CDS_TESTS else ["wind_3d_hourly_test"] def get_bounds() -> list[list[float]]: """Get list of bounding boxes to test (lon_min, lat_min, lon_max, lat_max).""" - return [[50, 0, 48, 3]] # Small test region + # Bounds are only meaningful for real downloads. Fixture files are not + # regenerated per-bounds and therefore shouldn't be validated against bounds. + return [[50, 0, 48, 3]] if RUN_CDS_TESTS else [None] # type: ignore[list-item] def get_years() -> list[slice]: """Get list of year ranges to test.""" - return [slice(2005, 2005)] + return [slice(2005, 2005)] if RUN_CDS_TESTS else [slice(2016, 2016)] def get_months() -> list[slice]: """Get list of month ranges to test.""" - return [slice(1, 2)] + return [slice(1, 2)] if RUN_CDS_TESTS else [slice(1, 1)] def get_dataset( @@ -116,7 +124,13 @@ def get_dataset( years=year, months=month, bounds=bound, testing=testing ) if not dataset.downloaded: - dataset.download() + if RUN_CDS_TESTS: + dataset.download() + else: + raise AssertionError( + f"Dataset {data_config} is not downloaded, but CDS tests are disabled. " + "Use fixture configs or set GEODATA_RUN_CDS_TESTS=1." + ) return dataset @@ -133,6 +147,10 @@ def test_download(): they work before running longer tests. This is the foundation for all other data-dependent tests. """ + if not RUN_CDS_TESTS: + # This test verifies CDS download pipeline. Keep it opt-in. + return + configs = get_data_configs() years = get_years() months = get_months() @@ -155,11 +173,15 @@ def test_catalog_generation(): catalog generation means missing data or unnecessary downloads. Testing this ensures we know exactly what will be downloaded before we download it. """ - config = "wind_3d_hourly" + config = "wind_3d_hourly" if RUN_CDS_TESTS else "wind_3d_hourly_test" dataset_cls = load_dataset(config) # Test monthly catalog (if applicable) - dataset = dataset_cls(years=slice(2005, 2005), months=slice(1, 1), testing=True) + dataset = dataset_cls( + years=slice(2005, 2005) if RUN_CDS_TESTS else slice(2016, 2016), + months=slice(1, 1), + testing=True, + ) catalog = dataset.catalog assert len(catalog) > 0, "Catalog should contain at least one file" @@ -169,7 +191,7 @@ def test_catalog_generation(): assert hasattr(file, "year"), "Catalog entry should have year" assert hasattr(file, "month"), "Catalog entry should have month" assert hasattr(file, "path"), "Catalog entry should have path" - assert file.year == 2005, "Year should match" + assert file.year == (2005 if RUN_CDS_TESTS else 2016), "Year should match" assert file.month == 1, "Month should match" @@ -180,6 +202,10 @@ def test_catalog_testing_mode(): WHY: Testing mode should limit downloads to a few days/months to speed up tests. If this doesn't work correctly, tests become slow and expensive. """ + if not RUN_CDS_TESTS: + # Fixture datasets have fixed catalogs; testing mode isn't meaningful here. + return + config = "wind_3d_hourly" dataset_cls = load_dataset(config) @@ -211,9 +237,13 @@ def test_catalog_paths(): WHY: File paths determine where data is stored. Incorrect paths lead to data being saved in wrong locations or files overwriting each other. """ - config = "wind_3d_hourly" + config = "wind_3d_hourly" if RUN_CDS_TESTS else "wind_3d_hourly_test" dataset_cls = load_dataset(config) - dataset = dataset_cls(years=slice(2005, 2005), months=slice(1, 1), testing=True) + dataset = dataset_cls( + years=slice(2005, 2005) if RUN_CDS_TESTS else slice(2016, 2016), + months=slice(1, 1), + testing=True, + ) catalog = dataset.catalog paths = {file.path for file in catalog} @@ -294,6 +324,9 @@ def test_bounds_validation(): downloading unnecessary data or missing required data. Also validates that invalid bounds are rejected early. """ + if not RUN_CDS_TESTS: + return + config = "wind_3d_hourly" dataset_cls = load_dataset(config) @@ -358,9 +391,13 @@ def test_dataset_properties(): WHY: Dataset properties (projection, lat_direction, frequency) are used throughout the codebase for processing. Incorrect properties break analysis. """ - config = "wind_3d_hourly" + config = "wind_3d_hourly" if RUN_CDS_TESTS else "wind_3d_hourly_test" dataset_cls = load_dataset(config) - dataset = dataset_cls(years=slice(2005, 2005), months=slice(1, 1), testing=True) + dataset = dataset_cls( + years=slice(2005, 2005) if RUN_CDS_TESTS else slice(2016, 2016), + months=slice(1, 1), + testing=True, + ) # Test required properties exist assert hasattr(dataset, "projection"), "Dataset should have projection property" @@ -383,15 +420,19 @@ def test_dataset_repr(): WHY: The __repr__ method is used for debugging and logging. It should provide useful information about the dataset state. """ - config = "wind_3d_hourly" + config = "wind_3d_hourly" if RUN_CDS_TESTS else "wind_3d_hourly_test" dataset_cls = load_dataset(config) - dataset = dataset_cls(years=slice(2005, 2005), months=slice(1, 1), testing=True) + dataset = dataset_cls( + years=slice(2005, 2005) if RUN_CDS_TESTS else slice(2016, 2016), + months=slice(1, 1), + testing=True, + ) repr_str = repr(dataset) # Should contain key information - assert "wind_3d_hourly" in repr_str, "repr should contain weather_config" - assert "2005" in repr_str, "repr should contain years" + assert dataset.weather_config in repr_str, "repr should contain weather_config" + assert ("2005" if RUN_CDS_TESTS else "2016") in repr_str, "repr should contain years" assert "1" in repr_str, "repr should contain months" @@ -442,10 +483,16 @@ def test_data_dimensions(): a 3D wind dataset should have a level/height dimension. Missing dimensions indicate incorrect data structure. """ - config = "wind_3d_hourly" + config = "wind_3d_hourly" if RUN_CDS_TESTS else "wind_3d_hourly_test" dataset_cls = load_dataset(config) - dataset = dataset_cls(years=slice(2005, 2005), months=slice(1, 1), bounds=get_bounds()[0], testing=True) - dataset.download() + dataset = dataset_cls( + years=slice(2005, 2005) if RUN_CDS_TESTS else slice(2016, 2016), + months=slice(1, 1), + bounds=get_bounds()[0], + testing=True, + ) + if RUN_CDS_TESTS and not dataset.downloaded: + dataset.download() # Check first downloaded file for file in dataset.catalog: @@ -473,15 +520,16 @@ def test_data_value_ranges(): WHY: Data values should be within physically plausible ranges. Out-of-range values indicate data corruption or processing errors. """ - config = "wind_3d_hourly" + config = "wind_3d_hourly" if RUN_CDS_TESTS else "wind_3d_hourly_test" dataset_cls = load_dataset(config) dataset = dataset_cls( - years=slice(2005, 2005), + years=slice(2005, 2005) if RUN_CDS_TESTS else slice(2016, 2016), months=slice(1, 1), bounds=get_bounds()[0], testing=True ) - dataset.download() + if RUN_CDS_TESTS and not dataset.downloaded: + dataset.download() # Check first downloaded file for file in dataset.catalog: @@ -496,7 +544,8 @@ def test_data_value_ranges(): # Wind components should be within reasonable range # (typical wind speeds are -100 to 100 m/s) - if "u" in var.lower() or "v" in var.lower(): + var_str = str(var) + if "u" in var_str.lower() or "v" in var_str.lower(): if data.notnull().any(): data_min = float(data.min()) data_max = float(data.max()) @@ -522,15 +571,16 @@ def test_postprocessing_applied(): applied consistently. If postprocessing fails silently, downstream code expecting transformed data will fail. """ - config = "wind_3d_hourly" + config = "wind_3d_hourly" if RUN_CDS_TESTS else "wind_3d_hourly_test" dataset_cls = load_dataset(config) dataset = dataset_cls( - years=slice(2005, 2005), + years=slice(2005, 2005) if RUN_CDS_TESTS else slice(2016, 2016), months=slice(1, 1), bounds=get_bounds()[0], testing=True ) - dataset.download() + if RUN_CDS_TESTS and not dataset.downloaded: + dataset.download() # Check that postprocessed files have correct structure for file in dataset.catalog: @@ -584,6 +634,10 @@ def test_testing_mode(): WHY: Testing mode is crucial for fast CI/CD pipelines. If it doesn't work correctly, tests become too slow or download too much data. """ + if not RUN_CDS_TESTS: + # Fixture datasets ignore testing-mode catalog limiting; keep this check opt-in. + return + config = "wind_3d_hourly" dataset_cls = load_dataset(config) @@ -611,15 +665,19 @@ def test_storage_path(): WHY: Files must be saved to the correct location for proper organization and retrieval. Wrong paths make it impossible to find downloaded data. """ - config = "wind_3d_hourly" + config = "wind_3d_hourly" if RUN_CDS_TESTS else "wind_3d_hourly_test" dataset_cls = load_dataset(config) - dataset = dataset_cls(years=slice(2005, 2005), months=slice(1, 1), testing=True) + dataset = dataset_cls( + years=slice(2005, 2005) if RUN_CDS_TESTS else slice(2016, 2016), + months=slice(1, 1), + testing=True, + ) # Storage root should follow expected pattern assert dataset.storage_root is not None, "Storage root should be set" assert "era5" in str(dataset.storage_root), \ "Storage root should contain module name" - assert "wind_3d_hourly" in str(dataset.storage_root), \ + assert dataset.weather_config in str(dataset.storage_root), \ "Storage root should contain weather_config" @@ -630,6 +688,9 @@ def test_bounds_applied(): WHY: When bounds are specified, data should be filtered to those bounds. Downloading global data when only a region is needed wastes resources. """ + if not RUN_CDS_TESTS: + return + config = "wind_3d_hourly" dataset_cls = load_dataset(config) diff --git a/tests/pr/test_era5_lengthy.py b/tests/pr/test_era5_lengthy.py index 9979ace..4b06b52 100644 --- a/tests/pr/test_era5_lengthy.py +++ b/tests/pr/test_era5_lengthy.py @@ -16,11 +16,14 @@ """Tests in this file are lengthy due to the nature of the dataset being tested.""" import logging +import os -from geodata.datasets import DatasetType, load_dataset +from geodata.datasets import load_dataset logging.basicConfig(level=logging.INFO) +RUN_CDS_TESTS = os.getenv("GEODATA_RUN_CDS_TESTS") == "1" + # TODO: Test other functionalities with the 3D dataset def get_data_configs() -> list[str]: @@ -41,7 +44,7 @@ def get_months() -> list[slice]: def get_era5(data_config: str, bound: list[int], year: slice, month: slice): dataset_cls = load_dataset(data_config) - dataset: DatasetType = dataset_cls( + dataset = dataset_cls( years=year, months=month, bounds=bound, testing=True ) if not dataset.downloaded: @@ -50,6 +53,11 @@ def get_era5(data_config: str, bound: list[int], year: slice, month: slice): def test_download(): + if not RUN_CDS_TESTS: + # PRs should not require CDS keys / network. Run this test only in + # an opt-in integration job: GEODATA_RUN_CDS_TESTS=1. + return + configs = get_data_configs() years = get_years() months = get_months()