delayed_paperclip 0.6.5 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
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