From e8efbb4f4a32013ecd1f5e37d7a26e624d972e72 Mon Sep 17 00:00:00 2001 From: Pawel Wolff Date: Tue, 26 Aug 2025 09:44:47 +0200 Subject: [PATCH] Fix for global_attrs in to_xarray. A relevant test added. --- src/earthkit/data/utils/xarray/builder.py | 2 +- tests/xr_engine/test_xr_attrs.py | 40 +++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/earthkit/data/utils/xarray/builder.py b/src/earthkit/data/utils/xarray/builder.py index b3436d97b..a3891de7f 100644 --- a/src/earthkit/data/utils/xarray/builder.py +++ b/src/earthkit/data/utils/xarray/builder.py @@ -142,7 +142,7 @@ def _metadata(): fixed_attrs[a.name] = a.value() elif callable(a): res.update(a(_metadata())) - elif isinstance(a, str): + else: res.update(a.get(_metadata())) res = {k: v for k, v in res.items() if v is not None} diff --git a/tests/xr_engine/test_xr_attrs.py b/tests/xr_engine/test_xr_attrs.py index 5639ecd72..ca669af52 100644 --- a/tests/xr_engine/test_xr_attrs.py +++ b/tests/xr_engine/test_xr_attrs.py @@ -198,3 +198,43 @@ def test_xr_attrs_types(kwargs, coords, dims, attrs): print(ds["t"].attrs) for k, v in attrs.items(): assert ds["t"].attrs[k] == v, f"{k}" + + +@pytest.mark.cache +def test_xr_global_attrs(): + ds_fl = from_source( + "url", earthkit_remote_test_data_file("test-data", "xr_engine", "level", "pl_small.grib") + ) + ds = ds_fl.to_xarray( + attrs_mode="fixed", + global_attrs=[ + {"centre_fixed": "_ecmf_"}, + lambda md: {"centre_callable": md.get("centre")}, + "centre", + "key=centreDescription", + {"centre_key": "key=centre"}, + {"geography_namespace": "namespace=geography"}, + ], + ) + ref_global_attrs = { + "centre_callable": "ecmf", + "centre": "ecmf", + "centreDescription": "European Centre for Medium-Range Weather Forecasts", + "centre_key": "ecmf", + "geography_namespace": { + "Ni": 36, + "Nj": 19, + "latitudeOfFirstGridPointInDegrees": 90.0, + "longitudeOfFirstGridPointInDegrees": 0.0, + "latitudeOfLastGridPointInDegrees": -90.0, + "longitudeOfLastGridPointInDegrees": 350.0, + "iScansNegatively": 0, + "jScansPositively": 0, + "jPointsAreConsecutive": 0, + "jDirectionIncrementInDegrees": 10.0, + "iDirectionIncrementInDegrees": 10.0, + "gridType": "regular_ll", + }, + "centre_fixed": "_ecmf_", + } + assert ds.attrs == ref_global_attrs