Skip to content

Commit b1151bd

Browse files
authored
Fix week parsing for date parameters/arguments (#1317)
* fixed week range parsing * added new week parse test & sample data
1 parent 52403e6 commit b1151bd

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

integrations/server/test_covidcast.py

+31
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,18 @@ def _insert_placeholder_set_five(self):
8181
self._insert_rows(rows)
8282
return rows
8383

84+
def _insert_placeholder_set_with_weeks(self):
85+
rows = [
86+
CovidcastTestRow.make_default_row(
87+
time_value=2021_05+i, time_type="week",
88+
source="nchs-mortality", signal="deaths_covid_incidence_num",
89+
geo_type="state", geo_value="il",
90+
value=i*i)
91+
for i in [0, 1, 2]
92+
]
93+
self._insert_rows(rows)
94+
return rows
95+
8496
def test_round_trip(self):
8597
"""Make a simple round-trip with some sample data."""
8698

@@ -445,3 +457,22 @@ def test_date_formats(self):
445457

446458
# assert that the right data came back
447459
self.assertEqual(len(response['epidata']), 2 * 3)
460+
461+
462+
def test_week_formats(self):
463+
"""Test different ways to specify week ranges are accepted."""
464+
465+
rows = self._insert_placeholder_set_with_weeks()
466+
expected = {
467+
'result': 1,
468+
'epidata': [r.as_api_row_dict() for r in rows],
469+
'message': 'success',
470+
}
471+
472+
colond = self.request_based_on_row(rows[0], time_values="202105:202107")
473+
dashed = self.request_based_on_row(rows[0], time_values="202105-202107")
474+
enumed = self.request_based_on_row(rows[0], time_values="202105,202106,202107")
475+
476+
self.assertEqual(expected, colond)
477+
self.assertEqual(expected, dashed)
478+
self.assertEqual(expected, enumed)

src/server/_params.py

+12-1
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,18 @@ def extract_dates(key: Union[str, Sequence[str]]) -> Optional[TimeValues]:
439439
values.append(r)
440440
continue
441441
# parse other date formats
442-
r = parse_day_value(part)
442+
dashless_part = part.replace("-", "")
443+
if len(dashless_part) in (6, 12):
444+
# if there are 6 or 12 (hopefully integer) chars in this, it
445+
# should be a week or week range (YYYYWW or YYYYWWYYYYWW)
446+
r = parse_week_value(part)
447+
elif len(dashless_part) in (8, 16):
448+
# if its 8 or 16, it should be a day or
449+
# day range (YYYYMMDD or YYYYMMDDYYYYMMDD)
450+
r = parse_day_value(part)
451+
else:
452+
# other time types tbd lol
453+
raise ValidationFailedException(f"unrecognized date format: {part}")
443454
values.append(r)
444455
return values
445456

0 commit comments

Comments
 (0)