66(2) check equivalence of files : xarray -> file VS xarray->ncdata->file
77"""
88
9+ import numpy as np
910import pytest
1011import xarray
1112
@@ -38,6 +39,45 @@ def use_xarraylock():
3839 yield
3940
4041
42+ def check_load_equivalence (ds1 : xarray .Dataset , ds2 : xarray .Dataset ):
43+ """
44+ Check that datasets differ only in "expected" ways.
45+
46+ The key differences are due to coordinates remaining lazy in loading via ncdata, but
47+ having real data in a "normal" load. This also affects which coords have indexes,
48+ but we are not checking that here anyway.
49+ """
50+
51+ def check_attrs_equivalent (attrs1 , attrs2 ):
52+ # Because dict-eq does not work when values can be arrays (!)
53+ okay = set (attrs1 .keys ()) == set (attrs2 .keys ())
54+ if okay :
55+ for attr in attrs1 :
56+ okay = np .all (attrs1 [attr ] == attrs2 [attr ])
57+ if not okay :
58+ break
59+ assert okay
60+
61+ def check_vars_equivalent (v1 , v2 ):
62+ check_attrs_equivalent (v1 .attrs , v2 .attrs )
63+ assert v1 .dims == v2 .dims
64+ assert v1 .dtype == v2 .dtype
65+ # Numeric compare may need to allow for NaNs : floats *and datetimes*
66+ equal_nan = (
67+ v1 .dtype .kind in "fM"
68+ ) # cannot set kwarg when not applicable
69+ result = np .array_equal (v1 .data , v2 .data , equal_nan = equal_nan )
70+ if hasattr (result , "compute" ):
71+ result = result .compute ()
72+ assert result
73+
74+ check_attrs_equivalent (ds1 .attrs , ds2 .attrs )
75+ assert ds1 .dims == ds2 .dims
76+ assert list (ds1 .variables ) == list (ds2 .variables )
77+ for varname in ds1 .variables :
78+ check_vars_equivalent (ds1 .variables [varname ], ds2 .variables [varname ])
79+
80+
4181def test_load_direct_vs_viancdata (standard_testcase , use_xarraylock , tmp_path ):
4282 source_filepath = standard_testcase .filepath
4383 ncdata = from_nc4 (source_filepath )
@@ -52,8 +92,7 @@ def test_load_direct_vs_viancdata(standard_testcase, use_xarraylock, tmp_path):
5292 # Load same, via ncdata
5393 xr_ncdata_ds = to_xarray (ncdata )
5494
55- # Treat as OK if it passes xarray comparison
56- assert xr_ds .identical (xr_ncdata_ds )
95+ check_load_equivalence (xr_ds , xr_ncdata_ds )
5796
5897
5998def test_save_direct_vs_viancdata (standard_testcase , tmp_path ):
0 commit comments