diff options
author | kiorky <kiorky@cryptelium.net> | 2022-09-06 18:31:07 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-06 18:31:07 +0200 |
commit | 614fd3fa09d85469830cc6bac785931cbc69f9ab (patch) | |
tree | bdb8e92d897b627f38ec9489f0e9cf62f04fd755 | |
parent | bb5a45196e5f8f15fd0890f4ee5e9697671a3fe2 (diff) | |
parent | 3a99a259eb231bd9cf17b5b06ceeb4bff353698b (diff) | |
download | croniter-614fd3fa09d85469830cc6bac785931cbc69f9ab.tar.gz |
Merge pull request #21 from snapiri/croniter_range_infinite_loop
Fix croniter_range infinite loop
-rw-r--r-- | src/croniter/croniter.py | 8 | ||||
-rwxr-xr-x | src/croniter/tests/test_croniter_range.py | 14 |
2 files changed, 20 insertions, 2 deletions
diff --git a/src/croniter/croniter.py b/src/croniter/croniter.py index 16d784f..1e4b199 100644 --- a/src/croniter/croniter.py +++ b/src/croniter/croniter.py @@ -279,8 +279,12 @@ class croniter(object): or (lag < 0 and ((3600 * abs(lag_hours) + abs(lag)) >= hours_before_midnight * 3600)) ): - dtresult = dtresult - datetime.timedelta(seconds=lag) - result = self._datetime_to_timestamp(dtresult) + dtresult_adjusted = dtresult - datetime.timedelta(seconds=lag) + result_adjusted = self._datetime_to_timestamp(dtresult_adjusted) + # Do the actual adjust only if the result time actually exists + if self._timestamp_to_datetime(result_adjusted).tzinfo == dtresult_adjusted.tzinfo: + dtresult = dtresult_adjusted + result = result_adjusted self.dst_start_time = result self.cur = result if issubclass(ret_type, datetime.datetime): diff --git a/src/croniter/tests/test_croniter_range.py b/src/croniter/tests/test_croniter_range.py index 29fc0d0..e57e4e0 100755 --- a/src/croniter/tests/test_croniter_range.py +++ b/src/croniter/tests/test_croniter_range.py @@ -160,6 +160,20 @@ class CroniterRangeTest(base.TestCase): except CroniterBadTypeRangeError: self.fail('should not be triggered') + def test_dst_iter(self): + tz = pytz.timezone('Asia/Hebron') + now = datetime(2022, 3, 26, 0, 0, 0, tzinfo=tz) + it = croniter('0 0 * * *', now) + ret = [ + it.get_next(datetime).isoformat(), + it.get_next(datetime).isoformat(), + it.get_next(datetime).isoformat(), + ] + self.assertEqual(ret, [ + '2022-03-26T00:00:00+02:00', + '2022-03-27T01:00:00+03:00', + '2022-03-28T00:00:00+03:00']) + if __name__ == '__main__': unittest.main() |