Skip to content

Commit cc678b7

Browse files
committed
fix: replace utcnow() with now(UTC).replace(tzinfo=None) for consistency
1 parent 134c2eb commit cc678b7

4 files changed

Lines changed: 39 additions & 38 deletions

File tree

README.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ This is how you do it
104104
.. code-block:: python
105105
106106
scheduler.schedule(
107-
scheduled_time=datetime.utcnow(), # Time for first execution, in UTC timezone
107+
scheduled_time=datetime.now(UTC).replace(tzinfo=None), # Time for first execution, in UTC timezone
108108
func=func, # Function to be queued
109109
args=[arg1, arg2], # Arguments passed into function when executed
110110
kwargs={'foo': 'bar'}, # Keyword arguments passed into function when executed

rq_scheduler/scheduler.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from uuid import uuid4
77

88
from datetime import datetime
9+
from dateutil.tz import UTC
910
from itertools import repeat
1011

1112
from rq.exceptions import NoSuchJobError
@@ -216,7 +217,7 @@ def enqueue_in(self, time_delta, func, *args, **kwargs):
216217
"""
217218
Similar to ``enqueue_at``, but accepts a timedelta instead of datetime object.
218219
The job's scheduled execution time will be calculated by adding the timedelta
219-
to datetime.utcnow().
220+
to datetime.now(UTC).replace(tzinfo=None).
220221
"""
221222
timeout = kwargs.pop('timeout', None)
222223
job_id = kwargs.pop('job_id', None)
@@ -237,7 +238,7 @@ def enqueue_in(self, time_delta, func, *args, **kwargs):
237238
if at_front:
238239
job.enqueue_at_front = True
239240
self.connection.zadd(self.scheduled_jobs_key,
240-
{job.id: to_unix(datetime.utcnow() + time_delta)})
241+
{job.id: to_unix(datetime.now(UTC).replace(tzinfo=None) + time_delta)})
241242
return job
242243

243244
def schedule(self, scheduled_time, func, args=None, kwargs=None,
@@ -391,7 +392,7 @@ def get_jobs_to_queue(self, with_times=False):
391392
If with_times is True a list of tuples consisting of the job instance and
392393
it's scheduled execution time is returned.
393394
"""
394-
return self.get_jobs(to_unix(datetime.utcnow()), with_times=with_times)
395+
return self.get_jobs(to_unix(datetime.now(UTC).replace(tzinfo=None)), with_times=with_times)
395396

396397
def get_queue_for_job(self, job):
397398
"""
@@ -431,7 +432,7 @@ def enqueue_job(self, job):
431432
if job.meta['repeat'] == 0:
432433
return
433434
self.connection.zadd(self.scheduled_jobs_key,
434-
{job.id: to_unix(datetime.utcnow()) + int(interval)})
435+
{job.id: to_unix(datetime.now(UTC).replace(tzinfo=None)) + int(interval)})
435436
elif cron_string:
436437
# If this is a repeat job and counter has reached 0, don't repeat
437438
if repeat is not None:

rq_scheduler/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,5 @@ def rationalize_until(until=None):
5252
elif isinstance(until, datetime):
5353
until = to_unix(until)
5454
elif isinstance(until, timedelta):
55-
until = to_unix((datetime.utcnow() + until))
55+
until = to_unix((datetime.now(dateutil.tz.UTC).replace(tzinfo=None) + until))
5656
return until

