def schedule(args=None, kwargs=None, eta=None, convert_utc=True): if convert_utc and eta: eta = local_to_utc(eta) cmd = klass((args or (), kwargs or {}), execute_time=eta, retries=retries) return invoker.enqueue(cmd)
def schedule(args=None, kwargs=None, eta=None, delay=None, convert_utc=True, task_id=None): if delay and eta: raise ValueError('Both a delay and an eta cannot be ' 'specified at the same time') if delay: eta = (datetime.datetime.now() + datetime.timedelta(seconds=delay)) if eta: if is_naive(eta) and convert_utc: eta = local_to_utc(eta) elif is_aware(eta) and convert_utc: eta = aware_to_utc(eta) elif is_aware(eta) and not convert_utc: eta = make_naive(eta) cmd = klass((args or (), kwargs or {}), execute_time=eta, retries=retries, retry_delay=retry_delay, task_id=task_id) return self.enqueue(cmd)
def schedule(args=None, kwargs=None, eta=None, delay=None, convert_utc=True): if delay and eta: raise ValueError('Both a delay and an eta cannot be specified at the same time') if delay: eta = datetime.datetime.now() + datetime.timedelta(seconds=delay) if convert_utc and eta: eta = local_to_utc(eta) cmd = klass((args or (), kwargs or {}), execute_time=eta, retries=retries) return invoker.enqueue(cmd)
def test_schedule_local_utc(self): dt = datetime.datetime(2011, 1, 1, 0, 0) dt2 = datetime.datetime(2037, 1, 1, 0, 0) r1 = modify_state.schedule(args=('k', 'v'), eta=dt) r2 = modify_state.schedule(args=('k2', 'v2'), eta=dt2) # dequeue a *single* message pt = self.spawn(self.consumer.check_message) # work on any messages generated by the processor thread st = self.spawn(self.consumer.worker_pool) pt.join() self.assertTrue('k' in state) self.assertEqual(self.consumer.schedule._schedule, {}) # dequeue a *single* message pt = self.spawn(self.consumer.check_message) pt.join() # it got stored in the schedule instead of executing self.assertFalse('k2' in state) self.assertTrue(r2.task_id in self.consumer.schedule._schedule) # run through an iteration of the scheduler self.consumer.check_schedule(dt) # our command was not enqueued self.assertEqual(len(self.consumer.invoker.queue), 0) # try running the scheduler with the time the command should run self.consumer.check_schedule(local_to_utc(dt2)) # it was enqueued self.assertEqual(len(self.consumer.invoker.queue), 1) self.assertEqual(self.consumer.schedule._schedule, {}) # dequeue and inspect -- it won't be executed because the scheduler will # see that it is scheduled to run in the future and plop it back into the # schedule command = self.consumer.invoker.dequeue() self.assertEqual(command.task_id, r2.task_id) self.assertEqual(command.execute_time, local_to_utc(dt2))
def _normalize_execute_time(self, eta=None, delay=None, convert_utc=True): if delay and eta: raise ValueError('Both a delay and an eta cannot be ' 'specified at the same time') elif delay: method = (convert_utc and datetime.datetime.utcnow or datetime.datetime.now) return method() + datetime.timedelta(seconds=delay) elif eta: if is_naive(eta) and convert_utc: eta = local_to_utc(eta) elif is_aware(eta) and convert_utc: eta = aware_to_utc(eta) elif is_aware(eta) and not convert_utc: eta = make_naive(eta) return eta
def schedule(args=None, kwargs=None, eta=None, delay=None, convert_utc=True): if delay and eta: raise ValueError('Both a delay and an eta cannot be ' 'specified at the same time') if delay: eta = (datetime.datetime.now() + datetime.timedelta(seconds=delay)) if convert_utc and eta: eta = local_to_utc(eta) cmd = klass( (args or (), kwargs or {}), execute_time=eta, retries=retries, retry_delay=retry_delay) return self.enqueue(cmd)
def test_schedule(self): dt = datetime.datetime(2011, 1, 1, 0, 1) add('k', 'v') self.assertEqual(len(queue), 1) task = huey.dequeue() self.assertEqual(task.execute_time, None) add.schedule(args=('k2', 'v2'), eta=dt) self.assertEqual(len(queue), 1) task = huey.dequeue() self.assertEqual(task.execute_time, local_to_utc(dt)) add.schedule(args=('k3', 'v3'), eta=dt, convert_utc=False) self.assertEqual(len(queue), 1) task = huey.dequeue() self.assertEqual(task.execute_time, dt)
def test_schedule(self): dt = datetime.datetime(2011, 1, 1, 0, 1) add('k', 'v') self.assertEqual(len(queue), 1) cmd = invoker.dequeue() self.assertEqual(cmd.execute_time, None) add.schedule(args=('k2', 'v2'), eta=dt) self.assertEqual(len(queue), 1) cmd = invoker.dequeue() self.assertEqual(cmd.execute_time, local_to_utc(dt)) add.schedule(args=('k3', 'v3'), eta=dt, convert_utc=False) self.assertEqual(len(queue), 1) cmd = invoker.dequeue() self.assertEqual(cmd.execute_time, dt)
def test_scheduled_time(self): put_data('k', 'v') task = huey.dequeue() self.assertEqual(len(huey), 0) self.assertEqual(task.execute_time, None) dt = datetime.datetime(2011, 1, 1, 0, 1) put_data.schedule(args=('k2', 'v2'), eta=dt) self.assertEqual(len(huey), 1) task = huey.dequeue() self.assertEqual(task.execute_time, local_to_utc(dt)) put_data.schedule(args=('k3', 'v3'), eta=dt, convert_utc=False) self.assertEqual(len(huey), 1) task = huey.dequeue() self.assertEqual(task.execute_time, dt)
def test_scheduled_time(self): put_data("k", "v") task = huey.dequeue() self.assertEqual(len(huey), 0) self.assertEqual(task.execute_time, None) dt = datetime.datetime(2011, 1, 1, 0, 1) put_data.schedule(args=("k2", "v2"), eta=dt) self.assertEqual(len(huey), 1) task = huey.dequeue() self.assertEqual(task.execute_time, local_to_utc(dt)) put_data.schedule(args=("k3", "v3"), eta=dt, convert_utc=False) self.assertEqual(len(huey), 1) task = huey.dequeue() self.assertEqual(task.execute_time, dt)
def schedule(args=None, kwargs=None, eta=None, delay=None, convert_utc=True, task_id=None): if delay and eta: raise ValueError('Both a delay and an eta cannot be ' 'specified at the same time') if delay: eta = (datetime.datetime.now() + datetime.timedelta(seconds=delay)) if convert_utc and eta: eta = local_to_utc(eta) cmd = klass( (args or (), kwargs or {}), execute_time=eta, retries=retries, retry_delay=retry_delay, task_id=task_id) enqueued = self.enqueue(cmd) self.emit_task("enqueued", cmd) return enqueued
def test_schedule_persistence(self): # should not error out as it will be EmptyData self.consumer.load_schedule() dt = datetime.datetime(2037, 1, 1, 0, 0) dt2 = datetime.datetime(2037, 1, 1, 0, 1) r = modify_state.schedule(args=('k', 'v'), eta=dt, convert_utc=False) r2 = modify_state.schedule(args=('k2', 'v2'), eta=dt2, convert_utc=False) # two messages in the queue self.assertEqual(len(self.consumer.invoker.queue), 2) # pull 'em down self.consumer.check_message() self.consumer.check_message() self.consumer.save_schedule() self.consumer.schedule._schedule = {} self.consumer.load_schedule() self.assertTrue(r.command.task_id in self.consumer.schedule._schedule) self.assertTrue(r2.command.task_id in self.consumer.schedule._schedule) cmd1 = self.consumer.schedule._schedule[r.command.task_id] cmd2 = self.consumer.schedule._schedule[r2.command.task_id] self.assertEqual(cmd1.execute_time, dt) self.assertEqual(cmd2.execute_time, dt2) # check w/conversion r3 = modify_state.schedule(args=('k3', 'v3'), eta=dt) self.consumer.check_message() self.consumer.save_schedule() self.consumer.schedule._schedule = {} self.consumer.load_schedule() cmd3 = self.consumer.schedule._schedule[r3.command.task_id] self.assertEqual(cmd3.execute_time, local_to_utc(dt))
def test_schedule_persistence(self): dt = datetime.datetime(2037, 1, 1, 0, 0) dt2 = datetime.datetime(2037, 1, 1, 0, 1) r = modify_state.schedule(args=('k', 'v'), eta=dt, convert_utc=False) r2 = modify_state.schedule(args=('k2', 'v2'), eta=dt2, convert_utc=False) # two messages in the queue self.assertEqual(len(self.consumer.invoker.queue), 2) # pull 'em down self.consumer.check_message() self.consumer.check_message() self.consumer.save_schedule() self.consumer.schedule._schedule = {} self.consumer.load_schedule() self.assertTrue(r.task_id in self.consumer.schedule._schedule) self.assertTrue(r2.task_id in self.consumer.schedule._schedule) cmd1 = self.consumer.schedule._schedule[r.task_id] cmd2 = self.consumer.schedule._schedule[r2.task_id] self.assertEqual(cmd1.execute_time, dt) self.assertEqual(cmd2.execute_time, dt2) # check w/conversion r3 = modify_state.schedule(args=('k3', 'v3'), eta=dt) self.consumer.check_message() self.consumer.save_schedule() self.consumer.schedule._schedule = {} self.consumer.load_schedule() cmd3 = self.consumer.schedule._schedule[r3.task_id] self.assertEqual(cmd3.execute_time, local_to_utc(dt))