Skip to content

Commit bf2a816

Browse files
authored
Merge pull request #335 from lardawge/ls/add-support-for-override-worker-queue-names
Add support for overridden worker queue names
2 parents c3cc169 + 47a29a1 commit bf2a816

File tree

11 files changed

+130
-21
lines changed

11 files changed

+130
-21
lines changed

lib/backgrounder/support/backends.rb

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ def self.included(base)
1010
module ClassMethods
1111
attr_reader :queue_options
1212

13-
def backend(queue_name=nil, args={})
13+
def backend(backend_name=nil, args={})
1414
return @backend if @backend
15-
@queue_options = args
16-
@backend = queue_name
15+
@queue_options = set_queue_name_default(args)
16+
@backend = backend_name
1717
end
1818

1919
def enqueue_for_backend(worker, class_name, subject_id, mounted_as)
@@ -23,17 +23,29 @@ def enqueue_for_backend(worker, class_name, subject_id, mounted_as)
2323
private
2424

2525
def enqueue_active_job(worker, *args)
26-
worker.perform_later(*args.map(&:to_s))
26+
options = if worker.new.queue_name != 'default'
27+
queue_options.except(:queue)
28+
else
29+
queue_options
30+
end
31+
32+
worker.set(options).perform_later(*args.map(&:to_s))
2733
end
2834

2935
def enqueue_sidekiq(worker, *args)
30-
override_queue_name = worker.sidekiq_options['queue'] == 'default' || worker.sidekiq_options['queue'].nil?
36+
override_queue_name = worker.sidekiq_options['queue'] == 'default'
3137
args = sidekiq_queue_options(override_queue_name, 'class' => worker, 'args' => args.map(&:to_s))
3238
worker.client_push(args)
3339
end
3440

3541
private
3642

43+
def set_queue_name_default(options)
44+
options.tap do |opts|
45+
opts[:queue] ||= :carrierwave
46+
end
47+
end
48+
3749
def sidekiq_queue_options(override_queue_name, args)
3850
if override_queue_name && queue_options[:queue]
3951
args['queue'] = queue_options[:queue]

lib/carrierwave_backgrounder.rb

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,6 @@ def self.configure
2222
@worker_klass = 'CarrierWave::Workers::ActiveJob'
2323
require 'backgrounder/workers/active_job/process_asset'
2424
require 'backgrounder/workers/active_job/store_asset'
25-
26-
queue_name = queue_options[:queue] || 'carrierwave'
27-
28-
::CarrierWave::Workers::ActiveJob::ProcessAsset.class_eval do
29-
queue_as queue_name
30-
end
31-
::CarrierWave::Workers::ActiveJob::StoreAsset.class_eval do
32-
queue_as queue_name
33-
end
3425
when :sidekiq
3526
@worker_klass = 'CarrierWave::Workers'
3627

@@ -43,8 +34,8 @@ def self.configure
4334
end
4435
end
4536

46-
def self.suppress_record_not_found_errors(surpress_errors = true)
47-
@suppress_not_found_errors = surpress_errors
37+
def self.suppress_record_not_found_errors(suppress_errors = true)
38+
@suppress_not_found_errors = suppress_errors
4839
end
4940
end
5041
end

spec/backgrounder/support/backends_spec.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ module CarrierWave::Backgrounder
4444
let(:args) { ['FakeClass', 1, :image] }
4545

