From aa6f0eee5feda06c76eb9bda7e59fbeebd61350c Mon Sep 17 00:00:00 2001 From: Sergio Souza Costa Date: Mon, 15 Jun 2026 11:17:56 -0300 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20apply=20audit=20quick-wins=20?= =?UTF-8?q?=E2=80=94=20lazy=20fiona,=20drop=20unused=20deps,=20raise=20on?= =?UTF-8?q?=20ambiguous=20tile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - bdc_importer: move `import fiona` to lazy import inside _register_tile_sources(); module now imports cleanly without the bdc extra and raises a clear actionable error when fiona is missing - requirements.txt: remove rasterstats and typer (confirmed unused by grep; neither appears in disscube/, tools/, scripts/, or examples/) - cube_client.load(): raise ValueError when tile_id is omitted and multiple tiles match the requested variable, listing available tile_ids - test_bdc_master_grids: remove @expectedFailure from ambiguous-tile test; test now passes (78 passed, was 77 passed + 1 xfailed) - docs/guides/bdc.md: add warning that STAC data ingestion is planned/not yet implemented; update multi-tile warning to reflect the new ValueError Co-Authored-By: Claude Sonnet 4.6 --- disscube/client/cube_client.py | 8 ++++++++ disscube/utils/bdc_importer.py | 8 +++++++- docs/guides/bdc.md | 7 +++++-- requirements.txt | 2 -- tests/test_bdc_master_grids.py | 10 +--------- 5 files changed, 21 insertions(+), 14 deletions(-) diff --git a/disscube/client/cube_client.py b/disscube/client/cube_client.py index fe3cd0e..04fee9e 100644 --- a/disscube/client/cube_client.py +++ b/disscube/client/cube_client.py @@ -166,6 +166,14 @@ def load( "Please specify grid_id." ) + if tile_id is None and len(matches) > 1: + candidate_tiles = sorted(set(m.tile_id for m in matches if m.tile_id)) + if len(candidate_tiles) > 1: + raise ValueError( + f"Variable '{variable_id}' exists across multiple tiles: {candidate_tiles}. " + "Pass tile_id= to load a specific tile." + ) + # Separate temporal from static matches, skipping stale catalog entries # whose files no longer exist on disk (catalog can accumulate orphans when # a source_id or other spec field changes between runs). diff --git a/disscube/utils/bdc_importer.py b/disscube/utils/bdc_importer.py index 38258df..6aad1bb 100644 --- a/disscube/utils/bdc_importer.py +++ b/disscube/utils/bdc_importer.py @@ -1,6 +1,5 @@ import logging -import fiona from shapely.geometry import shape from disscube.models import SpatialSource from disscube.client import CubeClient @@ -35,6 +34,13 @@ def import_bdc_grids(cube: CubeClient, sm_path: str, md_path: str, lg_path: str) def _register_tile_sources(cube: CubeClient, paths: dict[str, str]) -> None: """Register BDC tile envelopes as SpatialSources.""" + try: + import fiona + except ImportError as exc: + raise ImportError( + "fiona is required for BDC import; install disscube[bdc]" + ) from exc + level_paths = [ ("SM", paths["sm_path"]), ("MD", paths["md_path"]), diff --git a/docs/guides/bdc.md b/docs/guides/bdc.md index c92160a..7e8b14c 100644 --- a/docs/guides/bdc.md +++ b/docs/guides/bdc.md @@ -9,7 +9,7 @@ O Brazil Data Cube (BDC) particionam o Brasil em tiles hierárquicos. DisSCube r ## Registrar grades e tiles BDC -O utilitário `bdc_importer` cria as master grids e registra cada tile como `SpatialSource`: +O utilitário `bdc_importer` indexa as master grids e registra cada tile como `SpatialSource` no catálogo: ```python from disscube.utils.bdc_importer import import_bdc_grids @@ -24,6 +24,9 @@ import_bdc_grids( Isso registra as master grids e cada tile como `SpatialSource` com `bbox` preenchido. +!!! warning "Ingestão de dados STAC — planejada" + `bdc_importer` indexa a grade BDC e os tiles (geometria e metadados), mas **não realiza ingestão de dados via STAC**. Os `SpatialSource` registrados têm `asset_url` como placeholder (`"planned"`) e não são diretamente carregáveis como dados raster. A integração com o catálogo STAC do BDC está planejada e ainda não implementada. Para usar dados BDC reais, forneça os arquivos localmente via um `SpatialSource` com `asset_url` apontando para o arquivo correto. + ## Derivação por tile ```python @@ -60,7 +63,7 @@ da = cube.load("slope", grid_id="BR/5km") ``` !!! warning "Carga multi-tile" - `load()` sem `tile_id` retorna silenciosamente o primeiro resultado quando múltiplos tiles da mesma variável existem na mesma grade. Mosaico automático não está implementado. **Sempre especifique `tile_id` em workloads multi-tile.** + `load()` sem `tile_id` levanta `ValueError` quando múltiplos tiles da mesma variável existem na mesma grade. Mosaico automático não está implementado. **Sempre especifique `tile_id` em workloads multi-tile.** ## Grade 100m nacional diff --git a/requirements.txt b/requirements.txt index 4809305..01544cb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,6 @@ xarray zarr rasterio geopandas -rasterstats shapely scipy numpy @@ -12,7 +11,6 @@ pandas pyproj fsspec s3fs -typer fastapi uvicorn python-multipart diff --git a/tests/test_bdc_master_grids.py b/tests/test_bdc_master_grids.py index 8e369e1..ab105b0 100644 --- a/tests/test_bdc_master_grids.py +++ b/tests/test_bdc_master_grids.py @@ -161,16 +161,8 @@ def test_load_with_explicit_tile_id_filters_correctly(self, mock_open_zarr, mock @patch('disscube.client.cube_client.os.path.exists', return_value=True) @patch('xarray.open_zarr') - @unittest.expectedFailure def test_load_without_tile_id_raises_for_ambiguous_tiles(self, mock_open_zarr, mock_exists): - """ - PLANNED (not yet implemented): load(name) without tile_id should raise - ValueError when multiple tiles of the same variable exist on the same grid. - - Currently load() silently returns the first match. This test is marked - @expectedFailure to document the planned behavior as a regression guard — - when the feature is implemented, remove the decorator and the test will pass. - """ + """load(name) without tile_id raises ValueError when multiple tiles exist on the same grid.""" from disscube.models import DerivedVariable d1 = DerivedVariable( From 33d12a372742ce4bfe56034b26979bd7e2b5171e Mon Sep 17 00:00:00 2001 From: Sergio Souza Costa Date: Mon, 15 Jun 2026 12:00:07 -0300 Subject: [PATCH 2/2] fix: correct brmangue import path in 03_brmangue_simulate example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit executor.raster_executor → executors.raster_executor Co-Authored-By: Claude Sonnet 4.6 --- examples/case_studies/maranhao/03_brmangue_simulate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/case_studies/maranhao/03_brmangue_simulate.py b/examples/case_studies/maranhao/03_brmangue_simulate.py index 632272f..f127bfd 100644 --- a/examples/case_studies/maranhao/03_brmangue_simulate.py +++ b/examples/case_studies/maranhao/03_brmangue_simulate.py @@ -13,7 +13,7 @@ from disscube.client import CubeClient try: - from brmangue.executor.raster_executor import BrmangueRasterExecutor + from brmangue.executors.raster_executor import BrmangueRasterExecutor from dissmodel.executor import ExperimentRecord except ImportError as e: print(f"Warning: {e}. Skipping simulation step.")