Esempio n. 1
0
def test_iter_period_from_range():
    tm = dt.timedelta(1)
    range = [dt.datetime(2021, 1, 1)]
    assert list(iter_period_from_range(range,
                                       tm)) == [(dt.datetime(2021, 1, 1),
                                                 dt.datetime(2021, 1, 1))]
    assert list(iter_period_from_range(range, dt.timedelta(2))) == [
        (dt.datetime(2021, 1, 1), dt.datetime(2021, 1, 1))
    ]

    range = [
        dt.datetime(2021, 1, 1),
        dt.datetime(2021, 1, 2),
        dt.datetime(2021, 1, 3)
    ]
    assert list(iter_period_from_range(range,
                                       tm)) == [(dt.datetime(2021, 1, 1),
                                                 dt.datetime(2021, 1, 3))]

    range = [dt.datetime(2021, 1, 1), dt.datetime(2021, 1, 3)]
    assert list(iter_period_from_range(range, tm)) == [
        (dt.datetime(2021, 1, 1), dt.datetime(2021, 1, 1)),
        (dt.datetime(2021, 1, 3), dt.datetime(2021, 1, 3)),
    ]

    range = []
    assert list(iter_period_from_range(range, tm)) == []
Esempio n. 2
0
 def iter_period_for_execute(self) -> Iterator[tuple[dt.datetime, dt.datetime]]:
     """
     Collects all work datetimes for execute.
     """
     datetime_range = [item.worktime for item in self.iter_items_for_execute()]
     yield from iter_period_from_range(
         datetime_range, self.interval_timedelta, self.period_length
     )
Esempio n. 3
0
def test_iter_period_from_range_with_length():
    tm = dt.timedelta(1)
    range = [dt.datetime(2021, 1, 1)]
    assert list(iter_period_from_range(range, tm, length=2)) == [
        (dt.datetime(2021, 1, 1), dt.datetime(2021, 1, 1))
    ]

    range = [
        dt.datetime(2021, 1, 1),
        dt.datetime(2021, 1, 2),
        dt.datetime(2021, 1, 3)
    ]
    assert list(iter_period_from_range(range, tm, length=1)) == [
        (dt.datetime(2021, 1, 1), dt.datetime(2021, 1, 1)),
        (dt.datetime(2021, 1, 2), dt.datetime(2021, 1, 2)),
        (dt.datetime(2021, 1, 3), dt.datetime(2021, 1, 3)),
    ]

    range = [
        dt.datetime(2021, 1, 1),
        dt.datetime(2021, 1, 2),
        dt.datetime(2021, 1, 3)
    ]
    assert list(iter_period_from_range(range, tm, length=2)) == [
        (dt.datetime(2021, 1, 1), dt.datetime(2021, 1, 2)),
        (dt.datetime(2021, 1, 3), dt.datetime(2021, 1, 3)),
    ]

    range = [
        dt.datetime(2021, 1, 1),
        dt.datetime(2021, 1, 2),
        dt.datetime(2021, 1, 3)
    ]
    assert list(iter_period_from_range(range, tm, length=3)) == [
        (dt.datetime(2021, 1, 1), dt.datetime(2021, 1, 3))
    ]
Esempio n. 4
0
    def recreate_prev_items(
        cls,
        flow_name: str,
        worktime: dt.datetime,
        offset_periods: Union[pydantic.PositiveInt,
                              list[pydantic.NegativeInt]],
        interval_timedelta: dt.timedelta,
    ) -> Optional[list["FlowItem"]]:

        if isinstance(offset_periods, int):
            if offset_periods > 0:
                offset_periods = [-i for i in range(offset_periods) if i > 0]
            else:
                raise ValueError("Only positive Int")
        else:
            assert all([i < 0 for i in offset_periods])

        first_item = cls.first_item(flow_name)
        if first_item:
            worktime_list = [
                worktime + (interval_timedelta * delta)
                for delta in offset_periods
            ]
            worktime_list = list(
                filter(lambda dt_: dt_ >= first_item.worktime, worktime_list))

            cls.delete().where(cls.name == flow_name,
                               cls.worktime.in_(worktime_list)).execute()

            items = []
            for date1, date2 in iter_period_from_range(worktime_list,
                                                       interval_timedelta):
                new_items = cls.create_missing_items(
                    flow_name,
                    start_time=date1,
                    end_time=date2,
                    interval_timedelta=interval_timedelta,
                )
                items.extend(new_items)

            logger.info(
                "Recreated items to restart flows {} for previous worktimes {}",
                flow_name,
                worktime_list,
            )

            return items