4646
it 'invokes client_push on the class with passed args' do
47-
expect(MockSidekiqWorker).to receive(:client_push).with({ 'class' => MockSidekiqWorker, 'args' => args.map(&:to_s) })
47+
expect(MockSidekiqWorker).to receive(:client_push).with({ 'class' => MockSidekiqWorker,
48+
'args' => args.map(&:to_s),
49+
'queue' => :carrierwave })
4850
mock_module.backend :sidekiq
4951
mock_module.enqueue_for_backend(MockSidekiqWorker, *args)
5052
end
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
require 'rails_helper'
2+
3+
RSpec.describe 'Queue Name', clear_images: true do
4+
let(:user) { User.new }
5+
6+
context 'when using built in worker' do
7+
context 'when queue name is passed in via config' do
8+
before do
9+
CarrierWave::Backgrounder.instance_variable_set(:@queue_options, queue: 'carrierwaver')
10+
end
11+
12+
after do
13+
CarrierWave::Backgrounder.instance_variable_set(:@queue_options, queue: 'carrierwave')
14+
end
15+
16+
it 'uses the config queue name' do
17+
user.update(avatar: load_file('test-1.jpg'))
18+
expect(Sidekiq::Queues["carrierwaver"].size).to eql(1)
19+
end
20+
end
21+
22+
context 'when not queue name is not set' do
23+
it 'uses the default name carrierwave' do
24+
user.update(avatar: load_file('test-1.jpg'))
25+
expect(Sidekiq::Queues["carrierwave"].size).to eql(1)
26+
end
27+
end
28+
end
29+
30+
context 'when using a subclassed worker' do
31+
context 'when queue name is passed in via config' do
32+
before do
33+
CarrierWave::Backgrounder.instance_variable_set(:@queue_options, queue: 'carrierwaver')
34+
end
35+
36+
after do
37+
CarrierWave::Backgrounder.instance_variable_set(:@queue_options, queue: 'carrierwave')
38+
end
39+
40+
it 'uses the config queue name' do
41+
user.update(portrait: load_file('test-1.jpg'))
42+
expect(Sidekiq::Queues["carrierwaver"].size).to eql(1)
43+
end
44+
end
45+
46+
context 'when not queue name is not set' do
47+
it 'uses the default name carrierwave' do
48+
user.update(portrait: load_file('test-1.jpg'))
49+
expect(Sidekiq::Queues["carrierwave"].size).to eql(1)
50+
end
51+
end
52+
53+
context 'when overridden via subclassed worker' do
54+
before do
55+
PortraitProcessJob.queue_as :custom_queue
56+
end
57+
58+
after do
59+
PortraitProcessJob.queue_as :carrierwave
60+
end
61+
62+
it 'uses the queue name passed in' do
63+
user.update(portrait: load_file('test-1.jpg'))
64+
expect(Sidekiq::Queues["custom_queue"].size).to eql(1)
65+
end
66+
end
67+
end
68+
end

spec/rails_helper.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,19 @@
77
require 'rspec/rails'
88
require 'backgrounder/railtie'
99

10+
if ENV['QUEUE_ADAPTER'] == 'sidekiq'
11+
Object.send(:remove_const, :PortraitProcessJob) if defined?(PortraitProcessJob)
12+
class PortraitProcessJob
13+
include CarrierWave::Workers::ProcessAssetMixin
14+
include Sidekiq::Worker
15+
end
16+
else
17+
Object.send(:remove_const, :PortraitProcessJob) if defined?(PortraitProcessJob)
18+
class PortraitProcessJob < ::ActiveJob::Base
19+
include CarrierWave::Workers::ProcessAssetMixin
20+
end
21+
end
22+
1023
begin
1124
ActiveRecord::Migration.maintain_test_schema!
1225
rescue ActiveRecord::PendingMigrationError => e

spec/support/dummy_app/Gemfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
source "https://rubygems.org"
22
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
33

4-
ruby "3.0.0"
4+
ruby "3.4.5"
55

66
# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
77
gem "rails", "~> 8.0.2"
88

99
# Use sqlite3 as the database for Active Record
10-
gem "sqlite3", "~> 1.4"
10+
gem "sqlite3", "~> 2.7"
1111

1212
# Use the Puma web server [https://github.com/puma/puma]
1313
# gem "puma", "~> 5.0"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class PortraitProcessJob
2+
def perform(*args)
3+
# Do something later
4+
end
5+
end

spec/support/dummy_app/app/models/user.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,7 @@ class User < ApplicationRecord
77
mount_uploaders :images, AvatarUploader
88
store_in_background :images
99
serialize :images, coder: JSON
10+
11+
mount_uploader :portrait, AvatarUploader
12+
store_in_background :portrait, PortraitProcessJob
1013
end
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class AddColumnsForPortrait < ActiveRecord::Migration[8.0]
2+
def change
3+
add_column :users, :portrait, :string
4+
add_column :users, :portrait_tmp, :string
5+
add_column :users, :portrait_processing, :boolean, null: false, default:false
6+
end
7+
end

spec/support/dummy_app/db/schema.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#
1111
# It's strongly recommended that you check this file into your version control system.
1212

13-
ActiveRecord::Schema[7.0].define(version: 2023_08_11_155811) do
13+
ActiveRecord::Schema[8.0].define(version: 2025_09_26_184915) do
1414
create_table "admins", force: :cascade do |t|
1515
t.string "avatar"
1616
t.boolean "avatar_processing", default: false, null: false
@@ -29,6 +29,8 @@
2929
t.string "images"
3030
t.string "images_tmp"
3131
t.boolean "images_processing", default: false, null: false
32+
t.string "portrait"
33+
t.string "portrait_tmp"
34+
t.boolean "portrait_processing", default: false, null: false
3235
end
33-
3436
end

0 commit comments

Comments
 (0)