carrierwave_backgrounder 0.0.6 → 0.0.7
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 +25 -12
- data/carrierwave_backgrounder.gemspec +1 -0
- data/lib/backgrounder/{delay_storage.rb → delay.rb} +10 -3
- data/lib/backgrounder/orm/data_mapper.rb +75 -0
- data/lib/backgrounder/orm/mongoid.rb +33 -0
- data/lib/backgrounder/version.rb +1 -1
- data/lib/backgrounder/workers/process_asset.rb +8 -5
- data/lib/carrierwave_backgrounder.rb +14 -1
- metadata +78 -53
data/README.md
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
# CarrierWave Backgrounder
|
1
|
+
# CarrierWave Backgrounder [](http://travis-ci.org/lardawge/carrierwave_backgrounder)
|
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
5
|
This gem addresses that issue by disabling processing until a background process initiates it.
|
6
|
-
It supports
|
6
|
+
It supports Delayed Job, Resque and Girl Friday.
|
7
7
|
|
8
8
|
## Background options
|
9
9
|
|
@@ -33,6 +33,16 @@ gem 'carrierwave_backgrounder'
|
|
33
33
|
|
34
34
|
## Getting Started
|
35
35
|
|
36
|
+
In your CarrierWave uploader file:
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
class AvatarUploader < CarrierWave::Uploader::Base
|
40
|
+
include ::CarrierWave::Backgrounder::Delay
|
41
|
+
|
42
|
+
#etc...
|
43
|
+
end
|
44
|
+
```
|
45
|
+
|
36
46
|
### To use process_in_background
|
37
47
|
|
38
48
|
In your model:
|
@@ -42,6 +52,12 @@ mount_uploader :avatar, AvatarUploader
|
|
42
52
|
process_in_background :avatar
|
43
53
|
```
|
44
54
|
|
55
|
+
Optionally you can add a column to the database which will be set to nil when the background processing is complete.
|
56
|
+
|
57
|
+
```ruby
|
58
|
+
add_column :users, :avatar_processing, :boolean
|
59
|
+
```
|
60
|
+
|
45
61
|
### To use store_in_background
|
46
62
|
|
47
63
|
In your model:
|
@@ -57,16 +73,6 @@ Add a column to the model you want to background which will store the temp file
|
|
57
73
|
add_column :users, :avatar_tmp, :string
|
58
74
|
```
|
59
75
|
|
60
|
-
In your CarrierWave uploader file:
|
61
|
-
|
62
|
-
```ruby
|
63
|
-
class AvatarUploader < CarrierWave::Uploader::Base
|
64
|
-
include ::CarrierWave::Backgrounder::DelayStorage
|
65
|
-
|
66
|
-
#ect...
|
67
|
-
end
|
68
|
-
```
|
69
|
-
|
70
76
|
## Usage Tips
|
71
77
|
|
72
78
|
If you need to process/store the upload immediately:
|
@@ -75,6 +81,13 @@ If you need to process/store the upload immediately:
|
|
75
81
|
@user.process_<column>_upload = true
|
76
82
|
```
|
77
83
|
|
84
|
+
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
|
85
|
+
second argument:
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
process_in_background :avatar, MyAppsAwesomeProcessingWorker
|
89
|
+
```
|
90
|
+
|
78
91
|
## ORM
|
79
92
|
|
80
93
|
Currently ActiveRecord is the default orm and I have not tested this with others but it should work by adding the following to your carrierwave initializer:
|
@@ -2,13 +2,20 @@ module CarrierWave
|
|
2
2
|
module Backgrounder
|
3
3
|
|
4
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
|
+
module Delay
|
5
12
|
|
6
13
|
##
|
7
|
-
#Intercept carrierwave#cache_versions! so we can process versions later.
|
14
|
+
# Intercept carrierwave#cache_versions! so we can process versions later.
|
8
15
|
def cache_versions!(new_file)
|
9
16
|
super(new_file) if proceed_with_versioning?
|
10
17
|
end
|
11
|
-
|
18
|
+
|
12
19
|
def process!(new_file=nil)
|
13
20
|
super(new_file) if proceed_with_versioning?
|
14
21
|
end
|
@@ -18,7 +25,7 @@ module CarrierWave
|
|
18
25
|
def proceed_with_versioning?
|
19
26
|
!model.respond_to?(:"process_#{mounted_as}_upload") || model.send(:"process_#{mounted_as}_upload")
|
20
27
|
end
|
21
|
-
end #
|
28
|
+
end # Delay
|
22
29
|
|
23
30
|
end # Backgrounder
|
24
31
|
end # CarrierWave
|
@@ -0,0 +1,75 @@
|
|
1
|
+
module CarrierWave
|
2
|
+
module Backgrounder
|
3
|
+
module ORM
|
4
|
+
|
5
|
+
module DataMapper
|
6
|
+
include CarrierWave::Backgrounder::ORM::Base
|
7
|
+
|
8
|
+
def process_in_background(column, worker=::CarrierWave::Workers::ProcessAsset)
|
9
|
+
before :save, :"set_#{column}_processing"
|
10
|
+
after :save, :"enqueue_#{column}_background_job"
|
11
|
+
|
12
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
13
|
+
attr_accessor :process_#{column}_upload
|
14
|
+
attr_reader :#{column}_changed
|
15
|
+
|
16
|
+
def set_#{column}_processing
|
17
|
+
@#{column}_changed = attribute_dirty?(:#{column})
|
18
|
+
self.#{column}_processing = true if respond_to?(:#{column}_processing)
|
19
|
+
end
|
20
|
+
|
21
|
+
def enqueue_#{column}_background_job
|
22
|
+
if trigger_#{column}_background_processing?
|
23
|
+
::Delayed::Job.enqueue #{worker}.new(self.class, 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
|
+
RUBY
|
33
|
+
end
|
34
|
+
|
35
|
+
def store_in_background(column, worker=::CarrierWave::Workers::StoreAsset)
|
36
|
+
before :save, :"set_#{column}_changed"
|
37
|
+
after :save, :"enqueue_#{column}_background_job"
|
38
|
+
|
39
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
40
|
+
attr_accessor :process_#{column}_upload
|
41
|
+
attr_reader :#{column}_changed
|
42
|
+
|
43
|
+
def set_#{column}_changed
|
44
|
+
@#{column}_changed = attribute_dirty?(:#{column})
|
45
|
+
end
|
46
|
+
|
47
|
+
def write_#{column}_identifier
|
48
|
+
super() and return if process_#{column}_upload
|
49
|
+
self.#{column}_tmp = _mounter(:#{column}).cache_name
|
50
|
+
end
|
51
|
+
|
52
|
+
def store_#{column}!
|
53
|
+
super() if process_#{column}_upload
|
54
|
+
end
|
55
|
+
|
56
|
+
def enqueue_#{column}_background_job
|
57
|
+
if trigger_#{column}_background_storage?
|
58
|
+
::Delayed::Job.enqueue #{worker}.new(self.class, id, #{column}.mounted_as)
|
59
|
+
@#{column}_changed = false
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def trigger_#{column}_background_storage?
|
64
|
+
process_#{column}_upload != true && #{column}_changed
|
65
|
+
end
|
66
|
+
|
67
|
+
RUBY
|
68
|
+
end
|
69
|
+
end # DataMapper
|
70
|
+
|
71
|
+
end #ORM
|
72
|
+
end #Backgrounder
|
73
|
+
end #CarrierWave
|
74
|
+
|
75
|
+
DataMapper::Model.append_extensions ::CarrierWave::Backgrounder::ORM::DataMapper
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module CarrierWave
|
2
|
+
module Backgrounder
|
3
|
+
module ORM
|
4
|
+
|
5
|
+
module Mongoid
|
6
|
+
include CarrierWave::Backgrounder::ORM::Base
|
7
|
+
|
8
|
+
def process_in_background(column, worker=::CarrierWave::Workers::ProcessAsset)
|
9
|
+
super
|
10
|
+
|
11
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
12
|
+
def trigger_#{column}_background_processing?
|
13
|
+
process_#{column}_upload != true && #{column}_changed?
|
14
|
+
end
|
15
|
+
RUBY
|
16
|
+
end
|
17
|
+
|
18
|
+
def store_in_background(column, worker=::CarrierWave::Workers::StoreAsset)
|
19
|
+
super
|
20
|
+
|
21
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
22
|
+
def trigger_#{column}_background_storage?
|
23
|
+
process_#{column}_upload != true && #{column}_changed?
|
24
|
+
end
|
25
|
+
RUBY
|
26
|
+
end
|
27
|
+
end # ActiveRecord
|
28
|
+
|
29
|
+
end # ORM
|
30
|
+
end # Backgrounder
|
31
|
+
end # CarrierWave
|
32
|
+
|
33
|
+
Mongoid::Document::ClassMethods.send(:include, ::CarrierWave::Backgrounder::ORM::Mongoid)
|
data/lib/backgrounder/version.rb
CHANGED
@@ -12,13 +12,16 @@ module CarrierWave
|
|
12
12
|
def perform
|
13
13
|
resource = klass.is_a?(String) ? klass.constantize : klass
|
14
14
|
record = resource.find id
|
15
|
-
|
16
|
-
if record
|
17
|
-
record.
|
15
|
+
|
16
|
+
if record
|
17
|
+
record.send(:"process_#{column}_upload=", true)
|
18
|
+
if record.send(:"#{column}").recreate_versions! && record.respond_to?(:"#{column}_processing")
|
19
|
+
record.update_attribute :"#{column}_processing", nil
|
20
|
+
end
|
18
21
|
end
|
19
22
|
end
|
20
|
-
|
23
|
+
|
21
24
|
end # ProcessAsset
|
22
|
-
|
25
|
+
|
23
26
|
end # Workers
|
24
27
|
end # Backgrounder
|
@@ -1,6 +1,9 @@
|
|
1
1
|
module CarrierWave
|
2
2
|
module Backgrounder
|
3
|
-
|
3
|
+
Logger = Logger.new(STDOUT)
|
4
|
+
|
5
|
+
autoload :Delay, 'backgrounder/delay'
|
6
|
+
autoload :DelayStorage, 'backgrounder/delay'
|
4
7
|
|
5
8
|
module ORM
|
6
9
|
autoload :Base, 'backgrounder/orm/base'
|
@@ -12,11 +15,21 @@ if defined?(Rails)
|
|
12
15
|
module CarrierWave
|
13
16
|
module Backgrounder
|
14
17
|
class Railtie < Rails::Railtie
|
18
|
+
|
15
19
|
initializer "carrierwave_backgrounder.active_record" do
|
16
20
|
ActiveSupport.on_load :active_record do
|
17
21
|
require 'backgrounder/orm/activerecord'
|
18
22
|
end
|
19
23
|
end
|
24
|
+
|
25
|
+
initializer "carrierwave_backgrounder.data_mapper", :before =>"data_mapper.add_to_prepare" do
|
26
|
+
require 'backgrounder/orm/data_mapper' if defined?(DataMapper)
|
27
|
+
end
|
28
|
+
|
29
|
+
initializer "carrierwave_backgrounder.mongoid" do
|
30
|
+
require 'backgrounder/orm/mongoid' if defined?(Mongoid)
|
31
|
+
end
|
32
|
+
|
20
33
|
end
|
21
34
|
end
|
22
35
|
end
|
metadata
CHANGED
@@ -1,70 +1,98 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: carrierwave_backgrounder
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.7
|
4
5
|
prerelease:
|
5
|
-
version: 0.0.6
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Larry Sprock
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-05-30 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
17
15
|
name: carrierwave
|
18
|
-
|
19
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
20
17
|
none: false
|
21
|
-
requirements:
|
18
|
+
requirements:
|
22
19
|
- - ~>
|
23
|
-
- !ruby/object:Gem::Version
|
24
|
-
version:
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0.5'
|
25
22
|
type: :runtime
|
26
|
-
version_requirements: *id001
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rspec
|
29
23
|
prerelease: false
|
30
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
31
25
|
none: false
|
32
|
-
requirements:
|
33
|
-
- -
|
34
|
-
- !ruby/object:Gem::Version
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.5'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - '='
|
36
|
+
- !ruby/object:Gem::Version
|
35
37
|
version: 2.5.0
|
36
38
|
type: :development
|
37
|
-
|
38
|
-
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - '='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.5.0
|
46
|
+
- !ruby/object:Gem::Dependency
|
39
47
|
name: mocha
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0.9'
|
54
|
+
type: :development
|
40
55
|
prerelease: false
|
41
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
42
57
|
none: false
|
43
|
-
requirements:
|
58
|
+
requirements:
|
44
59
|
- - ~>
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version:
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.9'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rake
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
47
70
|
type: :development
|
48
|
-
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
49
78
|
description:
|
50
|
-
email:
|
79
|
+
email:
|
51
80
|
- larry@lucidbleu.com
|
52
81
|
executables: []
|
53
|
-
|
54
82
|
extensions: []
|
55
|
-
|
56
83
|
extra_rdoc_files: []
|
57
|
-
|
58
|
-
files:
|
84
|
+
files:
|
59
85
|
- .gitignore
|
60
86
|
- .rspec
|
61
87
|
- Gemfile
|
62
88
|
- README.md
|
63
89
|
- Rakefile
|
64
90
|
- carrierwave_backgrounder.gemspec
|
65
|
-
- lib/backgrounder/
|
91
|
+
- lib/backgrounder/delay.rb
|
66
92
|
- lib/backgrounder/orm/activerecord.rb
|
67
93
|
- lib/backgrounder/orm/base.rb
|
94
|
+
- lib/backgrounder/orm/data_mapper.rb
|
95
|
+
- lib/backgrounder/orm/mongoid.rb
|
68
96
|
- lib/backgrounder/version.rb
|
69
97
|
- lib/backgrounder/workers.rb
|
70
98
|
- lib/backgrounder/workers/process_asset.rb
|
@@ -74,35 +102,32 @@ files:
|
|
74
102
|
- spec/workers/fixtures/test.jpg
|
75
103
|
- spec/workers/process_asset_spec.rb
|
76
104
|
- spec/workers/store_asset_spec.rb
|
77
|
-
|
78
|
-
homepage: ""
|
105
|
+
homepage: ''
|
79
106
|
licenses: []
|
80
|
-
|
81
107
|
post_install_message:
|
82
108
|
rdoc_options: []
|
83
|
-
|
84
|
-
require_paths:
|
109
|
+
require_paths:
|
85
110
|
- lib
|
86
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
112
|
none: false
|
88
|
-
requirements:
|
89
|
-
- -
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
version:
|
92
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ! '>='
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
118
|
none: false
|
94
|
-
requirements:
|
95
|
-
- -
|
96
|
-
- !ruby/object:Gem::Version
|
97
|
-
version:
|
119
|
+
requirements:
|
120
|
+
- - ! '>='
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
98
123
|
requirements: []
|
99
|
-
|
100
124
|
rubyforge_project: carrierwave_backgrounder
|
101
|
-
rubygems_version: 1.
|
125
|
+
rubygems_version: 1.8.21
|
102
126
|
signing_key:
|
103
127
|
specification_version: 3
|
104
|
-
summary: Offload CarrierWave's image processing and storage to a background process
|
105
|
-
|
128
|
+
summary: Offload CarrierWave's image processing and storage to a background process
|
129
|
+
using Delayed Job
|
130
|
+
test_files:
|
106
131
|
- spec/spec_helper.rb
|
107
132
|
- spec/workers/fixtures/test.jpg
|
108
133
|
- spec/workers/process_asset_spec.rb
|