diff --git a/rq/queue.py b/rq/queue.py index e694e3f..11e6553 100644 --- a/rq/queue.py +++ b/rq/queue.py @@ -111,6 +111,16 @@ class Queue(object): script = self.connection.register_script(script) return script(keys=[self.key]) + def delete(self, delete_jobs=True): + """Deletes the queue. If delete_jobs is true it removes all the associated messages on the queue first.""" + if delete_jobs: + self.empty() + + with self.connection._pipeline() as pipeline: + pipeline.srem(self.redis_queues_keys, self._key) + pipeline.delete(self._key) + pipeline.execute() + def is_empty(self): """Returns whether the current queue is empty.""" return self.count == 0 diff --git a/tests/test_queue.py b/tests/test_queue.py index e19415f..96035c8 100644 --- a/tests/test_queue.py +++ b/tests/test_queue.py @@ -72,6 +72,38 @@ class TestQueue(RQTestCase): self.testconn.rpush('rq:queue:example', 'sentinel message') self.assertEqual(q.is_empty(), False) + def test_queue_delete(self): + """Test queue.delete properly removes queue""" + q = Queue('example') + job = q.enqueue(say_hello) + job2 = q.enqueue(say_hello) + + self.assertEqual(2, len(q.get_job_ids())) + + q.delete() + + self.assertEqual(0, len(q.get_job_ids())) + self.assertEqual(False, self.testconn.exists(job.key)) + self.assertEqual(False, self.testconn.exists(job2.key)) + self.assertEqual(0, len(self.testconn.smembers(Queue.redis_queues_keys))) + self.assertEqual(False, self.testconn.exists(q.key)) + + def test_queue_delete_but_keep_jobs(self): + """Test queue.delete properly removes queue but keeps the job keys in the redis store""" + q = Queue('example') + job = q.enqueue(say_hello) + job2 = q.enqueue(say_hello) + + self.assertEqual(2, len(q.get_job_ids())) + + q.delete(delete_jobs=False) + + self.assertEqual(0, len(q.get_job_ids())) + self.assertEqual(True, self.testconn.exists(job.key)) + self.assertEqual(True, self.testconn.exists(job2.key)) + self.assertEqual(0, len(self.testconn.smembers(Queue.redis_queues_keys))) + self.assertEqual(False, self.testconn.exists(q.key)) + def test_remove(self): """Ensure queue.remove properly removes Job from queue.""" q = Queue('example')