steini-resque 1.18.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/HISTORY.md +322 -0
  2. data/LICENSE +20 -0
  3. data/README.markdown +881 -0
  4. data/Rakefile +78 -0
  5. data/bin/resque +81 -0
  6. data/bin/resque-web +23 -0
  7. data/lib/resque.rb +352 -0
  8. data/lib/resque/errors.rb +10 -0
  9. data/lib/resque/failure.rb +70 -0
  10. data/lib/resque/failure/base.rb +64 -0
  11. data/lib/resque/failure/hoptoad.rb +48 -0
  12. data/lib/resque/failure/multiple.rb +54 -0
  13. data/lib/resque/failure/redis.rb +51 -0
  14. data/lib/resque/helpers.rb +63 -0
  15. data/lib/resque/job.rb +205 -0
  16. data/lib/resque/plugin.rb +56 -0
  17. data/lib/resque/server.rb +231 -0
  18. data/lib/resque/server/public/favicon.ico +0 -0
  19. data/lib/resque/server/public/idle.png +0 -0
  20. data/lib/resque/server/public/jquery-1.3.2.min.js +19 -0
  21. data/lib/resque/server/public/jquery.relatize_date.js +95 -0
  22. data/lib/resque/server/public/poll.png +0 -0
  23. data/lib/resque/server/public/ranger.js +73 -0
  24. data/lib/resque/server/public/reset.css +48 -0
  25. data/lib/resque/server/public/style.css +85 -0
  26. data/lib/resque/server/public/working.png +0 -0
  27. data/lib/resque/server/test_helper.rb +19 -0
  28. data/lib/resque/server/views/error.erb +1 -0
  29. data/lib/resque/server/views/failed.erb +64 -0
  30. data/lib/resque/server/views/key_sets.erb +19 -0
  31. data/lib/resque/server/views/key_string.erb +11 -0
  32. data/lib/resque/server/views/layout.erb +44 -0
  33. data/lib/resque/server/views/next_more.erb +10 -0
  34. data/lib/resque/server/views/overview.erb +4 -0
  35. data/lib/resque/server/views/queues.erb +49 -0
  36. data/lib/resque/server/views/stats.erb +62 -0
  37. data/lib/resque/server/views/workers.erb +109 -0
  38. data/lib/resque/server/views/working.erb +72 -0
  39. data/lib/resque/stat.rb +53 -0
  40. data/lib/resque/tasks.rb +51 -0
  41. data/lib/resque/version.rb +3 -0
  42. data/lib/resque/worker.rb +533 -0
  43. data/lib/tasks/redis.rake +161 -0
  44. data/lib/tasks/resque.rake +2 -0
  45. data/test/hoptoad_test.rb +25 -0
  46. data/test/job_hooks_test.rb +363 -0
  47. data/test/job_plugins_test.rb +230 -0
  48. data/test/plugin_test.rb +116 -0
  49. data/test/redis-test.conf +115 -0
  50. data/test/resque-web_test.rb +53 -0
  51. data/test/resque_test.rb +259 -0
  52. data/test/test_helper.rb +148 -0
  53. data/test/worker_test.rb +332 -0
  54. metadata +183 -0
