delayed_paperclip 0.6.5 → 0.7.1

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/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
1
  *.log
2
2
  pkg/
3
3
  public/
4
+ Gemfile.lock
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm gemset use delayed_paperclip --create
data/CONTRIBUTING ADDED
@@ -0,0 +1,16 @@
1
+ Contributor Policy
2
+ =================
3
+
4
+ Commit bit. If you have a commit accepted into the project then you get full git access to the repo. If I don't give you this in a timely manner just send me a message.
5
+
6
+ Testing
7
+ ======
8
+
9
+ Please don't commit code without tests. You can bootstrap the development environment by running `bundle install`. After that, running `rake test` should just work. If it doesn't then file a bug.
10
+
11
+ Versioning
12
+ =========
13
+
14
+ Don't bump the version in any changes you make or pull in to the project. I'll maintain rights to push the gem to rubygems.org and make releases when appropriate.
15
+
16
+ And please keep the README up to date. Thank you!
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
data/README.textile CHANGED
@@ -88,4 +88,8 @@ AFAIK this library should work no matter what kind of post-processing you are do
88
88
 
89
89
  h2. Does it work with s3?
90
90
 
91
- Yes.
91
+ Yes.
92
+
93
+ h2. Contributing
94
+
95
+ Checkout out CONTRIBUTING for more info.
data/Rakefile CHANGED
@@ -1,51 +1,15 @@
1
1
  require 'rake'
2
2
  require 'rake/testtask'
3
- require 'rake/rdoctask'
4
3
 
5
4
  $LOAD_PATH << File.join(File.dirname(__FILE__), 'lib')
6
- require 'paperclip'
7
5
 
8
6
  desc 'Default: run unit tests.'
9
- task :default => [:clean, :test]
7
+ task :default => :test
10
8
 
11
9
  desc 'Test the paperclip plugin.'
12
10
  Rake::TestTask.new(:test) do |t|
13
- t.libs << 'lib'
11
+ t.libs << 'lib:test'
14
12
  t.pattern = 'test/**/*_test.rb'
15
13
  t.verbose = true
16
14
  end
17
15
 
18
- desc 'Generate documentation for the paperclip plugin.'
19
- Rake::RDocTask.new(:rdoc) do |rdoc|
20
- rdoc.rdoc_dir = 'doc'
21
- rdoc.title = 'Delayed::Paperclip'
22
- rdoc.options << '--line-numbers' << '--inline-source'
23
- rdoc.rdoc_files.include('README*')
24
- rdoc.rdoc_files.include('lib/**/*.rb')
25
- end
26
-
27
- desc 'Clean up files.'
28
- task :clean do |t|
29
- FileUtils.rm_rf "doc"
30
- FileUtils.rm_rf "tmp"
31
- FileUtils.rm_rf "pkg"
32
- FileUtils.rm "test/debug.log" rescue nil
33
- FileUtils.rm "test/paperclip.db" rescue nil
34
- Dir.glob("paperclip-*.gem").each{|f| FileUtils.rm f }
35
- end
36
-
37
- begin
38
- require 'jeweler'
39
- Jeweler::Tasks.new do |gemspec|
40
- gemspec.name = "delayed_paperclip"
41
- gemspec.summary = "Process your Paperclip attachments in the background with delayed_job."
42
- gemspec.description = "Process your Paperclip attachments in the background with delayed_job."
43
- gemspec.email = "jesse@jstorimer.com"
44
- gemspec.homepage = "http://github.com/jstorimer/delayed_paperclip"
45
- gemspec.authors = ["Jesse Storimer"]
46
- gemspec.add_dependency('paperclip', '>= 2.3.0')
47
- end
48
- Jeweler::GemcutterTasks.new
49
- rescue LoadError
50
- puts "Jeweler not available. Install it with: sudo gem install jeweler -s http://gemcutter.org"
51
- end
@@ -1,61 +1,21 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
- # -*- encoding: utf-8 -*-
5
-
6
1
  Gem::Specification.new do |s|
7
2
  s.name = %q{delayed_paperclip}
8
- s.version = "0.6.5"
3
+ s.version = "0.7.1"
9
4
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Jesse Storimer"]
12
- s.date = %q{2010-03-13}
13
- s.description = %q{Process your Paperclip attachments in the background with delayed_job.}
5
+ s.authors = ["Jesse Storimer", "Bert Goethals"]
6
+ s.summary = %q{Process your Paperclip attachments in the background.}
7
+ s.description = %q{Process your Paperclip attachments in the background with delayed_job, Resque or your own processor.}
14
8
  s.email = %q{jesse@jstorimer.com}
