resque-mongo 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/.gitignore +3 -0
  2. data/.kick +26 -0
  3. data/CONTRIBUTORS +14 -0
  4. data/HISTORY.md +53 -0
  5. data/LICENSE +20 -0
  6. data/README.markdown +755 -0
  7. data/Rakefile +65 -0
  8. data/bin/resque +57 -0
  9. data/bin/resque-web +18 -0
  10. data/config.ru +14 -0
  11. data/deps.rip +8 -0
  12. data/examples/async_helper.rb +31 -0
  13. data/examples/demo/README.markdown +71 -0
  14. data/examples/demo/Rakefile +3 -0
  15. data/examples/demo/app.rb +27 -0
  16. data/examples/demo/config.ru +19 -0
  17. data/examples/demo/job.rb +12 -0
  18. data/examples/god/resque.god +52 -0
  19. data/examples/god/stale.god +26 -0
  20. data/examples/instance.rb +11 -0
  21. data/examples/simple.rb +30 -0
  22. data/init.rb +1 -0
  23. data/lib/resque.rb +224 -0
  24. data/lib/resque/errors.rb +7 -0
  25. data/lib/resque/failure.rb +63 -0
  26. data/lib/resque/failure/base.rb +58 -0
  27. data/lib/resque/failure/hoptoad.rb +88 -0
  28. data/lib/resque/failure/mongo.rb +32 -0
  29. data/lib/resque/helpers.rb +65 -0
  30. data/lib/resque/job.rb +103 -0
  31. data/lib/resque/server.rb +182 -0
  32. data/lib/resque/server/public/idle.png +0 -0
  33. data/lib/resque/server/public/jquery-1.3.2.min.js +19 -0
  34. data/lib/resque/server/public/jquery.relatize_date.js +95 -0
  35. data/lib/resque/server/public/poll.png +0 -0
  36. data/lib/resque/server/public/ranger.js +24 -0
  37. data/lib/resque/server/public/reset.css +48 -0
  38. data/lib/resque/server/public/style.css +75 -0
  39. data/lib/resque/server/public/working.png +0 -0
  40. data/lib/resque/server/views/error.erb +1 -0
  41. data/lib/resque/server/views/failed.erb +35 -0
  42. data/lib/resque/server/views/key.erb +17 -0
  43. data/lib/resque/server/views/layout.erb +38 -0
  44. data/lib/resque/server/views/next_more.erb +10 -0
  45. data/lib/resque/server/views/overview.erb +4 -0
  46. data/lib/resque/server/views/queues.erb +46 -0
  47. data/lib/resque/server/views/stats.erb +62 -0
  48. data/lib/resque/server/views/workers.erb +78 -0
  49. data/lib/resque/server/views/working.erb +67 -0
  50. data/lib/resque/stat.rb +55 -0
  51. data/lib/resque/tasks.rb +39 -0
  52. data/lib/resque/version.rb +3 -0
  53. data/lib/resque/worker.rb +415 -0
  54. data/tasks/redis.rake +133 -0
  55. data/tasks/resque.rake +2 -0
  56. data/test/dump.rdb +0 -0
  57. data/test/redis-test.conf +132 -0
  58. data/test/resque_test.rb +191 -0
  59. data/test/test_helper.rb +87 -0
  60. data/test/worker_test.rb +229 -0
  61. metadata +162 -0
