Skip to content

Commit 72f9cb8

Browse files
committed
Rename *Pair classes to *Set
1 parent f713e39 commit 72f9cb8

File tree

7 files changed

+133
-138
lines changed

7 files changed

+133
-138
lines changed

src/server/_params.py

+28-28
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def _parse_single_arg(key: str) -> Tuple[str, str]:
4848

4949

5050
@dataclass
51-
class GeoPair:
51+
class GeoSet:
5252
geo_type: str
5353
geo_values: Union[bool, Sequence[str]]
5454

@@ -64,20 +64,20 @@ def count(self) -> float:
6464
return len(self.geo_values)
6565

6666

67-
def parse_geo_arg(key: str = "geo") -> List[GeoPair]:
68-
return [GeoPair(geo_type, geo_values) for [geo_type, geo_values] in _parse_common_multi_arg(key)]
67+
def parse_geo_arg(key: str = "geo") -> List[GeoSet]:
68+
return [GeoSet(geo_type, geo_values) for [geo_type, geo_values] in _parse_common_multi_arg(key)]
6969

7070

71-
def parse_single_geo_arg(key: str) -> GeoPair:
71+
def parse_single_geo_arg(key: str) -> GeoSet:
7272
"""
7373
parses a single geo pair with only one value
7474
"""
7575
r = _parse_single_arg(key)
76-
return GeoPair(r[0], [r[1]])
76+
return GeoSet(r[0], [r[1]])
7777

7878

7979
@dataclass
80-
class SourceSignalPair:
80+
class SourceSignalSet:
8181
source: str
8282
signal: Union[bool, Sequence[str]]
8383

@@ -93,20 +93,20 @@ def count(self) -> float:
9393
return len(self.signal)
9494

9595

96-
def parse_source_signal_arg(key: str = "signal") -> List[SourceSignalPair]:
97-
return [SourceSignalPair(source, signals) for [source, signals] in _parse_common_multi_arg(key)]
96+
def parse_source_signal_arg(key: str = "signal") -> List[SourceSignalSet]:
97+
return [SourceSignalSet(source, signals) for [source, signals] in _parse_common_multi_arg(key)]
9898

9999

100-
def parse_single_source_signal_arg(key: str) -> SourceSignalPair:
100+
def parse_single_source_signal_arg(key: str) -> SourceSignalSet:
101101
"""
102102
parses a single source signal pair with only one value
103103
"""
104104
r = _parse_single_arg(key)
105-
return SourceSignalPair(r[0], [r[1]])
105+
return SourceSignalSet(r[0], [r[1]])
106106

107107

108108
@dataclass
109-
class TimePair:
109+
class TimeSet:
110110
time_type: str
111111
time_values: Union[bool, TimeValues]
112112

