|
1 |
| -from math import inf |
2 | 1 | import re
|
3 | 2 | from dataclasses import dataclass
|
| 3 | +from itertools import groupby |
| 4 | +from math import inf |
4 | 5 | from typing import List, Optional, Sequence, Tuple, Union
|
5 | 6 |
|
6 | 7 | from flask import request
|
7 |
| - |
| 8 | +from more_itertools import flatten |
8 | 9 |
|
9 | 10 | from ._exceptions import ValidationFailedException
|
10 | 11 | from .utils import days_in_range, weeks_in_range, guess_time_value_is_day, guess_time_value_is_week, TimeValues, days_to_ranges, weeks_to_ranges
|
@@ -92,9 +93,35 @@ def count(self) -> float:
|
92 | 93 | return inf if self.signal else 0
|
93 | 94 | return len(self.signal)
|
94 | 95 |
|
| 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 | + |
95 | 122 |
|
96 | 123 | 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)) |
98 | 125 |
|
99 | 126 |
|
100 | 127 | def parse_single_source_signal_arg(key: str) -> SourceSignalPair:
|
|
0 commit comments