Skip to content

Commit 45cc2ee

Browse files
dcherianmathausespencerkclarkpre-commit-ci[bot]
authored
Refactor calendar fixtures (#10150)
* Refactor calendar fixtures * Update xarray/tests/__init__.py Co-authored-by: Mathias Hauser <[email protected]> * Apply suggestions from code review Co-authored-by: Spencer Clark <[email protected]> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * sort * cleanup --------- Co-authored-by: Mathias Hauser <[email protected]> Co-authored-by: Spencer Clark <[email protected]> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 2da7f55 commit 45cc2ee

File tree

4 files changed

+51
-58
lines changed

4 files changed

+51
-58
lines changed

xarray/tests/__init__.py

+28-4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import xarray.testing
1818
from xarray import Dataset
19+
from xarray.coding.times import _STANDARD_CALENDARS as _STANDARD_CALENDARS_UNSORTED
1920
from xarray.core.duck_array_ops import allclose_or_equiv # noqa: F401
2021
from xarray.core.extension_array import PandasExtensionArray
2122
from xarray.core.options import set_options
@@ -355,13 +356,36 @@ def create_test_data(
355356
return obj
356357

357358

358-
_CFTIME_CALENDARS = [
359+
_STANDARD_CALENDAR_NAMES = sorted(_STANDARD_CALENDARS_UNSORTED)
360+
_NON_STANDARD_CALENDAR_NAMES = {
361+
"noleap",
359362
"365_day",
360363
"360_day",
361364
"julian",
362365
"all_leap",
363366
"366_day",
364-
"gregorian",
365-
"proleptic_gregorian",
366-
"standard",
367+
}
368+
_NON_STANDARD_CALENDARS = [
369+
pytest.param(cal, marks=requires_cftime)
370+
for cal in sorted(_NON_STANDARD_CALENDAR_NAMES)
371+
]
372+
_STANDARD_CALENDARS = [pytest.param(cal) for cal in _STANDARD_CALENDAR_NAMES]
373+
_ALL_CALENDARS = sorted(_STANDARD_CALENDARS + _NON_STANDARD_CALENDARS)
374+
_CFTIME_CALENDARS = [
375+
pytest.param(*p.values, marks=requires_cftime) for p in _ALL_CALENDARS
367376
]
377+
378+
379+
def _all_cftime_date_types():
380+
import cftime
381+
382+
return {
383+
"noleap": cftime.DatetimeNoLeap,
384+
"365_day": cftime.DatetimeNoLeap,
385+
"360_day": cftime.Datetime360Day,
386+
"julian": cftime.DatetimeJulian,
387+
"all_leap": cftime.DatetimeAllLeap,
388+
"366_day": cftime.DatetimeAllLeap,
389+
"gregorian": cftime.DatetimeGregorian,
390+
"proleptic_gregorian": cftime.DatetimeProlepticGregorian,
391+
}

xarray/tests/test_accessor_dt.py

+9-16
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import xarray as xr
88
from xarray.tests import (
9+
_CFTIME_CALENDARS,
10+
_all_cftime_date_types,
911
assert_allclose,
1012
assert_array_equal,
1113
assert_chunks_equal,
@@ -390,15 +392,6 @@ def test_dask_accessor_method(self, method, parameters) -> None:
390392
assert_equal(actual.compute(), expected.compute())
391393

392394

393-
_CFTIME_CALENDARS = [
394-
"365_day",
395-
"360_day",
396-
"julian",
397-
"all_leap",
398-
"366_day",
399-
"gregorian",
400-
"proleptic_gregorian",
401-
]
402395
_NT = 100
403396

404397

@@ -407,6 +400,13 @@ def calendar(request):
407400
return request.param
408401

409402

403+
@pytest.fixture()
404+
def cftime_date_type(calendar):
405+
if calendar == "standard":
406+
calendar = "proleptic_gregorian"
407+
return _all_cftime_date_types()[calendar]
408+
409+
410410
@pytest.fixture()
411411
def times(calendar):
412412
import cftime
@@ -573,13 +573,6 @@ def test_dask_field_access(times_3d, data, field) -> None:
573573
assert_equal(result.compute(), expected)
574574

575575

576-
@pytest.fixture()
577-
def cftime_date_type(calendar):
578-
from xarray.tests.test_coding_times import _all_cftime_date_types
579-
580-
return _all_cftime_date_types()[calendar]
581-
582-
583576
@requires_cftime
584577
def test_seasons(cftime_date_type) -> None:
585578
dates = xr.DataArray(

xarray/tests/test_cftimeindex.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,14 @@
2121
)
2222
from xarray.core.types import PDDatetimeUnitOptions
2323
from xarray.tests import (
24+
_ALL_CALENDARS,
25+
_NON_STANDARD_CALENDAR_NAMES,
26+
_all_cftime_date_types,
2427
assert_array_equal,
2528
assert_identical,
2629
has_cftime,
2730
requires_cftime,
2831
)
29-
from xarray.tests.test_coding_times import (
30-
_ALL_CALENDARS,
31-
_NON_STANDARD_CALENDARS,
32-
_all_cftime_date_types,
33-
)
3432

3533
# cftime 1.5.2 renames "gregorian" to "standard"
3634
standard_or_gregorian = ""
@@ -1228,7 +1226,7 @@ def test_to_datetimeindex(calendar, unsafe) -> None:
12281226
index = xr.date_range("2000", periods=5, calendar=calendar, use_cftime=True)
12291227
expected = pd.date_range("2000", periods=5, unit="ns")
12301228

1231-
if calendar in _NON_STANDARD_CALENDARS and not unsafe:
1229+
if calendar in _NON_STANDARD_CALENDAR_NAMES and not unsafe:
12321230
with pytest.warns(RuntimeWarning, match="non-standard"):
12331231
result = index.to_datetimeindex(time_unit="ns")
12341232
else:

xarray/tests/test_coding_times.py

+10-32
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
decode_cf,
2020
)
2121
from xarray.coders import CFDatetimeCoder, CFTimedeltaCoder
22-
from xarray.coding.times import _STANDARD_CALENDARS as _STANDARD_CALENDARS_UNSORTED
2322
from xarray.coding.times import (
2423
_encode_datetime_with_cftime,
2524
_netcdf_to_numpy_timeunit,
@@ -41,8 +40,13 @@
4140
from xarray.core.utils import is_duck_dask_array
4241
from xarray.testing import assert_equal, assert_identical
4342
from xarray.tests import (
43+
_ALL_CALENDARS,
44+
_NON_STANDARD_CALENDARS,
45+
_STANDARD_CALENDAR_NAMES,
46+
_STANDARD_CALENDARS,
4447
DuckArrayWrapper,
4548
FirstElementAccessibleArray,
49+
_all_cftime_date_types,
4650
arm_xfail,
4751
assert_array_equal,
4852
assert_duckarray_allclose,
@@ -53,17 +57,6 @@
5357
requires_dask,
5458
)
5559

56-
_NON_STANDARD_CALENDARS_SET = {
57-
"noleap",
58-
"365_day",
59-
"360_day",
60-
"julian",
61-
"all_leap",
62-
"366_day",
63-
}
64-
_STANDARD_CALENDARS = sorted(_STANDARD_CALENDARS_UNSORTED)
65-
_ALL_CALENDARS = sorted(_NON_STANDARD_CALENDARS_SET.union(_STANDARD_CALENDARS))
66-
_NON_STANDARD_CALENDARS = sorted(_NON_STANDARD_CALENDARS_SET)
6760
_CF_DATETIME_NUM_DATES_UNITS = [
6861
(np.arange(10), "days since 2000-01-01", "s"),
6962
(np.arange(10).astype("float64"), "days since 2000-01-01", "s"),
@@ -99,26 +92,11 @@
9992
_CF_DATETIME_TESTS = [
10093
num_dates_units + (calendar,)
10194
for num_dates_units, calendar in product(
102-
_CF_DATETIME_NUM_DATES_UNITS, _STANDARD_CALENDARS
95+
_CF_DATETIME_NUM_DATES_UNITS, _STANDARD_CALENDAR_NAMES
10396
)
10497
]
10598

10699

107-
def _all_cftime_date_types():
108-
import cftime
109-
110-
return {
111-
"noleap": cftime.DatetimeNoLeap,
112-
"365_day": cftime.DatetimeNoLeap,
113-
"360_day": cftime.Datetime360Day,
114-
"julian": cftime.DatetimeJulian,
115-
"all_leap": cftime.DatetimeAllLeap,
116-
"366_day": cftime.DatetimeAllLeap,
117-
"gregorian": cftime.DatetimeGregorian,
118-
"proleptic_gregorian": cftime.DatetimeProlepticGregorian,
119-
}
120-
121-
122100
@requires_cftime
123101
@pytest.mark.filterwarnings("ignore:Ambiguous reference date string")
124102
@pytest.mark.filterwarnings("ignore:Times can't be serialized faithfully")
@@ -734,13 +712,13 @@ def test_decode_cf(calendar, time_unit: PDDatetimeUnitOptions) -> None:
734712
ds[v].attrs["units"] = "days since 2001-01-01"
735713
ds[v].attrs["calendar"] = calendar
736714

737-
if not has_cftime and calendar not in _STANDARD_CALENDARS:
715+
if not has_cftime and calendar not in _STANDARD_CALENDAR_NAMES:
738716
with pytest.raises(ValueError):
739717
ds = decode_cf(ds)
740718
else:
741719
ds = decode_cf(ds, decode_times=CFDatetimeCoder(time_unit=time_unit))
742720

743-
if calendar not in _STANDARD_CALENDARS:
721+
if calendar not in _STANDARD_CALENDAR_NAMES:
744722
assert ds.test.dtype == np.dtype("O")
745723
else:
746724
assert ds.test.dtype == np.dtype(f"=M8[{time_unit}]")
@@ -1085,7 +1063,7 @@ def test_decode_ambiguous_time_warns(calendar) -> None:
10851063

10861064
# we don't decode non-standard calendards with
10871065
# pandas so expect no warning will be emitted
1088-
is_standard_calendar = calendar in _STANDARD_CALENDARS
1066+
is_standard_calendar = calendar in _STANDARD_CALENDAR_NAMES
10891067

10901068
dates = [1, 2, 3]
10911069
units = "days since 1-1-1"
@@ -1954,7 +1932,7 @@ def test_duck_array_decode_times(calendar) -> None:
19541932
decoded = conventions.decode_cf_variable(
19551933
"foo", var, decode_times=CFDatetimeCoder(use_cftime=None)
19561934
)
1957-
if calendar not in _STANDARD_CALENDARS:
1935+
if calendar not in _STANDARD_CALENDAR_NAMES:
19581936
assert decoded.dtype == np.dtype("O")
19591937
else:
19601938
assert decoded.dtype == np.dtype("=M8[ns]")

0 commit comments

Comments
 (0)