delayed_paperclip 2.5.0.1 → 2.5.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.
@@ -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.