sidekiq 0.10.0 → 7.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (234) hide show
  1. checksums.yaml +7 -0
  2. data/Changes.md +2047 -0
  3. data/LICENSE.txt +9 -0
  4. data/README.md +73 -27
  5. data/bin/sidekiq +25 -9
  6. data/bin/sidekiqload +247 -0
  7. data/bin/sidekiqmon +11 -0
  8. data/lib/generators/sidekiq/job_generator.rb +57 -0
  9. data/lib/generators/sidekiq/templates/job.rb.erb +9 -0
  10. data/lib/generators/sidekiq/templates/job_spec.rb.erb +6 -0
  11. data/lib/generators/sidekiq/templates/job_test.rb.erb +8 -0
  12. data/lib/sidekiq/api.rb +1145 -0
  13. data/lib/sidekiq/capsule.rb +127 -0
  14. data/lib/sidekiq/cli.rb +348 -109
  15. data/lib/sidekiq/client.rb +241 -41
  16. data/lib/sidekiq/component.rb +68 -0
  17. data/lib/sidekiq/config.rb +287 -0
  18. data/lib/sidekiq/deploy.rb +62 -0
  19. data/lib/sidekiq/embedded.rb +61 -0
  20. data/lib/sidekiq/fetch.rb +88 -0
  21. data/lib/sidekiq/job.rb +374 -0
  22. data/lib/sidekiq/job_logger.rb +51 -0
  23. data/lib/sidekiq/job_retry.rb +300 -0
  24. data/lib/sidekiq/job_util.rb +107 -0
  25. data/lib/sidekiq/launcher.rb +271 -0
  26. data/lib/sidekiq/logger.rb +131 -0
  27. data/lib/sidekiq/manager.rb +96 -103
  28. data/lib/sidekiq/metrics/query.rb +153 -0
  29. data/lib/sidekiq/metrics/shared.rb +95 -0
  30. data/lib/sidekiq/metrics/tracking.rb +136 -0
  31. data/lib/sidekiq/middleware/chain.rb +149 -38
  32. data/lib/sidekiq/middleware/current_attributes.rb +95 -0
  33. data/lib/sidekiq/middleware/i18n.rb +42 -0
  34. data/lib/sidekiq/middleware/modules.rb +21 -0
  35. data/lib/sidekiq/monitor.rb +146 -0
  36. data/lib/sidekiq/paginator.rb +55 -0
  37. data/lib/sidekiq/processor.rb +246 -61
  38. data/lib/sidekiq/rails.rb +60 -13
  39. data/lib/sidekiq/redis_client_adapter.rb +95 -0
  40. data/lib/sidekiq/redis_connection.rb +68 -15
  41. data/lib/sidekiq/ring_buffer.rb +29 -0
  42. data/lib/sidekiq/scheduled.rb +236 -0
  43. data/lib/sidekiq/sd_notify.rb +149 -0
  44. data/lib/sidekiq/systemd.rb +24 -0
  45. data/lib/sidekiq/testing/inline.rb +30 -0
  46. data/lib/sidekiq/testing.rb +304 -10
  47. data/lib/sidekiq/transaction_aware_client.rb +44 -0
  48. data/lib/sidekiq/version.rb +4 -1
  49. data/lib/sidekiq/web/action.rb +93 -0
  50. data/lib/sidekiq/web/application.rb +447 -0
  51. data/lib/sidekiq/web/csrf_protection.rb +180 -0
  52. data/lib/sidekiq/web/helpers.rb +370 -0
  53. data/lib/sidekiq/web/router.rb +104 -0
  54. data/lib/sidekiq/web.rb +143 -74
  55. data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  56. data/lib/sidekiq.rb +120 -73
  57. data/sidekiq.gemspec +26 -23
  58. data/web/assets/images/apple-touch-icon.png +0 -0
  59. data/web/assets/images/favicon.ico +0 -0
  60. data/web/assets/images/logo.png +0 -0
  61. data/web/assets/images/status.png +0 -0
  62. data/web/assets/javascripts/application.js +162 -3
  63. data/web/assets/javascripts/base-charts.js +106 -0
  64. data/web/assets/javascripts/chart.min.js +13 -0
  65. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  66. data/web/assets/javascripts/dashboard-charts.js +168 -0
  67. data/web/assets/javascripts/dashboard.js +59 -0
  68. data/web/assets/javascripts/metrics.js +264 -0
  69. data/web/assets/stylesheets/application-dark.css +147 -0
  70. data/web/assets/stylesheets/application-rtl.css +153 -0
  71. data/web/assets/stylesheets/application.css +720 -7
  72. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  73. data/web/assets/stylesheets/bootstrap.css +5 -0
  74. data/web/locales/ar.yml +87 -0
  75. data/web/locales/cs.yml +78 -0
  76. data/web/locales/da.yml +75 -0
  77. data/web/locales/de.yml +81 -0
  78. data/web/locales/el.yml +87 -0
  79. data/web/locales/en.yml +101 -0
  80. data/web/locales/es.yml +86 -0
  81. data/web/locales/fa.yml +80 -0
  82. data/web/locales/fr.yml +99 -0
  83. data/web/locales/gd.yml +99 -0
  84. data/web/locales/he.yml +80 -0
  85. data/web/locales/hi.yml +75 -0
  86. data/web/locales/it.yml +69 -0
  87. data/web/locales/ja.yml +91 -0
  88. data/web/locales/ko.yml +68 -0
  89. data/web/locales/lt.yml +83 -0
  90. data/web/locales/nb.yml +77 -0
  91. data/web/locales/nl.yml +68 -0
  92. data/web/locales/pl.yml +59 -0
  93. data/web/locales/pt-br.yml +96 -0
  94. data/web/locales/pt.yml +67 -0
  95. data/web/locales/ru.yml +83 -0
  96. data/web/locales/sv.yml +68 -0
  97. data/web/locales/ta.yml +75 -0
  98. data/web/locales/uk.yml +77 -0
  99. data/web/locales/ur.yml +80 -0
  100. data/web/locales/vi.yml +83 -0
  101. data/web/locales/zh-cn.yml +95 -0
  102. data/web/locales/zh-tw.yml +102 -0
  103. data/web/views/_footer.erb +23 -0
  104. data/web/views/_job_info.erb +105 -0
  105. data/web/views/_metrics_period_select.erb +12 -0
  106. data/web/views/_nav.erb +52 -0
  107. data/web/views/_paging.erb +25 -0
  108. data/web/views/_poll_link.erb +4 -0
  109. data/web/views/_status.erb +4 -0
  110. data/web/views/_summary.erb +40 -0
  111. data/web/views/busy.erb +148 -0
  112. data/web/views/dashboard.erb +115 -0
  113. data/web/views/dead.erb +34 -0
  114. data/web/views/filtering.erb +7 -0
  115. data/web/views/layout.erb +42 -0
  116. data/web/views/metrics.erb +82 -0
  117. data/web/views/metrics_for_job.erb +68 -0
  118. data/web/views/morgue.erb +74 -0
  119. data/web/views/queue.erb +55 -0
  120. data/web/views/queues.erb +40 -0
  121. data/web/views/retries.erb +79 -0
  122. data/web/views/retry.erb +34 -0
  123. data/web/views/scheduled.erb +56 -0
  124. data/web/views/scheduled_job_info.erb +8 -0
  125. metadata +159 -237
  126. data/.gitignore +0 -6
  127. data/.rvmrc +0 -4
  128. data/COMM-LICENSE +0 -75
  129. data/Gemfile +0 -10
  130. data/LICENSE +0 -22
  131. data/Rakefile +0 -9
  132. data/TODO.md +0 -1
  133. data/bin/client +0 -7
  134. data/bin/sidekiqctl +0 -43
  135. data/config.ru +0 -8
  136. data/examples/chef/cookbooks/sidekiq/README.rdoc +0 -11
  137. data/examples/chef/cookbooks/sidekiq/recipes/default.rb +0 -55
  138. data/examples/chef/cookbooks/sidekiq/templates/default/monitrc.conf.erb +0 -8
  139. data/examples/chef/cookbooks/sidekiq/templates/default/sidekiq.erb +0 -219
  140. data/examples/chef/cookbooks/sidekiq/templates/default/sidekiq.yml.erb +0 -22
  141. data/examples/config.yml +0 -9
  142. data/examples/monitrc.conf +0 -6
  143. data/examples/por.rb +0 -27
  144. data/examples/scheduling.rb +0 -37
  145. data/examples/sinkiq.rb +0 -57
  146. data/examples/web-ui.png +0 -0
  147. data/lib/sidekiq/capistrano.rb +0 -32
  148. data/lib/sidekiq/extensions/action_mailer.rb +0 -26
  149. data/lib/sidekiq/extensions/active_record.rb +0 -27
  150. data/lib/sidekiq/extensions/generic_proxy.rb +0 -21
  151. data/lib/sidekiq/middleware/client/unique_jobs.rb +0 -32
  152. data/lib/sidekiq/middleware/server/active_record.rb +0 -13
  153. data/lib/sidekiq/middleware/server/exception_handler.rb +0 -38
  154. data/lib/sidekiq/middleware/server/failure_jobs.rb +0 -24
  155. data/lib/sidekiq/middleware/server/logging.rb +0 -27
  156. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -59
  157. data/lib/sidekiq/middleware/server/unique_jobs.rb +0 -15
  158. data/lib/sidekiq/retry.rb +0 -57
  159. data/lib/sidekiq/util.rb +0 -61
  160. data/lib/sidekiq/worker.rb +0 -37
  161. data/myapp/.gitignore +0 -15
  162. data/myapp/Capfile +0 -5
  163. data/myapp/Gemfile +0 -19
  164. data/myapp/Gemfile.lock +0 -143
  165. data/myapp/Rakefile +0 -7
  166. data/myapp/app/controllers/application_controller.rb +0 -3
  167. data/myapp/app/controllers/work_controller.rb +0 -38
  168. data/myapp/app/helpers/application_helper.rb +0 -2
  169. data/myapp/app/mailers/.gitkeep +0 -0
  170. data/myapp/app/mailers/user_mailer.rb +0 -9
  171. data/myapp/app/models/.gitkeep +0 -0
  172. data/myapp/app/models/post.rb +0 -5
  173. data/myapp/app/views/layouts/application.html.erb +0 -14
  174. data/myapp/app/views/user_mailer/greetings.html.erb +0 -3
  175. data/myapp/app/views/work/index.html.erb +0 -1
  176. data/myapp/app/workers/hard_worker.rb +0 -9
  177. data/myapp/config/application.rb +0 -59
  178. data/myapp/config/boot.rb +0 -6
  179. data/myapp/config/database.yml +0 -25
  180. data/myapp/config/deploy.rb +0 -15
  181. data/myapp/config/environment.rb +0 -5
  182. data/myapp/config/environments/development.rb +0 -38
  183. data/myapp/config/environments/production.rb +0 -67
  184. data/myapp/config/environments/test.rb +0 -37
  185. data/myapp/config/initializers/backtrace_silencers.rb +0 -7
  186. data/myapp/config/initializers/inflections.rb +0 -15
  187. data/myapp/config/initializers/mime_types.rb +0 -5
  188. data/myapp/config/initializers/secret_token.rb +0 -7
  189. data/myapp/config/initializers/session_store.rb +0 -8
  190. data/myapp/config/initializers/sidekiq.rb +0 -6
  191. data/myapp/config/initializers/wrap_parameters.rb +0 -14
  192. data/myapp/config/locales/en.yml +0 -5
  193. data/myapp/config/routes.rb +0 -10
  194. data/myapp/config.ru +0 -4
  195. data/myapp/db/migrate/20120123214055_create_posts.rb +0 -10
  196. data/myapp/db/seeds.rb +0 -7
  197. data/myapp/lib/assets/.gitkeep +0 -0
  198. data/myapp/lib/tasks/.gitkeep +0 -0
  199. data/myapp/log/.gitkeep +0 -0
  200. data/myapp/script/rails +0 -6
  201. data/test/config.yml +0 -9
  202. data/test/fake_env.rb +0 -0
  203. data/test/helper.rb +0 -15
  204. data/test/test_cli.rb +0 -168
  205. data/test/test_client.rb +0 -105
  206. data/test/test_extensions.rb +0 -68
  207. data/test/test_manager.rb +0 -43
  208. data/test/test_middleware.rb +0 -92
  209. data/test/test_processor.rb +0 -32
  210. data/test/test_retry.rb +0 -83
  211. data/test/test_stats.rb +0 -78
  212. data/test/test_testing.rb +0 -65
  213. data/test/test_web.rb +0 -61
  214. data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  215. data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  216. data/web/assets/javascripts/vendor/bootstrap/bootstrap-alert.js +0 -91
  217. data/web/assets/javascripts/vendor/bootstrap/bootstrap-button.js +0 -98
  218. data/web/assets/javascripts/vendor/bootstrap/bootstrap-carousel.js +0 -154
  219. data/web/assets/javascripts/vendor/bootstrap/bootstrap-collapse.js +0 -136
  220. data/web/assets/javascripts/vendor/bootstrap/bootstrap-dropdown.js +0 -92
  221. data/web/assets/javascripts/vendor/bootstrap/bootstrap-modal.js +0 -210
  222. data/web/assets/javascripts/vendor/bootstrap/bootstrap-popover.js +0 -95
  223. data/web/assets/javascripts/vendor/bootstrap/bootstrap-scrollspy.js +0 -125
  224. data/web/assets/javascripts/vendor/bootstrap/bootstrap-tab.js +0 -130
  225. data/web/assets/javascripts/vendor/bootstrap/bootstrap-tooltip.js +0 -270
  226. data/web/assets/javascripts/vendor/bootstrap/bootstrap-transition.js +0 -51
  227. data/web/assets/javascripts/vendor/bootstrap/bootstrap-typeahead.js +0 -271
  228. data/web/assets/javascripts/vendor/bootstrap.js +0 -12
  229. data/web/assets/javascripts/vendor/jquery.js +0 -9266
  230. data/web/assets/stylesheets/vendor/bootstrap-responsive.css +0 -567
  231. data/web/assets/stylesheets/vendor/bootstrap.css +0 -3365
  232. data/web/views/index.slim +0 -62
  233. data/web/views/layout.slim +0 -24
  234. data/web/views/queue.slim +0 -11