@@ -134,10 +134,10 @@ def to_ranges(self):
134134
returns this pair with times converted to ranges
135135
"""
136136
if isinstance(self.time_values, bool):
137-
return TimePair(self.time_type, self.time_values)
137+
return TimeSet(self.time_type, self.time_values)
138138
if self.time_type == 'week':
139-
return TimePair(self.time_type, weeks_to_ranges(self.time_values))
140-
return TimePair(self.time_type, days_to_ranges(self.time_values))
139+
return TimeSet(self.time_type, weeks_to_ranges(self.time_values))
140+
return TimeSet(self.time_type, days_to_ranges(self.time_values))
141141

142142

143143
def _verify_range(start: int, end: int) -> Union[int, Tuple[int, int]]:
@@ -204,18 +204,18 @@ def parse_day_value(time_value: str) -> Union[int, Tuple[int, int]]:
204204
raise ValidationFailedException(msg)
205205

206206

207-
def _parse_time_pair(time_type: str, time_values: Union[bool, Sequence[str]]) -> TimePair:
207+
def _parse_time_pair(time_type: str, time_values: Union[bool, Sequence[str]]) -> TimeSet:
208208
if isinstance(time_values, bool):
209-
return TimePair(time_type, time_values)
209+
return TimeSet(time_type, time_values)
210210

211211
if time_type == "week":
212-
return TimePair("week", [parse_week_value(t) for t in time_values])
212+
return TimeSet("week", [parse_week_value(t) for t in time_values])
213213
elif time_type == "day":
214-
return TimePair("day", [parse_day_value(t) for t in time_values])
214+
return TimeSet("day", [parse_day_value(t) for t in time_values])
215215
raise ValidationFailedException(f'time param: {time_type} is not one of "day" or "week"')
216216

217217

218-
def parse_time_arg(key: str = "time") -> Optional[TimePair]:
218+
def parse_time_arg(key: str = "time") -> Optional[TimeSet]:
219219
time_pairs = [_parse_time_pair(time_type, time_values) for [time_type, time_values] in _parse_common_multi_arg(key)]
220220

221221
# single value
@@ -236,10 +236,10 @@ def parse_time_arg(key: str = "time") -> Optional[TimePair]:
236236
return time_pair
237237
else:
238238
merged.extend(time_pair.time_values)
239-
return TimePair(time_pairs[0].time_type, merged).to_ranges()
239+
return TimeSet(time_pairs[0].time_type, merged).to_ranges()
240240

241241

242-
def parse_single_time_arg(key: str) -> TimePair:
242+
def parse_single_time_arg(key: str) -> TimeSet:
243243
"""
244244
parses a single time pair with only one value
245245
"""
@@ -285,26 +285,26 @@ def parse_week_range_arg(key: str) -> Tuple[int, int]:
285285
raise ValidationFailedException(f"{key} must match YYYYWW-YYYYWW")
286286
return r
287287

288-
def parse_day_or_week_arg(key: str, default_value: Optional[int] = None) -> TimePair:
288+
def parse_day_or_week_arg(key: str, default_value: Optional[int] = None) -> TimeSet:
289289
v = request.values.get(key)
290290
if not v:
291291
if default_value is not None:
292292
time_type = "day" if guess_time_value_is_day(default_value) else "week"
293-
return TimePair(time_type, [default_value])
293+
return TimeSet(time_type, [default_value])
294294
raise ValidationFailedException(f"{key} param is required")
295295
# format is either YYYY-MM-DD or YYYYMMDD or YYYYMM
296296
is_week = guess_time_value_is_week(v)
297297
if is_week:
298-
return TimePair("week", [parse_week_arg(key)])
299-
return TimePair("day", [parse_day_arg(key)])
298+
return TimeSet("week", [parse_week_arg(key)])
299+
return TimeSet("day", [parse_day_arg(key)])
300300

301-
def parse_day_or_week_range_arg(key: str) -> TimePair:
301+
def parse_day_or_week_range_arg(key: str) -> TimeSet:
302302
v = request.values.get(key)
303303
if not v:
304304
raise ValidationFailedException(f"{key} param is required")
305305
# format is either YYYY-MM-DD--YYYY-MM-DD or YYYYMMDD-YYYYMMDD or YYYYMM-YYYYMM
306306
# so if the first before the - has length 6, it must be a week
307307
is_week = guess_time_value_is_week(v.split('-', 2)[0])
308308
if is_week:
309-
return TimePair("week", [parse_week_range_arg(key)])
310-
return TimePair("day", [parse_day_range_arg(key)])
309+
return TimeSet("week", [parse_week_range_arg(key)])
310+
return TimeSet("day", [parse_day_range_arg(key)])

src/server/_query.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from ._printer import create_printer, APrinter
2020
from ._exceptions import DatabaseErrorException
2121
from ._validate import extract_strings
22-
from ._params import GeoPair, SourceSignalPair, TimePair
22+
from ._params import GeoSet, SourceSignalSet, TimeSet
2323
from .utils import time_values_to_ranges, TimeValues
2424

2525

@@ -118,15 +118,15 @@ def filter_fields(generator: Iterable[Dict[str, Any]]):
118118
def filter_geo_pairs(
119119
type_field: str,
120120
value_field: str,
121-
values: Sequence[GeoPair],
121+
values: Sequence[GeoSet],
122122
param_key: str,
123123
params: Dict[str, Any],
124124
) -> str:
125125
"""
126126
returns the SQL sub query to filter by the given geo pairs
127127
"""
128128

129-
def filter_pair(pair: GeoPair, i) -> str:
129+
def filter_pair(pair: GeoSet, i) -> str:
130130
type_param = f"{param_key}_{i}t"
131131
params[type_param] = pair.geo_type
132132
if isinstance(pair.geo_values, bool) and pair.geo_values:
@@ -145,15 +145,15 @@ def filter_pair(pair: GeoPair, i) -> str:
145145
def filter_source_signal_pairs(
146146
source_field: str,
147147
signal_field: str,
148-
values: Sequence[SourceSignalPair],
148+
values: Sequence[SourceSignalSet],
149149
param_key: str,
150150
params: Dict[str, Any],
151151
) -> str:
152152
"""
153153
returns the SQL sub query to filter by the given source signal pairs
154154
"""
155155

156-
def filter_pair(pair: SourceSignalPair, i) -> str:
156+
def filter_pair(pair: SourceSignalSet, i) -> str:
157157
source_param = f"{param_key}_{i}t"
158158
params[source_param] = pair.source
159159
if isinstance(pair.signal, bool) and pair.signal:
@@ -172,7 +172,7 @@ def filter_pair(pair: SourceSignalPair, i) -> str:
172172
def filter_time_pair(
173173
type_field: str,
174174
time_field: str,
175-
pair: Optional[TimePair],
175+
pair: Optional[TimeSet],
176176
param_key: str,
177177
params: Dict[str, Any],
178178
) -> str:
@@ -410,7 +410,7 @@ def where_geo_pairs(
410410
self,
411411
type_field: str,
412412
value_field: str,
413-
values: Sequence[GeoPair],
413+
values: Sequence[GeoSet],
414414
param_key: Optional[str] = None,
415415
) -> "QueryBuilder":
416416
fq_type_field = self._fq_field(type_field)
@@ -430,7 +430,7 @@ def where_source_signal_pairs(
430430
self,
431431
type_field: str,
432432
value_field: str,
433-
values: Sequence[SourceSignalPair],
433+
values: Sequence[SourceSignalSet],
434434
param_key: Optional[str] = None,
435435
) -> "QueryBuilder":
436436
fq_type_field = self._fq_field(type_field)
@@ -450,7 +450,7 @@ def where_time_pair(
450450
self,
451451
type_field: str,
452452
value_field: str,
453-
values: Optional[TimePair],
453+
values: Optional[TimeSet],
454454
param_key: Optional[str] = None,
455455
) -> "QueryBuilder":
456456
fq_type_field = self._fq_field(type_field)

src/server/endpoints/covidcast.py

+16-16
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
from .._common import is_compatibility_mode, db
1212
from .._exceptions import ValidationFailedException, DatabaseErrorException
1313
from .._params import (
14-
GeoPair,
15-
SourceSignalPair,
16-
TimePair,
14+
GeoSet,
15+
SourceSignalSet,
16+
TimeSet,
1717
parse_geo_arg,
1818
parse_source_signal_arg,
1919
parse_time_arg,
@@ -45,45 +45,45 @@
4545
latest_table = "epimetric_latest_v"
4646
history_table = "epimetric_full_v"
4747

48-
def parse_source_signal_pairs() -> List[SourceSignalPair]:
48+
def parse_source_signal_pairs() -> List[SourceSignalSet]:
4949
ds = request.values.get("data_source")
5050
if ds:
5151
# old version
5252
require_any("signal", "signals", empty=True)
5353
signals = extract_strings(("signals", "signal"))
5454
if len(signals) == 1 and signals[0] == "*":
55-
return [SourceSignalPair(ds, True)]
56-
return [SourceSignalPair(ds, signals)]
55+
return [SourceSignalSet(ds, True)]
56+
return [SourceSignalSet(ds, signals)]
5757

5858
if ":" not in request.values.get("signal", ""):
5959
raise ValidationFailedException("missing parameter: signal or (data_source and signal[s])")
6060

6161
return parse_source_signal_arg()
6262

6363

64-
def parse_geo_pairs() -> List[GeoPair]:
64+
def parse_geo_pairs() -> List[GeoSet]:
6565
geo_type = request.values.get("geo_type")
6666
if geo_type:
6767
# old version
6868
require_any("geo_value", "geo_values", empty=True)
6969
geo_values = extract_strings(("geo_values", "geo_value"))
7070
if len(geo_values) == 1 and geo_values[0] == "*":
71-
return [GeoPair(geo_type, True)]
72-
return [GeoPair(geo_type, geo_values)]
71+
return [GeoSet(geo_type, True)]
72+
return [GeoSet(geo_type, geo_values)]
7373

7474
if ":" not in request.values.get("geo", ""):
7575
raise ValidationFailedException("missing parameter: geo or (geo_type and geo_value[s])")
7676

7777
return parse_geo_arg()
7878

7979

80-
def parse_time_pairs() -> TimePair:
80+
def parse_time_pairs() -> TimeSet:
8181
time_type = request.values.get("time_type")
8282
if time_type:
8383
# old version
8484
require_all("time_type", "time_values")
8585
time_values = extract_dates("time_values")
86-
return TimePair(time_type, time_values)
86+
return TimeSet(time_type, time_values)
8787

8888
if ":" not in request.values.get("time", ""):
8989
raise ValidationFailedException("missing parameter: time or (time_type and time_values)")
@@ -356,7 +356,7 @@ def gen():
356356
@bp.route("/csv", methods=("GET", "POST"))
357357
def handle_export():
358358
source, signal = request.values.get("signal", "jhu-csse:confirmed_incidence_num").split(":")
359-
source_signal_pairs = [SourceSignalPair(source, [signal])]
359+
source_signal_pairs = [SourceSignalSet(source, [signal])]
360360
daily_signals, weekly_signals = count_signal_time_types(source_signal_pairs)
361361
source_signal_pairs, alias_mapper = create_source_signal_alias_mapper(source_signal_pairs)
362362
start_pair = parse_day_or_week_arg("start_day", 202001 if weekly_signals > 0 else 20200401)
@@ -383,8 +383,8 @@ def handle_export():
383383
q.set_fields(["geo_value", "signal", "time_value", "issue", "lag", "value", "stderr", "sample_size", "geo_type", "source"], [], [])
384384
q.set_order("time_value", "geo_value")
385385
q.where_source_signal_pairs("source", "signal", source_signal_pairs)
386-
q.where_time_pair("time_type", "time_value", TimePair("day" if is_day else "week", [(start_day, end_day)]))
387-
q.where_geo_pairs("geo_type", "geo_value", [GeoPair(geo_type, True if geo_values == "*" else geo_values)])
386+
q.where_time_pair("time_type", "time_value", TimeSet("day" if is_day else "week", [(start_day, end_day)]))
387+
q.where_geo_pairs("geo_type", "geo_value", [GeoSet(geo_type, True if geo_values == "*" else geo_values)])
388388

389389
_handle_lag_issues_as_of(q, None, None, as_of)
390390

@@ -615,13 +615,13 @@ def handle_coverage():
615615
last_weeks = last or 30
616616
is_day = False
617617
now_week = Week.thisweek() if now_time is None else time_value_to_week(now_time)
618-
time_window = TimePair("week", [(week_to_time_value(now_week - last_weeks), week_to_time_value(now_week))])
618+
time_window = TimeSet("week", [(week_to_time_value(now_week - last_weeks), week_to_time_value(now_week))])
619619
else:
620620
is_day = True
621621
if last is None:
622622
last = 30
623623
now = date.today() if now_time is None else time_value_to_day(now_time)
624-
time_window = TimePair("day", [(day_to_time_value(now - timedelta(days=last)), day_to_time_value(now))])
624+
time_window = TimeSet("day", [(day_to_time_value(now - timedelta(days=last)), day_to_time_value(now))])
625625
_verify_argument_time_type_matches(is_day, daily_signals, weekly_signals)
626626

627627
q = QueryBuilder(latest_table, "c")

src/server/endpoints/covidcast_utils/model.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import pandas as pd
77
import numpy as np
88

9-
from ..._params import SourceSignalPair
9+
from ..._params import SourceSignalSet
1010

1111

1212
class HighValuesAre(str, Enum):
@@ -241,7 +241,7 @@ def get_related_signals(signal: DataSignal) -> List[DataSignal]:
241241
return [s for s in data_signals if s != signal and s.signal_basename == signal.signal_basename]
242242

243243

244-
def count_signal_time_types(source_signals: List[SourceSignalPair]) -> Tuple[int, int]:
244+
def count_signal_time_types(source_signals: List[SourceSignalSet]) -> Tuple[int, int]:
245245
"""
246246
count the number of signals in this query for each time type
247247
@returns daily counts, weekly counts
@@ -262,9 +262,9 @@ def count_signal_time_types(source_signals: List[SourceSignalPair]) -> Tuple[int
262262
return daily, weekly
263263

264264

265-
def create_source_signal_alias_mapper(source_signals: List[SourceSignalPair]) -> Tuple[List[SourceSignalPair], Optional[Callable[[str, str], str]]]:
265+
def create_source_signal_alias_mapper(source_signals: List[SourceSignalSet]) -> Tuple[List[SourceSignalSet], Optional[Callable[[str, str], str]]]:
266266
alias_to_data_sources: Dict[str, List[DataSource]] = {}
267-
transformed_pairs: List[SourceSignalPair] = []
267+
transformed_pairs: List[SourceSignalSet] = []
268268
for pair in source_signals:
269269
source = data_source_by_id.get(pair.source)
270270
if not source or not source.uses_db_alias:
@@ -274,9 +274,9 @@ def create_source_signal_alias_mapper(source_signals: List[SourceSignalPair]) ->
274274
alias_to_data_sources.setdefault(source.db_source, []).append(source)
275275
if pair.signal is True:
276276
# list all signals of this source (*) so resolve to a plain list of all in this alias
277-
transformed_pairs.append(SourceSignalPair(source.db_source, [s.signal for s in source.signals]))
277+
transformed_pairs.append(SourceSignalSet(source.db_source, [s.signal for s in source.signals]))
278278
else:
279-
transformed_pairs.append(SourceSignalPair(source.db_source, pair.signal))
279+
transformed_pairs.append(SourceSignalSet(source.db_source, pair.signal))
280280

281281
if not alias_to_data_sources:
282282
# no alias needed

tests/server/endpoints/test_covidcast.py

-5
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,6 @@
55
from flask import Response
66
from delphi.epidata.server.main import app
77

8-
from delphi.epidata.server._params import (
9-
GeoPair,
10-
TimePair,
11-
)
12-
138
# py3tester coverage target
149
__test_target__ = "delphi.epidata.server.endpoints.covidcast"
1510

0 commit comments

Comments
 (0)