示例#1
0
文件: scheduler.py 项目: voidpp/buck
    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))
示例#2
0
    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
示例#3
0
 def validate_length(cls, value: str):
     try:
         parse_timer_lengths(value)
     except TimeLengthParseError as e:
         raise InvalidTimedeltaError(e)  # TODO: test this
     return value
示例#4
0
文件: test_tools.py 项目: voidpp/buck
 def test_invalid_length(self):
     with raises(TimeLengthParseError):
         parse_timer_lengths('dsfsd')
示例#5
0
文件: test_tools.py 项目: voidpp/buck
 def test_multiple_lengths(self):
     assert parse_timer_lengths('10s, 20s') == [10, 20]
示例#6
0
文件: test_tools.py 项目: voidpp/buck
 def test_simple_length(self):
     assert parse_timer_lengths('10s') == [10]