delayed_paperclip 2.5.1.0 → 2.6.0.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.textile CHANGED
@@ -1,4 +1,4 @@
1
- h1. Delayed::Paperclip !https://secure.travis-ci.org/jrgifford/delayed_paperclip.png!
1
+ h1. Delayed::Paperclip !https://travis-ci.org/jrgifford/delayed_paperclip.png?branch=master!:https://travis-ci.org/jrgifford/delayed_paperclip "!https://codeclimate.com/github/jrgifford/delayed_paperclip.png!":https://codeclimate.com/github/jrgifford/delayed_paperclip
2
2
 
3
3
  Delayed_paperclip lets you process your "Paperclip":http://github.com/thoughtbot/paperclip attachments in a background task with "delayed_job":http://github.com/tobi/delayed_job or "Resque":http://github.com/defunkt/resque.
4
4
 
@@ -98,6 +98,34 @@ being processed.
98
98
 
99
99
  </code></pre>
100
100
 
101
+ h4. Only process certain styles
102
+
103
+ This is useful if you don't want the background job to reprocess all styles.
104
+
105
+ <pre><code>
106
+ class User < ActiveRecord::Base
107
+ has_attached_file :avatar, :styles => { :small => "25x25#", :medium => "50x50x" }
108
+
109
+ process_in_background :avatar, :only_process => [:small]
110
+ end
111
+ </code></pre>
112
+
113
+ h4. Reprocess Without Delay
114
+
115
+ This is useful if you don't want the background job. It accepts individual styles to. Take note, normal `reprocess!` does not accept
116
+ styles as arguments anymore. It will delegate to DelayedPaperclip and reprocess all styles.
117
+
118
+ <pre><code>
119
+ class User < ActiveRecord::Base
120
+ has_attached_file :avatar, :styles => { :small => "25x25#", :medium => "50x50x" }
121
+
122
+ process_in_background :avatar
123
+ end
124
+
125
+ @user.avatar.url #=> "/system/images/3/original/IMG_2772.JPG?1267562148"
126
+ @user.avatar.reprocess_without_delay!(:medium)
127
+ </code></pre>
128
+
101
129
 
102
130
  h2. What if I'm not using images?
103
131
 
@@ -39,24 +39,32 @@ module DelayedPaperclip
39
39
  def process_delayed!
40
40
  self.job_is_processing = true
41
41
  self.post_processing = true
42
- reprocess!
42
+ reprocess!(*delayed_options[:only_process])
43
43
  self.job_is_processing = false
44
44
  end
45
45
 
46
+ def processing_image_url
47
+ processing_image_url = @options[:delayed][:processing_image_url]
48
+ processing_image_url = processing_image_url.call(self) if processing_image_url.respond_to?(:call)
49
+ processing_image_url
50
+ end
51
+
52
+
46
53
  def after_flush_writes_with_processing(*args)
47
54
  after_flush_writes_without_processing(*args)
48
55
 
49
56
  # update_column is available in rails 3.1 instead we can do this to update the attribute without callbacks
50
57
 
51
- #instance.update_column("#{name}_processing", false) if instance.respond_to?(:"#{name}_processing?")
58
+ # instance.update_column("#{name}_processing", false) if instance.respond_to?(:"#{name}_processing?")
52
59
  if instance.respond_to?(:"#{name}_processing?")
53
60
  instance.send("#{name}_processing=", false)
54
- instance.class.update_all({ "#{name}_processing" => false }, instance.class.primary_key => instance.id)
61
+ instance.class.where(instance.class.primary_key => instance.id).update_all({ "#{name}_processing" => false })
55
62
  end
56
63
  end
57
64
 
58
65
  def save_with_prepare_enqueueing
59
66
  was_dirty = @dirty
67
+
60
68
  save_without_prepare_enqueueing.tap do
61
69
  if delay_processing? && was_dirty
62
70
  instance.prepare_enqueueing_for name
@@ -64,6 +72,11 @@ module DelayedPaperclip
64
72
  end
65
73
  end
66
74
 
75
+ def reprocess_without_delay!(*style_args)
76
+ @post_processing_with_delay = true
77
+ reprocess!(*style_args)
78
+ end
79
+
67
80
  end
