Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
eed755f
add a user warning when data is not lazy
valeriupredoi Aug 8, 2025
f13b642
add a test module for zarrs
valeriupredoi Aug 8, 2025
3f7cf4a
add tiny Zarr sample data
valeriupredoi Aug 8, 2025
91ce068
add test
valeriupredoi Aug 8, 2025
edd6c36
make warning more robust
valeriupredoi Aug 8, 2025
105031f
add Zarr3 test data
valeriupredoi Aug 8, 2025
16fb588
rm erroneous file
valeriupredoi Aug 8, 2025
f6c2766
add zarr3 test
valeriupredoi Aug 8, 2025
7846f77
make the warning better
valeriupredoi Aug 8, 2025
2d2c661
full test suite
valeriupredoi Aug 8, 2025
1796100
more general search meth
valeriupredoi Aug 8, 2025
ba10ec7
add extra deps and trigger GHA locally
valeriupredoi Aug 11, 2025
74a7c0e
run just a simple pytest session
valeriupredoi Aug 11, 2025
d7a2698
pop a conda env file
valeriupredoi Aug 11, 2025
16e28ca
use conda env file in GHA
valeriupredoi Aug 11, 2025
6fdb0b9
run just simple pytest
valeriupredoi Aug 11, 2025
1d6cddd
Merge branch 'main' into add_warning_and_tests
pp-mo Aug 11, 2025
01cce51
Update lib/ncdata/xarray.py
valeriupredoi Aug 13, 2025
b7ad9f4
unreference uneeded conda env file
valeriupredoi Aug 13, 2025
cc79ff1
restore GHA workflow to original
valeriupredoi Aug 13, 2025
e2f607f
add comment
valeriupredoi Aug 13, 2025
773de45
Update lib/ncdata/xarray.py
valeriupredoi Aug 13, 2025
edf06ac
remove user warning
valeriupredoi Aug 13, 2025
aba9fa6
remove test for warning
valeriupredoi Aug 13, 2025
5f96f32
Merge branch 'add_warning_and_tests' of https://github.com/valeriupre…
valeriupredoi Aug 13, 2025
1fb1db7
readd empty line
valeriupredoi Aug 13, 2025
75e24cf
unrun GHA on push
valeriupredoi Aug 13, 2025
b48088a
Update tests/integration/test_zarr_to_iris.py
valeriupredoi Aug 13, 2025
7365729
Update tests/integration/test_zarr_to_iris.py
valeriupredoi Aug 13, 2025
33a9c80
Update tests/integration/test_zarr_to_iris.py
valeriupredoi Aug 13, 2025
0518afe
shorten imports
valeriupredoi Aug 13, 2025
5039d07
Merge branch 'add_warning_and_tests' of https://github.com/valeriupre…
valeriupredoi Aug 13, 2025
8f4e4da
correct test for s3 connection
valeriupredoi Aug 13, 2025
1c21daa
add dependency
valeriupredoi Aug 13, 2025
ec91745
remove zarr sample data
valeriupredoi Aug 13, 2025
0d74e97
move zzarr sample data
valeriupredoi Aug 13, 2025
b6dd8cb
fix test for new sample data path
valeriupredoi Aug 13, 2025
f8dd7be
run pre-commit
valeriupredoi Aug 13, 2025
e7df68d
remove unify chunks
valeriupredoi Aug 14, 2025
f1a4c46
Merge branch 'main' into add_warning_and_tests
valeriupredoi Aug 14, 2025
2ee710b
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Aug 14, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .github/workflows/ci-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ on:
push:
branches:
- "main"
- "v*x"
tags:
- "v*"
pull_request:
Expand Down Expand Up @@ -49,7 +48,7 @@ jobs:

- name: "Install dependencies"
run: |
conda install --yes numpy pytest pytest-mock iris xarray filelock requests
conda install --yes numpy pytest pytest-mock iris xarray filelock requests zarr aiohttp fsspec

- name: "Install *latest* Iris"
run: |
Expand Down
1 change: 0 additions & 1 deletion lib/ncdata/utils/_compare_nc_datasets.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import netCDF4
import netCDF4 as nc
import numpy as np

from ncdata import NcData, NcVariable


Expand Down
1 change: 0 additions & 1 deletion lib/ncdata/utils/_save_errors.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

import netCDF4 as nc
import numpy as np

from ncdata import NcData, NcVariable


Expand Down
3 changes: 1 addition & 2 deletions tests/integration/equivalence_testing_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,10 @@
ncdata and other types of data preserve information.
"""
import dask.array as da
import iris.mesh
import numpy as np
import pytest

import iris.mesh


def cubes_equal__corrected(c1, c2):
"""
Expand Down
2 changes: 1 addition & 1 deletion tests/integration/example_scripts/ex_dataset_print.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
"""Temporary integrational proof-of-concept example for dataset printout."""
import iris

import ncdata.iris as nci
from ncdata import NcData, NcDimension, NcVariable

from tests import testdata_dir