@@ -1,68 +0,0 @@
1
- require 'helper'
2
- require 'sidekiq'
3
- require 'active_record'
4
- require 'action_mailer'
5
- require 'sidekiq/extensions/action_mailer'
6
- require 'sidekiq/extensions/active_record'
7
-
8
- Sidekiq.hook_rails!
9
-
10
- class TestExtensions < MiniTest::Unit::TestCase
11
- describe 'sidekiq extensions' do
12
- before do
13
- Sidekiq.redis = REDIS
14
- Sidekiq.redis.flushdb
15
- end
16
-
17
- class MyModel < ActiveRecord::Base
18
- def self.long_class_method
19
- raise "Should not be called!"
20
- end
21
- end
22
-
23
- it 'allows delayed exection of ActiveRecord class methods' do
24
- assert_equal [], Sidekiq::Client.registered_queues
25
- assert_equal 0, Sidekiq.redis.llen('queue:default')
26
- MyModel.delay.long_class_method
27
- assert_equal ['default'], Sidekiq::Client.registered_queues
28
- assert_equal 1, Sidekiq.redis.llen('queue:default')
29
- end
30
-
31
- class UserMailer < ActionMailer::Base
32
- def greetings(a, b)
33
- raise "Should not be called!"
34
- end
35
- end
36
-
37
- it 'allows delayed delivery of ActionMailer mails' do
38
- assert_equal [], Sidekiq::Client.registered_queues
39
- assert_equal 0, Sidekiq.redis.llen('queue:default')
40
- UserMailer.delay.greetings(1, 2)
41
- assert_equal ['default'], Sidekiq::Client.registered_queues
42
- assert_equal 1, Sidekiq.redis.llen('queue:default')
43
- end
44
- end
45
-
46
- describe 'sidekiq rails extensions configuration' do
47
- before do
48
- @options = Sidekiq.options
49
- end
50
-
51
- after do
52
- Sidekiq.options = @options
53
- end
54
-
55
- it 'should set enable_rails_extensions option to true by default' do
56
- assert Sidekiq.options[:enable_rails_extensions]
57
- end
58
-
59
- it 'should extend ActiveRecord and ActiveMailer if enable_rails_extensions is true' do
60
- assert Sidekiq.hook_rails!
61
- end
62
-
63
- it 'should not extend ActiveRecord and ActiveMailer if enable_rails_extensions is false' do
64
- Sidekiq.options = { :enable_rails_extensions => false }
65
- refute Sidekiq.hook_rails!
66
- end
67
- end
68
- end
data/test/test_manager.rb DELETED
@@ -1,43 +0,0 @@
1
- require 'helper'
2
- require 'sidekiq'
3
- require 'sidekiq/manager'
4
-
5
- # for TimedQueue
6
- require 'connection_pool'
7
-
8
- class TestManager < MiniTest::Unit::TestCase
9
- describe 'with redis' do
10
- before do
11
- Sidekiq.redis = REDIS
12
- Sidekiq.redis.flushdb
13
- $processed = 0
14
- $mutex = Mutex.new
15
- end
16
-
17
- class IntegrationWorker
18
- include Sidekiq::Worker
19
-
20
- def perform(a, b)
21
- $mutex.synchronize do
22
- $processed += 1
23
- end
24
- a + b
25
- end
26
- end
27
-
28
- it 'processes messages' do
29
- Sidekiq::Client.push(:foo, 'class' => IntegrationWorker, 'args' => [1, 2])
30
- Sidekiq::Client.push(:foo, 'class' => IntegrationWorker, 'args' => [1, 3])
31
-
32
- q = TimedQueue.new
33
- mgr = Sidekiq::Manager.new(:queues => [:foo], :concurrency => 2)
34
- mgr.when_done do |_|
35
- q << 'done' if $processed == 2
36
- end
37
- mgr.start!
38
- result = q.timed_pop(1.0)
39
- assert_equal 'done', result
40
- mgr.stop
41
- end
42
- end
43
- end
@@ -1,92 +0,0 @@
1
- require 'helper'
2
- require 'sidekiq/middleware/chain'
3
- require 'sidekiq/middleware/server/unique_jobs'
4
- require 'sidekiq/processor'
5
-
6
- class TestMiddleware < MiniTest::Unit::TestCase
7
- describe 'middleware chain' do
8
- before do
9
- $errors = []
10
- Sidekiq.redis = REDIS
11
- end
12
-
13
- it 'handles errors' do
14
- handler = Sidekiq::Middleware::Server::ExceptionHandler.new
15
-
16
- assert_raises ArgumentError do
17
- handler.call('', { :a => 1 }, 'default') do
18
- raise ArgumentError
19
- end
20
- end
21
- assert_equal 1, $errors.size
22
- assert_equal({ :a => 1 }, $errors[0][:parameters])
23
- end
24
-
25
- class CustomMiddleware
26
- def initialize(name, recorder)
27
- @name = name
28
- @recorder = recorder
29
- end
30
-
31
- def call(*args)
32
- @recorder << [@name, 'before']
33
- yield
34
- @recorder << [@name, 'after']
35
- end
36
- end
37
-
38
- it 'supports custom middleware' do
39
- chain = Sidekiq::Middleware::Chain.new
40
- chain.add CustomMiddleware, 1, []
41
-
42
- assert_equal CustomMiddleware, chain.entries.last.klass
43
- end
44
-
45
- class CustomWorker
46
- include Sidekiq::Worker
47
- def perform(recorder)
48
- recorder << ['work_performed']
49
- end
50
- end
51
-
52
- class NonYieldingMiddleware
53
- def call(*args)
54
- end
55
- end
56
-
57
- it 'executes middleware in the proper order' do
58
- recorder = []
59
- msg = { 'class' => CustomWorker.to_s, 'args' => [recorder] }
60
-
61
- Sidekiq.server_middleware do |chain|
62
- # should only add once, second should be ignored
63
- 2.times { |i| chain.add CustomMiddleware, i.to_s, recorder }
64
- end
65
-
66
- boss = MiniTest::Mock.new
67
- processor = Sidekiq::Processor.new(boss)
68
- boss.expect(:processor_done!, nil, [processor])
69
- processor.process(msg, 'default')
70
- assert_equal %w(0 before work_performed 0 after), recorder.flatten
71
- end
72
-
73
- it 'allows middleware to abruptly stop processing rest of chain' do
74
- recorder = []
75
- chain = Sidekiq::Middleware::Chain.new
76
- chain.add NonYieldingMiddleware
77
- chain.add CustomMiddleware, 1, recorder
78
-
79
- final_action = nil
80
- chain.invoke { final_action = true }
81
- assert_equal nil, final_action
82
- assert_equal [], recorder
83
- end
84
- end
85
- end
86
-
87
- class FakeAirbrake
88
- def self.notify(ex, hash)
89
- $errors << hash
90
- end
91
- end
92
- Airbrake = FakeAirbrake
@@ -1,32 +0,0 @@
1
- require 'helper'
2
- require 'sidekiq/processor'
3
-
4
- class TestProcessor < MiniTest::Unit::TestCase
5
- describe 'with mock setup' do
6
- before do
7
- $invokes = 0
8
- $errors = []
9
- @boss = MiniTest::Mock.new
10
- Celluloid.logger = nil
11
- Sidekiq.redis = REDIS
12
- end
13
-
14
- class MockWorker
15
- include Sidekiq::Worker
16
- def perform(args)
17
- raise "kerboom!" if args == 'boom'
18
- $invokes += 1
19
- end
20
- end
21
-
22
- it 'processes as expected' do
23
- msg = { 'class' => MockWorker.to_s, 'args' => ['myarg'] }
24
- processor = ::Sidekiq::Processor.new(@boss)
25
- @boss.expect(:processor_done!, nil, [processor])
26
- processor.process(msg, 'default')
27
- @boss.verify
28
- assert_equal 1, $invokes
29
- assert_equal 0, $errors.size
30
- end
31
- end
32
- end
data/test/test_retry.rb DELETED
@@ -1,83 +0,0 @@
1
- require 'helper'
2
- require 'sidekiq/retry'
3
- require 'sidekiq/middleware/server/retry_jobs'
4
-
5
- class TestRetry < MiniTest::Unit::TestCase
6
- describe 'middleware' do
7
- before do
8
- @redis = MiniTest::Mock.new
9
- # Ugh, this is terrible.
10
- Sidekiq.instance_variable_set(:@redis, @redis)
11
-
12
- def @redis.with; yield self; end
13
- end
14
-
15
- it 'handles a new failed message' do
16
- @redis.expect :zadd, 1, ['retry', String, String]
17
- msg = { 'class' => 'Bob', 'args' => [1,2,'foo'] }
18
- handler = Sidekiq::Middleware::Server::RetryJobs.new
19
- assert_raises RuntimeError do
20
- handler.call('', msg, 'default') do
21
- raise "kerblammo!"
22
- end
23
- end
24
- assert_equal 'default', msg["queue"]
25
- assert_equal 'kerblammo!', msg["error_message"]
26
- assert_equal 'RuntimeError', msg["error_class"]
27
- assert_equal 0, msg["retry_count"]
28
- assert msg["failed_at"]
29
- @redis.verify
30
- end
31
-
32
- it 'handles a recurring failed message' do
33
- @redis.expect :zadd, 1, ['retry', String, String]
34
- now = Time.now.utc
35
- msg = {"class"=>"Bob", "args"=>[1, 2, "foo"], "queue"=>"default", "error_message"=>"kerblammo!", "error_class"=>"RuntimeError", "failed_at"=>now, "retry_count"=>10}
36
- handler = Sidekiq::Middleware::Server::RetryJobs.new
37
- assert_raises RuntimeError do
38
- handler.call('', msg, 'default') do
39
- raise "kerblammo!"
40
- end
41
- end
42
- assert_equal 'default', msg["queue"]
43
- assert_equal 'kerblammo!', msg["error_message"]
44
- assert_equal 'RuntimeError', msg["error_class"]
45
- assert_equal 11, msg["retry_count"]
46
- assert msg["failed_at"]
47
- @redis.verify
48
- end
49
-
50
- it 'throws away old messages after too many retries' do
51
- now = Time.now.utc
52
- msg = {"class"=>"Bob", "args"=>[1, 2, "foo"], "queue"=>"default", "error_message"=>"kerblammo!", "error_class"=>"RuntimeError", "failed_at"=>now, "retry_count"=>25}
53
- handler = Sidekiq::Middleware::Server::RetryJobs.new
54
- assert_raises RuntimeError do
55
- handler.call('', msg, 'default') do
56
- raise "kerblammo!"
57
- end
58
- end
59
- @redis.verify
60
- end
61
- end
62
-
63
- describe 'poller' do
64
- before do
65
- @redis = MiniTest::Mock.new
66
- Sidekiq.instance_variable_set(:@redis, @redis)
67
-
68
- def @redis.with; yield self; end
69
- end
70
-
71
- it 'should poll like a bad mother...SHUT YO MOUTH' do
72
- fake_msg = MultiJson.encode({ 'class' => 'Bob', 'args' => [1,2], 'queue' => 'someq' })
73
- @redis.expect :multi, [[fake_msg], 1], []
74
- @redis.expect :rpush, 1, ['queue:someq', fake_msg]
75
-
76
- inst = Sidekiq::Retry::Poller.new
77
- inst.poll
78
-
79
- @redis.verify
80
- end
81
- end
82
-
83
- end
data/test/test_stats.rb DELETED
@@ -1,78 +0,0 @@
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
- @redis = Sidekiq.redis = REDIS
9
- Sidekiq.redis.flushdb
10
- end
11
-
12
- class DumbWorker
13
- include Sidekiq::Worker
14
-
15
- def perform(arg)
16
- raise 'bang' if arg == nil
17
- end
18
- end
19
-
20
- it 'updates global stats in the success case' do
21
- msg = { 'class' => DumbWorker.to_s, 'args' => [""] }
22
- boss = MiniTest::Mock.new
23
-
24
- @redis.with do |conn|
25
-
26
- set = conn.smembers('workers')
27
- assert_equal 0, set.size
28
-
29
- processor = Sidekiq::Processor.new(boss)
30
- boss.expect(:processor_done!, nil, [processor])
31
-
32
- # adds to the workers set upon initialize
33
- set = conn.smembers('workers')
34
- assert_equal 1, set.size
35
- assert_match(/#{Regexp.escape(`hostname`.strip)}/, set.first)
36
-
37
- assert_equal 0, conn.get('stat:failed').to_i
38
- assert_equal 0, conn.get('stat:processed').to_i
39
- assert_equal 0, conn.get("stat:processed:#{processor}").to_i
40
-
41
- processor.process(msg, 'xyzzy')
42
- processor.process(msg, 'xyzzy')
43
- processor.process(msg, 'xyzzy')
44
-
45
- set = conn.smembers('workers')
46
- assert_equal 1, set.size
47
- assert_match(/#{Regexp.escape(`hostname`.strip)}/, set.first)
48
- assert_equal 0, conn.get('stat:failed').to_i
49
- assert_equal 3, conn.get('stat:processed').to_i
50
- assert_equal 3, conn.get("stat:processed:#{processor}").to_i
51
- end
52
- end
53
-
54
- it 'updates global stats in the error case' do
55
- msg = { 'class' => DumbWorker.to_s, 'args' => [nil] }
56
- boss = MiniTest::Mock.new
57
-
58
- assert_equal [], @redis.smembers('workers')
59
- assert_equal 0, @redis.get('stat:failed').to_i
60
- assert_equal 0, @redis.get('stat:processed').to_i
61
-
62
- processor = Sidekiq::Processor.new(boss)
63
- assert_equal 1, @redis.smembers('workers').size
64
-
65
- pstr = processor.to_s
66
- assert_raises RuntimeError do
67
- processor.process(msg, 'xyzzy')
68
- end
69
-
70
- set = @redis.smembers('workers')
71
- assert_equal 0, set.size
72
- assert_equal 1, @redis.get('stat:failed').to_i
73
- assert_equal 1, @redis.get('stat:processed').to_i
74
- assert_equal nil, @redis.get("stat:processed:#{pstr}")
75
- end
76
-
77
- end
78
- end
data/test/test_testing.rb DELETED
@@ -1,65 +0,0 @@
1
- require 'helper'
2
- require 'sidekiq'
3
- require 'sidekiq/worker'
4
- require 'active_record'
5
- require 'action_mailer'
6
- require 'sidekiq/extensions/action_mailer'
7
- require 'sidekiq/extensions/active_record'
8
-
9
- Sidekiq.hook_rails!
10
-
11
- class TestTesting < MiniTest::Unit::TestCase
12
- describe 'sidekiq testing' do
13
-
14
- class DirectWorker
15
- include Sidekiq::Worker
16
- def perform(a, b)
17
- a + b
18
- end
19
- end
20
-
21
- class FooMailer < ActionMailer::Base
22
- def bar(str)
23
- str
24
- end
25
- end
26
-
27
- class FooModel < ActiveRecord::Base
28
- def bar(str)
29
- str
30
- end
31
- end
32
-
33
- before do
34
- require 'sidekiq/testing'
35
- end
36
-
37
- after do
38
- # Undo override
39
- Sidekiq::Worker::ClassMethods.class_eval do
40
- remove_method :perform_async
41
- alias_method :perform_async, :perform_async_old
42
- remove_method :perform_async_old
43
- end
44
- end
45
-
46
- it 'stubs the async call when in testing mode' do
47
- # We can only have one it block here so all 'testing' tests
48
- # have to go here because require 'sidekiq/testing' changes
49
- # how Sidekiq works and we need to roll back those changes
50
- # when the test is done.
51
- assert_equal 0, DirectWorker.jobs.size
52
- assert DirectWorker.perform_async(1, 2)
53
- assert_equal 1, DirectWorker.jobs.size
54
-
55
- assert_equal 0, Sidekiq::Extensions::DelayedMailer.jobs.size
56
- FooMailer.delay.bar('hello!')
57
- assert_equal 1, Sidekiq::Extensions::DelayedMailer.jobs.size
58
-
59
- assert_equal 0, Sidekiq::Extensions::DelayedModel.jobs.size
60
- FooModel.delay.bar('hello!')
61
- assert_equal 1, Sidekiq::Extensions::DelayedModel.jobs.size
62
- end
63
-
64
- end
65
- end
data/test/test_web.rb DELETED
@@ -1,61 +0,0 @@
1
- require 'helper'
2
- require 'sidekiq'
3
- require 'sidekiq/web'
4
- require 'rack/test'
5
-
6
- class TestWeb < MiniTest::Unit::TestCase
7
- describe 'sidekiq web' do
8
- include Rack::Test::Methods
9
-
10
- def app
11
- Sidekiq::Web
12
- end
13
-
14
- before do
15
- Sidekiq.redis = REDIS
16
- Sidekiq.redis.flushdb
17
- end
18
-
19
- class WebWorker
20
- include Sidekiq::Worker
21
-
22
- def perform(a, b)
23
- a + b
24
- end
25
- end
26
-
27
- it 'shows active queues' do
28
- get '/'
29
- assert_equal 200, last_response.status
30
- assert_match last_response.body, /Sidekiq is down/
31
- refute_match last_response.body, /default/
32
-
33
- assert WebWorker.perform_async(1, 2)
34
-
35
- get '/'
36
- assert_equal 200, last_response.status
37
- assert_match last_response.body, /Sidekiq is down/
38
- assert_match last_response.body, /default/
39
- refute_match last_response.body, /foo/
40
-
41
- assert Sidekiq::Client.push(:foo, 'class' => WebWorker, 'args' => [1, 3])
42
-
43
- get '/'
44
- assert_equal 200, last_response.status
45
- assert_match last_response.body, /Sidekiq is down/
46
- assert_match last_response.body, /default/
47
- assert_match last_response.body, /foo/
48
- end
49
-
50
- it 'handles queues with no name' do
51
- get '/queues'
52
- assert_equal 404, last_response.status
53
- end
54
-
55
- it 'handles queue view' do
56
- get '/queues/default'
57
- assert_equal 200, last_response.status
58
- end
59
-
60
- end
61
- end
@@ -1,91 +0,0 @@
1
- /* ==========================================================
2
- * bootstrap-alert.js v2.0.0
3
- * http://twitter.github.com/bootstrap/javascript.html#alerts
4
- * ==========================================================
5
- * Copyright 2012 Twitter, Inc.
6
- *
7
- * Licensed under the Apache License, Version 2.0 (the "License");
8
- * you may not use this file except in compliance with the License.
9
- * You may obtain a copy of the License at
10
- *
11
- * http://www.apache.org/licenses/LICENSE-2.0
12
- *
13
- * Unless required by applicable law or agreed to in writing, software
14
- * distributed under the License is distributed on an "AS IS" BASIS,
15
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
- * See the License for the specific language governing permissions and
17
- * limitations under the License.
18
- * ========================================================== */
19
-
20
-
21
- !function( $ ){
22
-
23
- "use strict"
24
-
25
- /* ALERT CLASS DEFINITION
26
- * ====================== */
27
-
28
- var dismiss = '[data-dismiss="alert"]'
29
- , Alert = function ( el ) {
30
- $(el).on('click', dismiss, this.close)
31
- }
32
-
33
- Alert.prototype = {
34
-
35
- constructor: Alert
36
-
37
- , close: function ( e ) {
38
- var $this = $(this)
39
- , selector = $this.attr('data-target')
40
- , $parent
41
-
42
- if (!selector) {
43
- selector = $this.attr('href')
44
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
45
- }
46
-
47
- $parent = $(selector)
48
- $parent.trigger('close')
49
-
50
- e && e.preventDefault()
51
-
52
- $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
53
-
54
- $parent.removeClass('in')
55
-
56
- function removeElement() {
57
- $parent.remove()
58
- $parent.trigger('closed')
59
- }
60
-
61
- $.support.transition && $parent.hasClass('fade') ?
62
- $parent.on($.support.transition.end, removeElement) :
63
- removeElement()
64
- }
65
-
66
- }
67
-
68
-
69
- /* ALERT PLUGIN DEFINITION
70
- * ======================= */
71
-
72
- $.fn.alert = function ( option ) {
73
- return this.each(function () {
74
- var $this = $(this)
75
- , data = $this.data('alert')
76
- if (!data) $this.data('alert', (data = new Alert(this)))
77
- if (typeof option == 'string') data[option].call($this)
78
- })
79
- }
80
-
81
- $.fn.alert.Constructor = Alert
82
-
83
-
84
- /* ALERT DATA-API
85
- * ============== */
86
-
87
- $(function () {
88
- $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
89
- })
90
-
91
- }( window.jQuery )