68
81
  end
69
82
  end
@@ -9,16 +9,16 @@ module DelayedPaperclip
9
9
 
10
10
  def most_appropriate_url_with_processed
11
11
  if @attachment.original_filename.nil? || delayed_default_url?
12
- if @attachment.delayed_options.nil? || @attachment.delayed_options[:processing_image_url].nil?
12
+ if @attachment.delayed_options.nil? || @attachment.processing_image_url.nil? || !@attachment.processing?
13
13
  default_url
14
14
  else
15
- @attachment.delayed_options[:processing_image_url]
15
+ @attachment.processing_image_url
16
16
  end
17
17
  else
18
18
  @attachment_options[:url]
19
19
  end
20
20
  end
21
-
21
+
22
22
  def timestamp_possible_with_processed?
23
23
  if delayed_default_url?
24
24
  false
@@ -51,10 +51,13 @@ module DelayedPaperclip
51
51
  attachment_definitions[name][:delayed] = {}
52
52
  {
53
53
  :priority => 0,
54
+ :only_process => attachment_definitions[name][:only_process],
54
55
  :url_with_processing => DelayedPaperclip.options[:url_with_processing],
55
56
  :processing_image_url => options[:processing_image_url]
56
57
  }.each do |option, default|
58
+
57
59
  attachment_definitions[name][:delayed][option] = options.key?(option) ? options[option] : default
60
+
58
61
  end
59
62
 
60
63
  if respond_to?(:after_commit)
@@ -70,10 +73,10 @@ module DelayedPaperclip
70
73
  # setting each inididual NAME_processing to true, skipping the ActiveModel dirty setter
71
74
  # Then immediately push the state to the database
72
75
  def mark_enqueue_delayed_processing
73
- unless @_enqued_for_processing_with_processing.blank? # catches nil and empy arrays
76
+ unless @_enqued_for_processing_with_processing.blank? # catches nil and empty arrays
74
77
  updates = @_enqued_for_processing_with_processing.collect{|n| "#{n}_processing = :true" }.join(", ")
75
78
  updates = ActiveRecord::Base.send(:sanitize_sql_array, [updates, {:true => true}])
76
- self.class.update_all(updates, "id = #{self.id}")
79
+ self.class.where(:id => self.id).update_all(updates)
77
80
  end
78
81
  end
79
82
 
@@ -81,6 +84,7 @@ module DelayedPaperclip
81
84
  # then create
82
85
  def enqueue_delayed_processing
83
86
  mark_enqueue_delayed_processing
87
+
84
88
  (@_enqued_for_processing || []).each do |name|
85
89
  enqueue_post_processing_for(name)
86
90
  end
@@ -98,6 +102,7 @@ module DelayedPaperclip
98
102
  @_enqued_for_processing_with_processing ||= []
99
103
  @_enqued_for_processing_with_processing << name
100
104
  end
105
+
101
106
  @_enqued_for_processing ||= []
102
107
  @_enqued_for_processing << name
103
108
  end
@@ -110,6 +110,20 @@ module BaseDelayedPaperclipTest
110
110
  assert dummy.image.url.starts_with?("/system/dummies/images/000/000/001/original/12k.png")
111
111
  end
112
112
 
113
+ def test_unprocessed_processing_url_when_file
114
+ reset_dummy :with_processed => true, :processing_image_url => "processing"
115
+ dummy = Dummy.new(:image => File.open("#{RAILS_ROOT}/test/fixtures/12k.png"))
116
+ dummy.save!
117
+ assert dummy.reload.image.url.starts_with?("processing")
118
+ end
119
+
120
+ def test_processed_default_url_when_no_file
121
+ reset_dummy :with_processed => true, :processing_image_url => "processing"
122
+ dummy = Dummy.new()
123
+ dummy.save!
124
+ assert dummy.reload.image.url.starts_with?("/images/original/missing.png")
125
+ end
126
+
113
127
  def test_original_url_when_no_processing_column
114
128
  reset_dummy :with_processed => false
115
129
  dummy = Dummy.new(:image => File.open("#{RAILS_ROOT}/test/fixtures/12k.png"))