tests/test_scheduler.py

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ def test_create_scheduled_job(self):
177177
"""
178178
Ensure that scheduled jobs are put in the scheduler queue with the right score
179179
"""
180-
scheduled_time = datetime.utcnow()
180+
scheduled_time = datetime.now(UTC).replace(tzinfo=None)
181181
job = self.scheduler.enqueue_at(scheduled_time, say_hello)
182182
self.assertEqual(job, Job.fetch(job.id, connection=self.testconn))
183183
self.assertIn(job.id,
@@ -200,7 +200,7 @@ def test_enqueue_at_sets_timeout(self):
200200
a custom timeout.
201201
"""
202202
timeout = 13
203-
job = self.scheduler.enqueue_at(datetime.utcnow(), say_hello, timeout=timeout)
203+
job = self.scheduler.enqueue_at(datetime.now(UTC).replace(tzinfo=None), say_hello, timeout=timeout)
204204
job_from_queue = Job.fetch(job.id, connection=self.testconn)
205205
self.assertEqual(job_from_queue.timeout, timeout)
206206

@@ -210,38 +210,38 @@ def test_enqueue_at_sets_job_id(self):
210210
a custom job id.
211211
"""
212212
job_id = 'test_id'
213-
job = self.scheduler.enqueue_at(datetime.utcnow(), say_hello, job_id=job_id)
213+
job = self.scheduler.enqueue_at(datetime.now(UTC).replace(tzinfo=None), say_hello, job_id=job_id)
214214
self.assertEqual(job.id, job_id)
215215

216216
def test_enqueue_at_sets_job_ttl(self):
217217
"""
218218
Ensure that a job scheduled via enqueue_at can be created with a custom job ttl.
219219
"""
220220
job_ttl = 123456789
221-
job = self.scheduler.enqueue_at(datetime.utcnow(), say_hello, job_ttl=job_ttl)
221+
job = self.scheduler.enqueue_at(datetime.now(UTC).replace(tzinfo=None), say_hello, job_ttl=job_ttl)
222222
self.assertEqual(job.ttl, job_ttl)
223223

224224
def test_enqueue_at_sets_job_result_ttl(self):
225225
"""
226226
Ensure that a job scheduled via enqueue_at can be created with a custom result ttl.
227227
"""
228228
job_result_ttl = 1234567890
229-
job = self.scheduler.enqueue_at(datetime.utcnow(), say_hello, job_result_ttl=job_result_ttl)
229+
job = self.scheduler.enqueue_at(datetime.now(UTC).replace(tzinfo=None), say_hello, job_result_ttl=job_result_ttl)
230230
self.assertEqual(job.result_ttl, job_result_ttl)
231231

232232
def test_enqueue_at_sets_meta(self):
233233
"""
234234
Ensure that a job scheduled via enqueue_at can be created with a custom meta.
235235
"""
236236
meta = {'say': 'hello'}
237-
job = self.scheduler.enqueue_at(datetime.utcnow(), say_hello, meta=meta)
237+
job = self.scheduler.enqueue_at(datetime.now(UTC).replace(tzinfo=None), say_hello, meta=meta)
238238
self.assertEqual(job.meta, meta)
239239

240240
def test_enqueue_in(self):
241241
"""
242242
Ensure that jobs have the right scheduled time.
243243
"""
244-
right_now = datetime.utcnow()
244+
right_now = datetime.now(UTC).replace(tzinfo=None)
245245
time_delta = timedelta(minutes=1)
246246
job = self.scheduler.enqueue_in(time_delta, say_hello)
247247
self.assertIn(job.id,
@@ -297,7 +297,7 @@ def test_enqueue_in_sets_meta(self):
297297
self.assertEqual(job.meta, meta)
298298

299299
def test_count(self):
300-
now = datetime.utcnow()
300+
now = datetime.now(UTC).replace(tzinfo=None)
301301
self.scheduler.enqueue_at(now, say_hello)
302302
self.assertEqual(self.scheduler.count(), 1)
303303

@@ -314,7 +314,7 @@ def test_get_jobs(self):
314314
"""
315315
Ensure get_jobs() returns all jobs until the specified time.
316316
"""
317-
now = datetime.utcnow()
317+
now = datetime.now(UTC).replace(tzinfo=None)
318318
job = self.scheduler.enqueue_at(now, say_hello)
319319
self.assertIn(job, self.scheduler.get_jobs(now))
320320
future_time = now + timedelta(hours=1)
@@ -328,7 +328,7 @@ def test_get_jobs_slice(self):
328328
"""
329329
Ensure get_jobs() returns the appropriate slice of all jobs using offset and length.
330330
"""
331-
now = datetime.utcnow()
331+
now = datetime.now(UTC).replace(tzinfo=None)
332332
future_time = now + timedelta(hours=1)
333333
future_test_time = now + timedelta(minutes=59, seconds=59)
334334

@@ -355,7 +355,7 @@ def test_get_jobs_to_queue(self):
355355
"""
356356
Ensure that jobs scheduled the future are not queued.
357357
"""
358-
now = datetime.utcnow()
358+
now = datetime.now(UTC).replace(tzinfo=None)
359359
job = self.scheduler.enqueue_at(now, say_hello)
360360
self.assertIn(job, self.scheduler.get_jobs_to_queue())
361361
future_time = now + timedelta(hours=1)
@@ -370,7 +370,7 @@ def test_enqueue_job(self):
370370
- Job appears in the right queue
371371
- Queue is recognized by rq's Queue.all()
372372
"""
373-
now = datetime.utcnow()
373+
now = datetime.now(UTC).replace(tzinfo=None)
374374
queue_name = 'foo'
375375
scheduler = Scheduler(connection=self.testconn, queue_name=queue_name)
376376

@@ -423,15 +423,15 @@ def test_enqueue_at_with_job_queue_name(self):
423423
queue = Queue('foo', connection=self.testconn)
424424
job_queue = Queue('job_foo', connection=self.testconn)
425425
scheduler = Scheduler(connection=self.testconn, queue=queue)
426-
job = scheduler.enqueue_at(datetime.utcnow(), say_hello, queue_name='job_foo')
426+
job = scheduler.enqueue_at(datetime.now(UTC).replace(tzinfo=None), say_hello, queue_name='job_foo')
427427
self.assertEqual(scheduler.get_queue_for_job(job), job_queue)
428428
self.scheduler.enqueue_job(job)
429429
self.assertTrue(job.enqueued_at is not None)
430430
self.assertIn(job, job_queue.jobs)
431431
self.assertIn(job_queue, Queue.all(self.testconn))
432432

433433
def test_job_membership(self):
434-
now = datetime.utcnow()
434+
now = datetime.now(UTC).replace(tzinfo=None)
435435
job = self.scheduler.enqueue_at(now, say_hello)
436436
self.assertIn(job, self.scheduler)
437437
self.assertIn(job.id, self.scheduler)
@@ -454,7 +454,7 @@ def test_change_execution_time(self):
454454
"""
455455
Ensure ``change_execution_time`` is called, ensure that job's score is updated
456456
"""
457-
job = self.scheduler.enqueue_at(datetime.utcnow(), say_hello)
457+
job = self.scheduler.enqueue_at(datetime.now(UTC).replace(tzinfo=None), say_hello)
458458
new_date = datetime(2010, 1, 1)
459459
self.scheduler.change_execution_time(job, new_date)
460460
self.assertEqual(to_unix(new_date),
@@ -466,11 +466,11 @@ def test_args_kwargs_are_passed_correctly(self):
466466
"""
467467
Ensure that arguments and keyword arguments are properly saved to jobs.
468468
"""
469-
job = self.scheduler.enqueue_at(datetime.utcnow(), simple_addition, 1, 1, 1)
469+
job = self.scheduler.enqueue_at(datetime.now(UTC).replace(tzinfo=None), simple_addition, 1, 1, 1)
470470
self.assertEqual(job.args, (1, 1, 1))
471-
job = self.scheduler.enqueue_at(datetime.utcnow(), simple_addition, z=1, y=1, x=1)
471+
job = self.scheduler.enqueue_at(datetime.now(UTC).replace(tzinfo=None), simple_addition, z=1, y=1, x=1)
472472
self.assertEqual(job.kwargs, {'x': 1, 'y': 1, 'z': 1})
473-
job = self.scheduler.enqueue_at(datetime.utcnow(), simple_addition, 1, z=1, y=1)
473+
job = self.scheduler.enqueue_at(datetime.now(UTC).replace(tzinfo=None), simple_addition, 1, z=1, y=1)
474474
self.assertEqual(job.kwargs, {'y': 1, 'z': 1})
475475
self.assertEqual(job.args, (1,))
476476

@@ -487,7 +487,7 @@ def test_interval_and_repeat_persisted_correctly(self):
487487
"""
488488
Ensure that interval and repeat attributes are correctly saved.
489489
"""
490-
job = self.scheduler.schedule(datetime.utcnow(), say_hello, interval=10, repeat=11)
490+
job = self.scheduler.schedule(datetime.now(UTC).replace(tzinfo=None), say_hello, interval=10, repeat=11)
491491
job_from_queue = Job.fetch(job.id, connection=self.testconn)
492492
self.assertEqual(job_from_queue.meta['interval'], 10)
493493
self.assertEqual(job_from_queue.meta['repeat'], 11)
@@ -508,7 +508,7 @@ def test_crontab_persisted_correctly(self):
508508
# check that minute=1, seconds=0, and is within an hour
509509
assert datetime_time.minute == 1
510510
assert datetime_time.second == 0
511-
assert datetime_time - datetime.utcnow() < timedelta(hours=1)
511+
assert datetime_time - datetime.now(UTC).replace(tzinfo=None) < timedelta(hours=1)
512512

513513
def test_crontab_persisted_correctly_with_local_timezone(self):
514514
"""
@@ -638,14 +638,14 @@ def test_cron_sets_provided_ttl(self):
638638
def test_repeat_without_interval_raises_error(self):
639639
# Ensure that an error is raised if repeat is specified without interval
640640
def create_job():
641-
self.scheduler.schedule(datetime.utcnow(), say_hello, repeat=11)
641+
self.scheduler.schedule(datetime.now(UTC).replace(tzinfo=None), say_hello, repeat=11)
642642
self.assertRaises(ValueError, create_job)
643643

644644
def test_job_with_intervals_get_rescheduled(self):
645645
"""
646646
Ensure jobs with interval attribute are put back in the scheduler
647647
"""
648-
time_now = datetime.utcnow()
648+
time_now = datetime.now(UTC).replace(tzinfo=None)
649649
interval = 10
650650
job = self.scheduler.schedule(time_now, say_hello, interval=interval)
651651
self.scheduler.enqueue_job(job)
@@ -658,7 +658,7 @@ def test_job_with_interval_can_set_meta(self):
658658
"""
659659
Ensure that jobs with interval attribute can be created with meta
660660
"""
661-
time_now = datetime.utcnow()
661+
time_now = datetime.now(UTC).replace(tzinfo=None)
662662
interval = 10
663663
meta = {'say': 'hello'}
664664
job = self.scheduler.schedule(time_now, say_hello, interval=interval, meta=meta)
@@ -695,7 +695,7 @@ def test_job_with_repeat(self):
695695
Ensure jobs with repeat attribute are put back in the scheduler
696696
X (repeat) number of times
697697
"""
698-
time_now = datetime.utcnow()
698+
time_now = datetime.now(UTC).replace(tzinfo=None)
699699
interval = 10
700700
# If job is repeated once, the job shouldn't be put back in the queue
701701
job = self.scheduler.schedule(time_now, say_hello, interval=interval, repeat=1)
@@ -716,7 +716,7 @@ def test_missing_jobs_removed_from_scheduler(self):
716716
"""
717717
Ensure jobs that don't exist when queued are removed from the scheduler.
718718
"""
719-
job = self.scheduler.schedule(datetime.utcnow(), say_hello)
719+
job = self.scheduler.schedule(datetime.now(UTC).replace(tzinfo=None), say_hello)
720720
job.cancel()
721721
list(self.scheduler.get_jobs_to_queue())
722722
self.assertIn(job.id, tl(self.testconn.zrange(
@@ -730,15 +730,15 @@ def test_periodic_jobs_sets_result_ttl(self):
730730
"""
731731
Ensure periodic jobs set result_ttl to infinite.
732732
"""
733-
job = self.scheduler.schedule(datetime.utcnow(), say_hello, interval=5)
733+
job = self.scheduler.schedule(datetime.now(UTC).replace(tzinfo=None), say_hello, interval=5)
734734
job_from_queue = Job.fetch(job.id, connection=self.testconn)
735735
self.assertEqual(job.result_ttl, -1)
736736

737737
def test_periodic_jobs_sets_ttl(self):
738738
"""
739739
Ensure periodic jobs sets correctly ttl.
740740
"""
741-
job = self.scheduler.schedule(datetime.utcnow(), say_hello, interval=5, ttl=4)
741+
job = self.scheduler.schedule(datetime.now(UTC).replace(tzinfo=None), say_hello, interval=5, ttl=4)
742742
job_from_queue = Job.fetch(job.id, connection=self.testconn)
743743
self.assertEqual(job.ttl, 4)
744744

@@ -747,22 +747,22 @@ def test_periodic_jobs_sets_meta(self):
747747
Ensure periodic jobs sets correctly meta.
748748
"""
749749
meta = {'say': 'hello'}
750-
job = self.scheduler.schedule(datetime.utcnow(), say_hello, interval=5, meta=meta)
750+
job = self.scheduler.schedule(datetime.now(UTC).replace(tzinfo=None), say_hello, interval=5, meta=meta)
751751
self.assertEqual(meta, job.meta)
752752

753753
def test_periodic_job_sets_id(self):
754754
"""
755755
Ensure that ID is passed to RQ by schedule.
756756
"""
757-
job = self.scheduler.schedule(datetime.utcnow(), say_hello, interval=5, id='id test')
757+
job = self.scheduler.schedule(datetime.now(UTC).replace(tzinfo=None), say_hello, interval=5, id='id test')
758758
job_from_queue = Job.fetch(job.id, connection=self.testconn)
759759
self.assertEqual('id test', job.id)
760760

761761
def test_periodic_job_sets_description(self):
762762
"""
763763
Ensure that description is passed to RQ by schedule.
764764
"""
765-
job = self.scheduler.schedule(datetime.utcnow(), say_hello, interval=5, description='description')
765+
job = self.scheduler.schedule(datetime.now(UTC).replace(tzinfo=None), say_hello, interval=5, description='description')
766766
job_from_queue = Job.fetch(job.id, connection=self.testconn)
767767
self.assertEqual('description', job.description)
768768

@@ -786,7 +786,7 @@ def test_run_burst(self):
786786
"""
787787
Check burst mode of Scheduler.run().
788788
"""
789-
now = datetime.utcnow()
789+
now = datetime.now(UTC).replace(tzinfo=None)
790790
job = self.scheduler.enqueue_at(now, say_hello)
791791
self.assertIn(job, self.scheduler.get_jobs_to_queue())
792792
self.assertEqual(len(list(self.scheduler.get_jobs())), 1)
@@ -814,7 +814,7 @@ def test_small_float_interval(self):
814814
self.assertEqual(self.testconn.ttl(lock_key), 10) # int(0.1) + 10 = 10
815815

816816
#enqueue a job
817-
now = datetime.utcnow()
817+
now = datetime.now(UTC).replace(tzinfo=None)
818818
job = scheduler.enqueue_at(now, say_hello)
819819
self.assertIn(job, self.scheduler.get_jobs_to_queue())
820820
self.assertEqual(len(list(self.scheduler.get_jobs())), 1)

0 commit comments

Comments
 (0)