Skip to content

Commit eb50f50

Browse files
committed
Tweak internal consistency checks
1 parent da8b1c5 commit eb50f50

File tree

3 files changed

+91
-82
lines changed

3 files changed

+91
-82
lines changed

xarray/coding/cftime_offsets.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def get_date_type(calendar):
7979

8080
class BaseCFTimeOffset(object):
8181
_freq = None # type: ClassVar[str]
82-
_day_option = None
82+
_day_option = None # type: ClassVar[str]
8383

8484
def __init__(self, n=1):
8585
if not isinstance(n, int):

xarray/testing.py

Lines changed: 87 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
"""Testing functions exposed to the user API"""
22
from collections import OrderedDict
3+
from typing import Hashable, Union
34

45
import numpy as np
56
import pandas as pd
67

78
from xarray.core import duck_array_ops
89
from xarray.core import formatting
10+
from xarray.core.dataarray import DataArray
11+
from xarray.core.dataset import Dataset
12+
from xarray.core.variable import IndexVariable, Variable
913
from xarray.core.indexes import default_indexes
1014

1115

@@ -49,12 +53,11 @@ def assert_equal(a, b):
4953
assert_identical, assert_allclose, Dataset.equals, DataArray.equals,
5054
numpy.testing.assert_array_equal
5155
"""
52-
import xarray as xr
5356
__tracebackhide__ = True # noqa: F841
5457
assert type(a) == type(b) # noqa
55-
if isinstance(a, (xr.Variable, xr.DataArray)):
58+
if isinstance(a, (Variable, DataArray)):
5659
assert a.equals(b), formatting.diff_array_repr(a, b, 'equals')
57-
elif isinstance(a, xr.Dataset):
60+
elif isinstance(a, Dataset):
5861
assert a.equals(b), formatting.diff_dataset_repr(a, b, 'equals')
5962
else:
6063
raise TypeError('{} not supported by assertion comparison'
@@ -78,15 +81,14 @@ def assert_identical(a, b):
7881
--------
7982
assert_equal, assert_allclose, Dataset.equals, DataArray.equals
8083
"""
81-
import xarray as xr
8284
__tracebackhide__ = True # noqa: F841
8385
assert type(a) == type(b) # noqa
84-
if isinstance(a, xr.Variable):
86+
if isinstance(a, Variable):
8587
assert a.identical(b), formatting.diff_array_repr(a, b, 'identical')
86-
elif isinstance(a, xr.DataArray):
88+
elif isinstance(a, DataArray):
8789
assert a.name == b.name
8890
assert a.identical(b), formatting.diff_array_repr(a, b, 'identical')
89-
elif isinstance(a, (xr.Dataset, xr.Variable)):
91+
elif isinstance(a, (Dataset, Variable)):
9092
assert a.identical(b), formatting.diff_dataset_repr(a, b, 'identical')
9193
else:
9294
raise TypeError('{} not supported by assertion comparison'
@@ -118,15 +120,14 @@ def assert_allclose(a, b, rtol=1e-05, atol=1e-08, decode_bytes=True):
118120
--------
119121
assert_identical, assert_equal, numpy.testing.assert_allclose
120122
"""
121-
import xarray as xr
122123
__tracebackhide__ = True # noqa: F841
123124
assert type(a) == type(b) # noqa
124125
kwargs = dict(rtol=rtol, atol=atol, decode_bytes=decode_bytes)
125-
if isinstance(a, xr.Variable):
126+
if isinstance(a, Variable):
126127
assert a.dims == b.dims
127128
allclose = _data_allclose_or_equiv(a.values, b.values, **kwargs)
128129
assert allclose, '{}\n{}'.format(a.values, b.values)
129-
elif isinstance(a, xr.DataArray):
130+
elif isinstance(a, DataArray):
130131
assert_allclose(a.variable, b.variable, **kwargs)
131132
assert set(a.coords) == set(b.coords)
132133
for v in a.coords.variables:
@@ -136,7 +137,7 @@ def assert_allclose(a, b, rtol=1e-05, atol=1e-08, decode_bytes=True):
136137
b.coords[v].values, **kwargs)
137138
assert allclose, '{}\n{}'.format(a.coords[v].values,
138139
b.coords[v].values)
139-
elif isinstance(a, xr.Dataset):
140+
elif isinstance(a, Dataset):
140141
assert set(a.data_vars) == set(b.data_vars)
141142
assert set(a.coords) == set(b.coords)
142143
for k in list(a.variables) + list(a.coords):
@@ -148,14 +149,12 @@ def assert_allclose(a, b, rtol=1e-05, atol=1e-08, decode_bytes=True):
148149

149150

150151
def _assert_indexes_invariants_checks(indexes, possible_coord_variables, dims):
151-
import xarray as xr
152-
153152
assert isinstance(indexes, OrderedDict), indexes
154153
assert all(isinstance(v, pd.Index) for v in indexes.values()), \
155154
{k: type(v) for k, v in indexes.items()}
156155

157156
index_vars = {k for k, v in possible_coord_variables.items()
158-
if isinstance(v, xr.IndexVariable)}
157+
if isinstance(v, IndexVariable)}
159158
assert indexes.keys() <= index_vars, (set(indexes), index_vars)
160159

161160
# Note: when we support non-default indexes, these checks should be opt-in
@@ -167,98 +166,108 @@ def _assert_indexes_invariants_checks(indexes, possible_coord_variables, dims):
167166
(indexes, defaults)
168167

169168

170-
def _assert_indexes_invariants(a):
169+
def _assert_indexes_invariants(
170+
xarray_obj: Union[DataArray, Dataset, Variable],
171+
):
171172
"""Separate helper function for checking indexes invariants only."""
172-
import xarray as xr
173-
174-
if isinstance(a, xr.DataArray):
175-
if a._indexes is not None:
176-
_assert_indexes_invariants_checks(a._indexes, a._coords, a.dims)
177-
elif isinstance(a, xr.Dataset):
178-
if a._indexes is not None:
173+
if isinstance(xarray_obj, DataArray):
174+
if xarray_obj._indexes is not None:
175+
_assert_indexes_invariants_checks(
176+
xarray_obj._indexes, xarray_obj._coords, xarray_obj.dims)
177+
elif isinstance(xarray_obj, Dataset):
178+
if xarray_obj._indexes is not None:
179179
_assert_indexes_invariants_checks(
180-
a._indexes, a._variables, a._dims)
181-
elif isinstance(a, xr.Variable):
180+
xarray_obj._indexes, xarray_obj._variables, xarray_obj._dims)
181+
else:
182182
# no indexes
183183
pass
184184

185185

186-
def _assert_variable_invariants(a, name=None):
187-
name_or_empty = (name,) if name is not None else ()
188-
assert isinstance(a._dims, tuple), name_or_empty + (a._dims,)
189-
assert len(a._dims) == len(a._data.shape), \
190-
name_or_empty + (a._dims, a._data.shape)
191-
assert isinstance(a._encoding, (type(None), dict)), \
192-
name_or_empty + (a._encoding,)
193-
assert isinstance(a._attrs, (type(None), OrderedDict)), \
194-
name_or_empty + (a._attrs,)
195-
186+
def _assert_variable_invariants(var: Variable, name: Hashable = None):
187+
if name is None:
188+
name_or_empty = () # type: tuple
189+
else:
190+
name_or_empty = (name,)
191+
assert isinstance(var._dims, tuple), name_or_empty + (var._dims,)
192+
assert len(var._dims) == len(var._data.shape), \
193+
name_or_empty + (var._dims, var._data.shape)
194+
assert isinstance(var._encoding, (type(None), dict)), \
195+
name_or_empty + (var._encoding,)
196+
assert isinstance(var._attrs, (type(None), OrderedDict)), \
197+
name_or_empty + (var._attrs,)
196198

197-
def _assert_dataarray_invariants(a):
198-
import xarray as xr
199199

200-
assert isinstance(a._variable, xr.Variable), a._variable
201-
_assert_variable_invariants(a._variable)
200+
def _assert_dataarray_invariants(da: DataArray):
201+
assert isinstance(da._variable, Variable), da._variable
202+
_assert_variable_invariants(da._variable)
202203

203-
assert isinstance(a._coords, OrderedDict), a._coords
204+
assert isinstance(da._coords, OrderedDict), da._coords
204205
assert all(
205-
isinstance(v, xr.Variable) for v in a._coords.values()), a._coords
206-
assert all(set(v.dims) <= set(a.dims) for v in a._coords.values()), \
207-
(a.dims, {k: v.dims for k, v in a._coords.items()})
208-
assert all(isinstance(v, xr.IndexVariable)
209-
for (k, v) in a._coords.items()
206+
isinstance(v, Variable) for v in da._coords.values()), da._coords
207+
assert all(set(v.dims) <= set(da.dims) for v in da._coords.values()), \
208+
(da.dims, {k: v.dims for k, v in da._coords.items()})
209+
assert all(isinstance(v, IndexVariable)
210+
for (k, v) in da._coords.items()
210211
if v.dims == (k,)), \
211-
{k: type(v) for k, v in a._coords.items()}
212-
for k, v in a._coords.items():
212+
{k: type(v) for k, v in da._coords.items()}
213+
for k, v in da._coords.items():
213214
_assert_variable_invariants(v, k)
214215

215-
assert a._initialized is True
216-
216+
assert da._initialized is True
217217

218-
def _assert_dataset_invariants(a):
219-
import xarray as xr
220218

221-
assert isinstance(a._variables, OrderedDict), type(a._variables)
219+
def _assert_dataset_invariants(ds: Dataset):
220+
assert isinstance(ds._variables, OrderedDict), type(ds._variables)
222221
assert all(
223-
isinstance(v, xr.Variable) for v in a._variables.values()), \
224-
a._variables
225-
for k, v in a._variables.items():
222+
isinstance(v, Variable) for v in ds._variables.values()), \
223+
ds._variables
224+
for k, v in ds._variables.items():
226225
_assert_variable_invariants(v, k)
227226

228-
assert isinstance(a._coord_names, set), a._coord_names
229-
assert a._coord_names <= a._variables.keys(), \
230-
(a._coord_names, set(a._variables))
227+
assert isinstance(ds._coord_names, set), ds._coord_names
228+
assert ds._coord_names <= ds._variables.keys(), \
229+
(ds._coord_names, set(ds._variables))
231230

232-
assert type(a._dims) is dict, a._dims
233-
assert all(isinstance(v, int) for v in a._dims.values()), a._dims
234-
var_dims = set.union(*[set(v.dims) for v in a._variables.values()])
235-
assert a._dims.keys() == var_dims, (set(a._dims), var_dims)
236-
assert all(a._dims[k] == v.sizes[k]
237-
for v in a._variables.values()
231+
assert type(ds._dims) is dict, ds._dims
232+
assert all(isinstance(v, int) for v in ds._dims.values()), ds._dims
233+
var_dims = set.union(*[set(v.dims) for v in ds._variables.values()])
234+
assert ds._dims.keys() == var_dims, (set(ds._dims), var_dims)
235+
assert all(ds._dims[k] == v.sizes[k]
236+
for v in ds._variables.values()
238237
for k in v.sizes), \
239-
(a._dims, {k: v.sizes for k, v in a._variables.items()})
238+
(ds._dims, {k: v.sizes for k, v in ds._variables.items()})
239+
assert all(isinstance(v, IndexVariable)
240+
for (k, v) in ds._variables.items()
241+
if v.dims == (k,)), \
242+
{k: type(v) for k, v in ds._variables.items() if v.dims == (k,)}
243+
assert all(v.dims == (k,)
244+
for (k, v) in ds._variables.items()
245+
if k in ds._dims), \
246+
{k: v.dims for k, v in ds._variables.items() if k in ds._dims}
240247

241-
assert isinstance(a._encoding, (type(None), dict))
242-
assert isinstance(a._attrs, (type(None), OrderedDict))
243-
assert a._initialized is True
248+
assert isinstance(ds._encoding, (type(None), dict))
249+
assert isinstance(ds._attrs, (type(None), OrderedDict))
250+
assert ds._initialized is True
244251

245252

246-
def _assert_internal_invariants(a):
253+
def _assert_internal_invariants(
254+
xarray_obj: Union[DataArray, Dataset, Variable],
255+
):
247256
"""Validate that an xarray object satisfies its own internal invariants.
248257
249258
This exists for the benefit of xarray's own test suite, but may be useful
250259
in external projects if they (ill-advisedly) create objects using xarray's
251260
private APIs.
252261
"""
253-
import xarray as xr
254-
if isinstance(a, xr.Variable):
255-
_assert_variable_invariants(a)
256-
elif isinstance(a, xr.DataArray):
257-
_assert_dataarray_invariants(a)
258-
elif isinstance(a, xr.Dataset):
259-
_assert_dataset_invariants(a)
262+
if isinstance(xarray_obj, Variable):
263+
_assert_variable_invariants(xarray_obj)
264+
elif isinstance(xarray_obj, DataArray):
265+
_assert_dataarray_invariants(xarray_obj)
266+
elif isinstance(xarray_obj, Dataset):
267+
_assert_dataset_invariants(xarray_obj)
260268
else:
261-
raise TypeError('{} not supported by assertion comparison'
262-
.format(type(a)))
269+
raise TypeError(
270+
'{} is not a supported type for xarray invariant checks'
271+
.format(type(xarray_obj)))
263272

264-
_assert_indexes_invariants(a)
273+
_assert_indexes_invariants(xarray_obj)

xarray/tests/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ def source_ndarray(array):
185185
# invariants
186186
# TODO: add more invariant checks.
187187

188-
def assert_equal(a, b, *, check_invariants=False):
188+
def assert_equal(a, b, *, check_invariants=True):
189189
xarray.testing.assert_equal(a, b)
190190
if check_invariants:
191191
xarray.testing._assert_internal_invariants(a)
@@ -195,7 +195,7 @@ def assert_equal(a, b, *, check_invariants=False):
195195
xarray.testing._assert_indexes_invariants(b)
196196

197197

198-
def assert_identical(a, b, *, check_invariants=False):
198+
def assert_identical(a, b, *, check_invariants=True):
199199
xarray.testing.assert_identical(a, b)
200200
if check_invariants:
201201
xarray.testing._assert_internal_invariants(a)
@@ -205,7 +205,7 @@ def assert_identical(a, b, *, check_invariants=False):
205205
xarray.testing._assert_indexes_invariants(b)
206206

207207

208-
def assert_allclose(a, b, *, check_invariants=False, **kwargs):
208+
def assert_allclose(a, b, *, check_invariants=True, **kwargs):
209209
xarray.testing.assert_allclose(a, b, **kwargs)
210210
if check_invariants:
211211
xarray.testing._assert_internal_invariants(a)

0 commit comments

Comments
 (0)