15
- s.extra_rdoc_files = [
16
- "LICENSE",
17
- "README.textile"
18
- ]
19
- s.files = [
20
- ".gitignore",
21
- "LICENSE",
22
- "README.textile",
23
- "Rakefile",
24
- "VERSION",
25
- "delayed_paperclip.gemspec",
26
- "lib/delayed/jobs/delayed_paperclip_job.rb",
27
- "lib/delayed/jobs/resque_paperclip_job.rb",
28
- "lib/delayed/paperclip.rb",
29
- "lib/delayed_paperclip.rb",
30
- "rails/init.rb",
31
- "test/database.yml",
32
- "test/delayed_paperclip_test.rb",
33
- "test/fixtures/12k.png",
34
- "test/resque_paperclip_test.rb",
35
- "test/test_helper.rb"
36
- ]
37
9
  s.homepage = %q{http://github.com/jstorimer/delayed_paperclip}
38
- s.rdoc_options = ["--charset=UTF-8"]
39
- s.require_paths = ["lib"]
40
- s.rubygems_version = %q{1.3.6}
41
- s.summary = %q{Process your Paperclip attachments in the background with delayed_job.}
42
- s.test_files = [
43
- "test/delayed_paperclip_test.rb",
44
- "test/resque_paperclip_test.rb",
45
- "test/test_helper.rb"
46
- ]
47
10
 
48
- if s.respond_to? :specification_version then
49
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
50
- s.specification_version = 3
11
+ s.files = `git ls-files`.split("\n")
12
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
13
+
14
+ s.add_runtime_dependency 'paperclip', ["~> 2.3.0"]
51
15
 
52
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
53
- s.add_runtime_dependency(%q<paperclip>, [">= 2.3.0"])
54
- else
55
- s.add_dependency(%q<paperclip>, [">= 2.3.0"])
56
- end
57
- else
58
- s.add_dependency(%q<paperclip>, [">= 2.3.0"])
59
- end
16
+ s.add_development_dependency 'mocha'
17
+ s.add_development_dependency 'sqlite3-ruby'
18
+ s.add_development_dependency 'delayed_job'
19
+ s.add_development_dependency 'resque'
60
20
  end
61
21
 
@@ -0,0 +1,17 @@
1
+ module DelayedPaperclip
2
+ module Jobs
3
+ class DelayedJob < Struct.new(:instance_klass, :instance_id, :attachment_name)
4
+
5
+ def self.enqueue_delayed_paperclip(instance_klass, instance_id, attachment_name)
6
+ ::Delayed::Job.enqueue(
7
+ new(instance_klass, instance_id, attachment_name),
8
+ :priority => instance_klass.constantize.attachment_definitions[attachment_name][:delayed][:priority].to_i
9
+ )
10
+ end
11
+
12
+ def perform
13
+ DelayedPaperclip.process_job(instance_klass, instance_id, attachment_name)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ module DelayedPaperclip
2
+ module Jobs
3
+ class Resque
4
+ @queue = :paperclip
5
+
6
+ def self.enqueue_delayed_paperclip(instance_klass, instance_id, attachment_name)
7
+ ::Resque.enqueue(self, instance_klass, instance_id, attachment_name)
8
+ end
9
+
10
+ def self.perform(instance_klass, instance_id, attachment_name)
11
+ DelayedPaperclip.process_job(instance_klass, instance_id, attachment_name)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,9 +1,156 @@
1
1
  require 'paperclip'
2
2
 
3
- require 'delayed/paperclip'
4
- require 'delayed/jobs/resque_paperclip_job'
5
- require 'delayed/jobs/delayed_paperclip_job'
3
+ require 'delayed_paperclip'
4
+ require 'delayed_paperclip/jobs/delayed_job'
5
+ require 'delayed_paperclip/jobs/resque'
6
+
7
+ module DelayedPaperclip
8
+
9
+ class << self
10
+
11
+ def options
12
+ options ||= {
13
+ :background_job_class => detect_background_task
14
+ }
15
+ end
16
+
17
+ def detect_background_task
18
+ return DelayedPaperclip::Jobs::DelayedJob if defined? ::Delayed::Job
19
+ return DelayedPaperclip::Jobs::Resque if defined? ::Resque
20
+ end
21
+
22
+ def processor
23
+ options[:background_job_class]
24
+ end
25
+
26
+ def enqueue(instance_klass, instance_id, attachment_name)
27
+ processor.enqueue_delayed_paperclip(instance_klass, instance_id, attachment_name)
28
+ end
29
+
30
+ def process_job(instance_klass, instance_id, attachment_name)
31
+ instance_klass.constantize.find(instance_id).
32
+ send(attachment_name).
33
+ process_delayed!
34
+ end
35
+
36
+ end
37
+
38
+ def self.included(base)
39
+ base.extend(ClassMethods)
40
+ end
41
+
42
+ module ClassMethods
43
+
44
+ def process_in_background(name, options = {})
45
+ include InstanceMethods
46
+
47
+ attachment_definitions[name][:delayed] = {}
48
+ attachment_definitions[name][:delayed][:priority] = options.key?(:priority) ? options[:priority] : 0
49
+
50
+ if respond_to?(:after_commit)
51
+ after_commit :enqueue_delayed_processing
52
+ else
53
+ after_save :enqueue_delayed_processing
54
+ end
55
+ end
56
+ end
57
+
58
+ module InstanceMethods
59
+
60
+ # setting each inididual NAME_processing to true, skipping the ActiveModel dirty setter
61
+ # Then immediately push the state to the database
62
+ def mark_enqueue_delayed_processing
63
+ processing = []
64
+ (@_enqued_for_processing || []).each do |name|
65
+ if self.attributes.has_key? "#{name}_processing"
66
+ write_attribute("#{name}_processing", true)
67
+ processing << name
68
+ end
69
+ end
70
+ self.class.update_all(processing.collect{|n| "#{n}_processing = 1" }.join(", "), "id = #{self.id}") unless processing.empty?
71
+ end
72
+
73
+ # First mark processing
74
+ # then create
75
+ def enqueue_delayed_processing
76
+ mark_enqueue_delayed_processing
77
+ (@_enqued_for_processing || []).each do |name|
78
+ enqueue_post_processing_for(name)
79
+ end
80
+ @_enqued_for_processing = []
81
+ end
82
+
83
+ def enqueue_post_processing_for name
84
+ DelayedPaperclip.enqueue(self.class.name, read_attribute(:id), name.to_sym)
85
+ end
86
+
87
+ def attachment_for name
88
+ @_paperclip_attachments ||= {}
89
+ @_paperclip_attachments[name] ||= ::Paperclip::Attachment.new(name, self, self.class.attachment_definitions[name]).tap do |a|
90
+ a.post_processing = false if self.class.attachment_definitions[name][:delayed]
91
+ end
92
+ end
93
+
94
+ def prepare_enqueueing_for name
95
+ @_enqued_for_processing ||= []
96
+ @_enqued_for_processing << name
97
+ end
98
+
99
+ end
100
+ end
101
+
102
+ module Paperclip
103
+ class Attachment
104
+ attr_accessor :job_is_processing
105
+
106
+ def save_with_prepare_enqueueing
107
+ was_dirty = @dirty
108
+ save_without_prepare_enqueueing.tap do
109
+ if delay_processing? && was_dirty
110
+ instance.prepare_enqueueing_for name
111
+ end
112
+ end
113
+ end
114
+ alias_method_chain :save, :prepare_enqueueing
115
+
116
+ def url_with_processed style = default_style, include_updated_timestamp = @use_timestamp
117
+ return url_without_processed style, include_updated_timestamp if job_is_processing
118
+
119
+ if !@instance.respond_to?(:"#{name}_processing?")
120
+ url_without_processed style, include_updated_timestamp
121
+ else
122
+ if !processing?
123
+ url_without_processed style, include_updated_timestamp
124
+ else
125
+ if dirty?
126
+ url_without_processed style, include_updated_timestamp
127
+ else
128
+ interpolate(@default_url, style)
129
+ end
130
+ end
131
+ end
132
+ end
133
+ alias_method_chain :url, :processed
134
+
135
+ def delay_processing?
136
+ !!@instance.class.attachment_definitions[@name][:delayed]
137
+ end
138
+
139
+ def processing?
140
+ @instance.send(:"#{@name}_processing?")
141
+ end
142
+
143
+ def process_delayed!
144
+ job_is_processing = true
145
+ reprocess!
146
+ job_is_processing = false
147
+ instance.update_attribute("#{name}_processing", false) if instance.attributes.has_key? "#{name}_processing"
148
+ end
149
+
150
+ end
151
+ end
152
+
6
153
 
7
154
  if Object.const_defined?("ActiveRecord")
8
- ActiveRecord::Base.send(:include, Delayed::Paperclip)
9
- end
155
+ ActiveRecord::Base.send(:include, DelayedPaperclip)
156
+ end
@@ -1,74 +1,69 @@
1
- require 'test/test_helper'
2
- gem 'delayed_job'
1
+ require 'test_helper'
3
2
  require 'delayed_job'
3
+ Delayed::Worker.backend = :active_record
4
4
 
5
5
  class DelayedPaperclipTest < Test::Unit::TestCase
6
6
  def setup
7
+ super
8
+
7
9
  build_delayed_jobs
8
10
  reset_dummy
9
11
  end
10
12
 
11
- def test_attachment_changed
12
- @dummy.stubs(:image_file_size_changed?).returns(false)
13
- @dummy.stubs(:image_file_name_changed?).returns(false)
14
- @dummy.stubs(:image_content_type_changed?).returns(false)
15
- @dummy.stubs(:image_updated_at_changed?).returns(false)
13
+ def test_normal_paperclip_functioning
14
+ build_dummy_table(false)
15
+ reset_class "Dummy", false
16
16
 
17
- assert !@dummy.image_changed?
18
- end
17
+ Paperclip::Attachment.any_instance.expects(:post_process)
19
18
 
20
- def test_attachment_changed_when_image_changes
21
- @dummy.stubs(:image_file_size_changed?).returns(true)
19
+ dummy = Dummy.new(:image => File.open("#{ROOT}/test/fixtures/12k.png"))
22
20
 
23
- assert @dummy.image_changed?
21
+ assert !dummy.image.delay_processing?
22
+ assert dummy.image.post_processing
23
+ assert dummy.save
24
+ assert File.exists?(dummy.image.path)
24
25
  end
25
26
 
26
- def test_before_post_process
27
- Dummy.expects(:before_image_post_process)
28
- @dummy_class.process_in_background :image
29
- end
27
+ def test_delayed_paperclip_functioning
28
+ build_dummy_table(false)
29
+ reset_class "Dummy", true
30
30
 
31
- def test_halt_processing_if_source_changed
32
- @dummy.stubs(:image_changed?).returns(true)
33
- assert !@dummy.halt_processing_for_image
34
- end
31
+ Paperclip::Attachment.any_instance.expects(:post_process).never
35
32
 
36
- def test_halt_processing_if_source_has_not_changed
37
- @dummy.stubs(:image_changed?).returns(false)
38
- assert_not_equal false, @dummy.halt_processing_for_image
39
- end
33
+ dummy = Dummy.new(:image => File.open("#{ROOT}/test/fixtures/12k.png"))
40
34
 
41
- def test_after_save
42
- Dummy.expects(:after_save)
43
- @dummy_class.process_in_background :image
35
+ assert dummy.image.delay_processing?
36
+ assert !dummy.image.post_processing
37
+ assert dummy.save
38
+ assert File.exists?(dummy.image.path)
44
39
  end
45
40
 
41
+
46
42
  def test_enqueue_job_if_source_changed
47
- @dummy.stubs(:image_changed?).returns(true)
43
+ @dummy.image = File.open("#{RAILS_ROOT}/test/fixtures/12k.png")
48
44
 
49
45
  original_job_count = Delayed::Job.count
50
- @dummy.enqueue_job_for_image
46
+ @dummy.save
51
47
 
52
48
  assert_equal original_job_count + 1, Delayed::Job.count
53
49
  end
54
50
 
55
51
  def test_perform_job
56
- @dummy.stubs(:image_changed?).returns(true)
52
+ @dummy.image = File.open("#{RAILS_ROOT}/test/fixtures/12k.png")
57
53
  Paperclip::Attachment.any_instance.expects(:reprocess!)
58
54
 
59
55
  @dummy.save!
60
56
  Delayed::Job.last.payload_object.perform
61
57
  end
62
-
58
+
63
59
  def test_processing_column_kept_intact
64
60
  @dummy = reset_dummy(true)
65
-
66
- @dummy.stubs(:image_changed?).returns(true)
61
+
67
62
  Paperclip::Attachment.any_instance.stubs(:reprocess!).raises(StandardError.new('oops'))
68
63
 
69
64
  @dummy.save!
70
65
  assert @dummy.image_processing?
71
- Delayed::Job.work_off
66
+ Delayed::Worker.new.work_off
72
67
  assert @dummy.reload.image_processing?
73
68
  end
74
69
 
@@ -78,11 +73,7 @@ class DelayedPaperclipTest < Test::Unit::TestCase
78
73
  Dummy.any_instance.expects(:done_processing)
79
74
 
80
75
  @dummy.save!
81
- DelayedPaperclipJob.new(@dummy.class.name, @dummy.id, :image).perform
82
- end
83
-
84
- def test_processed_method_returns_nil_if_column_does_not_exist
85
- assert_equal nil, @dummy.image_processed!
76
+ DelayedPaperclip::Jobs::DelayedJob.new(@dummy.class.name, @dummy.id, :image).perform
86
77
  end
87
78
 
88
79
  def test_processing_true_when_new_image_added
@@ -95,17 +86,17 @@ class DelayedPaperclipTest < Test::Unit::TestCase
95
86
  end
96
87
 
97
88
  def test_processed_true_when_delayed_jobs_completed
98
- @dummy = reset_dummy(true)
89
+ @dummy = reset_dummy(true)
99
90
  @dummy.save!
100
91
 
101
- Delayed::Job.work_off
92
+ Delayed::Worker.new.work_off
102
93
 
103
94
  @dummy.reload
104
95
  assert !@dummy.image_processing?
105
96
  end
106
97
 
107
98
  def test_unprocessed_image_returns_missing_url
108
- @dummy = reset_dummy(true)
99
+ @dummy = reset_dummy(true)
109
100
  @dummy.save!
110
101
 
111
102
  assert_equal "/images/original/missing.png", @dummy.image.url
@@ -114,31 +105,29 @@ class DelayedPaperclipTest < Test::Unit::TestCase
114
105
 
115
106
  @dummy.reload
116
107
  assert_match(/\/system\/images\/1\/original\/12k.png/, @dummy.image.url)
117
- end
118
-
108
+ end
109
+
119
110
  def test_original_url_when_no_processing_column
120
- @dummy = reset_dummy(false)
111
+ @dummy = reset_dummy(false)
121
112
  @dummy.save!
122
113
 
123
114
  assert_match(/\/system\/images\/1\/original\/12k.png/, @dummy.image.url)
124
- end
125
-
115
+ end
116
+
126
117
  def test_original_url_if_image_changed
127
- @dummy = reset_dummy(true)
128
- @dummy.image_processing!
129
- @dummy.image_content_type_will_change!
118
+ @dummy.image = File.open("#{RAILS_ROOT}/test/fixtures/12k.png")
119
+ @dummy.save!
130
120
 
131
121
  assert_match(/system\/images\/.*original.*/, @dummy.image.url)
132
122
  end
133
-
123
+
134
124
  def test_missing_url_if_image_hasnt_changed
135
- @dummy = reset_dummy(true)
136
- @dummy.image_processing!
137
- @dummy.stubs(:image_changed?).returns(false)
125
+ @dummy = reset_dummy(true)
126
+ @dummy.save!
138
127
 
139
128
  assert_match(/images\/.*missing.*/, @dummy.image.url)
140
129
  end
141
-
130
+
142
131
  def test_should_not_blow_up_if_dsl_unused
143
132
  reset_class "Dummy", false
144
133
  @dummy = Dummy.new(:image => File.open("#{RAILS_ROOT}/test/fixtures/12k.png"))
@@ -1,9 +1,11 @@
1
- require 'test/test_helper'
1
+ require 'test_helper'
2
2
  gem 'resque'
3
3
  require 'resque'
4
4
 
5
5
  class ResquePaperclipTest < Test::Unit::TestCase
6
6
  def setup
7
+ super
8
+
7
9
  # Make sure that we just test Resque in here
8
10
  Object.send(:remove_const, :Delayed) if defined? Delayed
9
11
 
@@ -12,42 +14,41 @@ class ResquePaperclipTest < Test::Unit::TestCase
12
14
  end
13
15
 
14
16
  def test_enqueue_job_if_source_changed
15
- @dummy.stubs(:image_changed?).returns(true)
17
+ @dummy.image = File.open("#{RAILS_ROOT}/test/fixtures/12k.png")
16
18
 
17
19
  original_job_count = Resque.size(:paperclip)
18
- @dummy.enqueue_job_for_image
20
+ @dummy.save
19
21
 
20
22
  assert_equal original_job_count + 1, Resque.size(:paperclip)
21
23
  end
22
24
 
23
25
  def test_perform_job
24
26
  Paperclip::Attachment.any_instance.expects(:reprocess!)
25
-
26
27
  @dummy.save!
27
- ResquePaperclipJob.perform(@dummy.class.name, @dummy.id, :image)
28
+ DelayedPaperclip::Jobs::Resque.perform(@dummy.class.name, @dummy.id, :image)
28
29
  end
29
30
 
30
31
  def test_after_callback_is_functional
31
32
  @dummy_class.send(:define_method, :done_processing) { puts 'done' }
32
- @dummy_class.after_image_post_process :done_processing
33
+ @dummy_class.after_image_post_process :done_processing
33
34
  Dummy.any_instance.expects(:done_processing)
34
35
 
35
36
  @dummy.save!
36
- ResquePaperclipJob.perform(@dummy.class.name, @dummy.id, :image)
37
+ DelayedPaperclip::Jobs::Resque.perform(@dummy.class.name, @dummy.id, :image)
37
38
  end
38
-
39
+
39
40
  def test_processing_column_kept_intact
40
41
  @dummy = reset_dummy(true)
41
-
42
- @dummy.stubs(:image_changed?).returns(true)
42
+
43
+ @dummy.image = File.open("#{RAILS_ROOT}/test/fixtures/12k.png")
43
44
  Paperclip::Attachment.any_instance.stubs(:reprocess!).raises(StandardError.new('oops'))
44
45
 
45
46
  @dummy.save!
46
- assert @dummy.image_processing?
47
-
47
+ assert @dummy.image_processing?, "image should be processing #{@dummy.inspect}"
48
+
48
49
  worker = Resque::Worker.new(:paperclip)
49
50
  worker.process
50
-
51
- assert @dummy.reload.image_processing?
51
+
52
+ assert @dummy.reload.image_processing?, "image should be processing"
52
53
  end
53
- end
54
+ end
data/test/test_helper.rb CHANGED
@@ -1,23 +1,25 @@
1
- require 'test/unit'
2
1
  require 'rubygems'
2
+ require 'test/unit'
3
3
  require 'mocha'
4
4
  require 'active_record'
5
+ require 'logger'
6
+ require 'sqlite3'
7
+ require 'paperclip/railtie'
8
+ Paperclip::Railtie.insert
5
9
 
6
10
  ROOT = File.join(File.dirname(__FILE__), '..')
7
11
  RAILS_ROOT = ROOT
8
- RAILS_ENV = "test"
9
-
10
12
  $LOAD_PATH << File.join(ROOT, 'lib')
11
- $LOAD_PATH << File.join(ROOT, 'lib', 'delayed', 'paperclip')
12
- $LOAD_PATH << File.join(ROOT, 'test')
13
-
14
- require File.join(ROOT, 'lib', 'delayed_paperclip.rb')
15
13
 
16
- require 'active_support'
17
- gem 'sqlite3-ruby'
14
+ require 'delayed_paperclip'
18
15
 
19
- gem 'paperclip'
20
- require 'paperclip'
16
+ class Test::Unit::TestCase
17
+ def setup
18
+ silence_warnings do
19
+ Object.const_set(:Rails, stub('Rails', :root => ROOT, :env => 'test'))
20
+ end
21
+ end
22
+ end
21
23
 
22
24
  FIXTURES_DIR = File.join(File.dirname(__FILE__), "fixtures")
23
25
  config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
@@ -29,7 +31,7 @@ def reset_dummy(with_processed = false)
29
31
 
30
32
  reset_class "Dummy"
31
33
 
32
- @dummy = Dummy.new(:image => File.open("#{RAILS_ROOT}/test/fixtures/12k.png"))
34
+ @dummy = Dummy.new(:image => File.open("#{ROOT}/test/fixtures/12k.png"))
33
35
  end
34
36
 
35
37
  def reset_class class_name, include_process = true
@@ -65,4 +67,4 @@ def build_delayed_jobs
65
67
  table.string :locked_by # Who is working on this object (if locked)
66
68
  table.timestamps
67
69
  end
68
- end
70
+ end
metadata CHANGED
@@ -1,56 +1,91 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: delayed_paperclip
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 6
8
- - 5
9
- version: 0.6.5
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.7.1
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Jesse Storimer
9
+ - Bert Goethals
13
10
  autorequire:
14
11
  bindir: bin
15
12
  cert_chain: []
16
-
17
- date: 2010-03-13 00:00:00 -05:00
13
+ date: 2011-07-27 00:00:00.000000000 +02:00
18
14
  default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
21
17
  name: paperclip
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 2
29
- - 3
30
- - 0
18
+ requirement: &2152759240 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
31
23
  version: 2.3.0
32
24
  type: :runtime
33
- version_requirements: *id001
34
- description: Process your Paperclip attachments in the background with delayed_job.
25
+ prerelease: false
26
+ version_requirements: *2152759240
27
+ - !ruby/object:Gem::Dependency
28
+ name: mocha
29
+ requirement: &2152758840 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: *2152758840
38
+ - !ruby/object:Gem::Dependency
39
+ name: sqlite3-ruby
40
+ requirement: &2152758380 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ type: :development
47
+ prerelease: false
48
+ version_requirements: *2152758380
49
+ - !ruby/object:Gem::Dependency
50
+ name: delayed_job
51
+ requirement: &2152757960 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: *2152757960
60
+ - !ruby/object:Gem::Dependency
61
+ name: resque
62
+ requirement: &2152757540 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: *2152757540
71
+ description: Process your Paperclip attachments in the background with delayed_job,
72
+ Resque or your own processor.
35
73
  email: jesse@jstorimer.com
36
74
  executables: []
37
-
38
75
  extensions: []
39
-
40
- extra_rdoc_files:
41
- - LICENSE
42
- - README.textile
43
- files:
76
+ extra_rdoc_files: []
77
+ files:
44
78
  - .gitignore
79
+ - .rvmrc
80
+ - CONTRIBUTING
81
+ - Gemfile
45
82
  - LICENSE
46
83
  - README.textile
47
84
  - Rakefile
48
- - VERSION
49
85
  - delayed_paperclip.gemspec
50
- - lib/delayed/jobs/delayed_paperclip_job.rb
51
- - lib/delayed/jobs/resque_paperclip_job.rb
52
- - lib/delayed/paperclip.rb
53
86
  - lib/delayed_paperclip.rb
87
+ - lib/delayed_paperclip/jobs/delayed_job.rb
88
+ - lib/delayed_paperclip/jobs/resque.rb
54
89
  - rails/init.rb
55
90
  - test/database.yml
56
91
  - test/delayed_paperclip_test.rb
@@ -60,34 +95,31 @@ files:
60
95
  has_rdoc: true
61
96
  homepage: http://github.com/jstorimer/delayed_paperclip
62
97
  licenses: []
63
-
64
98
  post_install_message:
65
- rdoc_options:
66
- - --charset=UTF-8
67
- require_paths:
99
+ rdoc_options: []
100
+ require_paths:
68
101
  - lib
69
- required_ruby_version: !ruby/object:Gem::Requirement
70
- requirements:
71
- - - ">="
72
- - !ruby/object:Gem::Version
73
- segments:
74
- - 0
75
- version: "0"
76
- required_rubygems_version: !ruby/object:Gem::Requirement
77
- requirements:
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- segments:
81
- - 0
82
- version: "0"
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ! '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ! '>='
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
83
114
  requirements: []
84
-
85
115
  rubyforge_project:
86
- rubygems_version: 1.3.6
116
+ rubygems_version: 1.6.2
87
117
  signing_key:
88
118
  specification_version: 3
89
- summary: Process your Paperclip attachments in the background with delayed_job.
90
- test_files:
119
+ summary: Process your Paperclip attachments in the background.
120
+ test_files:
121
+ - test/database.yml
91
122
  - test/delayed_paperclip_test.rb
123
+ - test/fixtures/12k.png
92
124
  - test/resque_paperclip_test.rb
93
125
  - test/test_helper.rb
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.6.5
@@ -1,19 +0,0 @@
1
- class DelayedPaperclipJob < Struct.new(:instance_klass, :instance_id, :attachment_name)
2
- def perform
3
- process_job do
4
- instance.send(attachment_name).reprocess!
5
- instance.send("#{attachment_name}_processed!")
6
- end
7
- end
8
-
9
- private
10
- def instance
11
- @instance ||= instance_klass.constantize.find(instance_id)
12
- end
13
-
14
- def process_job
15
- instance.send(attachment_name).job_is_processing = true
16
- yield
17
- instance.send(attachment_name).job_is_processing = false
18
- end
19
- end
@@ -1,19 +0,0 @@
1
- class ResquePaperclipJob
2
- @queue = :paperclip
3
-
4
- def self.perform(instance_klass, instance_id, attachment_name)
5
- instance = instance_klass.constantize.find(instance_id)
6
-
7
- process_job(instance, attachment_name) do
8
- instance.send(attachment_name).reprocess!
9
- instance.send("#{attachment_name}_processed!")
10
- end
11
- end
12
-
13
- private
14
- def self.process_job(instance, attachment_name)
15
- instance.send(attachment_name).job_is_processing = true
16
- yield
17
- instance.send(attachment_name).job_is_processing = false
18
- end
19
- end
@@ -1,108 +0,0 @@
1
- module Delayed
2
- module Paperclip
3
- def self.included(base)
4
- base.extend(ClassMethods)
5
- end
6
-
7
- module ClassMethods
8
- def process_in_background(name)
9
- include InstanceMethods
10
-
11
- define_method "#{name}_changed?" do
12
- attachment_has_changed?(name)
13
- end
14
-
15
- define_method "halt_processing_for_#{name}" do
16
- return unless self.send("#{name}_changed?")
17
-
18
- false # halts processing
19
- end
20
-
21
- define_method "enqueue_job_for_#{name}" do
22
- return unless self.send("#{name}_changed?")
23
-
24
- if delayed_job?
25
- Delayed::Job.enqueue DelayedPaperclipJob.new(self.class.name, read_attribute(:id), name.to_sym)
26
- elsif resque?
27
- Resque.enqueue(ResquePaperclipJob, self.class.name, read_attribute(:id), name.to_sym)
28
- end
29
- end
30
-
31
- define_method "#{name}_processed!" do
32
- return unless column_exists?(:"#{name}_processing")
33
- return unless self.send(:"#{name}_processing?")
34
-
35
- self.send("#{name}_processing=", false)
36
- self.save(false)
37
- end
38
-
39
- define_method "#{name}_processing!" do
40
- return unless column_exists?(:"#{name}_processing")
41
- return if self.send(:"#{name}_processing?")
42
- return unless self.send(:"#{name}_changed?")
43
-
44
- self.send("#{name}_processing=", true)
45
- end
46
-
47
- self.send("before_#{name}_post_process", :"halt_processing_for_#{name}")
48
-
49
- before_save :"#{name}_processing!"
50
- after_save :"enqueue_job_for_#{name}"
51
- end
52
- end
53
-
54
- module InstanceMethods
55
- PAPERCLIP_ATTRIBUTES = ['_file_size', '_file_name', '_content_type', '_updated_at']
56
-
57
- def attachment_has_changed?(name)
58
- PAPERCLIP_ATTRIBUTES.each do |attribute|
59
- full_attribute = "#{name}#{attribute}_changed?".to_sym
60
-
61
- next unless self.respond_to?(full_attribute)
62
- return true if self.send("#{name}#{attribute}_changed?")
63
- end
64
-
65
- false
66
- end
67
-
68
- def delayed_job?
69
- defined? Delayed::Job
70
- end
71
-
72
- def resque?
73
- defined? Resque
74
- end
75
-
76
- def column_exists?(column)
77
- self.class.columns_hash.has_key?(column.to_s)
78
- end
79
- end
80
- end
81
- end
82
-
83
- module Paperclip
84
- class Attachment
85
- attr_accessor :job_is_processing
86
-
87
- def url_with_processed style = default_style, include_updated_timestamp = true
88
- return url_without_processed style, include_updated_timestamp unless @instance.respond_to?(:column_exists?)
89
- return url_without_processed style, include_updated_timestamp if job_is_processing
90
-
91
- if !@instance.column_exists?(:"#{@name}_processing")
92
- url_without_processed style, include_updated_timestamp
93
- else
94
- if !@instance.send(:"#{@name}_processing?")
95
- url_without_processed style, include_updated_timestamp
96
- else
97
- if @instance.send(:"#{@name}_changed?")
98
- url_without_processed style, include_updated_timestamp
99
- else
100
- interpolate(@default_url, style)
101
- end
102
- end
103
- end
104
- end
105
-
106
- alias_method_chain :url, :processed
107
- end
108
- end