diff --git a/doc/whats-new.rst b/doc/whats-new.rst index b5b4b375d04..2c9d72ebfba 100644 --- a/doc/whats-new.rst +++ b/doc/whats-new.rst @@ -30,6 +30,8 @@ Breaking changes Deprecations ~~~~~~~~~~~~ +- Deprecate the `cdms2 `_ conversion methods (:pull:`7876`) + By `Justus Magin `_. Performance ~~~~~~~~~~~ diff --git a/xarray/core/dataarray.py b/xarray/core/dataarray.py index bc2450abc9d..ee8573ebec7 100644 --- a/xarray/core/dataarray.py +++ b/xarray/core/dataarray.py @@ -42,6 +42,7 @@ ReprObject, _default, either_dict_or_kwargs, + emit_user_level_warning, ) from xarray.core.variable import ( IndexVariable, @@ -4331,16 +4332,44 @@ def from_series(cls, series: pd.Series, sparse: bool = False) -> DataArray: return result def to_cdms2(self) -> cdms2_Variable: - """Convert this array into a cdms2.Variable""" + """Convert this array into a cdms2.Variable + + .. deprecated:: 2023.06.0 + The `cdms2`_ library has been deprecated. Please consider using the + `xcdat`_ library instead. + + .. _cdms2: https://github.com/CDAT/cdms + .. _xcdat: https://github.com/xCDAT/xcdat + """ from xarray.convert import to_cdms2 + emit_user_level_warning( + "The cdms2 library has been deprecated." + " Please consider using the xcdat library instead.", + DeprecationWarning, + ) + return to_cdms2(self) @classmethod def from_cdms2(cls, variable: cdms2_Variable) -> DataArray: - """Convert a cdms2.Variable into an xarray.DataArray""" + """Convert a cdms2.Variable into an xarray.DataArray + + .. deprecated:: 2023.06.0 + The `cdms2`_ library has been deprecated. Please consider using the + `xcdat`_ library instead. + + .. _cdms2: https://github.com/CDAT/cdms + .. _xcdat: https://github.com/xCDAT/xcdat + """ from xarray.convert import from_cdms2 + emit_user_level_warning( + "The cdms2 library has been deprecated." + " Please consider using the xcdat library instead.", + DeprecationWarning, + ) + return from_cdms2(variable) def to_iris(self) -> iris_Cube: diff --git a/xarray/tests/test_dataarray.py b/xarray/tests/test_dataarray.py index 263653e992e..a479b1a765d 100644 --- a/xarray/tests/test_dataarray.py +++ b/xarray/tests/test_dataarray.py @@ -3548,6 +3548,10 @@ def test_to_masked_array(self) -> None: ma = da.to_masked_array() assert len(ma.mask) == N + @pytest.mark.skipif( + Version(np.__version__) > Version("1.24") or sys.version_info[:2] > (3, 10), + reason="cdms2 is unmaintained and does not support newer `numpy` or python versions", + ) def test_to_and_from_cdms2_classic(self) -> None: """Classic with 1D axes""" pytest.importorskip("cdms2") @@ -3565,7 +3569,8 @@ def test_to_and_from_cdms2_classic(self) -> None: IndexVariable("distance", [-2, 2]), IndexVariable("time", [0, 1, 2]), ] - actual = original.to_cdms2() + with pytest.deprecated_call(match=".*cdms2"): + actual = original.to_cdms2() assert_array_equal(actual.asma(), original) assert actual.id == original.name assert tuple(actual.getAxisIds()) == original.dims @@ -3578,7 +3583,8 @@ def test_to_and_from_cdms2_classic(self) -> None: assert len(component_times) == 3 assert str(component_times[0]) == "2000-1-1 0:0:0.0" - roundtripped = DataArray.from_cdms2(actual) + with pytest.deprecated_call(match=".*cdms2"): + roundtripped = DataArray.from_cdms2(actual) assert_identical(original, roundtripped) back = from_cdms2(actual) @@ -3587,6 +3593,10 @@ def test_to_and_from_cdms2_classic(self) -> None: for coord_name in original.coords.keys(): assert_array_equal(original.coords[coord_name], back.coords[coord_name]) + @pytest.mark.skipif( + Version(np.__version__) > Version("1.24") or sys.version_info[:2] > (3, 10), + reason="cdms2 is unmaintained and does not support newer `numpy` or python versions", + ) def test_to_and_from_cdms2_sgrid(self) -> None: """Curvilinear (structured) grid @@ -3605,7 +3615,8 @@ def test_to_and_from_cdms2_sgrid(self) -> None: coords=dict(x=x, y=y, lon=lon, lat=lat), name="sst", ) - actual = original.to_cdms2() + with pytest.deprecated_call(): + actual = original.to_cdms2() assert tuple(actual.getAxisIds()) == original.dims assert_array_equal(original.coords["lon"], actual.getLongitude().asma()) assert_array_equal(original.coords["lat"], actual.getLatitude().asma()) @@ -3616,6 +3627,10 @@ def test_to_and_from_cdms2_sgrid(self) -> None: assert_array_equal(original.coords["lat"], back.coords["lat"]) assert_array_equal(original.coords["lon"], back.coords["lon"]) + @pytest.mark.skipif( + Version(np.__version__) > Version("1.24") or sys.version_info[:2] > (3, 10), + reason="cdms2 is unmaintained and does not support newer `numpy` or python versions", + ) def test_to_and_from_cdms2_ugrid(self) -> None: """Unstructured grid""" pytest.importorskip("cdms2") @@ -3626,7 +3641,8 @@ def test_to_and_from_cdms2_ugrid(self) -> None: original = DataArray( np.arange(5), dims=["cell"], coords={"lon": lon, "lat": lat, "cell": cell} ) - actual = original.to_cdms2() + with pytest.deprecated_call(match=".*cdms2"): + actual = original.to_cdms2() assert tuple(actual.getAxisIds()) == original.dims assert_array_equal(original.coords["lon"], actual.getLongitude().getValue()) assert_array_equal(original.coords["lat"], actual.getLatitude().getValue())