carrierwave_backgrounder 0.4.2 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.gitignore +2 -1
- data/.travis.yml +12 -2
- data/CHANGELOG.md +38 -0
- data/Gemfile +1 -1
- data/README.md +70 -44
- data/carrierwave_backgrounder.gemspec +7 -2
- data/lib/backgrounder/orm/activemodel.rb +7 -7
- data/lib/backgrounder/orm/base.rb +19 -13
- data/lib/backgrounder/orm/data_mapper.rb +1 -1
- data/lib/backgrounder/support/backends.rb +4 -44
- data/lib/backgrounder/version.rb +1 -1
- data/lib/backgrounder/workers/active_job/process_asset.rb +14 -0
- data/lib/backgrounder/workers/active_job/store_asset.rb +14 -0
- data/lib/backgrounder/workers/base.rb +11 -7
- data/lib/backgrounder/workers/class_methods.rb +14 -0
- data/lib/backgrounder/workers/process_asset.rb +4 -13
- data/lib/backgrounder/workers/process_asset_mixin.rb +38 -0
- data/lib/backgrounder/workers/store_asset.rb +4 -26
- data/lib/backgrounder/workers/store_asset_mixin.rb +38 -0
- data/lib/backgrounder/workers.rb +1 -0
- data/lib/carrierwave_backgrounder.rb +24 -10
- data/lib/generators/carrierwave_backgrounder/install_generator.rb +1 -1
- data/lib/generators/carrierwave_backgrounder/templates/config/initializers/carrierwave_backgrounder.rb +1 -6
- data/spec/backgrounder/orm/activemodel_spec.rb +2 -5
- data/spec/backgrounder/support/backends_spec.rb +9 -158
- data/spec/backgrounder/workers/process_asset_spec.rb +10 -6
- data/spec/backgrounder/workers/store_asset_spec.rb +20 -99
- data/spec/integrations/process_in_background_multi_upload_spec.rb +83 -0
- data/spec/integrations/process_in_background_spec.rb +77 -0
- data/spec/integrations/store_in_background_multi_upload_spec.rb +89 -0
- data/spec/integrations/store_in_background_spec.rb +88 -0
- data/spec/rails_helper.rb +27 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/support/dummy_app/Gemfile +49 -0
- data/spec/support/dummy_app/README.md +24 -0
- data/spec/support/dummy_app/Rakefile +6 -0
- data/spec/support/dummy_app/app/controllers/application_controller.rb +2 -0
- data/spec/support/dummy_app/app/controllers/concerns/.keep +0 -0
- data/spec/support/dummy_app/app/jobs/application_job.rb +7 -0
- data/spec/support/dummy_app/app/models/admin.rb +10 -0
- data/spec/support/dummy_app/app/models/application_record.rb +3 -0
- data/spec/support/dummy_app/app/models/concerns/.keep +0 -0
- data/spec/support/dummy_app/app/models/user.rb +10 -0
- data/spec/support/dummy_app/app/uploaders/avatar_uploader.rb +67 -0
- data/spec/support/dummy_app/bin/bundle +114 -0
- data/spec/support/dummy_app/bin/rails +4 -0
- data/spec/support/dummy_app/bin/rake +4 -0
- data/spec/support/dummy_app/bin/setup +33 -0
- data/spec/support/dummy_app/config/application.rb +39 -0
- data/spec/support/dummy_app/config/boot.rb +3 -0
- data/spec/support/dummy_app/config/database.yml +25 -0
- data/spec/support/dummy_app/config/environment.rb +8 -0
- data/spec/support/dummy_app/config/environments/development.rb +65 -0
- data/spec/support/dummy_app/config/environments/production.rb +86 -0
- data/spec/support/dummy_app/config/environments/test.rb +63 -0
- data/spec/support/dummy_app/config/initializers/carrierwave_backgrounder.rb +5 -0
- data/spec/support/dummy_app/config/initializers/cors.rb +16 -0
- data/spec/support/dummy_app/config/initializers/filter_parameter_logging.rb +8 -0
- data/spec/support/dummy_app/config/initializers/inflections.rb +16 -0
- data/spec/support/dummy_app/config/locales/en.yml +33 -0
- data/spec/support/dummy_app/config/routes.rb +6 -0
- data/spec/support/dummy_app/config/storage.yml +34 -0
- data/spec/support/dummy_app/config.ru +6 -0
- data/spec/support/dummy_app/db/migrate/20230804214459_create_users.rb +9 -0
- data/spec/support/dummy_app/db/migrate/20230807165013_add_avatar_tmp_column_to_user.rb +5 -0
- data/spec/support/dummy_app/db/migrate/20230808233036_add_avatar_processing_flag_to_users.rb +5 -0
- data/spec/support/dummy_app/db/migrate/20230809215320_create_admins.rb +10 -0
- data/spec/support/dummy_app/db/migrate/20230810182011_add_images_to_users.rb +7 -0
- data/spec/support/dummy_app/db/migrate/20230811155811_add_images_to_admins.rb +6 -0
- data/spec/support/dummy_app/db/schema.rb +34 -0
- data/spec/support/dummy_app/db/seeds.rb +7 -0
- data/spec/support/dummy_app/lib/tasks/.keep +0 -0
- data/spec/support/dummy_app/log/.keep +0 -0
- data/spec/support/dummy_app/public/robots.txt +1 -0
- data/spec/support/dummy_app/storage/.keep +0 -0
- data/spec/support/dummy_app/tmp/.keep +0 -0
- data/spec/support/dummy_app/tmp/development_secret.txt +1 -0
- data/spec/support/dummy_app/tmp/images/.gitkeep +0 -0
- data/spec/support/dummy_app/tmp/pids/.keep +0 -0
- data/spec/support/dummy_app/tmp/storage/.keep +0 -0
- data/spec/support/dummy_app/vendor/.keep +0 -0
- data/spec/support/fixtures/images/test-1.jpg +0 -0
- data/spec/support/fixtures/images/test-2.jpg +0 -0
- data/spec/support/global_macros.rb +21 -0
- data/spec/support/mock_worker.rb +2 -0
- metadata +212 -16
- data/spec/support/backend_constants.rb +0 -58
@@ -1,33 +1,11 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require 'backgrounder/workers/store_asset_mixin'
|
3
|
+
|
2
4
|
module CarrierWave
|
3
5
|
module Workers
|
4
6
|
|
5
|
-
class StoreAsset
|
6
|
-
|
7
|
-
|
8
|
-
def perform(*args)
|
9
|
-
record = super(*args)
|
10
|
-
|
11
|
-
if record && record.send(:"#{column}_tmp")
|
12
|
-
store_directories(record)
|
13
|
-
record.send :"process_#{column}_upload=", true
|
14
|
-
record.send :"#{column}_tmp=", nil
|
15
|
-
record.send :"#{column}_processing=", false if record.respond_to?(:"#{column}_processing")
|
16
|
-
File.open(cache_path) { |f| record.send :"#{column}=", f }
|
17
|
-
if record.save!
|
18
|
-
FileUtils.rm_r(tmp_directory, :force => true)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def store_directories(record)
|
26
|
-
asset, asset_tmp = record.send(:"#{column}"), record.send(:"#{column}_tmp")
|
27
|
-
cache_directory = File.expand_path(asset.cache_dir, asset.root)
|
28
|
-
@cache_path = File.join(cache_directory, asset_tmp)
|
29
|
-
@tmp_directory = File.join(cache_directory, asset_tmp.split("/").first)
|
30
|
-
end
|
7
|
+
class StoreAsset
|
8
|
+
include CarrierWave::Workers::StoreAssetMixin
|
31
9
|
end # StoreAsset
|
32
10
|
|
33
11
|
end # Workers
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module CarrierWave
|
3
|
+
module Workers
|
4
|
+
|
5
|
+
module StoreAssetMixin
|
6
|
+
include CarrierWave::Workers::Base
|
7
|
+
|
8
|
+
def self.included(base)
|
9
|
+
base.extend CarrierWave::Workers::ClassMethods
|
10
|
+
end
|
11
|
+
|
12
|
+
def perform(*args)
|
13
|
+
record = super(*args)
|
14
|
+
|
15
|
+
return unless record && record.send(:"#{column}_tmp")
|
16
|
+
|
17
|
+
record.send :"process_#{column}_upload=", true
|
18
|
+
record.send :"#{column}_cache=", record.send(:"#{column}_tmp") # Set the cache path
|
19
|
+
cache_assets! record.send(:"#{column}") # Trigger version creation
|
20
|
+
store_assets! record.send(:"#{column}") # Store the files
|
21
|
+
record.send :"#{column}_tmp=", nil
|
22
|
+
record.send :"#{column}_processing=", false if record.respond_to?(:"#{column}_processing")
|
23
|
+
record.save!
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def cache_assets!(asset)
|
29
|
+
asset.is_a?(Array) ? asset.map(&:cache!) : asset.cache!
|
30
|
+
end
|
31
|
+
|
32
|
+
def store_assets!(asset)
|
33
|
+
asset.is_a?(Array) ? asset.map(&:store!) : asset.store!
|
34
|
+
end
|
35
|
+
end # StoreAssetMixin
|
36
|
+
|
37
|
+
end # Workers
|
38
|
+
end # Backgrounder
|
data/lib/backgrounder/workers.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'fileutils'
|
1
2
|
require 'active_support/core_ext/object'
|
2
3
|
require 'backgrounder/support/backends'
|
3
4
|
require 'backgrounder/orm/base'
|
@@ -7,10 +8,32 @@ module CarrierWave
|
|
7
8
|
module Backgrounder
|
8
9
|
include Support::Backends
|
9
10
|
|
11
|
+
class << self
|
12
|
+
attr_reader :worker_klass
|
13
|
+
end
|
14
|
+
|
10
15
|
def self.configure
|
11
16
|
yield self
|
12
|
-
|
17
|
+
|
18
|
+
case backend
|
19
|
+
when :active_job
|
20
|
+
@worker_klass = 'CarrierWave::Workers::ActiveJob'
|
21
|
+
|
22
|
+
require 'active_job'
|
23
|
+
require 'backgrounder/workers/active_job/process_asset'
|
24
|
+
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
|
13
34
|
when :sidekiq
|
35
|
+
@worker_klass = 'CarrierWave::Workers'
|
36
|
+
|
14
37
|
require 'sidekiq'
|
15
38
|
::CarrierWave::Workers::ProcessAsset.class_eval do
|
16
39
|
include ::Sidekiq::Worker
|
@@ -18,17 +41,8 @@ module CarrierWave
|
|
18
41
|
::CarrierWave::Workers::StoreAsset.class_eval do
|
19
42
|
include ::Sidekiq::Worker
|
20
43
|
end
|
21
|
-
when :sucker_punch
|
22
|
-
require 'sucker_punch'
|
23
|
-
::CarrierWave::Workers::ProcessAsset.class_eval do
|
24
|
-
include ::SuckerPunch::Job
|
25
|
-
end
|
26
|
-
::CarrierWave::Workers::StoreAsset.class_eval do
|
27
|
-
include ::SuckerPunch::Job
|
28
|
-
end
|
29
44
|
end
|
30
45
|
end
|
31
|
-
|
32
46
|
end
|
33
47
|
end
|
34
48
|
|
@@ -10,7 +10,7 @@ module CarrierwaveBackgrounder
|
|
10
10
|
def info_config
|
11
11
|
puts <<-EOF
|
12
12
|
|
13
|
-
\e[33mBy default :
|
13
|
+
\e[33mBy default :active_job is used as the backend for carrierwave_backgrounder with :carrierwave as the queue name.
|
14
14
|
To change this, edit config/initializers/carrierwave_backgrounder.rb.\e[0m
|
15
15
|
|
16
16
|
EOF
|
@@ -1,9 +1,4 @@
|
|
1
1
|
CarrierWave::Backgrounder.configure do |c|
|
2
|
-
c.backend :
|
3
|
-
# c.backend :resque, queue: :carrierwave
|
2
|
+
c.backend :active_job, queue: :carrierwave
|
4
3
|
# c.backend :sidekiq, queue: :carrierwave
|
5
|
-
# c.backend :girl_friday, queue: :carrierwave
|
6
|
-
# c.backend :sucker_punch, queue: :carrierwave
|
7
|
-
# c.backend :qu, queue: :carrierwave
|
8
|
-
# c.backend :qc
|
9
4
|
end
|
@@ -8,6 +8,7 @@ RSpec.describe CarrierWave::Backgrounder::ORM::ActiveModel do
|
|
8
8
|
def self.before_save(method, opts); nil; end
|
9
9
|
def self.after_commit(method, opts); nil; end
|
10
10
|
def avatar_changed?; nil; end
|
11
|
+
def avatar_present?; true; end
|
11
12
|
def remote_avatar_url; OpenStruct.new(:present? => true); end
|
12
13
|
def remove_avatar?; false; end
|
13
14
|
def previous_changes; {}; end
|
@@ -54,7 +55,7 @@ RSpec.describe CarrierWave::Backgrounder::ORM::ActiveModel do
|
|
54
55
|
end
|
55
56
|
|
56
57
|
it "returns true if alternate column is changed" do
|
57
|
-
expect(instance).to receive(:
|
58
|
+
expect(instance).to receive(:previous_changes).and_return({:some_other_column => true})
|
58
59
|
expect(instance.avatar_updated?).to be_truthy
|
59
60
|
end
|
60
61
|
end
|
@@ -66,20 +67,17 @@ RSpec.describe CarrierWave::Backgrounder::ORM::ActiveModel do
|
|
66
67
|
|
67
68
|
it "calls column_changed?" do
|
68
69
|
expect(instance).to receive(:process_avatar_upload).and_return(false)
|
69
|
-
expect(instance).to receive(:avatar_changed?)
|
70
70
|
expect(instance.enqueue_avatar_background_job?).to be_truthy
|
71
71
|
end
|
72
72
|
|
73
73
|
it "calls previous_changes" do
|
74
74
|
expect(instance).to receive(:process_avatar_upload).and_return(false)
|
75
|
-
expect(instance).to receive(:avatar_changed?).and_return(false)
|
76
75
|
expect(instance).to receive(:previous_changes).and_return({:avatar => true})
|
77
76
|
expect(instance.enqueue_avatar_background_job?).to be_truthy
|
78
77
|
end
|
79
78
|
|
80
79
|
it "calls avatar_remote_url" do
|
81
80
|
expect(instance).to receive(:process_avatar_upload).and_return(false)
|
82
|
-
expect(instance).to receive(:avatar_changed?).and_return(false)
|
83
81
|
expect(instance).to receive(:previous_changes).and_return({})
|
84
82
|
expect(instance).to receive(:remote_avatar_url).and_return('yup')
|
85
83
|
expect(instance.enqueue_avatar_background_job?).to be_truthy
|
@@ -87,7 +85,6 @@ RSpec.describe CarrierWave::Backgrounder::ORM::ActiveModel do
|
|
87
85
|
|
88
86
|
it "calls avatar_cache" do
|
89
87
|
expect(instance).to receive(:process_avatar_upload).and_return(false)
|
90
|
-
expect(instance).to receive(:avatar_changed?).and_return(false)
|
91
88
|
expect(instance).to receive(:previous_changes).and_return({})
|
92
89
|
expect(instance).to receive(:remote_avatar_url).and_return(nil)
|
93
90
|
expect(instance).to receive(:avatar_cache).and_return('yup')
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'support/backend_constants'
|
3
2
|
require 'support/mock_worker'
|
4
3
|
|
5
4
|
module CarrierWave::Backgrounder
|
@@ -31,80 +30,13 @@ module CarrierWave::Backgrounder
|
|
31
30
|
describe '#enqueue_for_backend' do
|
32
31
|
let!(:worker) { MockWorker.new('FakeClass', 1, :image) }
|
33
32
|
|
34
|
-
context '
|
35
|
-
|
36
|
-
@mock_worker = Class.new do
|
37
|
-
def self.perform(*args); new(*args).perform; end
|
38
|
-
end
|
39
|
-
|
40
|
-
allow(MockWorker).to receive(:new).and_return(worker)
|
41
|
-
end
|
42
|
-
|
43
|
-
context 'queue column exists' do
|
44
|
-
it 'does not pass the queue name if none passed to #backend' do
|
45
|
-
mock_module.backend :delayed_job
|
46
|
-
expect(Delayed::Job).to receive(:enqueue).with(worker, {})
|
47
|
-
mock_module.enqueue_for_backend MockWorker, 'FakeClass', 1, :image
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'sets the queue name to the queue name passed to #backend' do
|
51
|
-
mock_module.backend :delayed_job, :queue => :awesome_queue
|
52
|
-
expect(Delayed::Job).to receive(:enqueue).with(worker, :queue => :awesome_queue)
|
53
|
-
mock_module.enqueue_for_backend MockWorker, 'FakeClass', 1, :image
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
context 'priority set in config' do
|
58
|
-
it 'sets the priority which is passed to #backend' do
|
59
|
-
mock_module.backend :delayed_job, :priority => 5
|
60
|
-
expect(Delayed::Job).to receive(:enqueue).with(worker, :priority => 5)
|
61
|
-
mock_module.enqueue_for_backend MockWorker, 'FakeClass', 1, :image
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
context 'queue column does not exist' do
|
66
|
-
before do
|
67
|
-
column_names = Delayed::Job.column_names.tap { |cn| cn.delete('queue') }
|
68
|
-
allow(Delayed::Job).to receive(:column_names).and_return(column_names)
|
69
|
-
Delayed::Job.class_eval { remove_method(:queue) }
|
70
|
-
end
|
71
|
-
|
72
|
-
after do
|
73
|
-
Delayed::Job.class_eval { define_method(:queue) { nil } }
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'does not pass a queue name if none passed to #backend' do
|
77
|
-
mock_module.backend :delayed_job
|
78
|
-
expect(Delayed::Job).to receive(:enqueue).with(worker, {})
|
79
|
-
mock_module.enqueue_for_backend MockWorker, 'FakeClass', 1, :image
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'does not pass a queue name and logs a warning message if a queue name is passed to #backend' do
|
83
|
-
mock_module.backend :delayed_job, :queue => :awesome_queue
|
84
|
-
expect(Rails.logger).to receive(:warn).with(instance_of(String))
|
85
|
-
expect(Delayed::Job).to receive(:enqueue).with(worker, {})
|
86
|
-
mock_module.enqueue_for_backend MockWorker, 'FakeClass', 1, :image
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
context 'resque' do
|
92
|
-
let(:args) { [MockWorker, 'FakeClass', 1, :image] }
|
93
|
-
|
94
|
-
before do
|
95
|
-
allow(Resque).to receive(:enqueue).with(*args)
|
96
|
-
end
|
97
|
-
|
98
|
-
it 'sets a variable with the queue name, defaults to :carrierwave' do
|
99
|
-
mock_module.backend :resque
|
100
|
-
mock_module.enqueue_for_backend(*args)
|
101
|
-
expect(MockWorker.instance_variable_get '@queue').to eql(:carrierwave)
|
102
|
-
end
|
33
|
+
context 'active_job' do
|
34
|
+
let(:args) { ['FakeClass', 1, :image] }
|
103
35
|
|
104
|
-
it '
|
105
|
-
|
106
|
-
mock_module.
|
107
|
-
|
36
|
+
it 'invokes perform_later with string arguments' do
|
37
|
+
expect(MockWorker).to receive(:perform_later).with('FakeClass', '1', 'image')
|
38
|
+
mock_module.backend :active_job
|
39
|
+
mock_module.enqueue_for_backend(MockWorker, *args)
|
108
40
|
end
|
109
41
|
end
|
110
42
|
|
@@ -112,7 +44,7 @@ module CarrierWave::Backgrounder
|
|
112
44
|
let(:args) { ['FakeClass', 1, :image] }
|
113
45
|
|
114
46
|
it 'invokes client_push on the class with passed args' do
|
115
|
-
expect(MockSidekiqWorker).to receive(:client_push).with({ 'class' => MockSidekiqWorker, 'args' => args })
|
47
|
+
expect(MockSidekiqWorker).to receive(:client_push).with({ 'class' => MockSidekiqWorker, 'args' => args.map(&:to_s) })
|
116
48
|
mock_module.backend :sidekiq
|
117
49
|
mock_module.enqueue_for_backend(MockSidekiqWorker, *args)
|
118
50
|
end
|
@@ -122,7 +54,7 @@ module CarrierWave::Backgrounder
|
|
122
54
|
'retry' => false,
|
123
55
|
'timeout' => 60,
|
124
56
|
'queue' => :awesome_queue,
|
125
|
-
'args' => args })
|
57
|
+
'args' => args.map(&:to_s) })
|
126
58
|
options = {:retry => false, :timeout => 60, :queue => :awesome_queue}
|
127
59
|
mock_module.backend :sidekiq, options
|
128
60
|
mock_module.enqueue_for_backend(MockSidekiqWorker, *args)
|
@@ -132,93 +64,12 @@ module CarrierWave::Backgrounder
|
|
132
64
|
expect(MockNamedSidekiqWorker).to receive(:client_push).with({ 'class' => MockNamedSidekiqWorker,
|
133
65
|
'retry' => false,
|
134
66
|
'timeout' => 60,
|
135
|
-
'args' => args })
|
67
|
+
'args' => args.map(&:to_s) })
|
136
68
|
options = {:retry => false, :timeout => 60}
|
137
69
|
mock_module.backend :sidekiq, options
|
138
70
|
mock_module.enqueue_for_backend(MockNamedSidekiqWorker, *args)
|
139
71
|
end
|
140
72
|
end
|
141
|
-
|
142
|
-
context 'girl_friday' do
|
143
|
-
let(:args) { [MockWorker, 'FakeClass', 1, :image] }
|
144
|
-
|
145
|
-
it 'instantiates a GirlFriday work queue if one does not exist' do
|
146
|
-
mock_module.backend :girl_friday
|
147
|
-
expect(GirlFriday::WorkQueue).to receive(:new).with(:carrierwave, {}).and_return([])
|
148
|
-
mock_module.enqueue_for_backend(*args)
|
149
|
-
end
|
150
|
-
|
151
|
-
it 'instantiates a GirlFriday work queue passing the args to the queue' do
|
152
|
-
mock_module.backend :girl_friday, :queue => :awesome_queue, :size => 3
|
153
|
-
expect(GirlFriday::WorkQueue).to receive(:new).with(:awesome_queue, {:size => 3}).and_return([])
|
154
|
-
mock_module.enqueue_for_backend(*args)
|
155
|
-
end
|
156
|
-
|
157
|
-
it 'does not instantiate a GirlFriday work queue if one exists' do
|
158
|
-
mock_module.backend :girl_friday
|
159
|
-
mock_module.instance_variable_set('@girl_friday_queue', [])
|
160
|
-
expect(GirlFriday::WorkQueue).to receive(:new).never
|
161
|
-
mock_module.enqueue_for_backend(*args)
|
162
|
-
end
|
163
|
-
|
164
|
-
it 'add a worker to the girl_friday queue' do
|
165
|
-
expected = [{ :worker => MockWorker.new('FakeClass', 1, :image) }]
|
166
|
-
mock_module.backend :girl_friday
|
167
|
-
mock_module.instance_variable_set('@girl_friday_queue', [])
|
168
|
-
mock_module.enqueue_for_backend(*args)
|
169
|
-
expect(mock_module.instance_variable_get '@girl_friday_queue').to eql(expected)
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
context 'sucker_punch' do
|
174
|
-
let(:args) { [MockWorker, 'FakeClass', 1, :image] }
|
175
|
-
let(:job) { double('job') }
|
176
|
-
|
177
|
-
it 'invokes a new worker' do
|
178
|
-
expect(MockWorker).to receive(:new).and_return(worker)
|
179
|
-
expect(worker).to receive(:async).and_return(job)
|
180
|
-
expect(job).to receive(:perform).with('FakeClass', 1, :image)
|
181
|
-
mock_module.backend :sucker_punch
|
182
|
-
mock_module.enqueue_for_backend(*args)
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
context 'qu' do
|
187
|
-
let(:args) { [MockWorker, 'FakeClass', 1, :image] }
|
188
|
-
before do
|
189
|
-
allow(Qu).to receive(:enqueue).with(*args)
|
190
|
-
end
|
191
|
-
|
192
|
-
it 'sets a variable with the queue name, defaults to :carrierwave' do
|
193
|
-
mock_module.backend :qu
|
194
|
-
mock_module.enqueue_for_backend(*args)
|
195
|
-
expect(MockWorker.instance_variable_get '@queue').to eql(:carrierwave)
|
196
|
-
end
|
197
|
-
|
198
|
-
it 'sets a variable to the queue name passed to #backend' do
|
199
|
-
mock_module.backend :qu, :queue => :awesome_queue
|
200
|
-
mock_module.enqueue_for_backend(*args)
|
201
|
-
expect(MockWorker.instance_variable_get '@queue').to eql(:awesome_queue)
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
context 'qc' do
|
206
|
-
it 'calls enqueue with the passed args' do
|
207
|
-
expect(QC).to receive(:enqueue).with("MockWorker.perform", 'FakeClass', 1, 'image')
|
208
|
-
mock_module.backend :qc
|
209
|
-
mock_module.enqueue_for_backend(MockWorker, 'FakeClass', 1, :image)
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
context 'immediate' do
|
214
|
-
it 'instantiates a worker passing the args and calls perform' do
|
215
|
-
worker = double('Worker')
|
216
|
-
expect(MockWorker).to receive(:new).with('FakeClass', 1, :image).and_return(worker)
|
217
|
-
expect(worker).to receive(:perform)
|
218
|
-
mock_module.backend :immediate
|
219
|
-
mock_module.enqueue_for_backend(MockWorker, 'FakeClass', 1, :image)
|
220
|
-
end
|
221
|
-
end
|
222
73
|
end
|
223
74
|
end
|
224
75
|
end
|
@@ -22,9 +22,11 @@ RSpec.describe CarrierWave::Workers::ProcessAsset do
|
|
22
22
|
|
23
23
|
before do
|
24
24
|
allow(user).to receive(:find).with('22').and_return(user).once
|
25
|
-
allow(user).to receive(:image).
|
26
|
-
|
27
|
-
|
25
|
+
allow(user).to receive(:image).thrice.and_return(image)
|
26
|
+
|
27
|
+
expect(user).to receive(:process_image_upload=).with(true).once
|
28
|
+
expect(image).to receive(:recreate_versions!).once.and_return(true)
|
29
|
+
expect(image).to receive(:file).and_return(image)
|
28
30
|
end
|
29
31
|
|
30
32
|
it 'processes versions with image_processing column' do
|
@@ -48,9 +50,11 @@ RSpec.describe CarrierWave::Workers::ProcessAsset do
|
|
48
50
|
before do
|
49
51
|
allow(admin).to receive(:find).with('23').and_return(admin).once
|
50
52
|
allow(admin).to receive(:avatar).twice.and_return(avatar)
|
51
|
-
|
52
|
-
|
53
|
-
|
53
|
+
|
54
|
+
expect(admin).to receive(:respond_to?).with(:avatar_processing).once.and_return(false)
|
55
|
+
expect(admin).to receive(:process_avatar_upload=).with(true).once
|
56
|
+
expect(avatar).to receive(:recreate_versions!).once.and_return(true)
|
57
|
+
expect(avatar).to receive(:file).and_return(avatar)
|
54
58
|
|
55
59
|
worker.perform admin, '23', :avatar
|
56
60
|
end
|
@@ -8,6 +8,22 @@ RSpec.describe CarrierWave::Workers::StoreAsset do
|
|
8
8
|
let(:user) { double('User') }
|
9
9
|
let!(:worker) { worker_class.new(user, '22', :image) }
|
10
10
|
|
11
|
+
def stub_worker(obj, asset)
|
12
|
+
allow(asset).to receive(:root).once.and_return(File.expand_path('..', __FILE__))
|
13
|
+
allow(asset).to receive(:cache_dir).once.and_return('fixtures')
|
14
|
+
allow(obj).to receive(:image_tmp).and_return('images/test.jpg')
|
15
|
+
allow(obj).to receive(:find).with('22').once.and_return(obj)
|
16
|
+
allow(obj).to receive(:image=)
|
17
|
+
|
18
|
+
expect(asset).to receive(:cache!).once
|
19
|
+
expect(asset).to receive(:store!).once
|
20
|
+
expect(obj).to receive(:image).twice.and_return(image)
|
21
|
+
expect(obj).to receive(:process_image_upload=).with(true).once
|
22
|
+
expect(obj).to receive(:image_cache=).with("images/test.jpg").once
|
23
|
+
expect(obj).to receive(:image_tmp=).with(nil).once
|
24
|
+
expect(obj).to receive(:save!).once
|
25
|
+
end
|
26
|
+
|
11
27
|
describe ".perform" do
|
12
28
|
it 'creates a new instance and calls perform' do
|
13
29
|
args = [user, '22', :image]
|
@@ -17,61 +33,14 @@ RSpec.describe CarrierWave::Workers::StoreAsset do
|
|
17
33
|
end
|
18
34
|
end
|
19
35
|
|
20
|
-
describe "#perform" do
|
21
|
-
let(:image) { double('UserAsset') }
|
22
|
-
|
23
|
-
before do
|
24
|
-
allow(image).to receive(:root).once.and_return(File.expand_path('..', __FILE__))
|
25
|
-
allow(image).to receive(:cache_dir).once.and_return('fixtures')
|
26
|
-
allow(user).to receive(:image_tmp).twice.and_return('images/test.jpg')
|
27
|
-
allow(user).to receive(:find).with('22').once.and_return(user)
|
28
|
-
allow(user).to receive(:image).once.and_return(image)
|
29
|
-
allow(user).to receive(:process_image_upload=).with(true).once
|
30
|
-
allow(user).to receive(:image=).once
|
31
|
-
allow(user).to receive(:image_tmp=).with(nil).once
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'removes tmp directory on success' do
|
35
|
-
expect(FileUtils).to receive(:rm_r).with(fixtures_path, :force => true).once
|
36
|
-
expect(user).to receive(:save!).once.and_return(true)
|
37
|
-
worker.perform
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'does not remove the tmp directory if save! fails' do
|
41
|
-
expect(FileUtils).to receive(:rm_r).never
|
42
|
-
expect(user).to receive(:save!).once.and_return(false)
|
43
|
-
worker.perform
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'sets the cache_path' do
|
47
|
-
expect(user).to receive(:save!).once.and_return(false)
|
48
|
-
worker.perform
|
49
|
-
expect(worker.cache_path).to eql(fixtures_path + '/test.jpg')
|
50
|
-
end
|
51
|
-
|
52
|
-
it 'sets the tmp_directory' do
|
53
|
-
expect(user).to receive(:save!).once.and_return(false)
|
54
|
-
worker.perform
|
55
|
-
expect(worker.tmp_directory).to eql(fixtures_path)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
36
|
describe '#perform with args' do
|
60
37
|
let(:admin) { double('Admin') }
|
61
38
|
let(:image) { double('AdminAsset') }
|
62
39
|
let(:worker) { worker_class.new }
|
63
40
|
|
64
41
|
before do
|
65
|
-
|
66
|
-
|
67
|
-
allow(admin).to receive(:avatar_tmp).twice.and_return('images/test.jpg')
|
68
|
-
allow(admin).to receive(:find).with('23').once.and_return(admin)
|
69
|
-
allow(admin).to receive(:avatar).once.and_return(image)
|
70
|
-
allow(admin).to receive(:process_avatar_upload=).with(true).once
|
71
|
-
allow(admin).to receive(:avatar=).once
|
72
|
-
allow(admin).to receive(:avatar_tmp=).with(nil).once
|
73
|
-
allow(admin).to receive(:save!).once.and_return(false)
|
74
|
-
worker.perform admin, '23', :avatar
|
42
|
+
stub_worker(admin, image)
|
43
|
+
worker.perform admin, '22', :image
|
75
44
|
end
|
76
45
|
|
77
46
|
it 'sets klass' do
|
@@ -79,59 +48,11 @@ RSpec.describe CarrierWave::Workers::StoreAsset do
|
|
79
48
|
end
|
80
49
|
|
81
50
|
it 'sets column' do
|
82
|
-
expect(worker.id).to eql('
|
51
|
+
expect(worker.id).to eql('22')
|
83
52
|
end
|
84
53
|
|
85
54
|
it 'sets id' do
|
86
|
-
expect(worker.column).to eql(:
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe '#store_directories' do
|
91
|
-
let(:record) { double('Record') }
|
92
|
-
|
93
|
-
context 'cache_path' do
|
94
|
-
it 'sets the cache_path correctly if a full path is set for the cache_dir' do
|
95
|
-
root = '/Users/lar/Sites/bunker/public'
|
96
|
-
cache_dir = '/Users/lar/Sites/bunker/tmp/uploads'
|
97
|
-
asset = double(:cache_dir => cache_dir, :root => root)
|
98
|
-
expect(record).to receive(:image).and_return(asset)
|
99
|
-
expect(record).to receive(:image_tmp).and_return('images/test.jpg')
|
100
|
-
worker.send :store_directories, record
|
101
|
-
expect(worker.cache_path).to eql('/Users/lar/Sites/bunker/tmp/uploads/images/test.jpg')
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'sets the cache_path correctly if a partial path is set for cache_dir' do
|
105
|
-
root = '/Users/lar/Sites/bunker/public'
|
106
|
-
cache_dir = 'uploads/tmp'
|
107
|
-
asset = double(:cache_dir => cache_dir, :root => root)
|
108
|
-
expect(record).to receive(:image).and_return(asset)
|
109
|
-
expect(record).to receive(:image_tmp).and_return('images/test.jpg')
|
110
|
-
worker.send :store_directories, record
|
111
|
-
expect(worker.cache_path).to eql('/Users/lar/Sites/bunker/public/uploads/tmp/images/test.jpg')
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
context 'tmp_directory' do
|
116
|
-
it 'sets the tmp_directory correctly if a full path is set for the cache_dir' do
|
117
|
-
root = '/Users/lar/Sites/bunker/public'
|
118
|
-
cache_dir = '/Users/lar/Sites/bunker/tmp/uploads'
|
119
|
-
asset = double(:cache_dir => cache_dir, :root => root)
|
120
|
-
expect(record).to receive(:image).and_return(asset)
|
121
|
-
expect(record).to receive(:image_tmp).and_return('images/test.jpg')
|
122
|
-
worker.send :store_directories, record
|
123
|
-
expect(worker.tmp_directory).to eql('/Users/lar/Sites/bunker/tmp/uploads/images')
|
124
|
-
end
|
125
|
-
|
126
|
-
it 'sets the tmp_directory correctly if a partial path is set for cache_dir' do
|
127
|
-
root = '/Users/lar/Sites/bunker/public'
|
128
|
-
cache_dir = 'uploads/tmp'
|
129
|
-
asset = double(:cache_dir => cache_dir, :root => root)
|
130
|
-
expect(record).to receive(:image).and_return(asset)
|
131
|
-
expect(record).to receive(:image_tmp).and_return('images/test.jpg')
|
132
|
-
worker.send :store_directories, record
|
133
|
-
expect(worker.tmp_directory).to eql('/Users/lar/Sites/bunker/public/uploads/tmp/images')
|
134
|
-
end
|
55
|
+
expect(worker.column).to eql(:image)
|
135
56
|
end
|
136
57
|
end
|
137
58
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
RSpec.describe '::process_in_background multi-upload support', clear_images: true do
|
4
|
+
let(:admin) { Admin.new }
|
5
|
+
|
6
|
+
context 'when assigning an asset' do
|
7
|
+
before(:each) do
|
8
|
+
admin.update(images: load_files('test-1.jpg', 'test-2.jpg'))
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'creates a temp file and stores the path' do
|
12
|
+
expect(file_count("spec/support/dummy_app/public/uploads/admin/images/#{admin.id}")).to eql(2)
|
13
|
+
expect(admin.images.present?).to be(true)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'creates a background job in carrierwave queue' do
|
17
|
+
expect(Sidekiq::Queues["carrierwave"].size).to eql(1)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'sets the <column>_processing flag to true' do
|
21
|
+
expect(admin.images_processing).to be(true)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when processing the worker' do
|
26
|
+
before do
|
27
|
+
admin.update(images: load_files('test-1.jpg','test-2.jpg'))
|
28
|
+
expect(admin.images_processing).to be(true)
|
29
|
+
process_latest_sidekiq_job
|
30
|
+
admin.reload
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'creates the versions' do
|
34
|
+
version_paths = AvatarUploader.versions.keys.map { |key| admin.images.map { |i| i.send(key).current_path } }.flatten
|
35
|
+
version_paths.each { |path| expect(File.exist?(path)).to be(true) }
|
36
|
+
file_sizes = version_paths.map { |path| File.size(path) }
|
37
|
+
expect(file_sizes.uniq.count).to be(4)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'removes the files tmp directory' do
|
41
|
+
expect(file_count('spec/support/dummy_app/tmp/images')).to eql(0)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'sets the <column>_processing flag to false' do
|
45
|
+
expect(admin.avatar_processing).to be(false)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'when saving a record' do
|
50
|
+
let!(:admin) {
|
51
|
+
Sidekiq::Testing.inline! do
|
52
|
+
Admin.create(images: load_files('test-1.jpg'))
|
53
|
+
end
|
54
|
+
}
|
55
|
+
|
56
|
+
it 'does not enqueue a new job' do
|
57
|
+
expect { admin.reload.save }.to_not change(Sidekiq::Queues["carrierwave"], :size)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'when setting a column for removal' do
|
62
|
+
let!(:admin) {
|
63
|
+
Sidekiq::Testing.inline! do
|
64
|
+
Admin.create(images: load_files('test-1.jpg'))
|
65
|
+
end
|
66
|
+
}
|
67
|
+
|
68
|
+
before do
|
69
|
+
expect(admin.reload.images.present?).to be(true)
|
70
|
+
|
71
|
+
admin.remove_images = true
|
72
|
+
admin.save!
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'removes the attachment' do
|
76
|
+
expect(admin.images.present?).to be(false)
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'does not enqueue a new job' do
|
80
|
+
expect(Sidekiq::Queues["carrierwave"].size).to be(0)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|