Skip to content

Commit d06be56

Browse files
matMainRo
authored andcommitted
Fix timer
1 parent 2ae9fa4 commit d06be56

File tree

3 files changed

+59
-5
lines changed

3 files changed

+59
-5
lines changed

reactivex/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1153,6 +1153,9 @@ def timer(
11531153
[ timer(2) ]
11541154
--0-|
11551155
1156+
[ timer(2, 4) ]
1157+
--0----1----2--
1158+
11561159
Examples:
11571160
>>> res = reactivex.timer(datetime(...))
11581161
>>> res = reactivex.timer(datetime(...), 0.1)

reactivex/observable/timer.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@ def subscribe(
3535
observer: abc.ObserverBase[int], scheduler_: Optional[abc.SchedulerBase] = None
3636
) -> abc.DisposableBase:
3737
_scheduler = scheduler or scheduler_ or TimeoutScheduler.singleton()
38-
nonlocal duetime
38+
due_time = duetime
3939

40-
if not isinstance(duetime, datetime):
41-
duetime = _scheduler.now + _scheduler.to_timedelta(duetime)
40+
if not isinstance(due_time, datetime):
41+
due_time = _scheduler.now + _scheduler.to_timedelta(due_time)
4242

4343
p = max(0.0, _scheduler.to_seconds(period))
4444
mad = MultipleAssignmentDisposable()
45-
dt = duetime
45+
dt = due_time
4646
count = 0
4747

4848
def action(scheduler: abc.SchedulerBase, state: Any) -> None:
@@ -107,7 +107,7 @@ def action(count: Optional[int] = None) -> Optional[int]:
107107
return None
108108

109109
if not isinstance(_scheduler, PeriodicScheduler):
110-
raise ValueError("Sceduler must be PeriodicScheduler")
110+
raise ValueError("Scheduler must be PeriodicScheduler")
111111
return _scheduler.schedule_periodic(period, action, state=0)
112112

113113
return Observable(subscribe)

tests/test_observable/test_timer.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import unittest
22

33
import reactivex
4+
from reactivex import operators
45
from reactivex.testing import ReactiveTest, TestScheduler
56

67
on_next = ReactiveTest.on_next
@@ -126,3 +127,53 @@ def create():
126127

127128
results = scheduler.start(create)
128129
assert results.messages == [on_next(500, 0), on_next(800, 1)]
130+
131+
def test_periodic_timer_second_subscription(self):
132+
scheduler = TestScheduler()
133+
t = reactivex.timer(duetime=200, period=300, scheduler=scheduler)
134+
135+
def create():
136+
return reactivex.merge(
137+
t.pipe(operators.map(lambda x: (x, "first"))),
138+
reactivex.concat(reactivex.timer(100, scheduler=scheduler), t).pipe(
139+
operators.map(lambda x: (x, "second"))
140+
),
141+
)
142+
143+
results = scheduler.start(create)
144+
assert results.messages == [
145+
on_next(300, (0, "second")),
146+
on_next(400, (0, "first")),
147+
on_next(500, (0, "second")),
148+
on_next(700, (1, "first")),
149+
on_next(800, (1, "second")),
150+
]
151+
152+
def test_on_off_timer_repeat(self):
153+
scheduler = TestScheduler()
154+
t = reactivex.timer(duetime=230, scheduler=scheduler)
155+
156+
def create():
157+
return t.pipe(operators.repeat())
158+
159+
results = scheduler.start(create)
160+
assert results.messages == [
161+
on_next(430, 0),
162+
on_next(660, 0),
163+
on_next(890, 0),
164+
]
165+
166+
def test_periodic_timer_repeat(self):
167+
scheduler = TestScheduler()
168+
t = reactivex.timer(duetime=130, period=200, scheduler=scheduler)
169+
170+
def create():
171+
return t.pipe(operators.take(3), operators.repeat())
172+
173+
results = scheduler.start(create)
174+
assert results.messages == [
175+
on_next(330, 0),
176+
on_next(530, 1),
177+
on_next(730, 2),
178+
on_next(860, 0),
179+
]

0 commit comments

Comments
 (0)