1
1
"""Testing functions exposed to the user API"""
2
2
from collections import OrderedDict
3
+ from typing import Hashable , Union
3
4
4
5
import numpy as np
5
6
import pandas as pd
6
7
7
8
from xarray .core import duck_array_ops
8
9
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
9
13
from xarray .core .indexes import default_indexes
10
14
11
15
@@ -49,12 +53,11 @@ def assert_equal(a, b):
49
53
assert_identical, assert_allclose, Dataset.equals, DataArray.equals,
50
54
numpy.testing.assert_array_equal
51
55
"""
52
- import xarray as xr
53
56
__tracebackhide__ = True # noqa: F841
54
57
assert type (a ) == type (b ) # noqa
55
- if isinstance (a , (xr . Variable , xr . DataArray )):
58
+ if isinstance (a , (Variable , DataArray )):
56
59
assert a .equals (b ), formatting .diff_array_repr (a , b , 'equals' )
57
- elif isinstance (a , xr . Dataset ):
60
+ elif isinstance (a , Dataset ):
58
61
assert a .equals (b ), formatting .diff_dataset_repr (a , b , 'equals' )
59
62
else :
60
63
raise TypeError ('{} not supported by assertion comparison'
@@ -78,15 +81,14 @@ def assert_identical(a, b):
78
81
--------
79
82
assert_equal, assert_allclose, Dataset.equals, DataArray.equals
80
83
"""
81
- import xarray as xr
82
84
__tracebackhide__ = True # noqa: F841
83
85
assert type (a ) == type (b ) # noqa
84
- if isinstance (a , xr . Variable ):
86
+ if isinstance (a , Variable ):
85
87
assert a .identical (b ), formatting .diff_array_repr (a , b , 'identical' )
86
- elif isinstance (a , xr . DataArray ):
88
+ elif isinstance (a , DataArray ):
87
89
assert a .name == b .name
88
90
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 )):
90
92
assert a .identical (b ), formatting .diff_dataset_repr (a , b , 'identical' )
91
93
else :
92
94
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):
118
120
--------
119
121
assert_identical, assert_equal, numpy.testing.assert_allclose
120
122
"""
121
- import xarray as xr
122
123
__tracebackhide__ = True # noqa: F841
123
124
assert type (a ) == type (b ) # noqa
124
125
kwargs = dict (rtol = rtol , atol = atol , decode_bytes = decode_bytes )
125
- if isinstance (a , xr . Variable ):
126
+ if isinstance (a , Variable ):
126
127
assert a .dims == b .dims
127
128
allclose = _data_allclose_or_equiv (a .values , b .values , ** kwargs )
128
129
assert allclose , '{}\n {}' .format (a .values , b .values )
129
- elif isinstance (a , xr . DataArray ):
130
+ elif isinstance (a , DataArray ):
130
131
assert_allclose (a .variable , b .variable , ** kwargs )
131
132
assert set (a .coords ) == set (b .coords )
132
133
for v in a .coords .variables :
@@ -136,7 +137,7 @@ def assert_allclose(a, b, rtol=1e-05, atol=1e-08, decode_bytes=True):
136
137
b .coords [v ].values , ** kwargs )
137
138
assert allclose , '{}\n {}' .format (a .coords [v ].values ,
138
139
b .coords [v ].values )
139
- elif isinstance (a , xr . Dataset ):
140
+ elif isinstance (a , Dataset ):
140
141
assert set (a .data_vars ) == set (b .data_vars )
141
142
assert set (a .coords ) == set (b .coords )
142
143
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):
148
149
149
150
150
151
def _assert_indexes_invariants_checks (indexes , possible_coord_variables , dims ):
151
- import xarray as xr
152
-
153
152
assert isinstance (indexes , OrderedDict ), indexes
154
153
assert all (isinstance (v , pd .Index ) for v in indexes .values ()), \
155
154
{k : type (v ) for k , v in indexes .items ()}
156
155
157
156
index_vars = {k for k , v in possible_coord_variables .items ()
158
- if isinstance (v , xr . IndexVariable )}
157
+ if isinstance (v , IndexVariable )}
159
158
assert indexes .keys () <= index_vars , (set (indexes ), index_vars )
160
159
161
160
# 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):
167
166
(indexes , defaults )
168
167
169
168
170
- def _assert_indexes_invariants (a ):
169
+ def _assert_indexes_invariants (
170
+ xarray_obj : Union [DataArray , Dataset , Variable ],
171
+ ):
171
172
"""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 :
179
179
_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 :
182
182
# no indexes
183
183
pass
184
184
185
185
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 ,)
196
198
197
- def _assert_dataarray_invariants (a ):
198
- import xarray as xr
199
199
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 )
202
203
203
- assert isinstance (a ._coords , OrderedDict ), a ._coords
204
+ assert isinstance (da ._coords , OrderedDict ), da ._coords
204
205
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 ()
210
211
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 ():
213
214
_assert_variable_invariants (v , k )
214
215
215
- assert a ._initialized is True
216
-
216
+ assert da ._initialized is True
217
217
218
- def _assert_dataset_invariants (a ):
219
- import xarray as xr
220
218
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 )
222
221
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 ():
226
225
_assert_variable_invariants (v , k )
227
226
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 ))
231
230
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 ()
238
237
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 }
240
247
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
244
251
245
252
246
- def _assert_internal_invariants (a ):
253
+ def _assert_internal_invariants (
254
+ xarray_obj : Union [DataArray , Dataset , Variable ],
255
+ ):
247
256
"""Validate that an xarray object satisfies its own internal invariants.
248
257
249
258
This exists for the benefit of xarray's own test suite, but may be useful
250
259
in external projects if they (ill-advisedly) create objects using xarray's
251
260
private APIs.
252
261
"""
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 )
260
268
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 )))
263
272
264
- _assert_indexes_invariants (a )
273
+ _assert_indexes_invariants (xarray_obj )
0 commit comments