topprospect-delayed_job 2.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.textile +210 -0
  3. data/contrib/delayed_job.monitrc +14 -0
  4. data/contrib/delayed_job_multiple.monitrc +23 -0
  5. data/lib/delayed/backend/active_record.rb +97 -0
  6. data/lib/delayed/backend/active_record.rb.orig +105 -0
  7. data/lib/delayed/backend/base.rb +85 -0
  8. data/lib/delayed/backend/couch_rest.rb +109 -0
  9. data/lib/delayed/backend/data_mapper.rb +121 -0
  10. data/lib/delayed/backend/mongo_mapper.rb +106 -0
  11. data/lib/delayed/command.rb +107 -0
  12. data/lib/delayed/message_sending.rb +45 -0
  13. data/lib/delayed/performable_method.rb +27 -0
  14. data/lib/delayed/railtie.rb +14 -0
  15. data/lib/delayed/recipes.rb +31 -0
  16. data/lib/delayed/tasks.rb +20 -0
  17. data/lib/delayed/tasks.rb.orig +26 -0
  18. data/lib/delayed/worker.rb +213 -0
  19. data/lib/delayed/worker.rb.orig +202 -0
  20. data/lib/delayed/yaml_ext.rb +40 -0
  21. data/lib/delayed_job.rb +15 -0
  22. data/lib/generators/delayed_job/delayed_job_generator.rb +34 -0
  23. data/lib/generators/delayed_job/templates/migration.rb +21 -0
  24. data/lib/generators/delayed_job/templates/script +5 -0
  25. data/recipes/delayed_job.rb +1 -0
  26. data/spec/autoloaded/clazz.rb +7 -0
  27. data/spec/autoloaded/struct.rb +7 -0
  28. data/spec/backend/active_record_job_spec.rb +54 -0
  29. data/spec/backend/couch_rest_job_spec.rb +15 -0
  30. data/spec/backend/data_mapper_job_spec.rb +16 -0
  31. data/spec/backend/mongo_mapper_job_spec.rb +94 -0
  32. data/spec/backend/shared_backend_spec.rb +280 -0
  33. data/spec/message_sending_spec.rb +51 -0
  34. data/spec/performable_method_spec.rb +48 -0
  35. data/spec/sample_jobs.rb +25 -0
  36. data/spec/setup/active_record.rb +54 -0
  37. data/spec/setup/couch_rest.rb +7 -0
  38. data/spec/setup/data_mapper.rb +8 -0
  39. data/spec/setup/mongo_mapper.rb +17 -0
  40. data/spec/spec_helper.rb +31 -0
  41. data/spec/worker_spec.rb +214 -0
  42. metadata +300 -0
