Skip to content

Commit aab0f27

Browse files
committed
fixed coverage
1 parent 2a262f5 commit aab0f27

File tree

2 files changed

+62
-11
lines changed

2 files changed

+62
-11
lines changed

tests/config/test_attrs.py

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
# Permissions are hereby granted under the terms of the MIT License:
33
# https://opensource.org/licenses/MIT.
44

5+
import datetime
56
import json
67
import unittest
7-
from datetime import datetime
88

99
import numpy as np
1010
import xarray as xr
@@ -149,25 +149,76 @@ def test_yes(self):
149149

150150

151151
class EvalExprTest(unittest.TestCase):
152-
def test_all_cases(self):
152+
def test_scalar_result(self):
153153
# scalars
154154
self.assertEqual(None, eval_expr("None", {}))
155155
self.assertEqual(True, eval_expr("True", {}))
156156
self.assertEqual(13, eval_expr("13", {}))
157+
self.assertEqual("nan", eval_expr("float('NaN')", {}))
157158
self.assertEqual(0.5, eval_expr("0.5", {}))
158159
self.assertEqual("ABC", eval_expr("'ABC'", {}))
159-
time = datetime.fromisoformat("2024-01-02T10:20:30")
160+
time = datetime.date.fromisoformat("2024-01-02")
161+
self.assertEqual(
162+
"2024-01-02",
163+
eval_expr("time", dict(time=time)),
164+
)
165+
time = datetime.datetime.fromisoformat("2024-01-02T10:20:30")
160166
self.assertEqual(
161167
"2024-01-02T10:20:30",
162168
eval_expr("time", dict(time=time)),
163169
)
170+
with pytest.raises(
171+
ValueError, match="cannot serialize value of type <class 'object'>"
172+
):
173+
eval_expr("obj", dict(obj=object()))
164174

175+
def test_dict_result(self):
176+
self.assertEqual({}, eval_expr("d", dict(d={})))
177+
self.assertEqual(
178+
{
179+
"b": True,
180+
"i": 13,
181+
"t": [1, "B", {}],
182+
"f": 13.2,
183+
"d": "2020-05-04",
184+
"np_a": [0.1, 0.2],
185+
"xr_a": [0.3, 0.4],
186+
},
187+
eval_expr(
188+
"d",
189+
dict(
190+
d={
191+
"b": True,
192+
"i": 13,
193+
"t": (1, "B", {}),
194+
"f": 13.2,
195+
"d": datetime.date.fromisoformat("2020-05-04"),
196+
"np_a": np.array([0.1, 0.2]),
197+
"xr_a": xr.DataArray(np.array([0.3, 0.4])),
198+
}
199+
),
200+
),
201+
)
202+
203+
def test_array_1d_result(self):
165204
# arrays
166205
self.assert_array_ok([True, False])
167206
self.assert_array_ok([3, 4, 5])
168207
self.assert_array_ok([11.05, 11.15, 11.25])
208+
self.assert_array_ok([11.05, "nan", 11.25], dtype="float64")
169209
self.assert_array_ok(["A", "B"])
170210
self.assert_array_ok(["2024-01-02T10:20:30"], dtype="datetime64[s]")
211+
with pytest.raises(
212+
ValueError,
213+
match=(
214+
"cannot serialize 0-d array"
215+
" of type <class 'numpy.ndarray'>, dtype=dtype\\('O'\\)"
216+
),
217+
):
218+
eval_expr("a", dict(a=xr.DataArray([object(), object()])))
219+
220+
def test_array_2d_result(self):
221+
self.assert_array_ok([[3, 4], [5, 6]])
171222

172223
def assert_array_ok(self, a: list, dtype=None):
173224
# Test list
@@ -192,7 +243,7 @@ def assert_array_ok(self, a: list, dtype=None):
192243
)
193244

194245
# Test xarray-DataArray
195-
xr_a = xr.DataArray(np_a, dims="x")
246+
xr_a = xr.DataArray(np_a)
196247
self.assertEqual(
197248
a,
198249
eval_expr("a", dict(a=xr_a)),

zappend/config/attrs.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,13 @@ def to_json(value) -> Any:
7373
if math.isfinite(value):
7474
return value
7575
else:
76-
# TODO: case cover by test
7776
return str(value)
7877
if isinstance(value, (bool, int, str, type(None))):
7978
return value
8079
if isinstance(value, datetime.date):
8180
if isinstance(value, datetime.datetime):
8281
return value.replace(microsecond=0).isoformat()
8382
else:
84-
# TODO: cover case by test
8583
return value.isoformat()
8684

8785
try:
@@ -95,7 +93,6 @@ def to_json(value) -> Any:
9593
if np.isfinite(value):
9694
return float(value)
9795
else:
98-
# TODO: cover case by test
9996
return str(value)
10097
if np.issubdtype(value.dtype, np.bool_):
10198
return bool(value)
@@ -105,18 +102,21 @@ def to_json(value) -> Any:
105102
return int(value)
106103
if np.issubdtype(value.dtype, np.datetime64):
107104
return np.datetime_as_string(value, unit="s")
108-
# TODO: cover case by test
109105
raise ValueError(
110-
f"cannot serialize 0-d array of type {value.dtype}: {value}"
106+
f"cannot serialize 0-d array of type {type(value)}, dtype={value.dtype!r}"
111107
)
112108
except AttributeError:
113109
pass
114110

115111
if isinstance(value, dict):
116-
# TODO: cover case by test
117112
return {k: to_json(v) for k, v in value.items()}
118113

119-
return [to_json(v) for v in value]
114+
try:
115+
values = iter(value)
116+
except TypeError:
117+
raise ValueError(f"cannot serialize value of type {type(value)}")
118+
119+
return [to_json(v) for v in values]
120120

121121

122122
def get_dyn_config_attrs_env(ds: xr.Dataset, **kwargs):

0 commit comments

Comments
 (0)