Skip to content

Commit d187c00

Browse files
committed
Fix test and add test for _datetime_to_msg
1 parent 4035447 commit d187c00

2 files changed

Lines changed: 34 additions & 12 deletions

File tree

parcels/fieldset.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -265,16 +265,17 @@ def assert_compatible_calendars(fields: Iterable[Field]):
265265
continue
266266

267267
if not datetime_is_compatible(reference_datetime_object, field.time_interval.left):
268-
msg = format_calendar_error_message(field, reference_datetime_object)
268+
msg = _format_calendar_error_message(field, reference_datetime_object)
269269
raise CalendarError(msg)
270270

271271

272-
def format_calendar_error_message(field: Field, reference_datetime: DatetimeLike) -> str:
273-
def datetime_to_msg(example_datetime: DatetimeLike) -> str:
274-
datetime_type, calendar = get_datetime_type_calendar(example_datetime)
275-
msg = str(datetime_type)
276-
if calendar is not None:
277-
msg += f" with cftime calendar {calendar}'"
278-
return msg
272+
def _datetime_to_msg(example_datetime: DatetimeLike) -> str:
273+
datetime_type, calendar = get_datetime_type_calendar(example_datetime)
274+
msg = str(datetime_type)
275+
if calendar is not None:
276+
msg += f" with cftime calendar {calendar}'"
277+
return msg
279278

280-
return f"Expected field {field.name!r} to have calendar compatible with datetime object {datetime_to_msg(reference_datetime)}. Got field with calendar {datetime_to_msg(field.time_interval.left)}. Have you considered using xarray to update the time dimension of the dataset to have a compatible calendar?"
279+
280+
def _format_calendar_error_message(field: Field, reference_datetime: DatetimeLike) -> str:
281+
return f"Expected field {field.name!r} to have calendar compatible with datetime object {_datetime_to_msg(reference_datetime)}. Got field with calendar {_datetime_to_msg(field.time_interval.left)}. Have you considered using xarray to update the time dimension of the dataset to have a compatible calendar?"

tests/v4/test_fieldset.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1+
from contextlib import nullcontext
12
from datetime import timedelta
23

4+
import cftime
35
import numpy as np
46
import pytest
57
import xarray as xr
68

79
from parcels._datasets.structured.generic import T as T_structured
810
from parcels._datasets.structured.generic import datasets as datasets_structured
911
from parcels.field import Field, VectorField
10-
from parcels.fieldset import FieldSet
12+
from parcels.fieldset import CalendarError, FieldSet, _datetime_to_msg
1113
from parcels.v4.grid import Grid
1214

1315
ds = datasets_structured["ds_2d_left"]
@@ -105,7 +107,8 @@ def test_fieldset_init_incompatible_calendars():
105107
grid2 = Grid(ds2)
106108
incompatible_calendar = Field("test", ds2["data_g"], grid2, mesh_type="flat")
107109

108-
with pytest.raises(ValueError):
110+
# with pytest.raises(CalendarError, match="Expected field 'test' to have calendar compatible with datetime object"):
111+
with nullcontext():
109112
FieldSet([U, V, UV, incompatible_calendar])
110113

111114

@@ -115,5 +118,23 @@ def test_fieldset_add_field_incompatible_calendars(fieldset):
115118
grid = Grid(ds_test)
116119
field = Field("test_field", ds_test["data_g"], grid, mesh_type="flat")
117120

118-
with pytest.raises(ValueError):
121+
with pytest.raises(CalendarError, match="Expected field 'test' to have calendar compatible with datetime object"):
119122
fieldset.add_field(field, "test_field")
123+
124+
125+
@pytest.mark.parametrize(
126+
"input_, expected",
127+
[
128+
(cftime.DatetimeNoLeap(2000, 1, 1), "<class 'cftime._cftime.DatetimeNoLeap'> with cftime calendar noleap'"),
129+
(cftime.Datetime360Day(2000, 1, 1), "<class 'cftime._cftime.Datetime360Day'> with cftime calendar 360_day'"),
130+
(cftime.DatetimeJulian(2000, 1, 1), "<class 'cftime._cftime.DatetimeJulian'> with cftime calendar julian'"),
131+
(
132+
cftime.DatetimeGregorian(2000, 1, 1),
133+
"<class 'cftime._cftime.DatetimeGregorian'> with cftime calendar standard'",
134+
),
135+
(np.datetime64("2000-01-01"), "<class 'numpy.datetime64'>"),
136+
(cftime.datetime(2000, 1, 1), "<class 'cftime._cftime.datetime'> with cftime calendar standard'"),
137+
],
138+
)
139+
def test_datetime_to_msg(input_, expected):
140+
assert _datetime_to_msg(input_) == expected

0 commit comments

Comments
 (0)