@@ -157,4 +171,66 @@ module BaseDelayedPaperclipTest
157
171
  dummy.name = "foobar123"
158
172
  end
159
173
 
174
+ def test_delayed_paperclip_functioning_with_only_process_option
175
+ reset_class "Dummy", :with_processed => true, :only_process => [:thumbnail]
176
+ Paperclip::Attachment.any_instance.expects(:reprocess!).with(:thumbnail)
177
+ dummy = Dummy.new(:image => File.open("#{RAILS_ROOT}/test/fixtures/12k.png"))
178
+ dummy.save!
179
+ process_jobs
180
+ end
181
+
182
+ def test_delayed_paperclip_functioning_with_paperclip_only_process_option
183
+ reset_class "Dummy", :with_processed => true, :paperclip => { :only_process => [:thumbnail] }
184
+ Paperclip::Attachment.any_instance.expects(:reprocess!).with(:thumbnail)
185
+ dummy = Dummy.new(:image => File.open("#{RAILS_ROOT}/test/fixtures/12k.png"))
186
+ dummy.save!
187
+ process_jobs
188
+ end
189
+
190
+ def test_delayed_paperclip_should_convert_image_formats
191
+ reset_class "Dummy", :with_processed => true, :paperclip => { :styles => {:thumbnail => ['12x12', :jpg]} }
192
+ dummy = Dummy.new(:image => File.open("#{RAILS_ROOT}/test/fixtures/12k.png"))
193
+ dummy.save!
194
+ process_jobs
195
+ assert dummy.reload.image.url(:thumbnail).starts_with?("/system/dummies/images/000/000/001/thumbnail/12k.jpg")
196
+ assert File.exists?("#{RAILS_ROOT}/public/system/dummies/images/000/000/001/thumbnail/12k.jpg")
197
+ end
198
+
199
+ def test_delayed_paperclip_without_delay
200
+ reset_class "Dummy", :with_processed => true, :paperclip => { :styles => {:thumbnail => ['12x12', :jpg]} }
201
+ dummy = Dummy.new(:image => File.open("#{RAILS_ROOT}/test/fixtures/12k.png"))
202
+ dummy.save!
203
+ existing_jobs_count = jobs_count
204
+ dummy.update_attribute(:image_processing, false)
205
+ dummy.image.reprocess_without_delay!(:thumbnail)
206
+ Paperclip::Attachment.any_instance.expects(:reprocess!).never
207
+ assert_equal existing_jobs_count, jobs_count
208
+ assert_equal false, dummy.image_processing?
209
+ assert File.exists?("#{RAILS_ROOT}/public/system/dummies/images/000/000/001/thumbnail/12k.jpg")
210
+ end
211
+
212
+ def test_unprocess_image_interpolates_reprocessing_url
213
+ reset_class "Dummy", :paperclip => { :styles => {:thumbnail => '12x12'} }
214
+ reset_dummy :processing_image_url => "/images/:style/processing.png"
215
+ dummy = Dummy.new(:image => File.open("#{RAILS_ROOT}/test/fixtures/12k.png"))
216
+ dummy.save!
217
+ assert dummy.image.url.starts_with?("/images/original/processing.png")
218
+ assert dummy.image.url(:thumbnail).starts_with?("/images/thumbnail/processing.png")
219
+ process_jobs
220
+ dummy.reload
221
+ assert dummy.image.url.starts_with?("/system/dummies/images/000/000/001/original/12k.png")
222
+ end
223
+
224
+ def test_unprocess_image_accepts_proc_for_reprocessing_url
225
+ reset_class "Dummy", :paperclip => { :styles => {:thumbnail => '12x12'} }
226
+ reset_dummy :processing_image_url => lambda { |attachment| attachment.instance.reprocessing_url }
227
+ Dummy.send(:define_method, :reprocessing_url) { 'done' }
228
+ dummy = Dummy.new(:image => File.open("#{RAILS_ROOT}/test/fixtures/12k.png"))
229
+ dummy.save!
230
+ assert dummy.image.url.starts_with?("done")
231
+ process_jobs
232
+ dummy.reload
233
+ assert dummy.image.url.starts_with?("/system/dummies/images/000/000/001/original/12k.png")
234
+ end
235
+
160
236
  end
