From d375cd336ea42f4f0aa676baefa80880d2747dba Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Thu, 15 Jan 2026 12:00:25 +1300 Subject: [PATCH 1/2] Move test extras dependencies under dependency-groups Following [PEP735](https://peps.python.org/pep-0735), xref https://hatch.pypa.io/1.16/config/environment/advanced/#dependency-groups. Have also replaced fix-coord-transform-indexing branch with commit hash since https://github.com/pydata/xarray/pull/10980 was merged. --- .github/workflows/test.yml | 2 +- pyproject.toml | 31 ++++++++++++++++--------------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cfd4903..1f5a805 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -49,7 +49,7 @@ jobs: - name: Set Up Hatch Env run: | hatch env create test.py${{ matrix.python-version }} - hatch env run -e test.py${{ matrix.python-version }} list-env + hatch env run --env test.py${{ matrix.python-version }} list-env - name: Run Tests run: | hatch env run --env test.py${{ matrix.python-version }} run-coverage diff --git a/pyproject.toml b/pyproject.toml index dfc4a1b..c40e420 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,17 +38,6 @@ dynamic=["version"] dask = ["dask-geopandas"] rasterize = ["rasterio"] exactextract = ["exactextract", "sparse"] -test = [ - "geodatasets", - "pooch", - "dask-geopandas", - "rasterio", - "exactextract", - "sparse", - "netCDF4", - "hypothesis", - "xarray @ git+https://github.com/dcherian/xarray.git@fix-coord-transform-indexing", -] docs = [ "geodatasets", "pooch", @@ -91,14 +80,26 @@ exclude = [ "doc", ] -[tool.hatch.envs.test] -dependencies = [ +[dependency-groups] +test = [ "coverage", + "dask-geopandas", + "exactextract", + "geodatasets", + "hypothesis", + "netCDF4", + "pooch", + "pytest", "pytest", "pytest-cov", - "pytest-xdist" + "pytest-xdist", + "rasterio", + "sparse", + "xarray @ git+https://github.com/pydata/xarray.git@26ccc7f8f014f29c551fd566a04d6e9f878c0b0b", # https://github.com/pydata/xarray/pull/10980 ] -features = ["test"] + +[tool.hatch.envs.test] +dependency-groups = ["test"] [[tool.hatch.envs.test.matrix]] python = ["3.11", "3.13"] From ee21cc2bf40db0ff3b7391fa9ac7840c0615e28c Mon Sep 17 00:00:00 2001 From: Wei Ji <23487320+weiji14@users.noreply.github.com> Date: Thu, 15 Jan 2026 16:20:39 +1300 Subject: [PATCH 2/2] Use assert_equal instead of assert_identical to avoid comparing indexes Since https://github.com/pydata/xarray/pull/11035, `xarray.testing.assert_identical` compares xindexes too, which fails the test because RasterIndex and PandasIndex has different types. Using `assert_equal` which only checks the DataArray. Ideally should check that the index values are equal too somehow. --- tests/test_indexing.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/test_indexing.py b/tests/test_indexing.py index 9f4ccbd..be5b8ae 100644 --- a/tests/test_indexing.py +++ b/tests/test_indexing.py @@ -67,12 +67,12 @@ def pandas_da(raster_da): @given(data=st.data()) @settings(suppress_health_check=[HealthCheck.function_scoped_fixture]) def test_isel_basic_indexing_equivalence(data, raster_da, pandas_da): - """Test that isel produces identical results for RasterIndex and PandasIndex.""" + """Test that isel produces equal results for RasterIndex and PandasIndex.""" sizes = dict(raster_da.sizes) indexers = data.draw(basic_indexers(sizes=sizes)) result_raster = raster_da.isel(indexers) result_pandas = pandas_da.isel(indexers) - xr.testing.assert_identical(result_raster, result_pandas) + xr.testing.assert_equal(result_raster, result_pandas) @given(data=st.data()) @@ -81,7 +81,7 @@ def test_isel_basic_indexing_equivalence(data, raster_da, pandas_da): suppress_health_check=[HealthCheck.function_scoped_fixture], ) def test_sel_basic_indexing_equivalence(data, raster_da, pandas_da): - """Test that isel produces identical results for RasterIndex and PandasIndex.""" + """Test that isel produces equal results for RasterIndex and PandasIndex.""" indexers = data.draw(basic_label_indexers(indexes=pandas_da.xindexes)) result_raster = raster_da.sel( @@ -93,40 +93,40 @@ def test_sel_basic_indexing_equivalence(data, raster_da, pandas_da): if all(isinstance(idxr, slice) for idxr in indexers.values()): assert all(isinstance(idx, RasterIndex) for idx in result_raster.xindexes.get_unique()) - xr.testing.assert_identical(result_raster, result_pandas) + xr.testing.assert_equal(result_raster, result_pandas) def test_simple_isel(raster_da, pandas_da): """Sanity check: simple indexing operations.""" # Scalar indexing - xr.testing.assert_identical(raster_da.isel(x=0), pandas_da.isel(x=0)) - xr.testing.assert_identical(raster_da.isel(y=0), pandas_da.isel(y=0)) - xr.testing.assert_identical(raster_da.isel(x=0, y=0), pandas_da.isel(x=0, y=0)) + xr.testing.assert_equal(raster_da.isel(x=0), pandas_da.isel(x=0)) + xr.testing.assert_equal(raster_da.isel(y=0), pandas_da.isel(y=0)) + xr.testing.assert_equal(raster_da.isel(x=0, y=0), pandas_da.isel(x=0, y=0)) # Slice indexing - xr.testing.assert_identical(raster_da.isel(x=slice(2, 5)), pandas_da.isel(x=slice(2, 5))) - xr.testing.assert_identical(raster_da.isel(y=slice(1, 4)), pandas_da.isel(y=slice(1, 4))) - xr.testing.assert_identical( + xr.testing.assert_equal(raster_da.isel(x=slice(2, 5)), pandas_da.isel(x=slice(2, 5))) + xr.testing.assert_equal(raster_da.isel(y=slice(1, 4)), pandas_da.isel(y=slice(1, 4))) + xr.testing.assert_equal( raster_da.isel(x=slice(2, 5), y=slice(1, 4)), pandas_da.isel(x=slice(2, 5), y=slice(1, 4)), ) # Array indexing - xr.testing.assert_identical(raster_da.isel(x=[0, 2, 4]), pandas_da.isel(x=[0, 2, 4])) - xr.testing.assert_identical(raster_da.isel(y=[1, 3]), pandas_da.isel(y=[1, 3])) + xr.testing.assert_equal(raster_da.isel(x=[0, 2, 4]), pandas_da.isel(x=[0, 2, 4])) + xr.testing.assert_equal(raster_da.isel(y=[1, 3]), pandas_da.isel(y=[1, 3])) @given(data=st.data()) @settings(suppress_health_check=[HealthCheck.function_scoped_fixture]) def test_outer_array_indexing(data, raster_da, pandas_da): - """Test that outer array indexing produces identical results for RasterIndex and PandasIndex.""" + """Test that outer array indexing produces equal results for RasterIndex and PandasIndex.""" sizes = dict(raster_da.sizes) indexers = data.draw(outer_array_indexers(sizes=sizes)) result_raster = raster_da.isel(indexers) result_pandas = pandas_da.isel(indexers) - xr.testing.assert_identical(result_raster, result_pandas) + xr.testing.assert_equal(result_raster, result_pandas) @given(data=st.data()) @@ -135,11 +135,11 @@ def test_outer_array_indexing(data, raster_da, pandas_da): suppress_health_check=[HealthCheck.function_scoped_fixture], ) def test_outer_array_label_indexing(data, raster_da, pandas_da): - """Test that outer array label indexing produces identical results for RasterIndex and PandasIndex.""" + """Test that outer array label indexing produces equal results for RasterIndex and PandasIndex.""" indexers = data.draw(outer_array_label_indexers(indexes=pandas_da.xindexes)) result_raster = raster_da.sel(indexers, method="nearest") result_pandas = pandas_da.sel(indexers, method="nearest") - xr.testing.assert_identical(result_raster, result_pandas) + xr.testing.assert_equal(result_raster, result_pandas) @given(data=st.data())