@@ -0,0 +1,87 @@
1
+ dir = File.dirname(File.expand_path(__FILE__))
2
+ $LOAD_PATH.unshift dir + '/../lib'
3
+ $TESTING = true
4
+ require 'test/unit'
5
+ require 'rubygems'
6
+ require 'resque'
7
+
8
+
9
+ #
10
+ # make sure we can run redis
11
+ #
12
+
13
+ # if !system("which redis-server")
14
+ # puts '', "** can't find `redis-server` in your path"
15
+ # puts "** try running `sudo rake install`"
16
+ # abort ''
17
+ # end
18
+
19
+
20
+ #
21
+ # start our own redis when the tests start,
22
+ # kill it when they end
23
+ #
24
+
25
+ at_exit do
26
+ next if $!
27
+
28
+ if defined?(MiniTest)
29
+ exit_code = MiniTest::Unit.new.run(ARGV)
30
+ else
31
+ exit_code = Test::Unit::AutoRunner.run
32
+ end
33
+ end
34
+
35
+ Resque.mongo = 'localhost:27017'
36
+
37
+ ##
38
+ # test/spec/mini 3
39
+ # http://gist.github.com/25455
40
+ # chris@ozmm.org
41
+ #
42
+ def context(*args, &block)
43
+ return super unless (name = args.first) && block
44
+ require 'test/unit'
45
+ klass = Class.new(defined?(ActiveSupport::TestCase) ? ActiveSupport::TestCase : Test::Unit::TestCase) do
46
+ def self.test(name, &block)
47
+ define_method("test_#{name.gsub(/\W/,'_')}", &block) if block
48
+ end
49
+ def self.xtest(*args) end
50
+ def self.setup(&block) define_method(:setup, &block) end
51
+ def self.teardown(&block) define_method(:teardown, &block) end
52
+ end
53
+ (class << klass; self end).send(:define_method, :name) { name.gsub(/\W/,'_') }
54
+ klass.class_eval &block
55
+ end
56
+
57
+
58
+ #
59
+ # fixture classes
60
+ #
61
+
62
+ class SomeJob
63
+ def self.perform(repo_id, path)
64
+ end
65
+ end
66
+
67
+ class SomeIvarJob < SomeJob
68
+ @queue = :ivar
69
+ end
70
+
71
+ class SomeMethodJob < SomeJob
72
+ def self.queue
73
+ :method
74
+ end
75
+ end
76
+
77
+ class BadJob
78
+ def self.perform
79
+ raise "Bad job!"
80
+ end
81
+ end
82
+
83
+ class GoodJob
84
+ def self.perform(name)
85
+ "Good job, #{name}"
86
+ end
87
+ end
@@ -0,0 +1,229 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ context "Resque::Worker" do
4
+ setup do
5
+ Resque.drop
6
+
7
+ @worker = Resque::Worker.new(:jobs)
8
+ Resque::Job.create(:jobs, SomeJob, 20, '/tmp')
9
+ end
10
+
11
+ test "can fail jobs" do
12
+ Resque::Job.create(:jobs, BadJob)
13
+ @worker.work(0)
14
+ assert_equal 1, Resque::Failure.count
15
+ end
16
+
17
+ test "can peek at failed jobs" do
18
+ 10.times { Resque::Job.create(:jobs, BadJob) }
19
+ @worker.work(0)
20
+
21
+ assert_equal 10, Resque::Failure.count
22
+ assert_equal 10, Resque::Failure.all(0, 20).size
23
+ end
24
+
25
+ test "can clear failed jobs" do
26
+ Resque::Job.create(:jobs, BadJob)
27
+ @worker.work(0)
28
+ assert_equal 1, Resque::Failure.count
29
+ Resque::Failure.clear
30
+ assert_equal 0, Resque::Failure.count
31
+ end
32
+
33
+ test "catches exceptional jobs" do
34
+ Resque::Job.create(:jobs, BadJob)
35
+ Resque::Job.create(:jobs, BadJob)
36
+ @worker.process
37
+ @worker.process
38
+ @worker.process
39
+ assert_equal 2, Resque::Failure.count
40
+ end
41
+
42
+ test "can work on multiple queues" do
43
+ Resque::Job.create(:high, GoodJob)
44
+ Resque::Job.create(:critical, GoodJob)
45
+
46
+ worker = Resque::Worker.new(:critical, :high)
47
+
48
+ worker.process
49
+ assert_equal 1, Resque.size(:high)
50
+ assert_equal 0, Resque.size(:critical)
51
+
52
+ worker.process
53
+ assert_equal 0, Resque.size(:high)
54
+ end
55
+
56
+ test "can work on all queues" do
57
+ Resque::Job.create(:high, GoodJob)
58
+ Resque::Job.create(:critical, GoodJob)
59
+ Resque::Job.create(:blahblah, GoodJob)
60
+
61
+ worker = Resque::Worker.new("*")
62
+
63
+ worker.work(0)
64
+ assert_equal 0, Resque.size(:high)
65
+ assert_equal 0, Resque.size(:critical)
66
+ assert_equal 0, Resque.size(:blahblah)
67
+ end
68
+
69
+ test "processes * queues in alphabetical order" do
70
+ Resque::Job.create(:high, GoodJob)
71
+ Resque::Job.create(:critical, GoodJob)
72
+ Resque::Job.create(:blahblah, GoodJob)
73
+
74
+ worker = Resque::Worker.new("*")
75
+ processed_queues = []
76
+
77
+ worker.work(0) do |job|
78
+ processed_queues << job.queue
79
+ end
80
+
81
+ assert_equal %w( jobs high critical blahblah ).sort, processed_queues
82
+ end
83
+
84
+ test "has a unique id" do
85
+ assert_equal "#{`hostname`.chomp}:#{$$}:jobs", @worker.to_s
86
+ end
87
+
88
+ test "complains if no queues are given" do
89
+ assert_raise Resque::NoQueueError do
90
+ Resque::Worker.new
91
+ end
92
+ end
93
+
94
+ test "fails if a job class has no `perform` method" do
95
+ worker = Resque::Worker.new(:perform_less)
96
+ Resque::Job.create(:perform_less, Object)
97
+
98
+ assert_equal 0, Resque::Failure.count
99
+ worker.work(0)
100
+ assert_equal 1, Resque::Failure.count
101
+ end
102
+
103
+ test "inserts itself into the 'workers' list on startup" do
104
+ @worker.work(0) do
105
+ assert_equal @worker, Resque.workers[0]
106
+ end
107
+ end
108
+
109
+ test "removes itself from the 'workers' list on shutdown" do
110
+ @worker.work(0) do
111
+ assert_equal @worker, Resque.workers[0]
112
+ end
113
+
114
+ assert_equal [], Resque.workers
115
+ end
116
+
117
+ test "records what it is working on" do
118
+ @worker.work(0) do
119
+ task = @worker.job
120
+ assert_equal({"args"=>[20, "/tmp"], "class"=>"SomeJob"}, task['payload'])
121
+ assert task['run_at']
122
+ assert_equal 'jobs', task['queue']
123
+ end
124
+ end
125
+
126
+ test "clears its status when not working on anything" do
127
+ @worker.work(0)
128
+ assert_equal Hash.new, @worker.job
129
+ end
130
+
131
+ test "knows when it is working" do
132
+ @worker.work(0) do
133
+ assert @worker.working?
134
+ end
135
+ end
136
+
137
+ test "knows when it is idle" do
138
+ @worker.work(0)
139
+ assert @worker.idle?
140
+ end
141
+
142
+ test "knows who is working" do
143
+ @worker.work(0) do
144
+ assert_equal [@worker], Resque.working
145
+ end
146
+ end
147
+
148
+ test "keeps track of how many jobs it has processed" do
149
+ Resque::Job.create(:jobs, BadJob)
150
+ Resque::Job.create(:jobs, BadJob)
151
+
152
+ 3.times do
153
+ job = @worker.reserve
154
+ @worker.process job
155
+ end
156
+ assert_equal 3, @worker.processed
157
+ end
158
+
159
+ test "keeps track of how many failures it has seen" do
160
+ Resque::Job.create(:jobs, BadJob)
161
+ Resque::Job.create(:jobs, BadJob)
162
+
163
+ 3.times do
164
+ job = @worker.reserve
165
+ @worker.process job
166
+ end
167
+ assert_equal 2, @worker.failed
168
+ end
169
+
170
+ test "stats are erased when the worker goes away" do
171
+ @worker.work(0)
172
+ assert_equal 0, @worker.processed
173
+ assert_equal 0, @worker.failed
174
+ end
175
+
176
+ test "knows when it started" do
177
+ time = Time.now
178
+ @worker.work(0) do
179
+ assert_equal time.to_s, @worker.started.to_s
180
+ end
181
+ end
182
+
183
+ test "knows whether it exists or not" do
184
+ @worker.work(0) do
185
+ assert Resque::Worker.exists?(@worker)
186
+ assert !Resque::Worker.exists?('blah-blah')
187
+ end
188
+ end
189
+
190
+ test "sets $0 while working" do
191
+ @worker.work(0) do
192
+ assert_equal "resque: Processing jobs since #{Time.now.to_i}", $0
193
+ end
194
+ end
195
+
196
+ test "can be found" do
197
+ @worker.work(0) do
198
+ found = Resque::Worker.find(@worker.to_s)
199
+ assert_equal @worker.to_s, found.to_s
200
+ assert found.working?
201
+ assert_equal @worker.job, found.job
202
+ end
203
+ end
204
+
205
+ test "doesn't find fakes" do
206
+ @worker.work(0) do
207
+ found = Resque::Worker.find('blah-blah')
208
+ assert_equal nil, found
209
+ end
210
+ end
211
+
212
+ test "cleans up dead worker info on start (crash recovery)" do
213
+ # first we fake out two dead workers
214
+ workerA = Resque::Worker.new(:jobs)
215
+ workerA.instance_variable_set(:@to_s, "#{`hostname`.chomp}:1:jobs")
216
+ workerA.register_worker
217
+
218
+ workerB = Resque::Worker.new(:high, :low)
219
+ workerB.instance_variable_set(:@to_s, "#{`hostname`.chomp}:2:high,low")
220
+ workerB.register_worker
221
+
222
+ assert_equal 2, Resque.workers.size
223
+
224
+ # then we prune them
225
+ @worker.work(0) do
226
+ assert_equal 1, Resque.workers.size
227
+ end
228
+ end
229
+ end
metadata ADDED
@@ -0,0 +1,162 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: resque-mongo
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.1
5
+ platform: ruby
6
+ authors:
7
+ - Christos Trochalakis
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-01-28 00:00:00 +02:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: mongo
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: vegas
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.2
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: sinatra
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 0.9.2
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: jeweler
47
+ type: :development
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ description: ""
56
+ email: yatiohi@ideopolis.gr
57
+ executables:
58
+ - resque
59
+ - resque-web
60
+ extensions: []
61
+
62
+ extra_rdoc_files:
63
+ - LICENSE
64
+ - README.markdown
65
+ files:
66
+ - .gitignore
67
+ - .kick
68
+ - CONTRIBUTORS
69
+ - HISTORY.md
70
+ - LICENSE
71
+ - README.markdown
72
+ - Rakefile
73
+ - bin/resque
74
+ - bin/resque-web
75
+ - config.ru
76
+ - deps.rip
77
+ - examples/async_helper.rb
78
+ - examples/demo/README.markdown
79
+ - examples/demo/Rakefile
80
+ - examples/demo/app.rb
81
+ - examples/demo/config.ru
82
+ - examples/demo/job.rb
83
+ - examples/god/resque.god
84
+ - examples/god/stale.god
85
+ - examples/instance.rb
86
+ - examples/simple.rb
87
+ - init.rb
88
+ - lib/resque.rb
89
+ - lib/resque/errors.rb
90
+ - lib/resque/failure.rb
91
+ - lib/resque/failure/base.rb
92
+ - lib/resque/failure/hoptoad.rb
93
+ - lib/resque/failure/mongo.rb
94
+ - lib/resque/helpers.rb
95
+ - lib/resque/job.rb
96
+ - lib/resque/server.rb
97
+ - lib/resque/server/public/idle.png
98
+ - lib/resque/server/public/jquery-1.3.2.min.js
99
+ - lib/resque/server/public/jquery.relatize_date.js
100
+ - lib/resque/server/public/poll.png
101
+ - lib/resque/server/public/ranger.js
102
+ - lib/resque/server/public/reset.css
103
+ - lib/resque/server/public/style.css
104
+ - lib/resque/server/public/working.png
105
+ - lib/resque/server/views/error.erb
106
+ - lib/resque/server/views/failed.erb
107
+ - lib/resque/server/views/key.erb
108
+ - lib/resque/server/views/layout.erb
109
+ - lib/resque/server/views/next_more.erb
110
+ - lib/resque/server/views/overview.erb
111
+ - lib/resque/server/views/queues.erb
112
+ - lib/resque/server/views/stats.erb
113
+ - lib/resque/server/views/workers.erb
114
+ - lib/resque/server/views/working.erb
115
+ - lib/resque/stat.rb
116
+ - lib/resque/tasks.rb
117
+ - lib/resque/version.rb
118
+ - lib/resque/worker.rb
119
+ - tasks/redis.rake
120
+ - tasks/resque.rake
121
+ - test/dump.rdb
122
+ - test/redis-test.conf
123
+ - test/resque_test.rb
124
+ - test/test_helper.rb
125
+ - test/worker_test.rb
126
+ has_rdoc: true
127
+ homepage: http://github.com/ctrochalakis/resque-mongo
128
+ licenses: []
129
+
130
+ post_install_message:
131
+ rdoc_options:
132
+ - --charset=UTF-8
133
+ require_paths:
134
+ - lib
135
+ required_ruby_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: "0"
140
+ version:
141
+ required_rubygems_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: "0"
146
+ version:
147
+ requirements: []
148
+
149
+ rubyforge_project:
150
+ rubygems_version: 1.3.5
151
+ signing_key:
152
+ specification_version: 3
153
+ summary: ""
154
+ test_files:
155
+ - test/test_helper.rb
156
+ - test/worker_test.rb
157
+ - test/resque_test.rb
158
+ - examples/demo/app.rb
159
+ - examples/demo/job.rb
160
+ - examples/simple.rb
161
+ - examples/instance.rb
162
+ - examples/async_helper.rb