delayed_paperclip 2.5.0.1 → 2.5.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -60,12 +60,12 @@ To have the missing image url be outputted by paperclip while the image is being
60
60
  def self.up
61
61
  add_column :users, :avatar_processing, :boolean
62
62
  end
63
-
63
+
64
64
  def self.down
65
65
  remove_column :users, :avatar_processing
66
66
  end
67
67
  end
68
-
68
+
69
69
  @user = User.new(:avatar => File.new(...))
70
70
  @user.save
71
71
  @user.avatar.url #=> "/images/original/missing.png"
@@ -75,6 +75,30 @@ To have the missing image url be outputted by paperclip while the image is being
75
75
  @user.avatar.url #=> "/system/images/3/original/IMG_2772.JPG?1267562148"
76
76
  </code></pre>
77
77
 
78
+ h4. Custom image for processing
79
+
80
+ This is useful if you have a difference between missing images and images currently
81
+ being processed.
82
+
83
+ <pre><code>
84
+
85
+ class User < ActiveRecord::Base
86
+ has_attached_file :avatar
87
+
88
+ process_in_background :avatar, :processing_image_url => "/images/original/processing.jpg"
89
+ end
90
+
91
+ @user = User.new(:avatar => File.new(...))
92
+ @user.save
93
+ @user.avatar.url #=> "/images/original/processing.png"
94
+ Delayed::Worker.new.work_off
95
+
96
+ @user.reload
97
+ @user.avatar.url #=> "/system/images/3/original/IMG_2772.JPG?1267562148"
98
+
99
+ </code></pre>
100
+
101
+
78
102
  h2. What if I'm not using images?
79
103
 
80
104
  This library works no matter what kind of post-processing you are doing with Paperclip.
@@ -10,13 +10,15 @@ module DelayedPaperclip
10
10
  def options
11
11
  @options ||= {
12
12
  :background_job_class => detect_background_task,
13
- :url_with_processing => true
13
+ :url_with_processing => true,
14
+ :processing_image_url => nil
14
15
  }
15
16
  end
16
17
 
17
18
  def detect_background_task
18
19
  return DelayedPaperclip::Jobs::DelayedJob if defined? ::Delayed::Job
19
20
  return DelayedPaperclip::Jobs::Resque if defined? ::Resque
21
+ return DelayedPaperclip::Jobs::Sidekiq if defined? ::Sidekiq
20
22
  end
21
23
 
22
24
  def processor
@@ -49,7 +51,8 @@ module DelayedPaperclip
49
51
  attachment_definitions[name][:delayed] = {}
50
52
  {
51
53
  :priority => 0,
52
- :url_with_processing => DelayedPaperclip.options[:url_with_processing]
54
+ :url_with_processing => DelayedPaperclip.options[:url_with_processing],
55
+ :processing_image_url => options[:processing_image_url]
53
56
  }.each do |option, default|
54
57
  attachment_definitions[name][:delayed][option] = options.key?(option) ? options[option] : default
55
58
  end
@@ -2,5 +2,6 @@ module DelayedPaperclip
2
2
  module Jobs
3
3
  autoload :DelayedJob, 'delayed_paperclip/jobs/delayed_job'
4
4
  autoload :Resque, 'delayed_paperclip/jobs/resque'
5
+ autoload :Sidekiq, 'delayed_paperclip/jobs/sidekiq'
5
6
  end
6
7
  end
@@ -0,0 +1,18 @@
1
+ require 'sidekiq/worker'
2
+
3
+ module DelayedPaperclip
4
+ module Jobs
5
+ class Sidekiq
6
+ include ::Sidekiq::Worker
7
+ sidekiq_options :queue => :paperclip
8
+
9
+ def self.enqueue_delayed_paperclip(instance_klass, instance_id, attachment_name)
10
+ perform_async(instance_klass, instance_id, attachment_name)
11
+ end
12
+
13
+ def perform(instance_klass, instance_id, attachment_name)
14
+ DelayedPaperclip.process_job(instance_klass, instance_id, attachment_name)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -4,13 +4,26 @@ module DelayedPaperclip
4
4
  def self.included(base)
5
5
  base.send :include, InstanceMethods
6
6
  base.alias_method_chain :most_appropriate_url, :processed
7
+ base.alias_method_chain :timestamp_possible?, :processed
7
8
  end
8
9
 
9
10
  def most_appropriate_url_with_processed