@@ -0,0 +1,332 @@
1
+ require 'test_helper'
2
+
3
+ context "Resque::Worker" do
4
+ setup do
5
+ Resque.redis.flushall
6
+
7
+ Resque.before_first_fork = nil
8
+ Resque.before_fork = nil
9
+ Resque.after_fork = nil
10
+
11
+ @worker = Resque::Worker.new(:jobs)
12
+ Resque::Job.create(:jobs, SomeJob, 20, '/tmp')
13
+ end
14
+
15
+ test "can fail jobs" do
16
+ Resque::Job.create(:jobs, BadJob)
17
+ @worker.work(0)
18
+ assert_equal 1, Resque::Failure.count
19
+ end
20
+
21
+ test "failed jobs report exception and message" do
22
+ Resque::Job.create(:jobs, BadJobWithSyntaxError)
23
+ @worker.work(0)
24
+ assert_equal('SyntaxError', Resque::Failure.all['exception'])
25
+ assert_equal('Extra Bad job!', Resque::Failure.all['error'])
26
+ end
27
+
28
+ test "does not allow exceptions from failure backend to escape" do
29
+ job = Resque::Job.new(:jobs, {})
30
+ with_failure_backend BadFailureBackend do
31
+ @worker.perform job
32
+ end
33
+ end
34
+
35
+ test "fails uncompleted jobs on exit" do
36
+ job = Resque::Job.new(:jobs, [GoodJob, "blah"])
37
+ @worker.working_on(job)
38
+ @worker.unregister_worker
39
+ assert_equal 1, Resque::Failure.count
40
+ end
41
+
42
+ test "can peek at failed jobs" do
43
+ 10.times { Resque::Job.create(:jobs, BadJob) }
44
+ @worker.work(0)
45
+ assert_equal 10, Resque::Failure.count
46
+
47
+ assert_equal 10, Resque::Failure.all(0, 20).size
48
+ end
49
+
50
+ test "can clear failed jobs" do
51
+ Resque::Job.create(:jobs, BadJob)
52
+ @worker.work(0)
53
+ assert_equal 1, Resque::Failure.count
54
+ Resque::Failure.clear
55
+ assert_equal 0, Resque::Failure.count
56
+ end
57
+
58
+ test "catches exceptional jobs" do
59
+ Resque::Job.create(:jobs, BadJob)
60
+ Resque::Job.create(:jobs, BadJob)
61
+ @worker.process
62
+ @worker.process
63
+ @worker.process
64
+ assert_equal 2, Resque::Failure.count
65
+ end
66
+
67
+ test "strips whitespace from queue names" do
68
+ queues = "critical, high, low".split(',')
69
+ worker = Resque::Worker.new(*queues)
70
+ assert_equal %w( critical high low ), worker.queues
71
+ end
72
+
73
+ test "can work on multiple queues" do
74
+ Resque::Job.create(:high, GoodJob)
75
+ Resque::Job.create(:critical, GoodJob)
76
+
77
+ worker = Resque::Worker.new(:critical, :high)
78
+
79
+ worker.process
80
+ assert_equal 1, Resque.size(:high)
81
+ assert_equal 0, Resque.size(:critical)
82
+
83
+ worker.process
84
+ assert_equal 0, Resque.size(:high)
85
+ end
86
+
87
+ test "can work on all queues" do
88
+ Resque::Job.create(:high, GoodJob)
89
+ Resque::Job.create(:critical, GoodJob)
90
+ Resque::Job.create(:blahblah, GoodJob)
91
+
92
+ worker = Resque::Worker.new("*")
93
+
94
+ worker.work(0)
95
+ assert_equal 0, Resque.size(:high)
96
+ assert_equal 0, Resque.size(:critical)
97
+ assert_equal 0, Resque.size(:blahblah)
98
+ end
99
+
100
+ test "processes * queues in alphabetical order" do
101
+ Resque::Job.create(:high, GoodJob)
102
+ Resque::Job.create(:critical, GoodJob)
103
+ Resque::Job.create(:blahblah, GoodJob)
104
+
105
+ worker = Resque::Worker.new("*")
106
+ processed_queues = []
107
+
108
+ worker.work(0) do |job|
109
+ processed_queues << job.queue
110
+ end
111
+
112
+ assert_equal %w( jobs high critical blahblah ).sort, processed_queues
113
+ end
114
+
115
+ test "has a unique id" do
116
+ assert_equal "#{`hostname`.chomp}:#{$$}:jobs", @worker.to_s
117
+ end
118
+
119
+ test "complains if no queues are given" do
120
+ assert_raise Resque::NoQueueError do
121
+ Resque::Worker.new
122
+ end
123
+ end
124
+
125
+ test "fails if a job class has no `perform` method" do
126
+ worker = Resque::Worker.new(:perform_less)
127
+ Resque::Job.create(:perform_less, Object)
128
+
129
+ assert_equal 0, Resque::Failure.count
130
+ worker.work(0)
131
+ assert_equal 1, Resque::Failure.count
132
+ end
133
+
134
+ test "inserts itself into the 'workers' list on startup" do
135
+ @worker.work(0) do
136
+ assert_equal @worker, Resque.workers[0]
137
+ end
138
+ end
139
+
140
+ test "removes itself from the 'workers' list on shutdown" do
141
+ @worker.work(0) do
142
+ assert_equal @worker, Resque.workers[0]
143
+ end
144
+
145
+ assert_equal [], Resque.workers
146
+ end
147
+
148
+ test "removes worker with stringified id" do
149
+ @worker.work(0) do
150
+ worker_id = Resque.workers[0].to_s
151
+ Resque.remove_worker(worker_id)
152
+ assert_equal [], Resque.workers
153
+ end
154
+ end
155
+
156
+ test "records what it is working on" do
157
+ @worker.work(0) do
158
+ task = @worker.job
159
+ assert_equal({"args"=>[20, "/tmp"], "class"=>"SomeJob"}, task['payload'])
160
+ assert task['run_at']
161
+ assert_equal 'jobs', task['queue']
162
+ end
163
+ end
164
+
165
+ test "clears its status when not working on anything" do
166
+ @worker.work(0)
167
+ assert_equal Hash.new, @worker.job
168
+ end
169
+
170
+ test "knows when it is working" do
171
+ @worker.work(0) do
172
+ assert @worker.working?
173
+ end
174
+ end
175
+
176
+ test "knows when it is idle" do
177
+ @worker.work(0)
178
+ assert @worker.idle?
179
+ end
180
+
181
+ test "knows who is working" do
182
+ @worker.work(0) do
183
+ assert_equal [@worker], Resque.working
184
+ end
185
+ end
186
+
187
+ test "keeps track of how many jobs it has processed" do
188
+ Resque::Job.create(:jobs, BadJob)
189
+ Resque::Job.create(:jobs, BadJob)
190
+
191
+ 3.times do
192
+ job = @worker.reserve
193
+ @worker.process job
194
+ end
195
+ assert_equal 3, @worker.processed
196
+ end
197
+
198
+ test "keeps track of how many failures it has seen" do
199
+ Resque::Job.create(:jobs, BadJob)
200
+ Resque::Job.create(:jobs, BadJob)
201
+
202
+ 3.times do
203
+ job = @worker.reserve
204
+ @worker.process job
205
+ end
206
+ assert_equal 2, @worker.failed
207
+ end
208
+
209
+ test "stats are erased when the worker goes away" do
210
+ @worker.work(0)
211
+ assert_equal 0, @worker.processed
212
+ assert_equal 0, @worker.failed
213
+ end
214
+
215
+ test "knows when it started" do
216
+ time = Time.now
217
+ @worker.work(0) do
218
+ assert_equal time.to_s, @worker.started.to_s
219
+ end
220
+ end
221
+
222
+ test "knows whether it exists or not" do
223
+ @worker.work(0) do
224
+ assert Resque::Worker.exists?(@worker)
225
+ assert !Resque::Worker.exists?('blah-blah')
226
+ end
227
+ end
228
+
229
+ test "sets $0 while working" do
230
+ @worker.work(0) do
231
+ ver = Resque::Version
232
+ assert_equal "resque-#{ver}: Processing jobs since #{Time.now.to_i}", $0
233
+ end
234
+ end
235
+
236
+ test "can be found" do
237
+ @worker.work(0) do
238
+ found = Resque::Worker.find(@worker.to_s)
239
+ assert_equal @worker.to_s, found.to_s
240
+ assert found.working?
241
+ assert_equal @worker.job, found.job
242
+ end
243
+ end
244
+
245
+ test "doesn't find fakes" do
246
+ @worker.work(0) do
247
+ found = Resque::Worker.find('blah-blah')
248
+ assert_equal nil, found
249
+ end
250
+ end
251
+
252
+ test "cleans up dead worker info on start (crash recovery)" do
253
+ # first we fake out two dead workers
254
+ workerA = Resque::Worker.new(:jobs)
255
+ workerA.instance_variable_set(:@to_s, "#{`hostname`.chomp}:1:jobs")
256
+ workerA.register_worker
257
+
258
+ workerB = Resque::Worker.new(:high, :low)
259
+ workerB.instance_variable_set(:@to_s, "#{`hostname`.chomp}:2:high,low")
260
+ workerB.register_worker
261
+
262
+ assert_equal 2, Resque.workers.size
263
+
264
+ # then we prune them
265
+ @worker.work(0) do
266
+ assert_equal 1, Resque.workers.size
267
+ end
268
+ end
269
+
270
+ test "Processed jobs count" do
271
+ @worker.work(0)
272
+ assert_equal 1, Resque.info[:processed]
273
+ end
274
+
275
+ test "Will call a before_first_fork hook only once" do
276
+ Resque.redis.flushall
277
+ $BEFORE_FORK_CALLED = 0
278
+ Resque.before_first_fork = Proc.new { $BEFORE_FORK_CALLED += 1 }
279
+ workerA = Resque::Worker.new(:jobs)
280
+ Resque::Job.create(:jobs, SomeJob, 20, '/tmp')
281
+
282
+ assert_equal 0, $BEFORE_FORK_CALLED
283
+
284
+ workerA.work(0)
285
+ assert_equal 1, $BEFORE_FORK_CALLED
286
+
287
+ # TODO: Verify it's only run once. Not easy.
288
+ # workerA.work(0)
289
+ # assert_equal 1, $BEFORE_FORK_CALLED
290
+ end
291
+
292
+ test "Will call a before_fork hook before forking" do
293
+ Resque.redis.flushall
294
+ $BEFORE_FORK_CALLED = false
295
+ Resque.before_fork = Proc.new { $BEFORE_FORK_CALLED = true }
296
+ workerA = Resque::Worker.new(:jobs)
297
+
298
+ assert !$BEFORE_FORK_CALLED
299
+ Resque::Job.create(:jobs, SomeJob, 20, '/tmp')
300
+ workerA.work(0)
301
+ assert $BEFORE_FORK_CALLED
302
+ end
303
+
304
+ test "very verbose works in the afternoon" do
305
+ require 'time'
306
+ $last_puts = ""
307
+ $fake_time = Time.parse("15:44:33 2011-03-02")
308
+ singleton = class << @worker; self end
309
+ singleton.send :define_method, :puts, lambda { |thing| $last_puts = thing }
310
+
311
+ @worker.very_verbose = true
312
+ @worker.log("some log text")
313
+
314
+ assert_match /\*\* \[15:44:33 2011-03-02\] \d+: some log text/, $last_puts
315
+ end
316
+
317
+ test "Will call an after_fork hook after forking" do
318
+ Resque.redis.flushall
319
+ $AFTER_FORK_CALLED = false
320
+ Resque.after_fork = Proc.new { $AFTER_FORK_CALLED = true }
321
+ workerA = Resque::Worker.new(:jobs)
322
+
323
+ assert !$AFTER_FORK_CALLED
324
+ Resque::Job.create(:jobs, SomeJob, 20, '/tmp')
325
+ workerA.work(0)
326
+ assert $AFTER_FORK_CALLED
327
+ end
328
+
329
+ test "returns PID of running process" do
330
+ assert_equal @worker.to_s.split(":")[1].to_i, @worker.pid
331
+ end
332
+ end
metadata ADDED
@@ -0,0 +1,183 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: steini-resque
3
+ version: !ruby/object:Gem::Version
4
+ hash: 85
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 18
9
+ - 5
10
+ version: 1.18.5
11
+ platform: ruby
12
+ authors:
13
+ - Chris Wanstrath
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-08-30 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: redis-namespace
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ hash: 19
30
+ segments:
31
+ - 1
32
+ - 0
33
+ - 2
34
+ version: 1.0.2
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: vegas
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ hash: 31
46
+ segments:
47
+ - 0
48
+ - 1
49
+ - 2
50
+ version: 0.1.2
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: sinatra
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 63
62
+ segments:
63
+ - 0
64
+ - 9
65
+ - 2
66
+ version: 0.9.2
67
+ type: :runtime
68
+ version_requirements: *id003
69
+ - !ruby/object:Gem::Dependency
70
+ name: multi_json
71
+ prerelease: false
72
+ requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ hash: 15
78
+ segments:
79
+ - 1
80
+ - 0
81
+ version: "1.0"
82
+ type: :runtime
83
+ version_requirements: *id004
84
+ description: " Resque is a Redis-backed Ruby library for creating background jobs,\n placing those jobs on multiple queues, and processing them later.\n\n Background jobs can be any Ruby class or module that responds to\n perform. Your existing classes can easily be converted to background\n jobs or you can create new classes specifically to do work. Or, you\n can do both.\n\n Resque is heavily inspired by DelayedJob (which rocks) and is\n comprised of three parts:\n\n * A Ruby library for creating, querying, and processing jobs\n * A Rake task for starting a worker which processes jobs\n * A Sinatra app for monitoring queues, jobs, and workers.\n"
85
+ email: chris@ozmm.org
86
+ executables:
87
+ - resque
88
+ - resque-web
89
+ extensions: []
90
+
91
+ extra_rdoc_files:
92
+ - LICENSE
93
+ - README.markdown
94
+ files:
95
+ - README.markdown
96
+ - Rakefile
97
+ - LICENSE
98
+ - HISTORY.md
99
+ - lib/tasks/resque.rake
100
+ - lib/tasks/redis.rake
101
+ - lib/resque/stat.rb
102
+ - lib/resque/errors.rb
103
+ - lib/resque/version.rb
104
+ - lib/resque/plugin.rb
105
+ - lib/resque/failure/multiple.rb
106
+ - lib/resque/failure/redis.rb
107
+ - lib/resque/failure/hoptoad.rb
108
+ - lib/resque/failure/base.rb
109
+ - lib/resque/job.rb
110
+ - lib/resque/tasks.rb
111
+ - lib/resque/server/test_helper.rb
112
+ - lib/resque/server/public/poll.png
113
+ - lib/resque/server/public/jquery.relatize_date.js
114
+ - lib/resque/server/public/reset.css
115
+ - lib/resque/server/public/idle.png
116
+ - lib/resque/server/public/jquery-1.3.2.min.js
117
+ - lib/resque/server/public/favicon.ico
118
+ - lib/resque/server/public/working.png
119
+ - lib/resque/server/public/ranger.js
120
+ - lib/resque/server/public/style.css
121
+ - lib/resque/server/views/stats.erb
122
+ - lib/resque/server/views/key_string.erb
123
+ - lib/resque/server/views/workers.erb
124
+ - lib/resque/server/views/next_more.erb
125
+ - lib/resque/server/views/key_sets.erb
126
+ - lib/resque/server/views/working.erb
127
+ - lib/resque/server/views/overview.erb
128
+ - lib/resque/server/views/queues.erb
129
+ - lib/resque/server/views/failed.erb
130
+ - lib/resque/server/views/error.erb
131
+ - lib/resque/server/views/layout.erb
132
+ - lib/resque/worker.rb
133
+ - lib/resque/helpers.rb
134
+ - lib/resque/failure.rb
135
+ - lib/resque/server.rb
136
+ - lib/resque.rb
137
+ - bin/resque
138
+ - bin/resque-web
139
+ - test/test_helper.rb
140
+ - test/job_hooks_test.rb
141
+ - test/hoptoad_test.rb
142
+ - test/redis-test.conf
143
+ - test/worker_test.rb
144
+ - test/resque-web_test.rb
145
+ - test/resque_test.rb
146
+ - test/plugin_test.rb
147
+ - test/job_plugins_test.rb
148
+ has_rdoc: true
149
+ homepage: http://github.com/defunkt/resque
150
+ licenses: []
151
+
152
+ post_install_message:
153
+ rdoc_options:
154
+ - --charset=UTF-8
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ none: false
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ hash: 3
163
+ segments:
164
+ - 0
165
+ version: "0"
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
+ none: false
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ hash: 3
172
+ segments:
173
+ - 0
174
+ version: "0"
175
+ requirements: []
176
+
177
+ rubyforge_project:
178
+ rubygems_version: 1.3.7
179
+ signing_key:
180
+ specification_version: 3
181
+ summary: Resque is a Redis-backed queueing system.
182
+ test_files: []
183
+