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.

Files changed (47) hide show
  1. data/.gitignore +5 -0
  2. data/.rvmrc +2 -1
  3. data/Changes.md +11 -0
  4. data/LICENSE +11 -4
  5. data/README.md +1 -7
  6. data/TODO.md +0 -1
  7. data/bin/sidekiq +2 -0
  8. data/examples/por.rb +17 -0
  9. data/examples/sinkiq.rb +57 -0
  10. data/lib/sidekiq.rb +1 -1
  11. data/lib/sidekiq/cli.rb +72 -34
  12. data/lib/sidekiq/client.rb +33 -16
  13. data/lib/sidekiq/manager.rb +37 -47
  14. data/lib/sidekiq/middleware/chain.rb +92 -0
  15. data/lib/sidekiq/middleware/client/resque_web_compatibility.rb +17 -0
  16. data/lib/sidekiq/middleware/client/unique_jobs.rb +30 -0
  17. data/lib/sidekiq/middleware/server/active_record.rb +13 -0
  18. data/lib/sidekiq/middleware/server/airbrake.rb +30 -0
  19. data/lib/sidekiq/middleware/server/unique_jobs.rb +17 -0
  20. data/lib/sidekiq/processor.rb +74 -16
  21. data/lib/sidekiq/redis_connection.rb +23 -0
  22. data/lib/sidekiq/testing.rb +34 -0
  23. data/lib/sidekiq/util.rb +21 -12
  24. data/lib/sidekiq/version.rb +1 -1
  25. data/lib/sidekiq/worker.rb +6 -7
  26. data/myapp/Gemfile +4 -1
  27. data/myapp/Gemfile.lock +29 -6
  28. data/myapp/app/controllers/work_controller.rb +9 -0
  29. data/myapp/app/views/work/index.html.erb +1 -0
  30. data/myapp/app/workers/hard_worker.rb +4 -2
  31. data/myapp/config/environments/development.rb +1 -0
  32. data/myapp/config/initializers/sidekiq.rb +1 -0
  33. data/myapp/config/routes.rb +4 -56
  34. data/sidekiq.gemspec +1 -0
  35. data/test/fake_env.rb +0 -0
  36. data/test/helper.rb +3 -0
  37. data/test/test_cli.rb +49 -0
  38. data/test/test_client.rb +52 -10
  39. data/test/test_manager.rb +11 -6
  40. data/test/test_middleware.rb +39 -20
  41. data/test/test_processor.rb +3 -2
  42. data/test/test_stats.rb +79 -0
  43. data/test/test_testing.rb +32 -0
  44. metadata +47 -18
  45. data/Gemfile.lock +0 -32
  46. data/lib/sidekiq/middleware.rb +0 -89
  47. data/test/timed_queue.rb +0 -42
@@ -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
@@ -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.5.1
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-05 00:00:00.000000000 Z
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: &70180457698040 !ruby/object:Gem::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: *70180457698040
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: &70180457697080 !ruby/object:Gem::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: *70180457697080
46
+ version_requirements: *70220996094360
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: celluloid
38
- requirement: &70180457696360 !ruby/object:Gem::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: *70180457696360
57
+ version_requirements: *70220996093580
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: multi_json
49
- requirement: &70180457695360 !ruby/object:Gem::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: *70180457695360
68
+ version_requirements: *70220996093020
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: minitest
60
- requirement: &70180457694420 !ruby/object:Gem::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: *70180457694420
79
+ version_requirements: *70220996092320
69
80
  - !ruby/object:Gem::Dependency
70
81
  name: rake
71
- requirement: &70180457693640 !ruby/object:Gem::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: *70180457693640
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/timed_queue.rb
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/timed_queue.rb
207
+ - test/test_stats.rb
208
+ - test/test_testing.rb
@@ -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
@@ -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