carrierwave_backgrounder 0.1.2 → 0.1.3

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/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 1.8.7
5
+ - 1.9.2
6
+ - 1.9.3
7
+ - 2.0.0
8
+ - ree
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 0.1.3
2
+
3
+ ### enhancements
4
+ * CarrierWave::Workers::ProcessAsset now uses #update_attribute when setting [column]_processing.
5
+
1
6
  ## 0.1.2
2
7
 
3
8
  ### enhancements
@@ -7,7 +12,7 @@
7
12
  ```
8
13
 
9
14
  ### bug fixes
10
- * Check [column]_cache to make sure we are processessing when a form fails and [column]_cache is used.
15
+ * Check [column]_cache to make sure we are processing when a form fails and [column]_cache is used.
11
16
 
12
17
  ## 0.1.1
13
18
 
data/README.md CHANGED
@@ -1,4 +1,7 @@
1
- # CarrierWave Backgrounder [![Build Status](https://secure.travis-ci.org/lardawge/carrierwave_backgrounder.png)](http://travis-ci.org/lardawge/carrierwave_backgrounder)
1
+ # CarrierWave Backgrounder
2
+
3
+ [![Build Status](https://secure.travis-ci.org/lardawge/carrierwave_backgrounder.png)](http://travis-ci.org/lardawge/carrierwave_backgrounder)
4
+ [![Code Quality](https://codeclimate.com/badge.png)](https://codeclimate.com/github/lardawge/carrierwave_backgrounder)
2
5
 
3
6
  I like CarrierWave. That being said, I don't like tying up app instances waiting for images to process.
4
7
 
@@ -35,6 +38,8 @@ These instructions assume you have previously set up [CarrierWave](https://githu
35
38
  In Rails, add the following your Gemfile:
36
39
 
37
40
  ```ruby
41
+ # IMPORTANT: Be sure to list the backend job processor you intend to use, before carrierwave_backgrounder
42
+ gem 'sidekiq' # or delayed_job, resque, ect...
38
43
  gem 'carrierwave_backgrounder'
39
44
  ```
40
45
 
@@ -105,7 +110,21 @@ To overide the worker in cases where additional methods need to be called or you
105
110
  second argument:
106
111
 
107
112
  ```ruby
