resque-mongo 1.3.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.
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