carrierwave_backgrounder 0.0.9 → 0.1.0
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.
- data/README.md +40 -24
- data/carrierwave_backgrounder.gemspec +2 -2
- data/lib/backgrounder/delay.rb +8 -14
- data/lib/backgrounder/orm/activemodel.rb +6 -8
- data/lib/backgrounder/orm/base.rb +8 -17
- data/lib/backgrounder/support/backends.rb +75 -0
- data/lib/backgrounder/version.rb +1 -1
- data/lib/backgrounder/workers/process_asset.rb +1 -15
- data/lib/backgrounder/workers/store_asset.rb +1 -15
- data/lib/carrierwave_backgrounder.rb +9 -70
- data/spec/backgrounder/support/backends_spec.rb +87 -0
- data/spec/spec_helper.rb +1 -0
- metadata +13 -12
- data/spec/backgrounder/backends_spec.rb +0 -67
data/README.md
CHANGED
@@ -2,28 +2,35 @@
|
|
2
2
|
|
3
3
|
I like CarrierWave. That being said, I don't like tying up app instances waiting for images to process.
|
4
4
|
|
5
|
-
This gem addresses that
|
6
|
-
|
5
|
+
This gem addresses that moving processing or storage/processing to a background task.
|
6
|
+
We currently support Delayed Job, Resque, Sidekiq, Girl Friday, Qu, and Queue Classic.
|
7
7
|
|
8
8
|
## Background options
|
9
9
|
|
10
10
|
There are currently two offerings for backgrounding upload tasks which are as follows;
|
11
11
|
|
12
12
|
```ruby
|
13
|
+
# This stores the original file with no processing/versioning.
|
14
|
+
# It will upload the original file to s3.
|
15
|
+
# This was developed to use where you do not have control over the cache location such as Heroku.
|
16
|
+
|
13
17
|
Backgrounder::ORM::Base::process_in_background
|
14
18
|
```
|
15
19
|
|
16
|
-
This method stores the original file and does no processing or versioning. Optionally you can add a column to the database which will be set to nil when the background processing is complete.
|
17
|
-
|
18
20
|
```ruby
|
21
|
+
# This does nothing to the file after it is cached which makes it super fast.
|
22
|
+
# It requires a column in the database which stores the cache location set by carrierwave so the background job can access it.
|
23
|
+
# The drawback to using this method is the need for a central location to store the cached files.
|
24
|
+
# Heroku may deploy workers on separate servers from where your dyno cached the files.
|
25
|
+
#
|
26
|
+
# IMPORTANT: Only use this method if you have full control over your tmp storage directory.
|
27
|
+
|
19
28
|
Backgrounder::ORM::Base::store_in_background
|
20
29
|
```
|
21
30
|
|
22
|
-
|
31
|
+
## Installation and Usage
|
23
32
|
|
24
|
-
|
25
|
-
|
26
|
-
These instructions assume you have previously set up [CarrierWave](https://github.com/jnicklas/carrierwave) and [DelayedJob](https://github.com/collectiveidea/delayed_job) or Resque
|
33
|
+
These instructions assume you have previously set up [CarrierWave](https://github.com/jnicklas/carrierwave) and your queing lib of choice.
|
27
34
|
|
28
35
|
In Rails, add the following your Gemfile:
|
29
36
|
|
@@ -31,14 +38,31 @@ In Rails, add the following your Gemfile:
|
|
31
38
|
gem 'carrierwave_backgrounder'
|
32
39
|
```
|
33
40
|
|
34
|
-
|
41
|
+
### Setup
|
35
42
|
|
36
43
|
In an initializer:
|
37
44
|
|
38
45
|
```ruby
|
39
46
|
CarrierWave::Backgrounder.configure do |c|
|
40
47
|
# :delayed_job, :girl_friday, :sidekiq, :qu, :resque, or :qc
|
41
|
-
c.backend
|
48
|
+
c.backend :delayed_job
|
49
|
+
end
|
50
|
+
```
|
51
|
+
|
52
|
+
If you would like to use a custom queue name for Delayed Job, Resque, Girl Friday, Sidekiq and Qu pass in the following option.
|
53
|
+
The queue name will default to carrierwave.
|
54
|
+
|
55
|
+
```ruby
|
56
|
+
CarrierWave::Backgrounder.configure do |c|
|
57
|
+
c.backend :delayed_job, queue: :awesome_queue
|
58
|
+
end
|
59
|
+
```
|
60
|
+
|
61
|
+
You can also pass additional configuration options to Girl Friday
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
CarrierWave::Backgrounder.configure do |c|
|
65
|
+
c.backend :girl_friday, queue: :awesome_queue, size: 3, store: GirlFriday::Store::Redis
|
42
66
|
end
|
43
67
|
```
|
44
68
|
|
@@ -84,32 +108,24 @@ add_column :users, :avatar_tmp, :string
|
|
84
108
|
|
85
109
|
## Usage Tips
|
86
110
|
|
111
|
+
### Bypass backgrounding
|
87
112
|
If you need to process/store the upload immediately:
|
88
113
|
|
89
114
|
```ruby
|
90
115
|
@user.process_<column>_upload = true
|
91
116
|
```
|
92
117
|
|
118
|
+
### Override worker
|
93
119
|
To overide the worker in cases where additional methods need to be called or you have app specific requirements, pass the worker class as the
|
94
120
|
second argument:
|
95
121
|
|
96
122
|
```ruby
|
97
123
|
process_in_background :avatar, MyAppsAwesomeProcessingWorker
|
98
124
|
```
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
```ruby
|
105
|
-
DataMapper::Model.send(:include, ::CarrierWave::Backgrounder::ORM::Base)
|
106
|
-
# or
|
107
|
-
Mongoid::Document::ClassMethods.send(:include, ::CarrierWave::Backgrounder::ORM::Base)
|
108
|
-
# or
|
109
|
-
Sequel::Model.send(:extend, ::CarrierWave::Backgrounder::ORM::Base)
|
110
|
-
```
|
111
|
-
|
112
|
-
Contributions are gladly accepted from those who use these orms.
|
125
|
+
### Testing with Rspec
|
126
|
+
We use the after_commit hook when using active_record. This creates a problem when testing with Rspec because after_commit never gets fired
|
127
|
+
if you're using trasactional fixtures. One solution to the problem is to use the [TestAfterCommit gem](https://github.com/grosser/test_after_commit).
|
128
|
+
There are various other solutions in which case google is your friend.
|
113
129
|
|
114
130
|
## License
|
115
131
|
|
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
|
21
21
|
s.add_dependency "carrierwave", ["~> 0.5"]
|
22
22
|
|
23
|
-
s.add_development_dependency "rspec", ["2.
|
24
|
-
s.add_development_dependency "mocha", ["~> 0.
|
23
|
+
s.add_development_dependency "rspec", ["~> 2.12.0"]
|
24
|
+
s.add_development_dependency "mocha", ["~> 0.13.0"]
|
25
25
|
s.add_development_dependency "rake"
|
26
26
|
end
|
data/lib/backgrounder/delay.rb
CHANGED
@@ -1,31 +1,25 @@
|
|
1
1
|
module CarrierWave
|
2
2
|
module Backgrounder
|
3
3
|
|
4
|
-
module DelayStorage
|
5
|
-
def self.included(klass)
|
6
|
-
klass.send :include, Delay
|
7
|
-
Logger.warn "Carrierwave::Backgrounder::DelayStorage is deprecated, use Carrierwave::Backgrounder::Delay instead"
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
4
|
module Delay
|
12
|
-
|
13
|
-
##
|
14
|
-
# Intercept carrierwave#cache_versions! so we can process versions later.
|
15
5
|
def cache_versions!(new_file)
|
16
|
-
super
|
6
|
+
super if proceed_with_versioning?
|
7
|
+
end
|
8
|
+
|
9
|
+
def store_versions!(*args)
|
10
|
+
super if proceed_with_versioning?
|
17
11
|
end
|
18
12
|
|
19
13
|
def process!(new_file=nil)
|
20
|
-
super
|
14
|
+
super if proceed_with_versioning?
|
21
15
|
end
|
22
|
-
|
16
|
+
|
23
17
|
private
|
24
18
|
|
25
19
|
def proceed_with_versioning?
|
26
20
|
!model.respond_to?(:"process_#{mounted_as}_upload") || model.send(:"process_#{mounted_as}_upload")
|
27
21
|
end
|
28
22
|
end # Delay
|
29
|
-
|
23
|
+
|
30
24
|
end # Backgrounder
|
31
25
|
end # CarrierWave
|
@@ -10,11 +10,10 @@ module CarrierWave
|
|
10
10
|
def process_in_background(column, worker=::CarrierWave::Workers::ProcessAsset)
|
11
11
|
super
|
12
12
|
|
13
|
-
|
14
|
-
include mod
|
15
|
-
mod.module_eval <<-RUBY, __FILE__, __LINE__ + 1
|
13
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
16
14
|
def trigger_#{column}_background_processing?
|
17
|
-
|
15
|
+
process_#{column}_upload != true &&
|
16
|
+
(#{column}_changed? || previous_changes.has_key?(:#{column}) || remote_#{column}_url.present?)
|
18
17
|
end
|
19
18
|
RUBY
|
20
19
|
end
|
@@ -22,11 +21,10 @@ module CarrierWave
|
|
22
21
|
def store_in_background(column, worker=::CarrierWave::Workers::StoreAsset)
|
23
22
|
super
|
24
23
|
|
25
|
-
|
26
|
-
include mod
|
27
|
-
mod.module_eval <<-RUBY, __FILE__, __LINE__ + 1
|
24
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
28
25
|
def trigger_#{column}_background_storage?
|
29
|
-
|
26
|
+
process_#{column}_upload != true &&
|
27
|
+
(#{column}_changed? || previous_changes.has_key?(:#{column}) || remote_#{column}_url.present?)
|
30
28
|
end
|
31
29
|
RUBY
|
32
30
|
end
|
@@ -39,18 +39,13 @@ module CarrierWave
|
|
39
39
|
# end
|
40
40
|
#
|
41
41
|
def process_in_background(column, worker=::CarrierWave::Workers::ProcessAsset)
|
42
|
-
send :before_save, :"set_#{column}_processing", :if => :"trigger_#{column}_background_processing?"
|
43
|
-
if self.respond_to?(:after_commit)
|
44
|
-
send :after_commit, :"enqueue_#{column}_background_job", :if => :"trigger_#{column}_background_processing?"
|
45
|
-
else
|
46
|
-
send :after_save, :"enqueue_#{column}_background_job", :if => :"trigger_#{column}_background_processing?"
|
47
|
-
end
|
48
42
|
send :attr_accessor, :"process_#{column}_upload"
|
49
43
|
|
50
|
-
|
51
|
-
|
44
|
+
send :before_save, :"set_#{column}_processing", :if => :"trigger_#{column}_background_processing?"
|
45
|
+
callback = self.respond_to?(:after_commit) ? :after_commit : :after_save
|
46
|
+
send callback, :"enqueue_#{column}_background_job", :if => :"trigger_#{column}_background_processing?"
|
52
47
|
|
53
|
-
|
48
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
54
49
|
|
55
50
|
def set_#{column}_processing
|
56
51
|
self.#{column}_processing = true if respond_to?(:#{column}_processing)
|
@@ -90,16 +85,12 @@ module CarrierWave
|
|
90
85
|
# end
|
91
86
|
#
|
92
87
|
def store_in_background(column, worker=::CarrierWave::Workers::StoreAsset)
|
93
|
-
if self.respond_to?(:after_commit)
|
94
|
-
send :after_commit, :"enqueue_#{column}_background_job", :if => :"trigger_#{column}_background_storage?"
|
95
|
-
else
|
96
|
-
send :after_save, :"enqueue_#{column}_background_job", :if => :"trigger_#{column}_background_storage?"
|
97
|
-
end
|
98
88
|
send :attr_accessor, :"process_#{column}_upload"
|
99
89
|
|
100
|
-
|
101
|
-
|
102
|
-
|
90
|
+
callback = self.respond_to?(:after_commit) ? :after_commit : :after_save
|
91
|
+
send callback, :"enqueue_#{column}_background_job", :if => :"trigger_#{column}_background_storage?"
|
92
|
+
|
93
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
103
94
|
|
104
95
|
def write_#{column}_identifier
|
105
96
|
super() and return if process_#{column}_upload
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module Support
|
2
|
+
module Backends
|
3
|
+
|
4
|
+
def self.included(base)
|
5
|
+
base.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
attr_writer :backend
|
10
|
+
attr_reader :queue_options
|
11
|
+
|
12
|
+
def backend(queue_name=nil, args={})
|
13
|
+
return @backend if @backend
|
14
|
+
@queue_options = args
|
15
|
+
@backend = queue_name and return if queue_name
|
16
|
+
determine_backend
|
17
|
+
end
|
18
|
+
|
19
|
+
def available_backends
|
20
|
+
@available_backends ||= begin
|
21
|
+
backends = []
|
22
|
+
backends << :girl_friday if defined? ::GirlFriday
|
23
|
+
backends << :delayed_job if defined? ::Delayed::Job
|
24
|
+
backends << :resque if defined? ::Resque
|
25
|
+
backends << :qu if defined? ::Qu
|
26
|
+
backends << :sidekiq if defined? ::Sidekiq
|
27
|
+
backends << :qc if defined? ::QC
|
28
|
+
backends << :immediate
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def enqueue_for_backend(worker, class_name, subject_id, mounted_as)
|
33
|
+
case backend
|
34
|
+
when :girl_friday
|
35
|
+
@girl_friday_queue ||= GirlFriday::WorkQueue.new(queue_options.delete(:queue) || :carrierwave, queue_options) do |msg|
|
36
|
+
worker = msg[:worker]
|
37
|
+
worker.perform
|
38
|
+
end
|
39
|
+
@girl_friday_queue << { :worker => worker.new(class_name, subject_id, mounted_as) }
|
40
|
+
when :delayed_job
|
41
|
+
::Delayed::Job.enqueue worker.new(class_name, subject_id, mounted_as), :queue => queue_options[:queue]
|
42
|
+
when :resque
|
43
|
+
worker.instance_variable_set('@queue', queue_options[:queue] || :carrierwave)
|
44
|
+
::Resque.enqueue worker, class_name, subject_id, mounted_as
|
45
|
+
when :qu
|
46
|
+
worker.instance_variable_set('@queue', queue_options[:queue] || :carrierwave)
|
47
|
+
::Qu.enqueue worker, class_name, subject_id, mounted_as
|
48
|
+
when :sidekiq
|
49
|
+
worker.extend ::Sidekiq::Worker
|
50
|
+
worker.sidekiq_options queue_options[:queue] || :carrierwave
|
51
|
+
::Sidekiq::Client.enqueue worker, class_name, subject_id, mounted_as
|
52
|
+
when :qc
|
53
|
+
::QC.enqueue "#{worker.name}.perform", class_name, subject_id, mounted_as.to_s
|
54
|
+
when :immediate
|
55
|
+
worker.new(class_name, subject_id, mounted_as).perform
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def determine_backend
|
62
|
+
@backend = if available_backends.empty?
|
63
|
+
warn 'WARNING: No available queue backends found for CarrierWave::Backgrounder. Using the :immediate.'
|
64
|
+
:immediate
|
65
|
+
elsif available_backends.size > 1
|
66
|
+
raise ::CarrierWave::Backgrounder::ToManyBackendsAvailableError,
|
67
|
+
"You have to many backends available: #{available_backends.inspect}. Please specify which one to use in configuration block"
|
68
|
+
else
|
69
|
+
available_backends.first
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/backgrounder/version.rb
CHANGED
@@ -3,20 +3,11 @@ module CarrierWave
|
|
3
3
|
module Workers
|
4
4
|
|
5
5
|
class ProcessAsset < Struct.new(:klass, :id, :column)
|
6
|
-
@queue = :process_asset
|
7
|
-
|
8
|
-
if defined?(::Sidekiq)
|
9
|
-
include ::Sidekiq::Worker
|
10
|
-
|
11
|
-
sidekiq_options :queue => @queue
|
12
|
-
end
|
13
|
-
|
14
6
|
def self.perform(*args)
|
15
7
|
new(*args).perform
|
16
8
|
end
|
17
9
|
|
18
|
-
def perform
|
19
|
-
set_args(*args) unless args.empty?
|
10
|
+
def perform
|
20
11
|
resource = klass.is_a?(String) ? klass.constantize : klass
|
21
12
|
record = resource.find id
|
22
13
|
|
@@ -28,11 +19,6 @@ module CarrierWave
|
|
28
19
|
end
|
29
20
|
end
|
30
21
|
end
|
31
|
-
|
32
|
-
def set_args(klass, id, column)
|
33
|
-
self.klass, self.id, self.column = klass, id, column
|
34
|
-
end
|
35
|
-
|
36
22
|
end # ProcessAsset
|
37
23
|
|
38
24
|
end # Workers
|
@@ -3,20 +3,11 @@ module CarrierWave
|
|
3
3
|
module Workers
|
4
4
|
|
5
5
|
class StoreAsset < Struct.new(:klass, :id, :column)
|
6
|
-
@queue = :store_asset
|
7
|
-
|
8
|
-
if defined?(::Sidekiq)
|
9
|
-
include ::Sidekiq::Worker
|
10
|
-
|
11
|
-
sidekiq_options :queue => @queue
|
12
|
-
end
|
13
|
-
|
14
6
|
def self.perform(*args)
|
15
7
|
new(*args).perform
|
16
8
|
end
|
17
9
|
|
18
|
-
def perform
|
19
|
-
set_args(*args) unless args.empty?
|
10
|
+
def perform
|
20
11
|
resource = klass.is_a?(String) ? klass.constantize : klass
|
21
12
|
record = resource.find id
|
22
13
|
if tmp = record.send(:"#{column}_tmp")
|
@@ -32,11 +23,6 @@ module CarrierWave
|
|
32
23
|
end
|
33
24
|
end
|
34
25
|
end
|
35
|
-
|
36
|
-
def set_args(klass, id, column)
|
37
|
-
self.klass, self.id, self.column = klass, id, column
|
38
|
-
end
|
39
|
-
|
40
26
|
end # StoreAsset
|
41
27
|
|
42
28
|
end # Workers
|
@@ -1,76 +1,16 @@
|
|
1
|
+
require 'backgrounder/support/backends'
|
2
|
+
require 'backgrounder/orm/base'
|
3
|
+
require 'backgrounder/delay'
|
4
|
+
|
1
5
|
module CarrierWave
|
2
6
|
module Backgrounder
|
7
|
+
include Support::Backends
|
3
8
|
|
4
|
-
|
5
|
-
|
6
|
-
autoload :Delay, 'backgrounder/delay'
|
7
|
-
autoload :DelayStorage, 'backgrounder/delay'
|
8
|
-
|
9
|
-
module ORM
|
10
|
-
autoload :Base, 'backgrounder/orm/base'
|
11
|
-
end
|
12
|
-
|
13
|
-
class << self
|
14
|
-
def backend=(value)
|
15
|
-
@backend = value
|
16
|
-
self.configure_backend
|
17
|
-
end
|
18
|
-
|
19
|
-
def backend
|
20
|
-
return @backend unless @backend.nil?
|
21
|
-
if available_backends.empty?
|
22
|
-
warn 'WARNING: No queue backends found to use for CarrierWave::Backgrounder'
|
23
|
-
elsif available_backends.size == 1
|
24
|
-
self.backend = available_backends.first
|
25
|
-
elsif available_backends.size > 1
|
26
|
-
warn 'WARNING: Multiple queue backends found for CarrierWave::Backgrounder. You need to set one explicitly.'
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def configure
|
31
|
-
yield self
|
32
|
-
end
|
33
|
-
|
34
|
-
def available_backends
|
35
|
-
@available_backends ||= begin
|
36
|
-
backends = []
|
37
|
-
backends << :girl_friday if defined? ::GirlFriday
|
38
|
-
backends << :delayed_job if defined? ::Delayed::Job
|
39
|
-
backends << :resque if defined? ::Resque
|
40
|
-
backends << :qu if defined? ::Qu
|
41
|
-
backends << :sidekiq if defined? ::Sidekiq
|
42
|
-
backends << :qc if defined? ::QC
|
43
|
-
backends
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def configure_backend
|
48
|
-
if backend == :girl_friday
|
49
|
-
require 'girl_friday'
|
50
|
-
@girl_friday_queue = GirlFriday::WorkQueue.new(:carrierwave) do |msg|
|
51
|
-
worker = msg[:worker]
|
52
|
-
worker.perform
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def enqueue_for_backend(worker, class_name, subject_id, mounted_as)
|
58
|
-
case backend
|
59
|
-
when :girl_friday
|
60
|
-
@girl_friday_queue << { :worker => worker.new(self.class.name, subject_id, mounted_as) }
|
61
|
-
when :delayed_job
|
62
|
-
::Delayed::Job.enqueue worker.new(class_name, subject_id, mounted_as)
|
63
|
-
when :resque
|
64
|
-
::Resque.enqueue worker, class_name, subject_id, mounted_as
|
65
|
-
when :qu
|
66
|
-
::Qu.enqueue worker, class_name, subject_id, column.mounted_as
|
67
|
-
when :sidekiq
|
68
|
-
::Sidekiq::Client.enqueue worker, class_name, subject_id, mounted_as
|
69
|
-
when :qc
|
70
|
-
::QC.enqueue "#{worker.name}.perform", class_name, subject_id, mounted_as.to_s
|
71
|
-
end
|
72
|
-
end
|
9
|
+
class UnsupportedBackendError < StandardError ; end
|
10
|
+
class ToManyBackendsAvailableError < StandardError ; end
|
73
11
|
|
12
|
+
def self.configure
|
13
|
+
yield self
|
74
14
|
end
|
75
15
|
|
76
16
|
end
|
@@ -103,4 +43,3 @@ if defined?(Rails)
|
|
103
43
|
end
|
104
44
|
end
|
105
45
|
end
|
106
|
-
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Support::Backends do
|
4
|
+
let(:test_module) { Module.new }
|
5
|
+
|
6
|
+
before do
|
7
|
+
test_module.send :include, Support::Backends
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'enumerating available backends' do
|
11
|
+
it 'detects GirlFriday' do
|
12
|
+
test_module.available_backends.should include(:girl_friday)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'detects Delayed::Job' do
|
16
|
+
test_module.available_backends.should include(:delayed_job)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'detects Resque' do
|
20
|
+
test_module.available_backends.should include(:resque)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'detects Qu' do
|
24
|
+
test_module.available_backends.should include(:qu)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'detects Sidekiq' do
|
28
|
+
test_module.available_backends.should include(:sidekiq)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'detects QC' do
|
32
|
+
test_module.available_backends.should include(:qc)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'detects Immediate' do
|
36
|
+
test_module.available_backends.should include(:immediate)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe 'setting backend' do
|
41
|
+
it 'using #backend=' do
|
42
|
+
test_module.backend = :delayed_job
|
43
|
+
expect(test_module.backend).to eql(:delayed_job)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'using #backend' do
|
47
|
+
test_module.backend(:delayed_job)
|
48
|
+
expect(test_module.backend).to eql(:delayed_job)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'allows passing of queue_options' do
|
52
|
+
test_module.backend(:delayed_job, queue: :awesome_queue)
|
53
|
+
expect(test_module.queue_options).to eql({queue: :awesome_queue})
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe 'automatically setting backends' do
|
58
|
+
before do
|
59
|
+
test_module.instance_variable_set('@backend', nil)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'sets the backend to immediate if none available' do
|
63
|
+
suppress_warnings do
|
64
|
+
test_module.stubs(:available_backends).returns([])
|
65
|
+
expect(test_module.backend).to eql(:immediate)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'sets a backend automatically if only one is available' do
|
70
|
+
test_module.stubs(:available_backends).returns([ :qu ])
|
71
|
+
test_module.backend.should eq(:qu)
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'raises an error if more than one backend is available' do
|
75
|
+
test_module.stubs(:available_backends).returns([:qu, :resque])
|
76
|
+
expect {
|
77
|
+
test_module.backend
|
78
|
+
}.to raise_error(CarrierWave::Backgrounder::ToManyBackendsAvailableError)
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'does not clobber a manually set backend' do
|
82
|
+
test_module.backend = :not_a_backend
|
83
|
+
test_module.backend.should eq(:not_a_backend)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: carrierwave_backgrounder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: carrierwave
|
@@ -32,17 +32,17 @@ dependencies:
|
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
none: false
|
34
34
|
requirements:
|
35
|
-
- -
|
35
|
+
- - ~>
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: 2.
|
37
|
+
version: 2.12.0
|
38
38
|
type: :development
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
|
-
- -
|
43
|
+
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: 2.
|
45
|
+
version: 2.12.0
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: mocha
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,7 +50,7 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - ~>
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0.
|
53
|
+
version: 0.13.0
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -58,7 +58,7 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.
|
61
|
+
version: 0.13.0
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: rake
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -92,14 +92,15 @@ files:
|
|
92
92
|
- lib/backgrounder/orm/activemodel.rb
|
93
93
|
- lib/backgrounder/orm/base.rb
|
94
94
|
- lib/backgrounder/orm/data_mapper.rb
|
95
|
+
- lib/backgrounder/support/backends.rb
|
95
96
|
- lib/backgrounder/version.rb
|
96
97
|
- lib/backgrounder/workers.rb
|
97
98
|
- lib/backgrounder/workers/process_asset.rb
|
98
99
|
- lib/backgrounder/workers/store_asset.rb
|
99
100
|
- lib/carrierwave_backgrounder.rb
|
100
|
-
- spec/backgrounder/backends_spec.rb
|
101
101
|
- spec/backgrounder/orm/activemodel_spec.rb
|
102
102
|
- spec/backgrounder/orm/base_spec.rb
|
103
|
+
- spec/backgrounder/support/backends_spec.rb
|
103
104
|
- spec/backgrounder/workers/fixtures/test.jpg
|
104
105
|
- spec/backgrounder/workers/process_asset_spec.rb
|
105
106
|
- spec/backgrounder/workers/store_asset_spec.rb
|
@@ -119,7 +120,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
119
120
|
version: '0'
|
120
121
|
segments:
|
121
122
|
- 0
|
122
|
-
hash:
|
123
|
+
hash: 1110196865602212339
|
123
124
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
125
|
none: false
|
125
126
|
requirements:
|
@@ -128,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
129
|
version: '0'
|
129
130
|
segments:
|
130
131
|
- 0
|
131
|
-
hash:
|
132
|
+
hash: 1110196865602212339
|
132
133
|
requirements: []
|
133
134
|
rubyforge_project: carrierwave_backgrounder
|
134
135
|
rubygems_version: 1.8.24
|
@@ -137,9 +138,9 @@ specification_version: 3
|
|
137
138
|
summary: Offload CarrierWave's image processing and storage to a background process
|
138
139
|
using Delayed Job
|
139
140
|
test_files:
|
140
|
-
- spec/backgrounder/backends_spec.rb
|
141
141
|
- spec/backgrounder/orm/activemodel_spec.rb
|
142
142
|
- spec/backgrounder/orm/base_spec.rb
|
143
|
+
- spec/backgrounder/support/backends_spec.rb
|
143
144
|
- spec/backgrounder/workers/fixtures/test.jpg
|
144
145
|
- spec/backgrounder/workers/process_asset_spec.rb
|
145
146
|
- spec/backgrounder/workers/store_asset_spec.rb
|
@@ -1,67 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'carrierwave_backgrounder'
|
3
|
-
|
4
|
-
describe CarrierWave::Backgrounder do
|
5
|
-
|
6
|
-
describe 'enumerating available backends' do
|
7
|
-
|
8
|
-
it 'detects GirlFriday' do
|
9
|
-
CarrierWave::Backgrounder.available_backends.should include(:girl_friday)
|
10
|
-
end
|
11
|
-
it 'detects Delayed::Job' do
|
12
|
-
CarrierWave::Backgrounder.available_backends.should include(:delayed_job)
|
13
|
-
end
|
14
|
-
it 'detects Resque' do
|
15
|
-
CarrierWave::Backgrounder.available_backends.should include(:resque)
|
16
|
-
end
|
17
|
-
it 'detects Qu' do
|
18
|
-
CarrierWave::Backgrounder.available_backends.should include(:qu)
|
19
|
-
end
|
20
|
-
it 'detects Sidekiq' do
|
21
|
-
CarrierWave::Backgrounder.available_backends.should include(:sidekiq)
|
22
|
-
end
|
23
|
-
it 'detects QC' do
|
24
|
-
CarrierWave::Backgrounder.available_backends.should include(:qc)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
describe 'automatically setting backends' do
|
29
|
-
|
30
|
-
before do
|
31
|
-
CarrierWave::Backgrounder.instance_variable_set('@backend', nil)
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'does not set a backend if none are available' do
|
35
|
-
suppress_warnings do
|
36
|
-
CarrierWave::Backgrounder.stubs(:available_backends).returns([])
|
37
|
-
CarrierWave::Backgrounder.backend.should be_nil
|
38
|
-
end
|
39
|
-
end
|
40
|
-
it 'sets a backend automatically if only one is available' do
|
41
|
-
CarrierWave::Backgrounder.stubs(:available_backends).returns([ :qu ])
|
42
|
-
CarrierWave::Backgrounder.backend.should eq(:qu)
|
43
|
-
end
|
44
|
-
it 'does not set a backend if more than one is available' do
|
45
|
-
suppress_warnings do
|
46
|
-
CarrierWave::Backgrounder.stubs(:available_backends).returns([:qu, :resque])
|
47
|
-
CarrierWave::Backgrounder.backend.should be_nil
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'does not clobber a manually set backend' do
|
52
|
-
CarrierWave::Backgrounder.backend = :not_a_backend
|
53
|
-
CarrierWave::Backgrounder.backend.should eq(:not_a_backend)
|
54
|
-
end
|
55
|
-
|
56
|
-
it 'calls configure_backend when setting the backend' do
|
57
|
-
CarrierWave::Backgrounder.stubs(:available_backends).returns([ :qu ])
|
58
|
-
CarrierWave::Backgrounder.expects(:configure_backend).once
|
59
|
-
CarrierWave::Backgrounder.backend.should eq(:qu)
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
end
|
67
|
-
|