108
- process_in_background :avatar, MyAppsAwesomeProcessingWorker
113
+ process_in_background :avatar, MyParanoidWorker
114
+ ```
115
+
116
+ Then create a worker that subclasses carrierwave_backgrounder's worker:
117
+
118
+ ```ruby
119
+ class MyParanoidWorker < ::CarrierWave::Workers::ProcessAsset
120
+ # ...or subclass CarrierWave::Workers::StoreAsset if you're using store_in_background
121
+
122
+ def error(job, exception)
123
+ report_job_failure # or whatever
124
+ end
125
+
126
+ # other hooks you might care about
127
+ end
109
128
  ```
110
129
  ### Testing with Rspec
111
130
  We use the after_commit hook when using active_record. This creates a problem when testing with Rspec because after_commit never gets fired
@@ -8,10 +8,9 @@ Gem::Specification.new do |s|
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ["Larry Sprock"]
10
10
  s.email = ["larry@lucidbleu.com"]
11
- s.homepage = ""
12
- s.summary = %q{Offload CarrierWave's image processing and storage to a background process using Delayed Job}
13
-
14
- s.rubyforge_project = "carrierwave_backgrounder"
11
+ s.homepage = "https://github.com/lardawge/carrierwave_backgrounder"
12
+ s.licenses = ["MIT"]
13
+ s.summary = %q{Offload CarrierWave's image processing and storage to a background process using Delayed Job, Resque, Sidekiq, Qu, Queue Classic or Girl Friday}
15
14
 
16
15
  s.files = `git ls-files`.split("\n")
17
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -8,25 +8,31 @@ module CarrierWave
8
8
  include CarrierWave::Backgrounder::ORM::Base
9
9
 
10
10
  def process_in_background(column, worker=::CarrierWave::Workers::ProcessAsset)
11
+ before_save :"set_#{column}_processing", :if => :"enqueue_#{column}_background_job?"
12
+ send _supported_am_after_callback, :"enqueue_#{column}_background_job", :if => :"enqueue_#{column}_background_job?"
11
13
  super
12
-
13
- class_eval <<-RUBY, __FILE__, __LINE__ + 1
14
- def trigger_#{column}_background_processing?
15
- process_#{column}_upload != true &&
16
- (#{column}_changed? || previous_changes.has_key?(:#{column}) || remote_#{column}_url.present? || #{column}_cache.present?)
17
- end
18
- RUBY
19
14
  end
20
15
 
21
16
  def store_in_background(column, worker=::CarrierWave::Workers::StoreAsset)
17
+ send _supported_am_after_callback, :"enqueue_#{column}_background_job", :if => :"enqueue_#{column}_background_job?"
18
+ super
19
+ end
20
+
21
+ private
22
+
23
+ def _supported_am_after_callback
24
+ respond_to?(:after_commit) ? :after_commit : :after_save
25
+ end
26
+
27
+ def _define_shared_backgrounder_methods(mod, column, worker)
22
28
  super
23
29
 
24
- class_eval <<-RUBY, __FILE__, __LINE__ + 1
25
- def trigger_#{column}_background_storage?
26
- process_#{column}_upload != true &&
27
- (#{column}_changed? || previous_changes.has_key?(:#{column}) || remote_#{column}_url.present? || #{column}_cache.present?)
28
- end
29
- RUBY
30
+ define_method :"#{column}_updated?" do
31
+ send(:"#{column}_changed?") || # after_save support
32
+ previous_changes.has_key?(:"#{column}") || # after_commit support
33
+ send(:"remote_#{column}_url").present? || # Remote upload support
34
+ send(:"#{column}_cache").present? # Form failure support
35
+ end
30
36
  end
31
37
  end # ActiveModel
32
38
 
@@ -39,27 +39,17 @@ module CarrierWave
39
39
  # end
40
40
  #
41
41
  def process_in_background(column, worker=::CarrierWave::Workers::ProcessAsset)
42
- send :attr_accessor, :"process_#{column}_upload"
43
-
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?"
47
-
48
- class_eval <<-RUBY, __FILE__, __LINE__ + 1
42
+ attr_accessor :"process_#{column}_upload"
49
43
 
44
+ mod = Module.new
45
+ include mod
46
+ mod.class_eval <<-RUBY, __FILE__, __LINE__ + 1
50
47
  def set_#{column}_processing
51
48
  self.#{column}_processing = true if respond_to?(:#{column}_processing)
52
49
  end
53
-
54
- def enqueue_#{column}_background_job
55
- CarrierWave::Backgrounder.enqueue_for_backend(#{worker}, self.class.name, id.to_s, #{column}.mounted_as)
56
- end
57
-
58
- def trigger_#{column}_background_processing?
59
- process_#{column}_upload != true
60
- end
61
-
62
50
  RUBY
51
+
52
+ _define_shared_backgrounder_methods(mod, column, worker)
63
53
  end
64
54
 
65
55
  ##
@@ -85,30 +75,37 @@ module CarrierWave
85
75
  # end
86
76
  #
87
77
  def store_in_background(column, worker=::CarrierWave::Workers::StoreAsset)
88
- send :attr_accessor, :"process_#{column}_upload"
89
-
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
78
+ attr_accessor :"process_#{column}_upload"
94
79
 
80
+ mod = Module.new
81
+ include mod
82
+ mod.class_eval <<-RUBY, __FILE__, __LINE__ + 1
95
83
  def write_#{column}_identifier
96
- super() and return if process_#{column}_upload
84
+ super and return if process_#{column}_upload
97
85
  self.#{column}_tmp = _mounter(:#{column}).cache_name if _mounter(:#{column}).cache_name
98
86
  end
99
87
 
100
88
  def store_#{column}!
101
- super() if process_#{column}_upload
89
+ super if process_#{column}_upload
102
90
  end
91
+ RUBY
103
92
 
104
- def enqueue_#{column}_background_job
105
- CarrierWave::Backgrounder.enqueue_for_backend(#{worker}, self.class.name, id.to_s, #{column}.mounted_as)
106
- end
93
+ _define_shared_backgrounder_methods(mod, column, worker)
94
+ end
107
95
 
108
- def trigger_#{column}_background_storage?
109
- process_#{column}_upload != true
96
+ private
97
+
98
+ def _define_shared_backgrounder_methods(mod, column, worker)
99
+ mod.class_eval <<-RUBY, __FILE__, __LINE__ + 1
100
+ def #{column}_updated?; true; end
101
+
102
+ def enqueue_#{column}_background_job?
103
+ !process_#{column}_upload && #{column}_updated?
110
104
  end
111
105
 
106
+ def enqueue_#{column}_background_job
107
+ CarrierWave::Backgrounder.enqueue_for_backend(#{worker}, self.class.name, id.to_s, #{column}.mounted_as)
108
+ end
112
109
  RUBY
113
110
  end
114
111
 
@@ -10,60 +10,46 @@ module CarrierWave
10
10
  after :save, :"enqueue_#{column}_background_job"
11
11
 
12
12
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
13
- attr_accessor :process_#{column}_upload
14
- attr_reader :#{column}_changed
15
-
16
13
  def set_#{column}_processing
17
14
  @#{column}_changed = attribute_dirty?(:#{column})
18
- self.#{column}_processing = true if respond_to?(:#{column}_processing)
15
+ self.#{column}_processing = true if respond_to?(:#{column}_processing)
19
16
  end
20
-
21
- def enqueue_#{column}_background_job
22
- if trigger_#{column}_background_processing?
23
- CarrierWave::Backgrounder.enqueue_for_backend(#{worker}, self.class.name, id, #{column}.mounted_as)
24
- @#{column}_changed = false
25
- end
26
- end
27
-
28
- def trigger_#{column}_background_processing?
29
- process_#{column}_upload != true && #{column}_changed
30
- end
31
-
32
17
  RUBY
33
18
  end
34
19
 
35
20
  def store_in_background(column, worker=::CarrierWave::Workers::StoreAsset)
36
21
  before :save, :"set_#{column}_changed"
37
- after :save, :"enqueue_#{column}_background_job"
22
+ after :save, :"enqueue_#{column}_background_job"
38
23
 
39
24
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
40
- attr_accessor :process_#{column}_upload
41
- attr_reader :#{column}_changed
42
-
43
25
  def set_#{column}_changed
44
26
  @#{column}_changed = attribute_dirty?(:#{column})
45
27
  end
46
28
 
47
29
  def write_#{column}_identifier
48
- super() and return if process_#{column}_upload
30
+ super and return if process_#{column}_upload
49
31
  self.#{column}_tmp = _mounter(:#{column}).cache_name
50
32
  end
33
+ RUBY
34
+ end
51
35
 
52
- def store_#{column}!
53
- super() if process_#{column}_upload
54
- end
36
+ private
37
+
38
+ def _define_shared_backgrounder_methods(mod, column, worker)
39
+ super
40
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
41
+ attr_reader :#{column}_changed
55
42
 
56
43
  def enqueue_#{column}_background_job
57
- if trigger_#{column}_background_storage?
44
+ if enqueue_#{column}_background_job?
58
45
  CarrierWave::Backgrounder.enqueue_for_backend(#{worker}, self.class.name, id, #{column}.mounted_as)
59
46
  @#{column}_changed = false
60
47
  end
61
48
  end
62
49
 
63
- def trigger_#{column}_background_storage?
64
- process_#{column}_upload != true && #{column}_changed
50
+ def #{column}_updated?
51
+ #{column}_changed
65
52
  end
66
-
67
53
  RUBY
68
54
  end
69
55
  end # DataMapper
@@ -25,34 +25,12 @@ module Support
25
25
  backends << :qu if defined? ::Qu
26
26
  backends << :sidekiq if defined? ::Sidekiq
27
27
  backends << :qc if defined? ::QC
28
- backends << :immediate
28
+ backends
29
29
  end
30
30
  end
31
31
 
32
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.sidekiq_options queue_options
50
- ::Sidekiq::Client.enqueue worker, class_name, subject_id, mounted_as
51
- when :qc
52
- ::QC.enqueue "#{worker.name}.perform", class_name, subject_id, mounted_as.to_s
53
- when :immediate
54
- worker.new(class_name, subject_id, mounted_as).perform
55
- end
33
+ self.send :"enqueue_#{backend}", worker, class_name, subject_id, mounted_as
56
34
  end
57
35
 
58
36
  private
@@ -62,13 +40,52 @@ module Support
62
40
  warn 'WARNING: No available queue backends found for CarrierWave::Backgrounder. Using the :immediate.'
63
41
  :immediate
64
42
  elsif available_backends.size > 1
65
- raise ::CarrierWave::Backgrounder::ToManyBackendsAvailableError,
66
- "You have to many backends available: #{available_backends.inspect}. Please specify which one to use in configuration block"
43
+ raise ::CarrierWave::Backgrounder::TooManyBackendsAvailableError,
44
+ "You have too many backends available: #{available_backends.inspect}. Please specify which one to use in configuration block"
67
45
  else
68
46
  available_backends.first
69
47
  end
70
48
  end
71
49
 
50
+ def enqueue_delayed_job(worker, *args)
51
+ ::Delayed::Job.enqueue worker.new(*args), :queue => queue_options[:queue]
52
+ end
53
+
54
+ def enqueue_resque(worker, *args)
55
+ worker.instance_variable_set('@queue', queue_options[:queue] || :carrierwave)
56
+ ::Resque.enqueue worker, *args
57
+ end
58
+
59
+ def enqueue_sidekiq(worker, *args)
60
+ sidekiq_client_args = { 'class' => worker, 'args' => args }
61
+ sidekiq_client_args['queue'] = queue_options[:queue] unless queue_options[:queue].nil?
62
+ sidekiq_client_args['retry'] = queue_options[:retry] unless queue_options[:retry].nil?
63
+ sidekiq_client_args['timeout'] = queue_options[:timeout] unless queue_options[:timeout].nil?
64
+ sidekiq_client_args['backtrace'] = queue_options[:backtrace] unless queue_options[:backtrace].nil?
65
+ worker.client_push(sidekiq_client_args)
66
+ end
67
+
68
+ def enqueue_girl_friday(worker, *args)
69
+ @girl_friday_queue ||= GirlFriday::WorkQueue.new(queue_options.delete(:queue) || :carrierwave, queue_options) do |msg|
70
+ worker = msg[:worker]
71
+ worker.perform
72
+ end
73
+ @girl_friday_queue << { :worker => worker.new(*args) }
74
+ end
75
+
76
+ def enqueue_qu(worker, *args)
77
+ worker.instance_variable_set('@queue', queue_options[:queue] || :carrierwave)
78
+ ::Qu.enqueue worker, *args
79
+ end
80
+
81
+ def enqueue_qc(worker, *args)
82
+ class_name, subject_id, mounted_as = args
83
+ ::QC.enqueue "#{worker.name}.perform", class_name, subject_id, mounted_as.to_s
84
+ end
85
+
86
+ def enqueue_immediate(worker, *args)
87
+ worker.new(*args).perform
88
+ end
72
89
  end
73
90
  end
74
91
  end
@@ -1,5 +1,5 @@
1
1
  module CarrierWave
2
2
  module Backgrounder
3
- VERSION = "0.1.2"
3
+ VERSION = "0.1.3"
4
4
  end
5
5
  end
@@ -10,23 +10,27 @@ module CarrierWave
10
10
  end
11
11
 
12
12
  def perform(*args)
13
- set_args(*args) unless args.empty?
14
- resource = klass.is_a?(String) ? klass.constantize : klass
15
- record = resource.find id
13
+ set_args(*args) if args.present?
14
+ record = constantized_resource.find id
16
15
 
17
16
  if record
18
17
  record.send(:"process_#{column}_upload=", true)
19
18
  if record.send(:"#{column}").recreate_versions! && record.respond_to?(:"#{column}_processing")
20
- record.send :"#{column}_processing=", nil
21
- record.save!
19
+ record.update_attribute :"#{column}_processing", nil
22
20
  end
23
21
  end
24
22
  end
25
23
 
24
+ private
25
+
26
26
  def set_args(klass, id, column)
27
27
  self.klass, self.id, self.column = klass, id, column
28
28
  end
29
29
 
30
+ def constantized_resource
31
+ klass.is_a?(String) ? klass.constantize : klass
32
+ end
33
+
30
34
  end # ProcessAsset
31
35
 
32
36
  end # Workers
@@ -4,33 +4,43 @@ module CarrierWave
4
4
 
5
5
  class StoreAsset < Struct.new(:klass, :id, :column)
6
6
  include ::Sidekiq::Worker if defined?(::Sidekiq)
7
+ attr_reader :cache_path, :tmp_directory
7
8
 
8
9
  def self.perform(*args)
9
10
  new(*args).perform
10
11
  end
11
12
 
12
13
  def perform(*args)
13
- set_args(*args) unless args.empty?
14
- resource = klass.is_a?(String) ? klass.constantize : klass
15
- record = resource.find id
16
- if tmp = record.send(:"#{column}_tmp")
17
- asset = record.send(:"#{column}")
18
- cache_dir = [asset.root, asset.cache_dir].join("/")
19
- cache_path = [cache_dir, tmp].join("/")
20
- tmp_dir = [cache_dir, tmp.split("/")[0]].join("/")
14
+ set_args(*args) if args.present?
15
+ record = constantized_resource.find id
16
+
17
+ if record.send(:"#{column}_tmp")
18
+ store_directories(record)
21
19
  record.send :"process_#{column}_upload=", true
22
20
  record.send :"#{column}_tmp=", nil
23
21
  File.open(cache_path) { |f| record.send :"#{column}=", f }
24
22
  if record.save!
25
- FileUtils.rm_r(tmp_dir, :force => true)
23
+ FileUtils.rm_r(tmp_directory, :force => true)
26
24
  end
27
25
  end
28
26
  end
29
27
 
28
+ private
29
+
30
30
  def set_args(klass, id, column)
31
31
  self.klass, self.id, self.column = klass, id, column
32
32
  end
33
33
 
34
+ def constantized_resource
35
+ klass.is_a?(String) ? klass.constantize : klass
36
+ end
37
+
38
+ def store_directories(record)
39
+ asset, asset_tmp = record.send(:"#{column}"), record.send(:"#{column}_tmp")
40
+ cache_directory = File.join(asset.root, asset.cache_dir)
41
+ @cache_path = File.join(cache_directory, asset_tmp)
42
+ @tmp_directory = File.join(cache_directory, asset_tmp.split("/").first)
43
+ end
34
44
  end # StoreAsset
35
45
 
36
46
  end # Workers
@@ -1,3 +1,4 @@
1
+ require 'active_support/core_ext/object'
1
2
  require 'backgrounder/support/backends'
2
3
  require 'backgrounder/orm/base'
3
4
  require 'backgrounder/delay'
@@ -7,7 +8,7 @@ module CarrierWave
7
8
  include Support::Backends
8
9
 
9
10
  class UnsupportedBackendError < StandardError ; end
10
- class ToManyBackendsAvailableError < StandardError ; end
11
+ class TooManyBackendsAvailableError < StandardError ; end
11
12
 
12
13
  def self.configure
13
14
  yield self
@@ -13,14 +13,71 @@ describe CarrierWave::Backgrounder::ORM::ActiveModel do
13
13
  end
14
14
 
15
15
  @mock_class.extend CarrierWave::Backgrounder::ORM::ActiveModel
16
- @mock_class.process_in_background :avatar
16
+ end
17
+
18
+ describe '.store_in_background' do
19
+ context 'setting up callbacks' do
20
+ it 'creates an after_commit hook' do
21
+ @mock_class.expects(:after_commit).with(:enqueue_avatar_background_job, :if => :enqueue_avatar_background_job?)
22
+ @mock_class.store_in_background :avatar
23
+ end
24
+ end
25
+ end
26
+
27
+ describe '.process_in_background' do
28
+ context 'setting up callbacks' do
29
+ it 'creates a before_save hook' do
30
+ @mock_class.expects(:before_save).with(:set_avatar_processing, :if => :enqueue_avatar_background_job?)
31
+ @mock_class.process_in_background :avatar
32
+ end
33
+
34
+ it 'creates an after_save hook' do
35
+ @mock_class.expects(:after_commit).with(:enqueue_avatar_background_job, :if => :enqueue_avatar_background_job?)
36
+ @mock_class.process_in_background :avatar
37
+ end
38
+ end
17
39
  end
18
40
 
19
41
  describe '#trigger_column_background_processing?' do
20
- it "calls up to processs column upload getter in the base class" do
21
- instance = @mock_class.new
42
+ let(:instance) { @mock_class.new }
43
+
44
+ before do
45
+ @mock_class.process_in_background :avatar
46
+ end
47
+
48
+ it "returns true if process_avatar_upload is false" do
22
49
  instance.expects(:process_avatar_upload)
23
- instance.trigger_avatar_background_processing?
50
+ expect(instance.enqueue_avatar_background_job?).to be_true
51
+ end
52
+
53
+ it "calls column_changed?" do
54
+ instance.expects(:process_avatar_upload).returns(false)
55
+ instance.expects(:avatar_changed?)
56
+ expect(instance.enqueue_avatar_background_job?).to be_true
57
+ end
58
+
59
+ it "calls previous_changes" do
60
+ instance.expects(:process_avatar_upload).returns(false)
61
+ instance.expects(:avatar_changed?).returns(false)
62
+ instance.expects(:previous_changes).returns({:avatar => true})
63
+ expect(instance.enqueue_avatar_background_job?).to be_true
64
+ end
65
+
66
+ it "calls avatar_remote_url" do
67
+ instance.expects(:process_avatar_upload).returns(false)
68
+ instance.expects(:avatar_changed?).returns(false)
69
+ instance.expects(:previous_changes).returns({})
70
+ instance.expects(:remote_avatar_url).returns('yup')
71
+ expect(instance.enqueue_avatar_background_job?).to be_true
72
+ end
73
+
74
+ it "calls avatar_cache" do
75
+ instance.expects(:process_avatar_upload).returns(false)
76
+ instance.expects(:avatar_changed?).returns(false)
77
+ instance.expects(:previous_changes).returns({})
78
+ instance.expects(:remote_avatar_url).returns(nil)
79
+ instance.expects(:avatar_cache).returns('yup')
80
+ expect(instance.enqueue_avatar_background_job?).to be_true
24
81
  end
25
82
  end
26
83
  end
@@ -12,64 +12,37 @@ describe CarrierWave::Backgrounder::ORM::Base do
12
12
  end
13
13
 
14
14
  it 'mixes in the two DSL methods' do
15
- @mock_class.should respond_to(:process_in_background)
16
- @mock_class.should respond_to(:store_in_background)
15
+ expect(@mock_class).to respond_to(:process_in_background)
16
+ expect(@mock_class).to respond_to(:store_in_background)
17
17
  end
18
18
 
19
- describe 'process in background' do
20
-
21
- describe 'setting up callbacks' do
22
-
23
- it 'creates a before_save hook' do
24
- @mock_class.expects(:before_save).with(:set_avatar_processing, :if => :trigger_avatar_background_processing?)
25
- @mock_class.process_in_background :avatar
26
- end
27
-
28
- it 'creates an after_save hook' do
29
- @mock_class.expects(:after_commit).with(:enqueue_avatar_background_job, :if => :trigger_avatar_background_processing?)
30
- @mock_class.process_in_background :avatar
31
- end
32
-
33
- end
34
-
35
- describe 'including new methods' do
19
+ describe '.process_in_background' do
20
+ context 'including new methods' do
36
21
  before do
37
22
  @mock_class.process_in_background :avatar
38
23
  @instance = @mock_class.new
39
24
  end
40
25
 
41
26
  it 'creates a processing enabled accessor' do
42
- @instance.should respond_to(:process_avatar_upload)
43
- @instance.should respond_to(:process_avatar_upload=)
27
+ expect(@instance).to respond_to(:process_avatar_upload)
28
+ expect(@instance).to respond_to(:process_avatar_upload=)
44
29
  end
45
30
 
46
31
  it 'create a setter for the processing attribute' do
47
- @instance.should respond_to(:set_avatar_processing)
32
+ expect(@instance).to respond_to(:set_avatar_processing)
48
33
  end
49
34
 
50
35
  it 'create a background job queuer' do
51
- @instance.should respond_to(:enqueue_avatar_background_job)
36
+ expect(@instance).to respond_to(:enqueue_avatar_background_job)
52
37
  end
53
38
 
54
39
  it 'create a trigger interrogator' do
55
- @instance.should respond_to(:trigger_avatar_background_processing?)
40
+ expect(@instance).to respond_to(:enqueue_avatar_background_job?)
56
41
  end
57
-
58
42
  end
59
-
60
43
  end
61
44
 
62
45
  describe 'store in background' do
63
-
64
- describe 'setting up callbacks' do
65
-
66
- it 'creates an after_save hook' do
67
- @mock_class.expects(:after_commit).with(:enqueue_avatar_background_job, :if => :trigger_avatar_background_storage?)
68
- @mock_class.store_in_background :avatar
69
- end
70
-
71
- end
72
-
73
46
  describe 'including new methods' do
74
47
  before do
75
48
  @mock_class.store_in_background :avatar
@@ -77,27 +50,25 @@ describe CarrierWave::Backgrounder::ORM::Base do
77
50
  end
78
51
 
79
52
  it 'creates a processing enabled accessor' do
80
- @instance.should respond_to(:process_avatar_upload)
81
- @instance.should respond_to(:process_avatar_upload=)
53
+ expect(@instance).to respond_to(:process_avatar_upload)
54
+ expect(@instance).to respond_to(:process_avatar_upload=)
82
55
  end
83
56
 
84
57
  it 'overrides the write column identifier method from carrierwave' do
85
- @instance.should respond_to(:write_avatar_identifier)
58
+ expect(@instance).to respond_to(:write_avatar_identifier)
86
59
  end
87
60
 
88
61
  it 'overrides the store column method from carrierwave' do
89
- @instance.should respond_to(:store_avatar!)
62
+ expect(@instance).to respond_to(:store_avatar!)
90
63
  end
91
64
 
92
65
  it 'create a background job queuer' do
93
- @instance.should respond_to(:enqueue_avatar_background_job)
66
+ expect(@instance).to respond_to(:enqueue_avatar_background_job)
94
67
  end
95
68
 
96
69
  it 'create a trigger interrogator' do
97
- @instance.should respond_to(:trigger_avatar_background_storage?)
70
+ expect(@instance).to respond_to(:enqueue_avatar_background_job?)
98
71
  end
99
-
100
72
  end
101
73
  end
102
-
103
74
  end
@@ -1,87 +1,221 @@
1
1
  require 'spec_helper'
2
+ require 'support/backend_constants'
3
+ require 'support/mock_worker'
2
4
 
3
5
  describe Support::Backends do
4
- let(:test_module) { Module.new }
6
+ let(:mock_module) { Module.new }
5
7
 
6
8
  before do
7
- test_module.send :include, Support::Backends
9
+ mock_module.send :include, Support::Backends
8
10
  end
9
11
 
10
12
  describe 'enumerating available backends' do
11
13
  it 'detects GirlFriday' do
12
- test_module.available_backends.should include(:girl_friday)
14
+ expect(mock_module.available_backends).to include(:girl_friday)
13
15
  end
14
16
 
15
17
  it 'detects Delayed::Job' do
16
- test_module.available_backends.should include(:delayed_job)
18
+ expect(mock_module.available_backends).to include(:delayed_job)
17
19
  end
18
20
 
19
21
  it 'detects Resque' do
20
- test_module.available_backends.should include(:resque)
22
+ expect(mock_module.available_backends).to include(:resque)
21
23
  end
22
24
 
23
25
  it 'detects Qu' do
24
- test_module.available_backends.should include(:qu)
26
+ expect(mock_module.available_backends).to include(:qu)
25
27
  end
26
28
 
27
29
  it 'detects Sidekiq' do
28
- test_module.available_backends.should include(:sidekiq)
30
+ expect(mock_module.available_backends).to include(:sidekiq)
29
31
  end
30
32
 
31
33
  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)
34
+ expect(mock_module.available_backends).to include(:qc)
37
35
  end
38
36
  end
39
37
 
40
38
  describe 'setting backend' do
41
39
  it 'using #backend=' do
42
- test_module.backend = :delayed_job
43
- expect(test_module.backend).to eql(:delayed_job)
40
+ mock_module.backend = :delayed_job
41
+ expect(mock_module.backend).to eql(:delayed_job)
44
42
  end
45
43
 
46
44
  it 'using #backend' do
47
- test_module.backend(:delayed_job)
48
- expect(test_module.backend).to eql(:delayed_job)
45
+ mock_module.backend(:delayed_job)
46
+ expect(mock_module.backend).to eql(:delayed_job)
49
47
  end
50
48
 
51
49
  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})
50
+ mock_module.backend(:delayed_job, :queue => :awesome_queue)
51
+ expect(mock_module.queue_options).to eql({:queue => :awesome_queue})
54
52
  end
55
53
  end
56
54
 
57
- describe 'automatically setting backends' do
55
+ describe 'auto detect backends' do
58
56
  before do
59
- test_module.instance_variable_set('@backend', nil)
57
+ mock_module.instance_variable_set('@backend', nil)
60
58
  end
61
59
 
62
60
  it 'sets the backend to immediate if none available' do
63
61
  suppress_warnings do
64
- test_module.stubs(:available_backends).returns([])
65
- expect(test_module.backend).to eql(:immediate)
62
+ mock_module.stubs(:available_backends).returns([])
63
+ expect(mock_module.backend).to eql(:immediate)
66
64
  end
67
65
  end
68
66
 
69
67
  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)
68
+ mock_module.stubs(:available_backends).returns([ :qu ])
69
+ expect(mock_module.backend).to eql(:qu)
72
70
  end
73
71
 
74
72
  it 'raises an error if more than one backend is available' do
75
- test_module.stubs(:available_backends).returns([:qu, :resque])
73
+ mock_module.stubs(:available_backends).returns([:qu, :resque])
76
74
  expect {
77
- test_module.backend
78
- }.to raise_error(CarrierWave::Backgrounder::ToManyBackendsAvailableError)
75
+ mock_module.backend
76
+ }.to raise_error(CarrierWave::Backgrounder::TooManyBackendsAvailableError)
79
77
  end
80
78
 
81
79
  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)
80
+ mock_module.backend = :not_a_backend
81
+ expect(mock_module.backend).to eql(:not_a_backend)
82
+ end
83
+ end
84
+
85
+ describe '#enqueue_for_backend' do
86
+ let!(:worker) { MockWorker.new('FakeClass', 1, :image) }
87
+
88
+ context 'delayed_job' do
89
+ before do
90
+ @mock_worker = Class.new do
91
+ def self.perform(*args); new(*args).perform; end
92
+ end
93
+
94
+ MockWorker.expects(:new).returns(worker)
95
+ end
96
+
97
+ it 'defaults the queue name to nil if none passed to #backend' do
98
+ mock_module.backend :delayed_job
99
+ Delayed::Job.expects(:enqueue).with(worker, :queue => nil)
100
+ mock_module.enqueue_for_backend MockWorker, 'FakeClass', 1, :image
101
+ end
102
+
103
+ it 'sets the queue name to the queue name passed to #backend' do
104
+ mock_module.backend :delayed_job, :queue => :awesome_queue
105
+ Delayed::Job.expects(:enqueue).with(worker, :queue => :awesome_queue)
106
+ mock_module.enqueue_for_backend MockWorker, 'FakeClass', 1, :image
107
+ end
108
+ end
109
+
110
+ context 'resque' do
111
+ let(:args) { [MockWorker, 'FakeClass', 1, :image] }
112
+
113
+ before do
114
+ Resque.expects(:enqueue).with(*args)
115
+ end
116
+
117
+ it 'sets a variable with the queue name, defaults to :carrierwave' do
118
+ mock_module.backend :resque
119
+ mock_module.enqueue_for_backend(*args)
120
+ expect(MockWorker.instance_variable_get '@queue').to eql(:carrierwave)
121
+ end
122
+
123
+ it 'sets a variable to the queue name passed to #backend' do
124
+ mock_module.backend :resque, :queue => :awesome_queue
125
+ mock_module.enqueue_for_backend(*args)
126
+ expect(MockWorker.instance_variable_get '@queue').to eql(:awesome_queue)
127
+ end
128
+ end
129
+
130
+ context 'sidekiq' do
131
+ let(:args) { ['FakeClass', 1, :image] }
132
+
133
+ it 'invokes client_push on the class with passed args' do
134
+ MockSidekiqWorker.expects(:client_push).with({ 'class' => MockSidekiqWorker, 'args' => args })
135
+ mock_module.backend :sidekiq
136
+ mock_module.enqueue_for_backend(MockSidekiqWorker, *args)
137
+ end
138
+
139
+ it 'invokes client_push and includes the options passed to backend' do
140
+ MockSidekiqWorker.expects(:client_push).with({ 'class' => MockSidekiqWorker,
141
+ 'retry' => false,
142
+ 'timeout' => 60,
143
+ 'queue' => :awesome_queue,
144
+ 'args' => args })
145
+ options = {:retry => false, :timeout => 60, :queue => :awesome_queue}
146
+ mock_module.backend :sidekiq, options
147
+ mock_module.enqueue_for_backend(MockSidekiqWorker, *args)
148
+ end
84
149
  end
150
+
151
+ context 'girl_friday' do
152
+ let(:args) { [MockWorker, 'FakeClass', 1, :image] }
153
+
154
+ it 'instantiates a GirlFriday work queue if one does not exist' do
155
+ mock_module.backend :girl_friday
156
+ GirlFriday::WorkQueue.expects(:new).with(:carrierwave, {}).returns([])
157
+ mock_module.enqueue_for_backend(*args)
158
+ end
159
+
160
+ it 'instantiates a GirlFriday work queue passing the args to the queue' do
161
+ mock_module.backend :girl_friday, :queue => :awesome_queue, :size => 3
162
+ GirlFriday::WorkQueue.expects(:new).with(:awesome_queue, {:size => 3}).returns([])
163
+ mock_module.enqueue_for_backend(*args)
164
+ end
165
+
166
+ it 'does not instantiate a GirlFriday work queue if one exists' do
167
+ mock_module.backend :girl_friday
168
+ mock_module.instance_variable_set('@girl_friday_queue', [])
169
+ GirlFriday::WorkQueue.expects(:new).never
170
+ mock_module.enqueue_for_backend(*args)
171
+ end
172
+
173
+ it 'add a worker to the girl_friday queue' do
174
+ expected = [{ :worker => MockWorker.new('FakeClass', 1, :image) }]
175
+ mock_module.backend :girl_friday
176
+ mock_module.instance_variable_set('@girl_friday_queue', [])
177
+ mock_module.enqueue_for_backend(*args)
178
+ expect(mock_module.instance_variable_get '@girl_friday_queue').to eql(expected)
179
+ end
180
+ end
181
+
182
+ context 'qu' do
183
+ let(:args) { [MockWorker, 'FakeClass', 1, :image] }
184
+ before do
185
+ Qu.expects(:enqueue).with(*args)
186
+ end
187
+
188
+ it 'sets a variable with the queue name, defaults to :carrierwave' do
189
+ mock_module.backend :qu
190
+ mock_module.enqueue_for_backend(*args)
191
+ expect(MockWorker.instance_variable_get '@queue').to eql(:carrierwave)
192
+ end
193
+
194
+ it 'sets a variable to the queue name passed to #backend' do
195
+ mock_module.backend :qu, :queue => :awesome_queue
196
+ mock_module.enqueue_for_backend(*args)
197
+ expect(MockWorker.instance_variable_get '@queue').to eql(:awesome_queue)
198
+ end
199
+ end
200
+
201
+ context 'qc' do
202
+ it 'calls enqueue with the passed args' do
203
+ QC.expects(:enqueue).with("MockWorker.perform", 'FakeClass', 1, 'image')
204
+ mock_module.backend :qc
205
+ mock_module.enqueue_for_backend(MockWorker, 'FakeClass', 1, :image)
206
+ end
207
+ end
208
+
209
+ context 'immediate' do
210
+ it 'instantiates a worker passing the args and calls perform' do
211
+ worker = mock('Worker')
212
+ MockWorker.expects(:new).with('FakeClass', 1, :image).returns(worker)
213
+ worker.expects(:perform)
214
+ mock_module.backend :immediate
215
+ mock_module.enqueue_for_backend(MockWorker, 'FakeClass', 1, :image)
216
+ end
217
+ end
218
+
85
219
  end
86
220
  end
87
221
 
@@ -5,10 +5,9 @@ require 'backgrounder/workers/process_asset'
5
5
  describe CarrierWave::Workers::ProcessAsset do
6
6
  let(:worker_class) { CarrierWave::Workers::ProcessAsset }
7
7
  let(:user) { mock('User') }
8
- let(:image) { mock('UserAsset') }
9
8
  let!(:worker) { worker_class.new(user, '22', :image) }
10
9
 
11
- context ".perform" do
10
+ describe ".perform" do
12
11
  it 'creates a new instance and calls perform' do
13
12
  args = [user, '22', :image]
14
13
  worker_class.expects(:new).with(*args).returns(worker)
@@ -18,29 +17,54 @@ describe CarrierWave::Workers::ProcessAsset do
18
17
  end
19
18
  end
20
19
 
21
- context "#perform" do
22
- it 'processes versions with image_processing column' do
20
+ describe "#perform" do
21
+ let(:image) { mock('UserAsset') }
22
+
23
+ before do
23
24
  user.expects(:find).with('22').returns(user).once
24
25
  user.expects(:image).once.returns(image)
25
26
  user.expects(:process_image_upload=).with(true).once
26
-
27
27
  image.expects(:recreate_versions!).once.returns(true)
28
+ end
29
+
30
+ it 'processes versions with image_processing column' do
28
31
  user.expects(:respond_to?).with(:image_processing).once.returns(true)
29
- user.expects(:image_processing=).with(nil).once
30
- user.expects(:save!)
32
+ user.expects(:update_attribute).with(:image_processing, nil).once
31
33
  worker.perform
32
34
  end
33
35
 
34
36
  it 'processes versions without image_processing column' do
35
- user.expects(:find).with('22').returns(user).once
36
- user.expects(:image).once.returns(image)
37
- user.expects(:process_image_upload=).with(true).once
38
-
39
- image.expects(:recreate_versions!).once.returns(true)
40
37
  user.expects(:respond_to?).with(:image_processing).once.returns(false)
41
- user.expects(:image_processing=).never
42
- user.expects(:save!).never
38
+ user.expects(:update_attribute).never
43
39
  worker.perform
44
40
  end
45
41
  end
42
+
43
+ describe '#perform with args' do
44
+ let(:admin) { mock('Admin') }
45
+ let(:avatar) { mock('AdminAsset') }
46
+ let(:worker) { worker_class.new }
47
+
48
+ before do
49
+ admin.expects(:find).with('23').returns(admin).once
50
+ admin.expects(:avatar).once.returns(avatar)
51
+ admin.expects(:process_avatar_upload=).with(true).once
52
+ admin.expects(:respond_to?).with(:avatar_processing).once.returns(false)
53
+ avatar.expects(:recreate_versions!).once.returns(true)
54
+
55
+ worker.perform admin, '23', :avatar
56
+ end
57
+
58
+ it 'sets klass' do
59
+ expect(worker.klass).to eql(admin)
60
+ end
61
+
62
+ it 'sets column' do
63
+ expect(worker.id).to eql('23')
64
+ end
65
+
66
+ it 'sets id' do
67
+ expect(worker.column).to eql(:avatar)
68
+ end
69
+ end
46
70
  end
@@ -3,35 +3,87 @@ require 'spec_helper'
3
3
  require 'backgrounder/workers/store_asset'
4
4
 
5
5
  describe CarrierWave::Workers::StoreAsset do
6
+ let(:fixtures_path) { File.expand_path('../fixtures/images', __FILE__) }
6
7
  let(:worker_class) { CarrierWave::Workers::StoreAsset }
7
- let(:user) { mock('User') }
8
- let(:image) { mock('UserAsset') }
8
+ let(:user) { mock('User') }
9
9
  let!(:worker) { worker_class.new(user, '22', :image) }
10
10
 
11
- context ".perform" do
11
+ describe ".perform" do
12
12
  it 'creates a new instance and calls perform' do
13
13
  args = [user, '22', :image]
14
14
  worker_class.expects(:new).with(*args).returns(worker)
15
15
  worker_class.any_instance.expects(:perform)
16
-
17
16
  worker_class.perform(*args)
18
17
  end
19
18
  end
20
19
 
21
- context "#perform" do
22
- it 'processes versions' do
23
- FileUtils.expects(:rm_r).with(File.expand_path('../fixtures/test.jpg', __FILE__),:force=>true).once
24
- user.expects(:find).with('22').once.returns(user)
25
- user.expects(:image_tmp).once.returns('test.jpg')
26
- user.expects(:image).once.returns(image)
20
+ describe "#perform" do
21
+ let(:image) { mock('UserAsset') }
22
+
23
+ before do
27
24
  image.expects(:root).once.returns(File.expand_path('..', __FILE__))
28
25
  image.expects(:cache_dir).once.returns('fixtures')
26
+ user.expects(:image_tmp).twice.returns('images/test.jpg')
27
+ user.expects(:find).with('22').once.returns(user)
28
+ user.expects(:image).once.returns(image)
29
29
  user.expects(:process_image_upload=).with(true).once
30
30
  user.expects(:image=).once
31
31
  user.expects(:image_tmp=).with(nil).once
32
+ end
33
+
34
+ it 'removes tmp directory on success' do
35
+ FileUtils.expects(:rm_r).with(fixtures_path, :force => true).once
32
36
  user.expects(:save!).once.returns(true)
37
+ worker.perform
38
+ end
39
+
40
+ it 'does not remove the tmp directory if save! fails' do
41
+ FileUtils.expects(:rm_r).never
42
+ user.expects(:save!).once.returns(false)
43
+ worker.perform
44
+ end
45
+
46
+ it 'sets the cache_path' do
47
+ user.expects(:save!).once.returns(false)
48
+ worker.perform
49
+ expect(worker.cache_path).to eql(fixtures_path + '/test.jpg')
50
+ end
33
51
 
52
+ it 'sets the tmp_directory' do
53
+ user.expects(:save!).once.returns(false)
34
54
  worker.perform
55
+ expect(worker.tmp_directory).to eql(fixtures_path)
56
+ end
57
+ end
58
+
59
+ describe '#perform with args' do
60
+ let(:admin) { mock('Admin') }
61
+ let(:image) { mock('AdminAsset') }
62
+ let(:worker) { worker_class.new }
63
+
64
+ before do
65
+ image.expects(:root).once.returns(File.expand_path('..', __FILE__))
66
+ image.expects(:cache_dir).once.returns('fixtures')
67
+ admin.expects(:avatar_tmp).twice.returns('images/test.jpg')
68
+ admin.expects(:find).with('23').once.returns(admin)
69
+ admin.expects(:avatar).once.returns(image)
70
+ admin.expects(:process_avatar_upload=).with(true).once
71
+ admin.expects(:avatar=).once
72
+ admin.expects(:avatar_tmp=).with(nil).once
73
+ admin.expects(:save!).once.returns(false)
74
+ worker.perform admin, '23', :avatar
75
+ end
76
+
77
+ it 'sets klass' do
78
+ expect(worker.klass).to eql(admin)
79
+ end
80
+
81
+ it 'sets column' do
82
+ expect(worker.id).to eql('23')
83
+ end
84
+
85
+ it 'sets id' do
86
+ expect(worker.column).to eql(:avatar)
35
87
  end
36
88
  end
37
- end
89
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  # encoding: utf-8
2
2
  require 'rubygems'
3
3
  require 'bundler/setup'
4
- require 'support/backend_constants'
5
4
  require 'logger'
6
5
  require 'carrierwave_backgrounder'
7
6
 
@@ -1,6 +1,8 @@
1
1
  # Fixture module declarations for backend detection testing
2
2
 
3
3
  module GirlFriday
4
+ class WorkQueue
5
+ end
4
6
  end
5
7
 
6
8
  module Delayed
@@ -15,6 +17,9 @@ module Qu
15
17
  end
16
18
 
17
19
  module Sidekiq
20
+ module Client
21
+ end
22
+
18
23
  module Worker
19
24
  def self.included(base)
20
25
  base.extend(ClassMethods)
@@ -23,6 +28,9 @@ module Sidekiq
23
28
  module ClassMethods
24
29
  def sidekiq_options(opts = {})
25
30
  end
31
+
32
+ def client_push(item)
33
+ end
26
34
  end
27
35
  end
28
36
  end
@@ -0,0 +1,17 @@
1
+ class MockWorker < Struct.new(:klass, :id, :column)
2
+ def self.perform(*args)
3
+ new(*args).perform
4
+ end
5
+
6
+ def perform(*args)
7
+ set_args(*args) unless args.empty?
8
+ end
9
+
10
+ def set_args(klass, id, column)
11
+ self.klass, self.id, self.column = klass, id, column
12
+ end
13
+ end
14
+
15
+ class MockSidekiqWorker < MockWorker
16
+ include Sidekiq::Worker
17
+ end
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.1.2
4
+ version: 0.1.3
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-15 00:00:00.000000000 Z
12
+ date: 2013-01-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: carrierwave
@@ -84,6 +84,7 @@ extra_rdoc_files: []
84
84
  files:
85
85
  - .gitignore
86
86
  - .rspec
87
+ - .travis.yml
87
88
  - CHANGELOG.md
88
89
  - Gemfile
89
90
  - README.md
@@ -105,13 +106,15 @@ files:
105
106
  - spec/backgrounder/orm/activemodel_spec.rb
106
107
  - spec/backgrounder/orm/base_spec.rb
107
108
  - spec/backgrounder/support/backends_spec.rb
108
- - spec/backgrounder/workers/fixtures/test.jpg
109
+ - spec/backgrounder/workers/fixtures/images/test.jpg
109
110
  - spec/backgrounder/workers/process_asset_spec.rb
110
111
  - spec/backgrounder/workers/store_asset_spec.rb
111
112
  - spec/spec_helper.rb
112
113
  - spec/support/backend_constants.rb
113
- homepage: ''
114
- licenses: []
114
+ - spec/support/mock_worker.rb
115
+ homepage: https://github.com/lardawge/carrierwave_backgrounder
116
+ licenses:
117
+ - MIT
115
118
  post_install_message:
116
119
  rdoc_options: []
117
120
  require_paths:
@@ -124,7 +127,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
124
127
  version: '0'
125
128
  segments:
126
129
  - 0
127
- hash: -4429973419830496543
130
+ hash: -2596358502417703338
128
131
  required_rubygems_version: !ruby/object:Gem::Requirement
129
132
  none: false
130
133
  requirements:
@@ -133,20 +136,21 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
136
  version: '0'
134
137
  segments:
135
138
  - 0
136
- hash: -4429973419830496543
139
+ hash: -2596358502417703338
137
140
  requirements: []
138
- rubyforge_project: carrierwave_backgrounder
141
+ rubyforge_project:
139
142
  rubygems_version: 1.8.24
140
143
  signing_key:
141
144
  specification_version: 3
142
145
  summary: Offload CarrierWave's image processing and storage to a background process
143
- using Delayed Job
146
+ using Delayed Job, Resque, Sidekiq, Qu, Queue Classic or Girl Friday
144
147
  test_files:
145
148
  - spec/backgrounder/orm/activemodel_spec.rb
146
149
  - spec/backgrounder/orm/base_spec.rb
147
150
  - spec/backgrounder/support/backends_spec.rb
148
- - spec/backgrounder/workers/fixtures/test.jpg
151
+ - spec/backgrounder/workers/fixtures/images/test.jpg
149
152
  - spec/backgrounder/workers/process_asset_spec.rb
150
153
  - spec/backgrounder/workers/store_asset_spec.rb
151
154
  - spec/spec_helper.rb
152
155
  - spec/support/backend_constants.rb
156
+ - spec/support/mock_worker.rb