Skip to content

Commit 255ae7e

Browse files
committed
JIT: major feature commit
* add smooth_diff * add model updates * add /trend endpoint * add /trendseries endpoint * add /csv endpoint * params with utility functions * update date utility functions
1 parent 01baf4f commit 255ae7e

File tree

15 files changed

+1881
-129
lines changed

15 files changed

+1881
-129
lines changed

integrations/server/test_covidcast_endpoints.py

Lines changed: 315 additions & 69 deletions
Large diffs are not rendered by default.

requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,5 @@ scipy==1.6.2
1111
tenacity==7.0.0
1212
newrelic
1313
epiweeks==2.1.2
14+
delphi_utils
15+
more_itertools==8.4.0

src/server/_config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
MAX_RESULTS = int(10e6)
1111
MAX_COMPATIBILITY_RESULTS = int(3650)
12+
MAX_SMOOTHER_WINDOW = 30
1213

1314
SQLALCHEMY_DATABASE_URI = os.environ.get("SQLALCHEMY_DATABASE_URI", "sqlite:///test.db")
1415

src/server/_params.py

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
from math import inf
21
import re
32
from dataclasses import dataclass
3+
from itertools import groupby
4+
from math import inf
45
from typing import List, Optional, Sequence, Tuple, Union
56

67
from flask import request
7-
8+
from more_itertools import flatten
89

910
from ._exceptions import ValidationFailedException
1011
from .utils import days_in_range, weeks_in_range, guess_time_value_is_day
@@ -92,9 +93,35 @@ def count(self) -> float:
9293
return inf if self.signal else 0
9394
return len(self.signal)
9495

96+
def add_signal(self, signal: str) -> None:
97+
if not isinstance(self.signal, bool):
98+
self.signal.append(signal)
99+
100+
def __hash__(self) -> int:
101+
return hash((self.source, self.signal if self.signal is isinstance(self.signal, bool) else tuple(self.signal)))
102+
103+
104+
def _combine_source_signal_pairs(source_signal_pairs: List[SourceSignalPair]) -> List[SourceSignalPair]:
105+
"""Combine SourceSignalPairs with the same source into a single SourceSignalPair object.
106+
107+
Example:
108+
[SourceSignalPair("src", ["sig1", "sig2"]), SourceSignalPair("src", ["sig2", "sig3"])] will be merged
109+
into [SourceSignalPair("src", ["sig1", "sig2", "sig3])].
110+
"""
111+
source_signal_pairs_grouped = groupby(sorted(source_signal_pairs, key=lambda x: x.source), lambda x: x.source)
112+
source_signal_pairs_combined = []
113+
for source, group in source_signal_pairs_grouped:
114+
group = list(group)
115+
if any(x.signal == True for x in group):
116+
combined_signals = True
117+
else:
118+
combined_signals = sorted(set(flatten(x.signal for x in group)))
119+
source_signal_pairs_combined.append(SourceSignalPair(source, combined_signals))
120+
return source_signal_pairs_combined
121+
95122

96123
def parse_source_signal_arg(key: str = "signal") -> List[SourceSignalPair]:
97-
return [SourceSignalPair(source, signals) for [source, signals] in _parse_common_multi_arg(key)]
124+
return _combine_source_signal_pairs([SourceSignalPair(source, signals) for [source, signals] in _parse_common_multi_arg(key)])
98125

99126

100127
def parse_single_source_signal_arg(key: str) -> SourceSignalPair:

src/server/_validate.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,3 +189,13 @@ def push_range(first: str, last: str):
189189
values.append(parse_date(part))
190190
# success, return the list
191191
return values
192+
193+
def extract_bool(key: Union[str, Sequence[str]]) -> Optional[bool]:
194+
s = _extract_value(key)
195+
if not s:
196+
return None
197+
if s.lower() == "true":
198+
return True
199+
if s.lower() == "false":
200+
return False
201+
raise ValidationFailedException(f"{key}: not a boolean: {s}")

0 commit comments

Comments
 (0)