10
11
  if @attachment.original_filename.nil? || delayed_default_url?
11
- default_url
12
+ if @attachment.delayed_options.nil? || @attachment.delayed_options[:processing_image_url].nil?
13
+ default_url
14
+ else
15
+ @attachment.delayed_options[:processing_image_url]
16
+ end
12
17
  else
13
- @attachment_options[:url]
18
+ @attachment_options[:url]
19
+ end
20
+ end
21
+
22
+ def timestamp_possible_with_processed?
23
+ if delayed_default_url?
24
+ false
25
+ else
26
+ timestamp_possible_without_processed?
14
27
  end
15
28
  end
16
29
 
@@ -73,11 +73,20 @@ module BaseDelayedPaperclipTest
73
73
  def test_unprocessed_image_returns_missing_url
74
74
  dummy = Dummy.new(:image => File.open("#{RAILS_ROOT}/test/fixtures/12k.png"))
75
75
  dummy.save!
76
- #assert_equal "/images/original/missing.png", dummy.image.url(:original, :timestamp => true)
77
- dummy.image.url.starts_with?("/images/original/missing.png")
76
+ assert dummy.image.url.starts_with?("/images/original/missing.png")
78
77
  process_jobs
79
78
  dummy.reload
80
- dummy.image.url.starts_with?("/system/images/1/original/12k.png")
79
+ assert dummy.image.url.starts_with?("/system/dummies/images/000/000/001/original/12k.png")
80
+ end
81
+
82
+ def test_unprocess_image_returns_reprocessing_url
83
+ reset_dummy :processing_image_url => "/images/original/processing.png"
84
+ dummy = Dummy.new(:image => File.open("#{RAILS_ROOT}/test/fixtures/12k.png"))
85
+ dummy.save!
86
+ assert dummy.image.url.starts_with?("/images/original/processing.png")
87
+ process_jobs
88
+ dummy.reload
89
+ assert dummy.image.url.starts_with?("/system/dummies/images/000/000/001/original/12k.png")
81
90
  end
82
91
 
83
92
  def test_unprocessed_image_not_returning_missing_url_if_turned_of_globally
@@ -85,27 +94,27 @@ module BaseDelayedPaperclipTest
85
94
  reset_dummy :with_processed => false
86
95
  dummy = Dummy.new(:image => File.open("#{RAILS_ROOT}/test/fixtures/12k.png"))
87
96
  dummy.save!
88
- dummy.image.url.starts_with?("/system/images/1/original/12k.png")
97
+ assert dummy.image.url.starts_with?("/system/dummies/images/000/000/001/original/12k.png")
89
98
  process_jobs
90
99
  dummy.reload
91
- dummy.image.url.starts_with?("/system/images/1/original/12k.png")
100
+ assert dummy.image.url.starts_with?("/system/dummies/images/000/000/001/original/12k.png")
92
101
  end
93
102
 
94
103
  def test_unprocessed_image_not_returning_missing_url_if_turned_of_on_instance
95
104
  reset_dummy :with_processed => false, :url_with_processing => false
96
105
  dummy = Dummy.new(:image => File.open("#{RAILS_ROOT}/test/fixtures/12k.png"))
97
106
  dummy.save!
98
- dummy.image.url.starts_with?("/system/images/1/original/12k.png")
107
+ assert dummy.image.url.starts_with?("/system/dummies/images/000/000/001/original/12k.png")
99
108
  process_jobs
100
109
  dummy.reload
101
- dummy.image.url.starts_with?("/system/images/1/original/12k.png")
110
+ assert dummy.image.url.starts_with?("/system/dummies/images/000/000/001/original/12k.png")
102
111
  end
103
112
 
104
113
  def test_original_url_when_no_processing_column
105
114
  reset_dummy :with_processed => false
106
115
  dummy = Dummy.new(:image => File.open("#{RAILS_ROOT}/test/fixtures/12k.png"))
107
116
  dummy.save!
108
- dummy.image.url.starts_with?("/system/images/1/original/12k.png")
117
+ assert dummy.reload.image.url.starts_with?("/system/dummies/images/000/000/001/original/12k.png")
109
118
  end
110
119
 
111
120
  def test_original_url_if_image_changed
@@ -113,9 +122,9 @@ module BaseDelayedPaperclipTest
113
122
  dummy.save!
114
123
  dummy.image = File.open("#{RAILS_ROOT}/test/fixtures/12k.png")
115
124
  dummy.save!