@@ -0,0 +1,214 @@
1
+ require 'spec_helper'
2
+
3
+ describe Delayed::Worker do
4
+ def job_create(opts = {})
5
+ Delayed::Job.create(opts.merge(:payload_object => SimpleJob.new))
6
+ end
7
+
8
+ describe "backend=" do
9
+ before do
10
+ @clazz = Class.new
11
+ Delayed::Worker.backend = @clazz
12
+ end
13
+
14
+ it "should set the Delayed::Job constant to the backend" do
15
+ Delayed::Job.should == @clazz
16
+ end
17
+
18
+ it "should set backend with a symbol" do
19
+ Delayed::Worker.backend = :active_record
20
+ Delayed::Worker.backend.should == Delayed::Backend::ActiveRecord::Job
21
+ end
22
+ end
23
+
24
+ BACKENDS.each do |backend|
25
+ describe "with the #{backend} backend" do
26
+ before do
27
+ Delayed::Worker.backend = backend
28
+ Delayed::Job.delete_all
29
+
30
+ @worker = Delayed::Worker.new(:max_priority => nil, :min_priority => nil, :quiet => true)
31
+
32
+ SimpleJob.runs = 0
33
+ end
34
+
35
+ describe "running a job" do
36
+ it "should fail after Worker.max_run_time" do
37
+ begin
38
+ old_max_run_time = Delayed::Worker.max_run_time
39
+ Delayed::Worker.max_run_time = 1.second
40
+ @job = Delayed::Job.create :payload_object => LongRunningJob.new
41
+ @worker.run(@job)
42
+ @job.reload.last_error.should =~ /expired/
43
+ @job.attempts.should == 1
44
+ ensure
45
+ Delayed::Worker.max_run_time = old_max_run_time
46
+ end
47
+ end
48
+ end
49
+
50
+ context "worker prioritization" do
51
+ before(:each) do
52
+ @worker = Delayed::Worker.new(:max_priority => 5, :min_priority => -5, :quiet => true)
53
+ end
54
+
55
+ it "should only work_off jobs that are >= min_priority" do
56
+ job_create(:priority => -10)
57
+ job_create(:priority => 0)
58
+ @worker.work_off
59
+
60
+ SimpleJob.runs.should == 1
61
+ end
62
+
63
+ it "should only work_off jobs that are <= max_priority" do
64
+ job_create(:priority => 10)
65
+ job_create(:priority => 0)
66
+
67
+ @worker.work_off
68
+
69
+ SimpleJob.runs.should == 1
70
+ end
71
+ end
72
+
73
+ context "while running with locked and expired jobs" do
74
+ before(:each) do
75
+ @worker.name = 'worker1'
76
+ end
77
+
78
+ it "should not run jobs locked by another worker" do
79
+ job_create(:locked_by => 'other_worker', :locked_at => (Delayed::Job.db_time_now - 1.minutes))
80
+ lambda { @worker.work_off }.should_not change { SimpleJob.runs }
81
+ end
82
+
83
+ it "should run open jobs" do
84
+ job_create
85
+ lambda { @worker.work_off }.should change { SimpleJob.runs }.from(0).to(1)
86
+ end
87
+
88
+ it "should run expired jobs" do
89
+ expired_time = Delayed::Job.db_time_now - (1.minutes + Delayed::Worker.max_run_time)
90
+ job_create(:locked_by => 'other_worker', :locked_at => expired_time)
91
+ lambda { @worker.work_off }.should change { SimpleJob.runs }.from(0).to(1)
92
+ end
93
+
94
+ it "should run own jobs" do
95
+ job_create(:locked_by => @worker.name, :locked_at => (Delayed::Job.db_time_now - 1.minutes))
96
+ lambda { @worker.work_off }.should change { SimpleJob.runs }.from(0).to(1)
97
+ end
98
+ end
99
+
100
+ describe "failed jobs" do
101
+ before do
102
+ # reset defaults
103
+ Delayed::Worker.destroy_failed_jobs = true
104
+ Delayed::Worker.max_attempts = 25
105
+
106
+ @job = Delayed::Job.enqueue ErrorJob.new
107
+ end
108
+
109
+ it "should record last_error when destroy_failed_jobs = false, max_attempts = 1" do
110
+ Delayed::Worker.destroy_failed_jobs = false
111
+ Delayed::Worker.max_attempts = 1
112
+ @worker.run(@job)
113
+ @job.reload
114
+ @job.last_error.should =~ /did not work/
115
+ @job.last_error.should =~ /worker_spec.rb/
116
+ @job.attempts.should == 1
117
+ @job.failed_at.should_not be_nil
118
+ end
119
+
120
+ it "should re-schedule jobs after failing" do
121
+ @worker.run(@job)
122
+ @job.reload
123
+ @job.last_error.should =~ /did not work/
124
+ @job.last_error.should =~ /sample_jobs.rb:8:in `perform'/
125
+ @job.attempts.should == 1
126
+ @job.run_at.should > Delayed::Job.db_time_now - 10.minutes
127
+ @job.run_at.should < Delayed::Job.db_time_now + 10.minutes
128
+ end
129
+ end
130
+
131
+ context "reschedule" do
132
+ before do
133
+ @job = Delayed::Job.create :payload_object => SimpleJob.new
134
+ end
135
+
136
+ share_examples_for "any failure more than Worker.max_attempts times" do
137
+ context "when the job's payload has an #on_permanent_failure hook" do
138
+ before do
139
+ @job = Delayed::Job.create :payload_object => OnPermanentFailureJob.new
140
+ @job.payload_object.should respond_to :on_permanent_failure
141
+ end
142
+
143
+ it "should run that hook" do
144
+ @job.payload_object.should_receive :on_permanent_failure
145
+ Delayed::Worker.max_attempts.times { @worker.reschedule(@job) }
146
+ end
147
+ end
148
+
149
+ context "when the job's payload has no #on_permanent_failure hook" do
150
+ # It's a little tricky to test this in a straightforward way,
151
+ # because putting a should_not_receive expectation on
152
+ # @job.payload_object.on_permanent_failure makes that object
153
+ # incorrectly return true to
154
+ # payload_object.respond_to? :on_permanent_failure, which is what
155
+ # reschedule uses to decide whether to call on_permanent_failure.
156
+ # So instead, we just make sure that the payload_object as it
157
+ # already stands doesn't respond_to? on_permanent_failure, then
158
+ # shove it through the iterated reschedule loop and make sure we
159
+ # don't get a NoMethodError (caused by calling that nonexistent
160
+ # on_permanent_failure method).
161
+
162
+ before do
163
+ @job.payload_object.should_not respond_to(:on_permanent_failure)
164
+ end
165
+
166
+ it "should not try to run that hook" do
167
+ lambda do
168
+ Delayed::Worker.max_attempts.times { @worker.reschedule(@job) }
169
+ end.should_not raise_exception(NoMethodError)
170
+ end
171
+ end
172
+ end
173
+
174
+ context "and we want to destroy jobs" do
175
+ before do
176
+ Delayed::Worker.destroy_failed_jobs = true
177
+ end
178
+
179
+ it_should_behave_like "any failure more than Worker.max_attempts times"
180
+
181
+ it "should be destroyed if it failed more than Worker.max_attempts times" do
182
+ @job.should_receive(:destroy)
183
+ Delayed::Worker.max_attempts.times { @worker.reschedule(@job) }
184
+ end
185
+
186
+ it "should not be destroyed if failed fewer than Worker.max_attempts times" do
187
+ @job.should_not_receive(:destroy)
188
+ (Delayed::Worker.max_attempts - 1).times { @worker.reschedule(@job) }
189
+ end
190
+ end
191
+
192
+ context "and we don't want to destroy jobs" do
193
+ before do
194
+ Delayed::Worker.destroy_failed_jobs = false
195
+ end
196
+
197
+ it_should_behave_like "any failure more than Worker.max_attempts times"
198
+
199
+ it "should be failed if it failed more than Worker.max_attempts times" do
200
+ @job.reload.failed_at.should == nil
201
+ Delayed::Worker.max_attempts.times { @worker.reschedule(@job) }
202
+ @job.reload.failed_at.should_not == nil
203
+ end
204
+
205
+ it "should not be failed if it failed fewer than Worker.max_attempts times" do
206
+ (Delayed::Worker.max_attempts - 1).times { @worker.reschedule(@job) }
207
+ @job.reload.failed_at.should == nil
208
+ end
209
+ end
210
+ end
211
+ end
212
+ end
213
+
214
+ end
metadata ADDED
@@ -0,0 +1,300 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: topprospect-delayed_job
3
+ version: !ruby/object:Gem::Version
4
+ hash: 5
5
+ prerelease:
6
+ segments:
7
+ - 2
8
+ - 0
9
+ - 5
10
+ version: 2.0.5
11
+ platform: ruby
12
+ authors:
13
+ - Chris Gaffney
14
+ - Brandon Keepers
15
+ - "Tobias L\xC3\xBCtke"
16
+ autorequire:
17
+ bindir: bin
18
+ cert_chain: []
19
+
20
+ date: 2011-07-26 00:00:00 -07:00
21
+ default_executable:
22
+ dependencies:
23
+ - !ruby/object:Gem::Dependency
24
+ name: daemons
25
+ prerelease: false
26
+ requirement: &id001 !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ hash: 3
32
+ segments:
33
+ - 0
34
+ version: "0"
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - <
44
+ - !ruby/object:Gem::Version
45
+ hash: 3
46
+ segments:
47
+ - 2
48
+ - 0
49
+ version: "2.0"
50
+ type: :development
51
+ version_requirements: *id002
52
+ - !ruby/object:Gem::Dependency
53
+ name: rake
54
+ prerelease: false
55
+ requirement: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ hash: 3
61
+ segments:
62
+ - 0
63
+ version: "0"
64
+ type: :development
65
+ version_requirements: *id003
66
+ - !ruby/object:Gem::Dependency
67
+ name: sqlite3
68
+ prerelease: false
69
+ requirement: &id004 !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ hash: 3
75
+ segments:
76
+ - 0
77
+ version: "0"
78
+ type: :development
79
+ version_requirements: *id004
80
+ - !ruby/object:Gem::Dependency
81
+ name: mysql
82
+ prerelease: false
83
+ requirement: &id005 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ hash: 3
89
+ segments:
90
+ - 0
91
+ version: "0"
92
+ type: :development
93
+ version_requirements: *id005
94
+ - !ruby/object:Gem::Dependency
95
+ name: mongo_mapper
96
+ prerelease: false
97
+ requirement: &id006 !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ hash: 3
103
+ segments:
104
+ - 0
105
+ version: "0"
106
+ type: :development
107
+ version_requirements: *id006
108
+ - !ruby/object:Gem::Dependency
109
+ name: dm-core
110
+ prerelease: false
111
+ requirement: &id007 !ruby/object:Gem::Requirement
112
+ none: false
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ hash: 3
117
+ segments:
118
+ - 0
119
+ version: "0"
120
+ type: :development
121
+ version_requirements: *id007
122
+ - !ruby/object:Gem::Dependency
123
+ name: dm-observer
124
+ prerelease: false
125
+ requirement: &id008 !ruby/object:Gem::Requirement
126
+ none: false
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ hash: 3
131
+ segments:
132
+ - 0
133
+ version: "0"
134
+ type: :development
135
+ version_requirements: *id008
136
+ - !ruby/object:Gem::Dependency
137
+ name: dm-aggregates
138
+ prerelease: false
139
+ requirement: &id009 !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ hash: 3
145
+ segments:
146
+ - 0
147
+ version: "0"
148
+ type: :development
149
+ version_requirements: *id009
150
+ - !ruby/object:Gem::Dependency
151
+ name: dm-validations
152
+ prerelease: false
153
+ requirement: &id010 !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ hash: 3
159
+ segments:
160
+ - 0
161
+ version: "0"
162
+ type: :development
163
+ version_requirements: *id010
164
+ - !ruby/object:Gem::Dependency
165
+ name: do_sqlite3
166
+ prerelease: false
167
+ requirement: &id011 !ruby/object:Gem::Requirement
168
+ none: false
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ hash: 3
173
+ segments:
174
+ - 0
175
+ version: "0"
176
+ type: :development
177
+ version_requirements: *id011
178
+ - !ruby/object:Gem::Dependency
179
+ name: database_cleaner
180
+ prerelease: false
181
+ requirement: &id012 !ruby/object:Gem::Requirement
182
+ none: false
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ hash: 3
187
+ segments:
188
+ - 0
189
+ version: "0"
190
+ type: :development
191
+ version_requirements: *id012
192
+ description: |-
193
+ Delayed_job (or DJ) encapsulates the common pattern of asynchronously executing longer tasks in the background. It is a direct extraction from Shopify where the job table is responsible for a multitude of core tasks.
194
+
195
+ This gem is collectiveidea's fork (http://github.com/collectiveidea/delayed_job).
196
+ email:
197
+ - chris@collectiveidea.com
198
+ - brandon@opensoul.org
199
+ executables: []
200
+
201
+ extensions: []
202
+
203
+ extra_rdoc_files:
204
+ - README.textile
205
+ files:
206
+ - contrib/delayed_job.monitrc
207
+ - contrib/delayed_job_multiple.monitrc
208
+ - lib/delayed/backend/active_record.rb
209
+ - lib/delayed/backend/active_record.rb.orig
210
+ - lib/delayed/backend/base.rb
211
+ - lib/delayed/backend/couch_rest.rb
212
+ - lib/delayed/backend/data_mapper.rb
213
+ - lib/delayed/backend/mongo_mapper.rb
214
+ - lib/delayed/command.rb
215
+ - lib/delayed/message_sending.rb
216
+ - lib/delayed/performable_method.rb
217
+ - lib/delayed/railtie.rb
218
+ - lib/delayed/recipes.rb
219
+ - lib/delayed/tasks.rb
220
+ - lib/delayed/tasks.rb.orig
221
+ - lib/delayed/worker.rb
222
+ - lib/delayed/worker.rb.orig
223
+ - lib/delayed/yaml_ext.rb
224
+ - lib/delayed_job.rb
225
+ - lib/generators/delayed_job/delayed_job_generator.rb
226
+ - lib/generators/delayed_job/templates/migration.rb
227
+ - lib/generators/delayed_job/templates/script
228
+ - recipes/delayed_job.rb
229
+ - spec/autoloaded/clazz.rb
230
+ - spec/autoloaded/struct.rb
231
+ - spec/backend/active_record_job_spec.rb
232
+ - spec/backend/couch_rest_job_spec.rb
233
+ - spec/backend/data_mapper_job_spec.rb
234
+ - spec/backend/mongo_mapper_job_spec.rb
235
+ - spec/backend/shared_backend_spec.rb
236
+ - spec/message_sending_spec.rb
237
+ - spec/performable_method_spec.rb
238
+ - spec/sample_jobs.rb
239
+ - spec/setup/active_record.rb
240
+ - spec/setup/couch_rest.rb
241
+ - spec/setup/data_mapper.rb
242
+ - spec/setup/mongo_mapper.rb
243
+ - spec/spec_helper.rb
244
+ - spec/worker_spec.rb
245
+ - MIT-LICENSE
246
+ - README.textile
247
+ has_rdoc: true
248
+ homepage: http://github.com/collectiveidea/delayed_job
249
+ licenses: []
250
+
251
+ post_install_message:
252
+ rdoc_options:
253
+ - --main
254
+ - README.textile
255
+ - --inline-source
256
+ - --line-numbers
257
+ require_paths:
258
+ - lib
259
+ required_ruby_version: !ruby/object:Gem::Requirement
260
+ none: false
261
+ requirements:
262
+ - - ">="
263
+ - !ruby/object:Gem::Version
264
+ hash: 3
265
+ segments:
266
+ - 0
267
+ version: "0"
268
+ required_rubygems_version: !ruby/object:Gem::Requirement
269
+ none: false
270
+ requirements:
271
+ - - ">="
272
+ - !ruby/object:Gem::Version
273
+ hash: 3
274
+ segments:
275
+ - 0
276
+ version: "0"
277
+ requirements: []
278
+
279
+ rubyforge_project:
280
+ rubygems_version: 1.5.2
281
+ signing_key:
282
+ specification_version: 3
283
+ summary: Database-backed asynchronous priority queue system -- Extracted from Shopify
284
+ test_files:
285
+ - spec/autoloaded/clazz.rb
286
+ - spec/autoloaded/struct.rb
287
+ - spec/backend/active_record_job_spec.rb
288
+ - spec/backend/couch_rest_job_spec.rb
289
+ - spec/backend/data_mapper_job_spec.rb
290
+ - spec/backend/mongo_mapper_job_spec.rb
291
+ - spec/backend/shared_backend_spec.rb
292
+ - spec/message_sending_spec.rb
293
+ - spec/performable_method_spec.rb
294
+ - spec/sample_jobs.rb
295
+ - spec/setup/active_record.rb
296
+ - spec/setup/couch_rest.rb
297
+ - spec/setup/data_mapper.rb
298
+ - spec/setup/mongo_mapper.rb
299
+ - spec/spec_helper.rb
300
+ - spec/worker_spec.rb