From c4d3205ba1e17dc9a01f1fe80eeaf59001fccb9b Mon Sep 17 00:00:00 2001 From: knappersfy Date: Fri, 5 Dec 2025 16:04:14 +0100 Subject: [PATCH 1/2] pre-commit --- ci/requirements/environment.yml | 2 +- pixi.toml | 4 ++-- xarray/tests/test_array_api.py | 26 +++++++++++++------------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/ci/requirements/environment.yml b/ci/requirements/environment.yml index eff54fe469e..dee3cc3c5e4 100644 --- a/ci/requirements/environment.yml +++ b/ci/requirements/environment.yml @@ -4,7 +4,7 @@ channels: - nodefaults dependencies: - aiobotocore - - array-api-strict<2.4 + - array-api-strict - boto3 - bottleneck - cartopy diff --git a/pixi.toml b/pixi.toml index 531d829340b..f44ba9a997e 100644 --- a/pixi.toml +++ b/pixi.toml @@ -111,7 +111,7 @@ scipy = "1.13.*" # - Update the min version lower-bound in the corresponding feature(s) where applicable # - Update this section to pin to the min version -array-api-strict = "1.1.*" # dependency for testing the array api compat +array-api-strict = "2.4.*" # dependency for testing the array api compat boto3 = "1.34.*" bottleneck = "1.4.*" cartopy = "0.23.*" @@ -198,7 +198,7 @@ cartopy = "*" seaborn = "*" [feature.test.dependencies] -array-api-strict = "<2.4" +array-api-strict = "*" pytest = "*" pytest-asyncio = "*" pytest-cov = "*" diff --git a/xarray/tests/test_array_api.py b/xarray/tests/test_array_api.py index 022d2e3750e..cf1eca60fea 100644 --- a/xarray/tests/test_array_api.py +++ b/xarray/tests/test_array_api.py @@ -32,7 +32,7 @@ def test_arithmetic(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: expected = np_arr + 7 actual = xp_arr + 7 assert isinstance(actual.data, Array) - assert_equal(actual, expected) + assert_equal(actual.copy(data=np.asarray(actual.data)), expected) def test_aggregation(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: @@ -40,7 +40,7 @@ def test_aggregation(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: expected = np_arr.sum() actual = xp_arr.sum() assert isinstance(actual.data, Array) - assert_equal(actual, expected) + assert_equal(actual.copy(data=np.asarray(actual.data)), expected) def test_aggregation_skipna(arrays) -> None: @@ -48,7 +48,7 @@ def test_aggregation_skipna(arrays) -> None: expected = np_arr.sum(skipna=False) actual = xp_arr.sum(skipna=False) assert isinstance(actual.data, Array) - assert_equal(actual, expected) + assert_equal(actual.copy(data=np.asarray(actual.data)), expected) # casting nan warns @@ -59,7 +59,7 @@ def test_astype(arrays) -> None: actual = xp_arr.astype(xp.int64) assert actual.dtype == xp.int64 assert isinstance(actual.data, Array) - assert_equal(actual, expected) + assert_equal(actual.copy(data=np.asarray(actual.data)), expected) def test_broadcast(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: @@ -72,7 +72,7 @@ def test_broadcast(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: assert len(actual) == len(expected) for a, e in zip(actual, expected, strict=True): assert isinstance(a.data, Array) - assert_equal(a, e) + assert_equal(a.copy(data=np.asarray(a.data)), e) def test_broadcast_during_arithmetic(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: @@ -83,12 +83,12 @@ def test_broadcast_during_arithmetic(arrays: tuple[xr.DataArray, xr.DataArray]) expected = np_arr * np_arr2 actual = xp_arr * xp_arr2 assert isinstance(actual.data, Array) - assert_equal(actual, expected) + assert_equal(actual.copy(data=np.asarray(actual.data)), expected) expected = np_arr2 * np_arr actual = xp_arr2 * xp_arr assert isinstance(actual.data, Array) - assert_equal(actual, expected) + assert_equal(actual.copy(data=np.asarray(actual.data)), expected) def test_concat(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: @@ -96,7 +96,7 @@ def test_concat(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: expected = xr.concat((np_arr, np_arr), dim="x") actual = xr.concat((xp_arr, xp_arr), dim="x") assert isinstance(actual.data, Array) - assert_equal(actual, expected) + assert_equal(actual.copy(data=np.asarray(actual.data)), expected) def test_indexing(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: @@ -104,7 +104,7 @@ def test_indexing(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: expected = np_arr[:, 0] actual = xp_arr[:, 0] assert isinstance(actual.data, Array) - assert_equal(actual, expected) + assert_equal(actual.copy(data=np.asarray(actual.data)), expected) def test_properties(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: @@ -120,7 +120,7 @@ def test_reorganizing_operation(arrays: tuple[xr.DataArray, xr.DataArray]) -> No expected = np_arr.transpose() actual = xp_arr.transpose() assert isinstance(actual.data, Array) - assert_equal(actual, expected) + assert_equal(actual.copy(data=np.asarray(actual.data)), expected) def test_stack(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: @@ -128,7 +128,7 @@ def test_stack(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: expected = np_arr.stack(z=("x", "y")) actual = xp_arr.stack(z=("x", "y")) assert isinstance(actual.data, Array) - assert_equal(actual, expected) + assert_equal(actual.copy(data=np.asarray(actual.data)), expected) def test_unstack(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: @@ -136,7 +136,7 @@ def test_unstack(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: expected = np_arr.stack(z=("x", "y")).unstack() actual = xp_arr.stack(z=("x", "y")).unstack() assert isinstance(actual.data, Array) - assert_equal(actual, expected) + assert_equal(actual.copy(data=np.asarray(actual.data)), expected) def test_where() -> None: @@ -145,4 +145,4 @@ def test_where() -> None: expected = xr.where(np_arr, 1, 0) actual = xr.where(xp_arr, 1, 0) assert isinstance(actual.data, Array) - assert_equal(actual, expected) + assert_equal(actual.copy(data=np.asarray(actual.data)), expected) From 6170555c93b626009d68251772170b2206ccaa8f Mon Sep 17 00:00:00 2001 From: knappersfy Date: Fri, 5 Dec 2025 16:25:05 +0100 Subject: [PATCH 2/2] invert assert_equal array, instead of copying --- xarray/tests/test_array_api.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/xarray/tests/test_array_api.py b/xarray/tests/test_array_api.py index cf1eca60fea..427d9d69711 100644 --- a/xarray/tests/test_array_api.py +++ b/xarray/tests/test_array_api.py @@ -32,7 +32,7 @@ def test_arithmetic(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: expected = np_arr + 7 actual = xp_arr + 7 assert isinstance(actual.data, Array) - assert_equal(actual.copy(data=np.asarray(actual.data)), expected) + assert_equal(expected, actual) def test_aggregation(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: @@ -40,7 +40,7 @@ def test_aggregation(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: expected = np_arr.sum() actual = xp_arr.sum() assert isinstance(actual.data, Array) - assert_equal(actual.copy(data=np.asarray(actual.data)), expected) + assert_equal(expected, actual) def test_aggregation_skipna(arrays) -> None: @@ -48,7 +48,7 @@ def test_aggregation_skipna(arrays) -> None: expected = np_arr.sum(skipna=False) actual = xp_arr.sum(skipna=False) assert isinstance(actual.data, Array) - assert_equal(actual.copy(data=np.asarray(actual.data)), expected) + assert_equal(expected, actual) # casting nan warns @@ -59,7 +59,7 @@ def test_astype(arrays) -> None: actual = xp_arr.astype(xp.int64) assert actual.dtype == xp.int64 assert isinstance(actual.data, Array) - assert_equal(actual.copy(data=np.asarray(actual.data)), expected) + assert_equal(expected, actual) def test_broadcast(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: @@ -72,7 +72,7 @@ def test_broadcast(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: assert len(actual) == len(expected) for a, e in zip(actual, expected, strict=True): assert isinstance(a.data, Array) - assert_equal(a.copy(data=np.asarray(a.data)), e) + assert_equal(e, a) def test_broadcast_during_arithmetic(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: @@ -83,12 +83,12 @@ def test_broadcast_during_arithmetic(arrays: tuple[xr.DataArray, xr.DataArray]) expected = np_arr * np_arr2 actual = xp_arr * xp_arr2 assert isinstance(actual.data, Array) - assert_equal(actual.copy(data=np.asarray(actual.data)), expected) + assert_equal(expected, actual) expected = np_arr2 * np_arr actual = xp_arr2 * xp_arr assert isinstance(actual.data, Array) - assert_equal(actual.copy(data=np.asarray(actual.data)), expected) + assert_equal(expected, actual) def test_concat(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: @@ -96,7 +96,7 @@ def test_concat(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: expected = xr.concat((np_arr, np_arr), dim="x") actual = xr.concat((xp_arr, xp_arr), dim="x") assert isinstance(actual.data, Array) - assert_equal(actual.copy(data=np.asarray(actual.data)), expected) + assert_equal(expected, actual) def test_indexing(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: @@ -104,7 +104,7 @@ def test_indexing(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: expected = np_arr[:, 0] actual = xp_arr[:, 0] assert isinstance(actual.data, Array) - assert_equal(actual.copy(data=np.asarray(actual.data)), expected) + assert_equal(expected, actual) def test_properties(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: @@ -120,7 +120,7 @@ def test_reorganizing_operation(arrays: tuple[xr.DataArray, xr.DataArray]) -> No expected = np_arr.transpose() actual = xp_arr.transpose() assert isinstance(actual.data, Array) - assert_equal(actual.copy(data=np.asarray(actual.data)), expected) + assert_equal(expected, actual) def test_stack(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: @@ -128,7 +128,7 @@ def test_stack(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: expected = np_arr.stack(z=("x", "y")) actual = xp_arr.stack(z=("x", "y")) assert isinstance(actual.data, Array) - assert_equal(actual.copy(data=np.asarray(actual.data)), expected) + assert_equal(expected, actual) def test_unstack(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: @@ -136,7 +136,7 @@ def test_unstack(arrays: tuple[xr.DataArray, xr.DataArray]) -> None: expected = np_arr.stack(z=("x", "y")).unstack() actual = xp_arr.stack(z=("x", "y")).unstack() assert isinstance(actual.data, Array) - assert_equal(actual.copy(data=np.asarray(actual.data)), expected) + assert_equal(expected, actual) def test_where() -> None: @@ -145,4 +145,4 @@ def test_where() -> None: expected = xr.where(np_arr, 1, 0) actual = xr.where(xp_arr, 1, 0) assert isinstance(actual.data, Array) - assert_equal(actual.copy(data=np.asarray(actual.data)), expected) + assert_equal(expected, actual)