From 5255e4f39f040be28b56740f3ebef667f286926c Mon Sep 17 00:00:00 2001
From: Cristian Bica <cristian.bica@gmail.com>
Date: Sun, 24 Aug 2014 15:29:20 +0300
Subject: ActiveJob: Implemented enqueue_at for QueueClassic

---
 .../queue_adapters/queue_classic_adapter.rb           | 19 +++++++++++++++++--
 activejob/test/support/queue_classic/inline.rb        | 12 ++++++++++++
 2 files changed, 29 insertions(+), 2 deletions(-)

(limited to 'activejob')

diff --git a/activejob/lib/active_job/queue_adapters/queue_classic_adapter.rb b/activejob/lib/active_job/queue_adapters/queue_classic_adapter.rb
index d74f8cf90e..914390a958 100644
--- a/activejob/lib/active_job/queue_adapters/queue_classic_adapter.rb
+++ b/activejob/lib/active_job/queue_adapters/queue_classic_adapter.rb
@@ -5,11 +5,26 @@ module ActiveJob
     class QueueClassicAdapter
       class << self
         def enqueue(job, *args)
-          QC::Queue.new(job.queue_name).enqueue("#{JobWrapper.name}.perform", job.name, *args)
+          build_queue(job.queue_name).enqueue("#{JobWrapper.name}.perform", job.name, *args)
         end
 
         def enqueue_at(job, timestamp, *args)
-          raise NotImplementedError
+          queue = build_queue(job.queue_name)
+          unless queue.respond_to?(:enqueue_at)
+            raise NotImplementedError, 'To be able to schedule jobs with Queue Classic ' \
+              'the QC::Queue needs to respond to `enqueue_at(timestamp, method, *args)`. '
+              'You can implement this yourself or you can use the queue_classic-later gem.'
+          end
+          queue.enqueue_at(timestamp, "#{JobWrapper.name}.perform", job.name, *args)
+        end
+
+        # Builds a <tt>QC::Queue</tt> object to schedule jobs on.
+        #
+        # If you have a custom <tt>QC::Queue</tt> subclass you'll need to suclass
+        # <tt>ActiveJob::QueueAdapters::QueueClassicAdapter</tt> and override the
+        # <tt>build_queue</tt> method.
+        def build_queue(queue_name)
+          QC::Queue.new(queue_name)
         end
       end
 
diff --git a/activejob/test/support/queue_classic/inline.rb b/activejob/test/support/queue_classic/inline.rb
index 5e9c295e01..5743d5bbb5 100644
--- a/activejob/test/support/queue_classic/inline.rb
+++ b/activejob/test/support/queue_classic/inline.rb
@@ -7,5 +7,17 @@ module QC
       receiver = eval(receiver_str)
       receiver.send(message, *args)
     end
+
+    def enqueue_in(seconds, method, *args)
+      receiver_str, _, message = method.rpartition('.')
+      receiver = eval(receiver_str)
+      receiver.send(message, *args)
+    end
+
+    def enqueue_at(not_before, method, *args)
+      receiver_str, _, message = method.rpartition('.')
+      receiver = eval(receiver_str)
+      receiver.send(message, *args)
+    end
   end
 end
-- 
cgit v1.2.3