Skip to content

Commit 39f40de

Browse files
authored
Merge pull request #39 from st31ny/cronsim
switch to cronsim for cron parsing
2 parents a94c8bf + 95ccbad commit 39f40de

File tree

3 files changed

+17
-20
lines changed

3 files changed

+17
-20
lines changed

aiocron/__init__.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# -*- coding: utf-8 -*-
2-
from croniter.croniter import croniter
2+
from cronsim import CronSim
33
from datetime import datetime
44
from functools import wraps, partial
55
from tzlocal import get_localzone
@@ -38,7 +38,6 @@ def __init__(
3838
uuid=None,
3939
loop=None,
4040
tz=None,
41-
croniter_kwargs=None,
4241
):
4342
self.spec = spec
4443
if func is not None:
@@ -50,11 +49,10 @@ def __init__(
5049
self.cron = wrap_func(self.func)
5150
self.auto_start = start
5251
self.uuid = uuid if uuid is not None else uuid4()
53-
self.handle = self.future = self.croniter = None
52+
self.handle = self.future = self.cronsim = None
5453
self.loop = loop if loop is not None else asyncio.get_event_loop()
5554
if start and self.func is not null_callback:
5655
self.handle = self.loop.call_soon_threadsafe(self.start)
57-
self.croniter_kwargs = croniter_kwargs or {}
5856

5957
def start(self):
6058
"""Start scheduling"""
@@ -66,7 +64,7 @@ def stop(self):
6664
"""Stop scheduling"""
6765
if self.handle is not None:
6866
self.handle.cancel()
69-
self.handle = self.future = self.croniter = None
67+
self.handle = self.future = self.cronsim = None
7068

7169
async def next(self, *args):
7270
"""yield from .next()"""
@@ -76,18 +74,16 @@ async def next(self, *args):
7674
return await self.future
7775

7876
def initialize(self):
79-
"""Initialize croniter and related times"""
80-
if self.croniter is None:
77+
"""Initialize cronsim and related times"""
78+
if self.cronsim is None:
8179
self.time = time.time()
8280
self.datetime = datetime.now(self.tz)
8381
self.loop_time = self.loop.time()
84-
self.croniter = croniter(
85-
self.spec, start_time=self.datetime, **self.croniter_kwargs
86-
)
82+
self.cronsim = CronSim(self.spec, self.datetime)
8783

8884
def get_next(self):
8985
"""Return next iteration time related to loop time"""
90-
return self.loop_time + (self.croniter.get_next(float) - self.time)
86+
return self.loop_time + (next(self.cronsim).timestamp() - self.time)
9187

9288
def call_next(self):
9389
"""Set next hop in the loop. Call task"""

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ classifiers = [
2323
]
2424
keywords = ["crontab", "cron", "asyncio"]
2525
dependencies = [
26-
"croniter>=3.0.3",
26+
"cronsim>=2.6",
27+
"python-dateutil>=2.9.0",
2728
"tox>=4.21.1",
2829
"tox-uv>=1.13.0",
2930
"tzlocal>=5.2",

tests/test_cron.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class CustomError(Exception):
1414
def test_str():
1515
loop = asyncio.new_event_loop()
1616

17-
@crontab("* * * * * *", loop=loop)
17+
@crontab("* * * * *", loop=loop)
1818
def t():
1919
pass
2020

@@ -26,7 +26,7 @@ def test_cron():
2626

2727
future = asyncio.Future(loop=loop)
2828

29-
@crontab("* * * * * *", start=False, loop=loop)
29+
@crontab("* * * * *", start=False, loop=loop)
3030
def t():
3131
future.set_result(1)
3232

@@ -41,7 +41,7 @@ def test_raise():
4141

4242
future = asyncio.Future(loop=loop)
4343

44-
@crontab("* * * * * *", start=False, loop=loop)
44+
@crontab("* * * * *", start=False, loop=loop)
4545
def t():
4646
loop.call_later(1, future.set_result, 1)
4747
raise ValueError()
@@ -58,7 +58,7 @@ def test_next():
5858
def t():
5959
return 1
6060

61-
t = crontab("* * * * * *", func=t, loop=loop)
61+
t = crontab("* * * * *", func=t, loop=loop)
6262

6363
future = asyncio.ensure_future(t.next(), loop=loop)
6464

@@ -69,7 +69,7 @@ def t():
6969
def test_null_callback():
7070
loop = asyncio.new_event_loop()
7171

72-
t = crontab("* * * * * *", loop=loop)
72+
t = crontab("* * * * *", loop=loop)
7373

7474
assert t.handle is None # not started
7575

@@ -82,7 +82,7 @@ def test_null_callback():
8282
def test_next_raise():
8383
loop = asyncio.new_event_loop()
8484

85-
@crontab("* * * * * *", loop=loop)
85+
@crontab("* * * * *", loop=loop)
8686
def t():
8787
raise CustomError()
8888

@@ -95,7 +95,7 @@ def t():
9595
def test_coro_next():
9696
loop = asyncio.new_event_loop()
9797

98-
@crontab("* * * * * *", loop=loop)
98+
@crontab("* * * * *", loop=loop)
9999
async def t():
100100
return 1
101101

@@ -108,7 +108,7 @@ async def t():
108108
def test_coro_next_raise():
109109
loop = asyncio.new_event_loop()
110110

111-
@crontab("* * * * * *", loop=loop)
111+
@crontab("* * * * *", loop=loop)
112112
async def t():
113113
raise CustomError()
114114

0 commit comments

Comments
 (0)