async def set_alarm(self, timer_id: int, timer_length: str, db: AsyncSession): task_func = self._get_task(Tasks.ALARM) query = select(TimerEvent). \ filter(TimerEvent.timer_id == timer_id). \ filter(TimerEvent.type.in_([TimerEventType.START, TimerEventType.PAUSE])) rows = await db.execute(query) countdowns = calc_countdowns( parse_timer_lengths(timer_length), calc_elapsed_time([r.TimerEvent for r in rows])) logger.debug("scheduling alarm for timer %s in %s", timer_id, countdowns) redis = self.create_redis() task_id_list = [] for idx, countdown in enumerate(countdowns, 1): args = [ timer_id, str(self._config.database), self._config.redis, len(countdowns) == idx ] task = task_func.apply_async(args, countdown=countdown) task_id_list.append(task.task_id) redis.set(create_alarm_key(timer_id), json.dumps(task_id_list))
def calculate(self) -> list[RunningTimer]: timer_events: dict[int, list[TimerEvent]] = defaultdict(list) for event in self._events: if event.type == TimerEventType.STOP: try: del timer_events[event.timer_id] except KeyError: # logger.warning("unknown timer %s", event.timer_id) pass continue timer_events[event.timer_id].append(event) res = [] for timer_id, events in timer_events.items(): try: timer = self._timers[timer_id] except KeyError: # logger.warning("unknown timer %s", timer_id) continue elapsed_time = calc_elapsed_time(events) lengths = parse_timer_lengths(timer.length) if elapsed_time > sum(lengths): continue last_event = events[-1:][0] remaining_times = calc_remaining_times(lengths, elapsed_time) res.append(RunningTimer( id = timer.id, name = timer.name or timer.length, elapsed_time = elapsed_time, lengths = lengths, state = TimerState.STARTED if last_event.type == TimerEventType.START else TimerState.PAUSED, remaining_times = remaining_times, orig_length = timer.length, )) return res
def validate_length(cls, value: str): try: parse_timer_lengths(value) except TimeLengthParseError as e: raise InvalidTimedeltaError(e) # TODO: test this return value
def test_invalid_length(self): with raises(TimeLengthParseError): parse_timer_lengths('dsfsd')
def test_multiple_lengths(self): assert parse_timer_lengths('10s, 20s') == [10, 20]
def test_simple_length(self): assert parse_timer_lengths('10s') == [10]