116
- dummy.image.url.starts_with?("/images/original/missing.png")
125
+ assert dummy.image.url.starts_with?("/images/original/missing.png")
117
126
  process_jobs
118
- dummy.image.url.starts_with?("/system/images/1/original/12k.png")
127
+ assert dummy.reload.image.url.starts_with?("/system/dummies/images/000/000/001/original/12k.png")
119
128
  end
120
129
 
121
130
  def test_missing_url_if_image_hasnt_changed
@@ -0,0 +1,39 @@
1
+ require 'test_helper'
2
+ require 'base_delayed_paperclip_test'
3
+ require 'sidekiq'
4
+
5
+ class SidekiqPaperclipTest < Test::Unit::TestCase
6
+ include BaseDelayedPaperclipTest
7
+
8
+ def setup
9
+ super
10
+ # Make sure that we just test Sidekiq in here
11
+ DelayedPaperclip.options[:background_job_class] = DelayedPaperclip::Jobs::Sidekiq
12
+ Sidekiq::Queue.new(:paperclip).clear
13
+ end
14
+
15
+ def process_jobs
16
+ Sidekiq::Queue.new(:paperclip).each do |job|
17
+ worker = job.klass.constantize.new
18
+ args = job.args
19
+ begin
20
+ worker.perform(*args)
21
+ rescue # Assume sidekiq handle exception properly
22
+ end
23
+ job.delete
24
+ end
25
+ end
26
+
27
+ def jobs_count
28
+ Sidekiq::Queue.new(:paperclip).size
29
+ end
30
+
31
+ def test_perform_job
32
+ dummy = Dummy.new(:image => File.open("#{RAILS_ROOT}/test/fixtures/12k.png"))
33
+ dummy.image = File.open("#{RAILS_ROOT}/test/fixtures/12k.png")
34
+ Paperclip::Attachment.any_instance.expects(:reprocess!)
35
+ dummy.save!
36
+ DelayedPaperclip::Jobs::Sidekiq.new.perform(dummy.class.name, dummy.id, :image)
37
+ end
38
+
39
+ end
@@ -57,6 +57,7 @@ def reset_class(class_name, options)
57
57
  klass.class_eval do
58
58
  include Paperclip::Glue
59
59
  has_attached_file :image
60
+
60
61
  process_in_background :image, options if options[:with_processed]
61
62
  after_update :reprocess if options[:with_after_update_callback]
62
63
 
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.0.1
4
+ version: 2.5.1.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: 2012-11-05 00:00:00.000000000 Z
14
+ date: 2013-02-12 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: paperclip
@@ -93,6 +93,22 @@ dependencies:
93
93
  - - ! '>='
94
94
  - !ruby/object:Gem::Version
95
95
  version: '0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: sidekiq
98
+ requirement: !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
96
112
  description: Process your Paperclip attachments in the background with delayed_job,
97
113
  Resque or your own processor.
98
114
  email: james@jamesrgifford.com
@@ -104,19 +120,21 @@ files:
104
120
  - LICENSE
105
121
  - Rakefile
106
122
  - init.rb
107
- - lib/delayed_paperclip.rb
108
123
  - lib/delayed_paperclip/railtie.rb
109
- - lib/delayed_paperclip/attachment.rb
110
- - lib/delayed_paperclip/url_generator.rb
111
- - lib/delayed_paperclip/jobs/resque.rb
112
124
  - lib/delayed_paperclip/jobs/delayed_job.rb
125
+ - lib/delayed_paperclip/jobs/resque.rb
126
+ - lib/delayed_paperclip/jobs/sidekiq.rb
127
+ - lib/delayed_paperclip/attachment.rb
113
128
  - 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
+ - test/resque_paperclip_test.rb
114
135
  - test/base_delayed_paperclip_test.rb
115
136
  - test/test_helper.rb
116
137
  - test/fixtures/12k.png
117
- - test/delayed_paperclip_test.rb
118
- - test/database.yml
119
- - test/resque_paperclip_test.rb
120
138
  - rails/init.rb
121
139
  homepage: http://github.com/jrgifford/delayed_paperclip
122
140
  licenses: []
@@ -138,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
156
  version: '0'
139
157
  requirements: []
140
158
  rubyforge_project:
141
- rubygems_version: 1.8.24
159
+ rubygems_version: 1.8.25
142
160
  signing_key:
143
161
  specification_version: 3
144
162
  summary: Process your Paperclip attachments in the background.