diff --git a/README.md b/README.md index 3568567..d67a5d8 100644 --- a/README.md +++ b/README.md @@ -250,6 +250,19 @@ end @user.avatar.reprocess_without_delay!(:medium) ```` +#### Set queue name + +You can set queue name for background job. By default it's called "paperclip". +You can set it by changing global default options or by: + +``` +class User < ActiveRecord::Base + has_attached_file :avatar + + process_in_background :avatar, queue: "default" +end +``` + Defaults -------- diff --git a/lib/delayed_paperclip.rb b/lib/delayed_paperclip.rb index 5386921..a5e96b2 100644 --- a/lib/delayed_paperclip.rb +++ b/lib/delayed_paperclip.rb @@ -11,7 +11,8 @@ def options @options ||= { :background_job_class => detect_background_task, :url_with_processing => true, - :processing_image_url => nil + :processing_image_url => nil, + :queue => "paperclip" } end @@ -59,11 +60,9 @@ def process_in_background(name, options = {}) :only_process => only_process_default, :url_with_processing => DelayedPaperclip.options[:url_with_processing], :processing_image_url => DelayedPaperclip.options[:processing_image_url], - :queue => nil + :queue => DelayedPaperclip.options[:queue] }.each do |option, default| - paperclip_definitions[name][:delayed][option] = options.key?(option) ? options[option] : default - end # Sets callback diff --git a/lib/delayed_paperclip/jobs/active_job.rb b/lib/delayed_paperclip/jobs/active_job.rb index e4bcbb9..ebac0df 100644 --- a/lib/delayed_paperclip/jobs/active_job.rb +++ b/lib/delayed_paperclip/jobs/active_job.rb @@ -1,11 +1,9 @@ module DelayedPaperclip module Jobs class ActiveJob < ActiveJob::Base - queue_as :paperclip - def self.enqueue_delayed_paperclip(instance_klass, instance_id, attachment_name) - # ActiveJob currently does not support symbol arguments - self.perform_later(instance_klass, instance_id, attachment_name.to_s) + queue_name = instance_klass.constantize.paperclip_definitions[attachment_name][:delayed][:queue] + set(:queue => queue_name).perform_later(instance_klass, instance_id, attachment_name.to_s) end def perform(instance_klass, instance_id, attachment_name) @@ -13,4 +11,4 @@ def perform(instance_klass, instance_id, attachment_name) end end end -end \ No newline at end of file +end diff --git a/lib/delayed_paperclip/jobs/delayed_job.rb b/lib/delayed_paperclip/jobs/delayed_job.rb index f4d123c..586cc37 100644 --- a/lib/delayed_paperclip/jobs/delayed_job.rb +++ b/lib/delayed_paperclip/jobs/delayed_job.rb @@ -4,7 +4,8 @@ module DelayedPaperclip module Jobs class DelayedJob < Struct.new(:instance_klass, :instance_id, :attachment_name) - if Gem.loaded_specs['delayed_job'].version >= Gem::Version.new("2.1.0") # this is available in newer versions of DelayedJob. Using the newee Job api thus. + # This is available in newer versions of DelayedJob. Using the newee Job api thus. + if Gem.loaded_specs['delayed_job'].version >= Gem::Version.new("2.1.0") def self.enqueue_delayed_paperclip(instance_klass, instance_id, attachment_name) ::Delayed::Job.enqueue( @@ -31,4 +32,4 @@ def perform end end end -end \ No newline at end of file +end diff --git a/lib/delayed_paperclip/jobs/resque.rb b/lib/delayed_paperclip/jobs/resque.rb index 67ac9ef..8f36817 100644 --- a/lib/delayed_paperclip/jobs/resque.rb +++ b/lib/delayed_paperclip/jobs/resque.rb @@ -3,9 +3,8 @@ module DelayedPaperclip module Jobs class Resque - @queue = :paperclip - def self.enqueue_delayed_paperclip(instance_klass, instance_id, attachment_name) + @queue = instance_klass.constantize.paperclip_definitions[attachment_name][:delayed][:queue] ::Resque.enqueue(self, instance_klass, instance_id, attachment_name) end @@ -14,4 +13,4 @@ def self.perform(instance_klass, instance_id, attachment_name) end end end -end \ No newline at end of file +end diff --git a/lib/delayed_paperclip/jobs/sidekiq.rb b/lib/delayed_paperclip/jobs/sidekiq.rb index c4d0932..0f66278 100644 --- a/lib/delayed_paperclip/jobs/sidekiq.rb +++ b/lib/delayed_paperclip/jobs/sidekiq.rb @@ -4,9 +4,15 @@ module DelayedPaperclip module Jobs class Sidekiq include ::Sidekiq::Worker - sidekiq_options :queue => :paperclip def self.enqueue_delayed_paperclip(instance_klass, instance_id, attachment_name) + queue_name = instance_klass.constantize.paperclip_definitions[attachment_name][:delayed][:queue] + # Sidekiq >= 4.1.0 + if respond_to?(:set) + set(:queue => queue_name) + else + sidekiq_options :queue => queue_name + end perform_async(instance_klass, instance_id, attachment_name) end diff --git a/spec/delayed_paperclip/attachment_spec.rb b/spec/delayed_paperclip/attachment_spec.rb index d947c5b..b2a5739 100644 --- a/spec/delayed_paperclip/attachment_spec.rb +++ b/spec/delayed_paperclip/attachment_spec.rb @@ -1,7 +1,6 @@ require 'spec_helper' describe DelayedPaperclip::Attachment do - before :each do DelayedPaperclip.options[:background_job_class] = DelayedPaperclip::Jobs::Resque reset_dummy(dummy_options) @@ -11,15 +10,14 @@ let(:dummy) { Dummy.create } describe "#delayed_options" do - it "returns the specific options for delayed paperclip" do - dummy.image.delayed_options.should == { + expect(dummy.image.delayed_options).to eq({ :priority => 0, :only_process => [], :url_with_processing => true, :processing_image_url => nil, - :queue => nil - } + :queue => "paperclip" + }) end end diff --git a/spec/delayed_paperclip/class_methods_spec.rb b/spec/delayed_paperclip/class_methods_spec.rb index 746aaca..8118167 100644 --- a/spec/delayed_paperclip/class_methods_spec.rb +++ b/spec/delayed_paperclip/class_methods_spec.rb @@ -19,11 +19,24 @@ :only_process => [], :url_with_processing => true, :processing_image_url => nil, - :queue => nil} + :queue => "paperclip"} } } end + it "allows to set queue name" do + Dummy.process_in_background(:image, :queue => "custom") + expect(Dummy.paperclip_definitions).to eq({ :image => { + :delayed => { + :priority => 0, + :only_process => [], + :url_with_processing => true, + :processing_image_url => nil, + :queue => "custom"} + } + }) + end + context "with processing_image_url" do before :each do Dummy.process_in_background(:image, processing_image_url: "/processing/url") @@ -36,7 +49,7 @@ :only_process => [], :url_with_processing => true, :processing_image_url => "/processing/url", - :queue => nil} + :queue => "paperclip"} } } end @@ -56,7 +69,7 @@ :only_process => [:small, :large], :url_with_processing => true, :processing_image_url => nil, - :queue => nil} + :queue => "paperclip"} } } end diff --git a/spec/delayed_paperclip/instance_methods_spec.rb b/spec/delayed_paperclip/instance_methods_spec.rb index 1b9ffcc..ec7ee03 100644 --- a/spec/delayed_paperclip/instance_methods_spec.rb +++ b/spec/delayed_paperclip/instance_methods_spec.rb @@ -23,6 +23,7 @@ it "clears instance variables" do dummy.instance_variable_set(:@_enqued_for_processing, ['foo']) dummy.instance_variable_set(:@_enqued_for_processing_with_processing, ['image']) + dummy.expects(:enqueue_post_processing_for).with('foo') dummy.enqueue_delayed_processing dummy.instance_variable_get(:@_enqued_for_processing).should == [] dummy.instance_variable_get(:@_enqued_for_processing_with_processing).should == [] diff --git a/spec/delayed_paperclip_spec.rb b/spec/delayed_paperclip_spec.rb index 7a0d819..2cb4f23 100644 --- a/spec/delayed_paperclip_spec.rb +++ b/spec/delayed_paperclip_spec.rb @@ -15,7 +15,8 @@ it ".options returns basic options" do DelayedPaperclip.options.should == {:background_job_class => DelayedPaperclip::Jobs::Resque, :url_with_processing => true, - :processing_image_url => nil} + :processing_image_url => nil, + :queue => "paperclip"} end end @@ -60,14 +61,14 @@ end it "returns paperclip options regardless of version" do - Dummy.paperclip_definitions.should == {:image => { :styles => { :thumbnail => "25x25" }, + expect(Dummy.paperclip_definitions).to eq({:image => { :styles => { :thumbnail => "25x25" }, :delayed => { :priority => 0, :only_process => [], :url_with_processing => true, :processing_image_url => nil, - :queue => nil} + :queue => "paperclip"} } - } + }) end end end diff --git a/spec/integration/active_job_resque_spec.rb b/spec/integration/active_job_resque_spec.rb index 2e3c240..f8af60d 100644 --- a/spec/integration/active_job_resque_spec.rb +++ b/spec/integration/active_job_resque_spec.rb @@ -21,8 +21,8 @@ def process_jobs worker.process end - def jobs_count - Resque.size(:paperclip) + def jobs_count(queue = :paperclip) + Resque.size(queue) end end end diff --git a/spec/integration/active_job_sidekiq_spec.rb b/spec/integration/active_job_sidekiq_spec.rb index d1fc95f..adad194 100644 --- a/spec/integration/active_job_sidekiq_spec.rb +++ b/spec/integration/active_job_sidekiq_spec.rb @@ -1,5 +1,5 @@ require 'spec_helper' -require 'sidekiq/api' +require 'sidekiq/testing' describe "ActiveJob with Sidekiq backend" do if defined? ActiveJob @@ -7,9 +7,6 @@ DelayedPaperclip.options[:background_job_class] = DelayedPaperclip::Jobs::ActiveJob ActiveJob::Base.logger = nil ActiveJob::Base.queue_adapter = :sidekiq - end - - before :each do Sidekiq::Queues["paperclip"].clear end @@ -31,7 +28,7 @@ def process_jobs end end - def jobs_count - Sidekiq::Queues["paperclip"].size + def jobs_count(queue = "paperclip") + Sidekiq::Queues[queue].size end end diff --git a/spec/integration/delayed_job_spec.rb b/spec/integration/delayed_job_spec.rb index 845eebd..c1f8d1c 100644 --- a/spec/integration/delayed_job_spec.rb +++ b/spec/integration/delayed_job_spec.rb @@ -33,7 +33,7 @@ def process_jobs Delayed::Worker.new.work_off end - def jobs_count + def jobs_count(queue = nil) Delayed::Job.count end diff --git a/spec/integration/examples/base.rb b/spec/integration/examples/base.rb index 9c5059e..b38f3d9 100644 --- a/spec/integration/examples/base.rb +++ b/spec/integration/examples/base.rb @@ -312,4 +312,13 @@ end end + describe "queue option" do + it "enqueues job with given queue name" do + reset_dummy :queue => "custom" + + expect do + dummy.save! + end.to change { jobs_count("custom") }.by(1) + end + end end diff --git a/spec/integration/resque_spec.rb b/spec/integration/resque_spec.rb index f283b23..8630253 100644 --- a/spec/integration/resque_spec.rb +++ b/spec/integration/resque_spec.rb @@ -32,7 +32,7 @@ def process_jobs worker.process end - def jobs_count - Resque.size(:paperclip) + def jobs_count(queue = :paperclip) + Resque.size(queue) end end diff --git a/spec/integration/sidekiq_spec.rb b/spec/integration/sidekiq_spec.rb index 9bf2d1f..d27b46e 100644 --- a/spec/integration/sidekiq_spec.rb +++ b/spec/integration/sidekiq_spec.rb @@ -39,7 +39,7 @@ def process_jobs end end - def jobs_count - Sidekiq::Queues["paperclip"].size + def jobs_count(queue = "paperclip") + Sidekiq::Queues[queue].size end end