@@ -39,6 +39,7 @@ class DelayedPaperclipTest < Test::Unit::TestCase
39
39
  table.datetime :locked_at # Set when a client is working on this object
40
40
  table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead)
41
41
  table.string :locked_by # Who is working on this object (if locked)
42
+ table.string :queue
42
43
  table.timestamps
43
44
  end
44
45
  end
data/test/test_helper.rb CHANGED
@@ -5,6 +5,8 @@ require 'active_record'
5
5
  require 'logger'
6
6
  require 'sqlite3'
7
7
  require 'paperclip/railtie'
8
+ require 'debugger'
9
+
8
10
  Paperclip::Railtie.insert
9
11
 
10
12
  ROOT = File.join(File.dirname(__FILE__), '..')
@@ -51,19 +53,22 @@ def build_dummy_table(with_processed)
51
53
  end
52
54
 
53
55
  def reset_class(class_name, options)
56
+ options[:paperclip] = {} if options[:paperclip].nil?
54
57
  ActiveRecord::Base.send(:include, Paperclip::Glue)
55
58
  Object.send(:remove_const, class_name) rescue nil
56
59
  klass = Object.const_set(class_name, Class.new(ActiveRecord::Base))
57
60
  klass.class_eval do
58
61
  include Paperclip::Glue
59
- has_attached_file :image
62
+ has_attached_file :image, options[:paperclip]
60
63
 
64
+ options.delete(:paperclip)
61
65
  process_in_background :image, options if options[:with_processed]
62
66
  after_update :reprocess if options[:with_after_update_callback]
63
67
 
64
68
  def reprocess
65
69
  image.reprocess!
66
70
  end
71
+
67
72
  end
68
73
  klass.reset_column_information
69
74
  klass
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: delayed_paperclip
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.1.0
4
+ version: 2.6.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-02-12 00:00:00.000000000 Z
14
+ date: 2013-07-02 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: paperclip
@@ -109,6 +109,22 @@ dependencies:
109
109
  - - ! '>='
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: debugger
114
+ requirement: !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ! '>='
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ! '>='
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
112
128
  description: Process your Paperclip attachments in the background with delayed_job,
113
129
  Resque or your own processor.
114
130
  email: james@jamesrgifford.com
@@ -120,21 +136,21 @@ files:
120
136
  - LICENSE
121
137
  - Rakefile
122
138
  - init.rb
123
- - lib/delayed_paperclip/railtie.rb
124
- - lib/delayed_paperclip/jobs/delayed_job.rb
139
+ - lib/delayed_paperclip.rb
140
+ - lib/delayed_paperclip/url_generator.rb
141
+ - lib/delayed_paperclip/attachment.rb
125
142
  - lib/delayed_paperclip/jobs/resque.rb
143
+ - lib/delayed_paperclip/jobs/delayed_job.rb
126
144
  - lib/delayed_paperclip/jobs/sidekiq.rb
127
- - lib/delayed_paperclip/attachment.rb
145
+ - lib/delayed_paperclip/railtie.rb
128
146
  - lib/delayed_paperclip/jobs.rb
129
- - lib/delayed_paperclip/url_generator.rb
130
- - lib/delayed_paperclip.rb
131
- - test/database.yml
132
- - test/sidekiq_paperclip.rb
133
- - test/delayed_paperclip_test.rb
134
147
  - test/resque_paperclip_test.rb
148
+ - test/delayed_paperclip_test.rb
149
+ - test/database.yml
150
+ - test/fixtures/12k.png
135
151
  - test/base_delayed_paperclip_test.rb
152
+ - test/sidekiq_paperclip.rb
136
153
  - test/test_helper.rb
137
- - test/fixtures/12k.png
138
154
  - rails/init.rb
139
155
  homepage: http://github.com/jrgifford/delayed_paperclip
140
156
  licenses: []
@@ -156,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
172
  version: '0'
157
173
  requirements: []
158
174
  rubyforge_project:
159
- rubygems_version: 1.8.25
175
+ rubygems_version: 1.8.23
160
176
  signing_key:
161
177
  specification_version: 3
162
178
  summary: Process your Paperclip attachments in the background.