sidekiq 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sidekiq might be problematic. Click here for more details.
- data/.gitignore +5 -0
- data/.rvmrc +2 -1
- data/Changes.md +11 -0
- data/LICENSE +11 -4
- data/README.md +1 -7
- data/TODO.md +0 -1
- data/bin/sidekiq +2 -0
- data/examples/por.rb +17 -0
- data/examples/sinkiq.rb +57 -0
- data/lib/sidekiq.rb +1 -1
- data/lib/sidekiq/cli.rb +72 -34
- data/lib/sidekiq/client.rb +33 -16
- data/lib/sidekiq/manager.rb +37 -47
- data/lib/sidekiq/middleware/chain.rb +92 -0
- data/lib/sidekiq/middleware/client/resque_web_compatibility.rb +17 -0
- data/lib/sidekiq/middleware/client/unique_jobs.rb +30 -0
- data/lib/sidekiq/middleware/server/active_record.rb +13 -0
- data/lib/sidekiq/middleware/server/airbrake.rb +30 -0
- data/lib/sidekiq/middleware/server/unique_jobs.rb +17 -0
- data/lib/sidekiq/processor.rb +74 -16
- data/lib/sidekiq/redis_connection.rb +23 -0
- data/lib/sidekiq/testing.rb +34 -0
- data/lib/sidekiq/util.rb +21 -12
- data/lib/sidekiq/version.rb +1 -1
- data/lib/sidekiq/worker.rb +6 -7
- data/myapp/Gemfile +4 -1
- data/myapp/Gemfile.lock +29 -6
- data/myapp/app/controllers/work_controller.rb +9 -0
- data/myapp/app/views/work/index.html.erb +1 -0
- data/myapp/app/workers/hard_worker.rb +4 -2
- data/myapp/config/environments/development.rb +1 -0
- data/myapp/config/initializers/sidekiq.rb +1 -0
- data/myapp/config/routes.rb +4 -56
- data/sidekiq.gemspec +1 -0
- data/test/fake_env.rb +0 -0
- data/test/helper.rb +3 -0
- data/test/test_cli.rb +49 -0
- data/test/test_client.rb +52 -10
- data/test/test_manager.rb +11 -6
- data/test/test_middleware.rb +39 -20
- data/test/test_processor.rb +3 -2
- data/test/test_stats.rb +79 -0
- data/test/test_testing.rb +32 -0
- metadata +47 -18
- data/Gemfile.lock +0 -32
- data/lib/sidekiq/middleware.rb +0 -89
- data/test/timed_queue.rb +0 -42
data/test/test_processor.rb
CHANGED
@@ -11,6 +11,7 @@ class TestProcessor < MiniTest::Unit::TestCase
|
|
11
11
|
end
|
12
12
|
|
13
13
|
class MockWorker
|
14
|
+
include Sidekiq::Worker
|
14
15
|
def perform(args)
|
15
16
|
raise "kerboom!" if args == 'boom'
|
16
17
|
$invokes += 1
|
@@ -21,7 +22,7 @@ class TestProcessor < MiniTest::Unit::TestCase
|
|
21
22
|
msg = { 'class' => MockWorker.to_s, 'args' => ['myarg'] }
|
22
23
|
processor = ::Sidekiq::Processor.new(@boss)
|
23
24
|
@boss.expect(:processor_done!, nil, [processor])
|
24
|
-
processor.process(msg)
|
25
|
+
processor.process(msg, 'default')
|
25
26
|
@boss.verify
|
26
27
|
assert_equal 1, $invokes
|
27
28
|
assert_equal 0, $errors.size
|
@@ -31,7 +32,7 @@ class TestProcessor < MiniTest::Unit::TestCase
|
|
31
32
|
msg = { 'class' => MockWorker.to_s, 'args' => ['boom'] }
|
32
33
|
processor = ::Sidekiq::Processor.new(@boss)
|
33
34
|
assert_raises RuntimeError do
|
34
|
-
processor.process(msg)
|
35
|
+
processor.process(msg, 'default')
|
35
36
|
end
|
36
37
|
@boss.verify
|
37
38
|
assert_equal 0, $invokes
|
data/test/test_stats.rb
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'sidekiq'
|
3
|
+
require 'sidekiq/processor'
|
4
|
+
|
5
|
+
class TestStats < MiniTest::Unit::TestCase
|
6
|
+
describe 'with redis' do
|
7
|
+
before do
|
8
|
+
Sidekiq::Manager.redis = @redis = Sidekiq::RedisConnection.create(:url => 'redis://localhost/sidekiq_test')
|
9
|
+
Sidekiq::Client.redis = nil
|
10
|
+
@redis.flushdb
|
11
|
+
end
|
12
|
+
|
13
|
+
class DumbWorker
|
14
|
+
include Sidekiq::Worker
|
15
|
+
|
16
|
+
def perform(redis)
|
17
|
+
raise 'bang' if redis == nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'updates global stats in the success case' do
|
22
|
+
msg = { 'class' => DumbWorker.to_s, 'args' => [@redis] }
|
23
|
+
boss = MiniTest::Mock.new
|
24
|
+
|
25
|
+
set = @redis.smembers('workers')
|
26
|
+
assert_equal 0, set.size
|
27
|
+
|
28
|
+
processor = Sidekiq::Processor.new(boss)
|
29
|
+
boss.expect(:processor_done!, nil, [processor])
|
30
|
+
|
31
|
+
# adds to the workers set upon initialize
|
32
|
+
set = @redis.smembers('workers')
|
33
|
+
assert_equal 1, set.size
|
34
|
+
assert_match(/#{Regexp.escape(`hostname`.strip)}/, set.first)
|
35
|
+
|
36
|
+
assert_equal 0, @redis.get('stat:failed').to_i
|
37
|
+
assert_equal 0, @redis.get('stat:processed').to_i
|
38
|
+
assert_equal 0, @redis.get("stat:processed:#{processor}").to_i
|
39
|
+
|
40
|
+
processor.process(msg, 'xyzzy')
|
41
|
+
processor.process(msg, 'xyzzy')
|
42
|
+
processor.process(msg, 'xyzzy')
|
43
|
+
|
44
|
+
set = @redis.smembers('workers')
|
45
|
+
assert_equal 1, set.size
|
46
|
+
assert_match(/#{Regexp.escape(`hostname`.strip)}/, set.first)
|
47
|
+
assert_equal 0, @redis.get('stat:failed').to_i
|
48
|
+
assert_equal 3, @redis.get('stat:processed').to_i
|
49
|
+
assert_equal 3, @redis.get("stat:processed:#{processor}").to_i
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'updates global stats in the error case' do
|
53
|
+
msg = { 'class' => DumbWorker.to_s, 'args' => [nil] }
|
54
|
+
boss = MiniTest::Mock.new
|
55
|
+
|
56
|
+
assert_equal [], @redis.smembers('workers')
|
57
|
+
assert_equal 0, @redis.get('stat:failed').to_i
|
58
|
+
assert_equal 0, @redis.get('stat:processed').to_i
|
59
|
+
|
60
|
+
processor = Sidekiq::Processor.new(boss)
|
61
|
+
assert_equal 1, @redis.smembers('workers').size
|
62
|
+
|
63
|
+
pstr = processor.to_s
|
64
|
+
assert_raises RuntimeError do
|
65
|
+
processor.process(msg, 'xyzzy')
|
66
|
+
end
|
67
|
+
|
68
|
+
set = @redis.smembers('workers')
|
69
|
+
assert_equal 0, set.size
|
70
|
+
assert_equal 1, @redis.get('stat:failed').to_i
|
71
|
+
assert_equal 1, @redis.get('stat:processed').to_i
|
72
|
+
assert_equal nil, @redis.get("stat:processed:#{pstr}")
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'should set various stats during processing' do
|
76
|
+
skip 'TODO'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'sidekiq/worker'
|
3
|
+
|
4
|
+
class TestTesting < MiniTest::Unit::TestCase
|
5
|
+
describe 'sidekiq testing' do
|
6
|
+
|
7
|
+
class DirectWorker
|
8
|
+
include Sidekiq::Worker
|
9
|
+
def perform(a, b)
|
10
|
+
a + b
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'stubs the async call when in testing mode' do
|
15
|
+
begin
|
16
|
+
# Override Sidekiq::Worker
|
17
|
+
require 'sidekiq/testing'
|
18
|
+
assert_equal 0, DirectWorker.jobs.size
|
19
|
+
assert DirectWorker.perform_async(1, 2)
|
20
|
+
assert_equal 1, DirectWorker.jobs.size
|
21
|
+
ensure
|
22
|
+
# Undo override
|
23
|
+
Sidekiq::Worker::ClassMethods.class_eval do
|
24
|
+
remove_method :perform_async
|
25
|
+
alias_method :perform_async, :perform_async_old
|
26
|
+
remove_method :perform_async_old
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-02-
|
12
|
+
date: 2012-02-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: redis
|
16
|
-
requirement: &
|
16
|
+
requirement: &70220996079880 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,21 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70220996079880
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: redis-namespace
|
27
|
+
requirement: &70220996078920 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70220996078920
|
25
36
|
- !ruby/object:Gem::Dependency
|
26
37
|
name: connection_pool
|
27
|
-
requirement: &
|
38
|
+
requirement: &70220996094360 !ruby/object:Gem::Requirement
|
28
39
|
none: false
|
29
40
|
requirements:
|
30
41
|
- - ! '>='
|
@@ -32,10 +43,10 @@ dependencies:
|
|
32
43
|
version: '0'
|
33
44
|
type: :runtime
|
34
45
|
prerelease: false
|
35
|
-
version_requirements: *
|
46
|
+
version_requirements: *70220996094360
|
36
47
|
- !ruby/object:Gem::Dependency
|
37
48
|
name: celluloid
|
38
|
-
requirement: &
|
49
|
+
requirement: &70220996093580 !ruby/object:Gem::Requirement
|
39
50
|
none: false
|
40
51
|
requirements:
|
41
52
|
- - ! '>='
|
@@ -43,10 +54,10 @@ dependencies:
|
|
43
54
|
version: '0'
|
44
55
|
type: :runtime
|
45
56
|
prerelease: false
|
46
|
-
version_requirements: *
|
57
|
+
version_requirements: *70220996093580
|
47
58
|
- !ruby/object:Gem::Dependency
|
48
59
|
name: multi_json
|
49
|
-
requirement: &
|
60
|
+
requirement: &70220996093020 !ruby/object:Gem::Requirement
|
50
61
|
none: false
|
51
62
|
requirements:
|
52
63
|
- - ! '>='
|
@@ -54,10 +65,10 @@ dependencies:
|
|
54
65
|
version: '0'
|
55
66
|
type: :runtime
|
56
67
|
prerelease: false
|
57
|
-
version_requirements: *
|
68
|
+
version_requirements: *70220996093020
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
70
|
name: minitest
|
60
|
-
requirement: &
|
71
|
+
requirement: &70220996092320 !ruby/object:Gem::Requirement
|
61
72
|
none: false
|
62
73
|
requirements:
|
63
74
|
- - ! '>='
|
@@ -65,10 +76,10 @@ dependencies:
|
|
65
76
|
version: '0'
|
66
77
|
type: :development
|
67
78
|
prerelease: false
|
68
|
-
version_requirements: *
|
79
|
+
version_requirements: *70220996092320
|
69
80
|
- !ruby/object:Gem::Dependency
|
70
81
|
name: rake
|
71
|
-
requirement: &
|
82
|
+
requirement: &70220996091640 !ruby/object:Gem::Requirement
|
72
83
|
none: false
|
73
84
|
requirements:
|
74
85
|
- - ! '>='
|
@@ -76,7 +87,7 @@ dependencies:
|
|
76
87
|
version: '0'
|
77
88
|
type: :development
|
78
89
|
prerelease: false
|
79
|
-
version_requirements: *
|
90
|
+
version_requirements: *70220996091640
|
80
91
|
description: Simple, efficient message processing for Ruby
|
81
92
|
email:
|
82
93
|
- mperham@gmail.com
|
@@ -85,24 +96,33 @@ executables:
|
|
85
96
|
extensions: []
|
86
97
|
extra_rdoc_files: []
|
87
98
|
files:
|
99
|
+
- .gitignore
|
88
100
|
- .rvmrc
|
89
101
|
- COMM-LICENSE
|
90
102
|
- Changes.md
|
91
103
|
- Gemfile
|
92
|
-
- Gemfile.lock
|
93
104
|
- LICENSE
|
94
105
|
- README.md
|
95
106
|
- Rakefile
|
96
107
|
- TODO.md
|
97
108
|
- bin/client
|
98
109
|
- bin/sidekiq
|
110
|
+
- examples/por.rb
|
111
|
+
- examples/sinkiq.rb
|
99
112
|
- lib/sidekiq.rb
|
100
113
|
- lib/sidekiq/cli.rb
|
101
114
|
- lib/sidekiq/client.rb
|
102
115
|
- lib/sidekiq/manager.rb
|
103
|
-
- lib/sidekiq/middleware.rb
|
116
|
+
- lib/sidekiq/middleware/chain.rb
|
117
|
+
- lib/sidekiq/middleware/client/resque_web_compatibility.rb
|
118
|
+
- lib/sidekiq/middleware/client/unique_jobs.rb
|
119
|
+
- lib/sidekiq/middleware/server/active_record.rb
|
120
|
+
- lib/sidekiq/middleware/server/airbrake.rb
|
121
|
+
- lib/sidekiq/middleware/server/unique_jobs.rb
|
104
122
|
- lib/sidekiq/processor.rb
|
105
123
|
- lib/sidekiq/rails.rb
|
124
|
+
- lib/sidekiq/redis_connection.rb
|
125
|
+
- lib/sidekiq/testing.rb
|
106
126
|
- lib/sidekiq/util.rb
|
107
127
|
- lib/sidekiq/version.rb
|
108
128
|
- lib/sidekiq/worker.rb
|
@@ -111,11 +131,13 @@ files:
|
|
111
131
|
- myapp/Gemfile.lock
|
112
132
|
- myapp/Rakefile
|
113
133
|
- myapp/app/controllers/application_controller.rb
|
134
|
+
- myapp/app/controllers/work_controller.rb
|
114
135
|
- myapp/app/helpers/application_helper.rb
|
115
136
|
- myapp/app/mailers/.gitkeep
|
116
137
|
- myapp/app/models/.gitkeep
|
117
138
|
- myapp/app/models/post.rb
|
118
139
|
- myapp/app/views/layouts/application.html.erb
|
140
|
+
- myapp/app/views/work/index.html.erb
|
119
141
|
- myapp/app/workers/hard_worker.rb
|
120
142
|
- myapp/config.ru
|
121
143
|
- myapp/config/application.rb
|
@@ -130,6 +152,7 @@ files:
|
|
130
152
|
- myapp/config/initializers/mime_types.rb
|
131
153
|
- myapp/config/initializers/secret_token.rb
|
132
154
|
- myapp/config/initializers/session_store.rb
|
155
|
+
- myapp/config/initializers/sidekiq.rb
|
133
156
|
- myapp/config/initializers/wrap_parameters.rb
|
134
157
|
- myapp/config/locales/en.yml
|
135
158
|
- myapp/config/routes.rb
|
@@ -140,12 +163,15 @@ files:
|
|
140
163
|
- myapp/log/.gitkeep
|
141
164
|
- myapp/script/rails
|
142
165
|
- sidekiq.gemspec
|
166
|
+
- test/fake_env.rb
|
143
167
|
- test/helper.rb
|
168
|
+
- test/test_cli.rb
|
144
169
|
- test/test_client.rb
|
145
170
|
- test/test_manager.rb
|
146
171
|
- test/test_middleware.rb
|
147
172
|
- test/test_processor.rb
|
148
|
-
- test/
|
173
|
+
- test/test_stats.rb
|
174
|
+
- test/test_testing.rb
|
149
175
|
homepage: http://mperham.github.com/sidekiq
|
150
176
|
licenses: []
|
151
177
|
post_install_message:
|
@@ -171,9 +197,12 @@ signing_key:
|
|
171
197
|
specification_version: 3
|
172
198
|
summary: Simple, efficient message processing for Ruby
|
173
199
|
test_files:
|
200
|
+
- test/fake_env.rb
|
174
201
|
- test/helper.rb
|
202
|
+
- test/test_cli.rb
|
175
203
|
- test/test_client.rb
|
176
204
|
- test/test_manager.rb
|
177
205
|
- test/test_middleware.rb
|
178
206
|
- test/test_processor.rb
|
179
|
-
- test/
|
207
|
+
- test/test_stats.rb
|
208
|
+
- test/test_testing.rb
|
data/Gemfile.lock
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
sidekiq (0.1.0)
|
5
|
-
celluloid
|
6
|
-
connection_pool
|
7
|
-
multi_json
|
8
|
-
redis
|
9
|
-
|
10
|
-
GEM
|
11
|
-
remote: http://rubygems.org/
|
12
|
-
specs:
|
13
|
-
celluloid (0.8.0)
|
14
|
-
connection_pool (0.1.0)
|
15
|
-
minitest (2.10.0)
|
16
|
-
multi_json (1.0.4)
|
17
|
-
rake (0.9.2.2)
|
18
|
-
redis (2.2.2)
|
19
|
-
simplecov (0.5.4)
|
20
|
-
multi_json (~> 1.0.3)
|
21
|
-
simplecov-html (~> 0.5.3)
|
22
|
-
simplecov-html (0.5.3)
|
23
|
-
|
24
|
-
PLATFORMS
|
25
|
-
java
|
26
|
-
ruby
|
27
|
-
|
28
|
-
DEPENDENCIES
|
29
|
-
minitest
|
30
|
-
rake
|
31
|
-
sidekiq!
|
32
|
-
simplecov
|
data/lib/sidekiq/middleware.rb
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
module Sidekiq
|
2
|
-
# Middleware is code configured to run before/after
|
3
|
-
# a message is processed. It is patterned after Rack
|
4
|
-
# middleware. The default middleware chain:
|
5
|
-
#
|
6
|
-
# Sidekiq::Middleware::Chain.register do
|
7
|
-
# use Sidekiq::Airbrake
|
8
|
-
# use Sidekiq::ActiveRecord
|
9
|
-
# end
|
10
|
-
#
|
11
|
-
# This is an example of a minimal middleware:
|
12
|
-
#
|
13
|
-
# class MyHook
|
14
|
-
# def initialize(options=nil)
|
15
|
-
# end
|
16
|
-
# def call(worker, msg)
|
17
|
-
# puts "Before work"
|
18
|
-
# yield
|
19
|
-
# puts "After work"
|
20
|
-
# end
|
21
|
-
# end
|
22
|
-
#
|
23
|
-
module Middleware
|
24
|
-
class Chain
|
25
|
-
def self.register(&block)
|
26
|
-
instance_exec(&block)
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.default
|
30
|
-
@default ||= [Entry.new(Airbrake), Entry.new(ActiveRecord)]
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.use(klass, *args)
|
34
|
-
chain << Entry.new(klass, args)
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.chain
|
38
|
-
@chain ||= default
|
39
|
-
end
|
40
|
-
|
41
|
-
def self.retrieve
|
42
|
-
Thread.current[:sidekiq_chain] ||= chain.map { |entry| entry.make_new }
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
class Entry
|
47
|
-
attr_reader :klass
|
48
|
-
def initialize(klass, args = [])
|
49
|
-
@klass = klass
|
50
|
-
@args = args
|
51
|
-
end
|
52
|
-
|
53
|
-
def make_new
|
54
|
-
@klass.new(*@args)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
class Airbrake
|
60
|
-
def initialize(options=nil)
|
61
|
-
end
|
62
|
-
|
63
|
-
def call(worker, msg)
|
64
|
-
yield
|
65
|
-
rescue => ex
|
66
|
-
send_to_airbrake(msg, ex) if defined?(::Airbrake)
|
67
|
-
raise
|
68
|
-
end
|
69
|
-
|
70
|
-
private
|
71
|
-
|
72
|
-
def send_to_airbrake(msg, ex)
|
73
|
-
::Airbrake.notify(:error_class => ex.class.name,
|
74
|
-
:error_message => "#{ex.class.name}: #{ex.message}",
|
75
|
-
:parameters => msg)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
class ActiveRecord
|
80
|
-
def initialize(options=nil)
|
81
|
-
end
|
82
|
-
|
83
|
-
def call(*)
|
84
|
-
yield
|
85
|
-
ensure
|
86
|
-
::ActiveRecord::Base.clear_active_connections! if defined?(::ActiveRecord)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|