Expand Down
2 changes: 1 addition & 1 deletion tests/integration/example_scripts/ex_iris_saveto_ncdata.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
Check that conversion succeeds and print the resulting dataset.
"""
import iris

from ncdata.iris import from_iris

from tests import testdata_dir


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
import iris
import numpy as np
import xarray as xr

from ncdata.iris_xarray import cubes_from_xarray, cubes_to_xarray

from tests import testdata_dir


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@

import netCDF4 as nc
import numpy as np

from ncdata import NcData, NcDimension, NcVariable
from ncdata.netcdf4 import from_nc4, to_nc4
from ncdata.utils import dataset_differences

from tests import testdata_dir


Expand Down
2 changes: 1 addition & 1 deletion tests/integration/test_iris_load_and_save_equivalence.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@

import iris
import pytest

from ncdata.netcdf4 import from_nc4, to_nc4
from ncdata.utils import dataset_differences

from tests.data_testcase_schemas import session_testdir, standard_testcase
from tests.integration.equivalence_testing_utils import (
adjust_chunks,
Expand Down
2 changes: 1 addition & 1 deletion tests/integration/test_iris_xarray_roundtrips.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,13 @@
import numpy as np
import pytest
import xarray

from ncdata.iris import from_iris
from ncdata.iris_xarray import cubes_to_xarray
from ncdata.netcdf4 import from_nc4
from ncdata.threadlock_sharing import lockshare_context
from ncdata.utils import dataset_differences
from ncdata.xarray import from_xarray

from tests.data_testcase_schemas import (
BAD_LOADSAVE_TESTCASES,
session_testdir,
Expand Down
1 change: 1 addition & 0 deletions tests/integration/test_netcdf_roundtrips.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

from ncdata.netcdf4 import from_nc4, to_nc4
from ncdata.utils import dataset_differences

from tests.data_testcase_schemas import session_testdir, standard_testcase

# Avoid complaints that the imported fixtures are "unused"
Expand Down
2 changes: 1 addition & 1 deletion tests/integration/test_xarray_load_and_save_equivalence.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
"""
import pytest
import xarray

from ncdata.netcdf4 import from_nc4, to_nc4
from ncdata.threadlock_sharing import lockshare_context
from ncdata.utils import dataset_differences
from ncdata.xarray import from_xarray, to_xarray

from tests.data_testcase_schemas import (
BAD_LOADSAVE_TESTCASES,
session_testdir,
Expand Down
111 changes: 111 additions & 0 deletions tests/integration/test_zarr_to_iris.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
"""Test conversion of remote and local Zarr store to iris Cube."""

from importlib.resources import files as importlib_files
from pathlib import Path

import fsspec
import iris
import pytest
import xarray as xr
from ncdata.iris_xarray import cubes_from_xarray as conversion_func


def _return_kwargs():
time_coder = xr.coders.CFDatetimeCoder(use_cftime=True)
return {
"consolidated": True,
"decode_times": time_coder,
"engine": "zarr",
"chunks": {},
"backend_kwargs": {},
}


def _run_checks(cube):
"""Run some standard checks."""
assert cube.var_name == "q"
assert cube.standard_name == "specific_humidity"
assert cube.long_name is None
coords = cube.coords()
coord_names = [coord.standard_name for coord in coords]
assert "longitude" in coord_names
assert "latitude" in coord_names


def test_load_zarr2_local():
"""Test loading a Zarr2 store from local FS."""
zarr_path = (
Path(importlib_files("tests"))
/ "testdata"
/ "zarr-sample-data"
/ "example_field_0.zarr2"
)

xr_kwargs = _return_kwargs()
zarr_xr = xr.open_dataset(zarr_path, **xr_kwargs)

cubes = conversion_func(zarr_xr)

assert len(cubes) == 1
cube = cubes[0]
_run_checks(cube)


def test_load_zarr3_local():
"""Test loading a Zarr3 store from local FS."""
zarr_path = (
Path(importlib_files("tests"))
/ "testdata"
/ "zarr-sample-data"
/ "example_field_0.zarr3"
)

xr_kwargs = _return_kwargs()
zarr_xr = xr.open_dataset(zarr_path, **xr_kwargs)

cubes = conversion_func(zarr_xr)

assert len(cubes) == 1
cube = cubes[0]
_run_checks(cube)


def _is_url_ok(url):
fs = fsspec.filesystem("http")
valid_zarr = True
try:
fs.open(str(url) + "/zarr.json", "rb") # Zarr3
except Exception: # noqa: BLE001
try:
fs.open(str(url) + "/.zmetadata", "rb") # Zarr2
except Exception: # noqa: BLE001
valid_zarr = False

return valid_zarr


S3_TEST_PATH = (
"https://uor-aces-o.s3-ext.jc.rl.ac.uk/"
"esmvaltool-zarr/pr_Amon_CNRM-ESM2-1_02Kpd-11_r1i1p2f2_gr_200601-220112.zarr3"
)
_S3_accessible = _is_url_ok(S3_TEST_PATH)


@pytest.mark.skipif(not _S3_accessible, reason="S3 url not accessible")
def test_load_remote_zarr():
"""Test loading a remote Zarr store.

This is a ~250MB compressed Zarr in an S3 bucket.
Conversion is done fully lazily, by passing chunks={}
to Xarray loader. Test takes ~3-4s and needs ~400MB res mem.
"""
zarr_path = S3_TEST_PATH

xr_kwargs = _return_kwargs()
zarr_xr = xr.open_dataset(zarr_path, **xr_kwargs)

cubes = conversion_func(zarr_xr)

assert isinstance(cubes, iris.cube.CubeList)
assert len(cubes) == 1
assert cubes[0].has_lazy_data()
3 changes: 3 additions & 0 deletions tests/testdata/zarr-sample-data/example_field_0.zarr2/.zattrs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"Conventions": "CF-1.12"
}
3 changes: 3 additions & 0 deletions tests/testdata/zarr-sample-data/example_field_0.zarr2/.zgroup
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"zarr_format": 2
}
Loading
Loading