sidekiq 0.10.0 → 7.2.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.
- checksums.yaml +7 -0
- data/Changes.md +2082 -0
- data/LICENSE.txt +9 -0
- data/README.md +73 -27
- data/bin/sidekiq +25 -9
- data/bin/sidekiqload +247 -0
- data/bin/sidekiqmon +11 -0
- data/lib/generators/sidekiq/job_generator.rb +57 -0
- data/lib/generators/sidekiq/templates/job.rb.erb +9 -0
- data/lib/generators/sidekiq/templates/job_spec.rb.erb +6 -0
- data/lib/generators/sidekiq/templates/job_test.rb.erb +8 -0
- data/lib/sidekiq/api.rb +1145 -0
- data/lib/sidekiq/capsule.rb +127 -0
- data/lib/sidekiq/cli.rb +348 -109
- data/lib/sidekiq/client.rb +241 -41
- data/lib/sidekiq/component.rb +68 -0
- data/lib/sidekiq/config.rb +287 -0
- data/lib/sidekiq/deploy.rb +62 -0
- data/lib/sidekiq/embedded.rb +61 -0
- data/lib/sidekiq/fetch.rb +88 -0
- data/lib/sidekiq/job.rb +374 -0
- data/lib/sidekiq/job_logger.rb +51 -0
- data/lib/sidekiq/job_retry.rb +301 -0
- data/lib/sidekiq/job_util.rb +107 -0
- data/lib/sidekiq/launcher.rb +271 -0
- data/lib/sidekiq/logger.rb +131 -0
- data/lib/sidekiq/manager.rb +96 -103
- data/lib/sidekiq/metrics/query.rb +155 -0
- data/lib/sidekiq/metrics/shared.rb +95 -0
- data/lib/sidekiq/metrics/tracking.rb +136 -0
- data/lib/sidekiq/middleware/chain.rb +149 -38
- data/lib/sidekiq/middleware/current_attributes.rb +95 -0
- data/lib/sidekiq/middleware/i18n.rb +42 -0
- data/lib/sidekiq/middleware/modules.rb +21 -0
- data/lib/sidekiq/monitor.rb +146 -0
- data/lib/sidekiq/paginator.rb +55 -0
- data/lib/sidekiq/processor.rb +246 -61
- data/lib/sidekiq/rails.rb +60 -13
- data/lib/sidekiq/redis_client_adapter.rb +111 -0
- data/lib/sidekiq/redis_connection.rb +68 -15
- data/lib/sidekiq/ring_buffer.rb +29 -0
- data/lib/sidekiq/scheduled.rb +236 -0
- data/lib/sidekiq/sd_notify.rb +149 -0
- data/lib/sidekiq/systemd.rb +24 -0
- data/lib/sidekiq/testing/inline.rb +30 -0
- data/lib/sidekiq/testing.rb +310 -10
- data/lib/sidekiq/transaction_aware_client.rb +44 -0
- data/lib/sidekiq/version.rb +4 -1
- data/lib/sidekiq/web/action.rb +93 -0
- data/lib/sidekiq/web/application.rb +463 -0
- data/lib/sidekiq/web/csrf_protection.rb +180 -0
- data/lib/sidekiq/web/helpers.rb +364 -0
- data/lib/sidekiq/web/router.rb +104 -0
- data/lib/sidekiq/web.rb +143 -74
- data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
- data/lib/sidekiq.rb +120 -73
- data/sidekiq.gemspec +26 -23
- data/web/assets/images/apple-touch-icon.png +0 -0
- data/web/assets/images/favicon.ico +0 -0
- data/web/assets/images/logo.png +0 -0
- data/web/assets/images/status.png +0 -0
- data/web/assets/javascripts/application.js +177 -3
- data/web/assets/javascripts/base-charts.js +106 -0
- data/web/assets/javascripts/chart.min.js +13 -0
- data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
- data/web/assets/javascripts/dashboard-charts.js +182 -0
- data/web/assets/javascripts/dashboard.js +57 -0
- data/web/assets/javascripts/metrics.js +298 -0
- data/web/assets/stylesheets/application-dark.css +147 -0
- data/web/assets/stylesheets/application-rtl.css +153 -0
- data/web/assets/stylesheets/application.css +729 -7
- data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
- data/web/assets/stylesheets/bootstrap.css +5 -0
- data/web/locales/ar.yml +87 -0
- data/web/locales/cs.yml +78 -0
- data/web/locales/da.yml +75 -0
- data/web/locales/de.yml +81 -0
- data/web/locales/el.yml +87 -0
- data/web/locales/en.yml +101 -0
- data/web/locales/es.yml +86 -0
- data/web/locales/fa.yml +80 -0
- data/web/locales/fr.yml +99 -0
- data/web/locales/gd.yml +99 -0
- data/web/locales/he.yml +80 -0
- data/web/locales/hi.yml +75 -0
- data/web/locales/it.yml +69 -0
- data/web/locales/ja.yml +91 -0
- data/web/locales/ko.yml +68 -0
- data/web/locales/lt.yml +83 -0
- data/web/locales/nb.yml +77 -0
- data/web/locales/nl.yml +68 -0
- data/web/locales/pl.yml +59 -0
- data/web/locales/pt-br.yml +96 -0
- data/web/locales/pt.yml +67 -0
- data/web/locales/ru.yml +83 -0
- data/web/locales/sv.yml +68 -0
- data/web/locales/ta.yml +75 -0
- data/web/locales/uk.yml +77 -0
- data/web/locales/ur.yml +80 -0
- data/web/locales/vi.yml +83 -0
- data/web/locales/zh-cn.yml +95 -0
- data/web/locales/zh-tw.yml +102 -0
- data/web/views/_footer.erb +23 -0
- data/web/views/_job_info.erb +105 -0
- data/web/views/_metrics_period_select.erb +12 -0
- data/web/views/_nav.erb +52 -0
- data/web/views/_paging.erb +25 -0
- data/web/views/_poll_link.erb +4 -0
- data/web/views/_status.erb +4 -0
- data/web/views/_summary.erb +40 -0
- data/web/views/busy.erb +148 -0
- data/web/views/dashboard.erb +105 -0
- data/web/views/dead.erb +34 -0
- data/web/views/filtering.erb +7 -0
- data/web/views/layout.erb +42 -0
- data/web/views/metrics.erb +91 -0
- data/web/views/metrics_for_job.erb +59 -0
- data/web/views/morgue.erb +74 -0
- data/web/views/queue.erb +55 -0
- data/web/views/queues.erb +44 -0
- data/web/views/retries.erb +79 -0
- data/web/views/retry.erb +34 -0
- data/web/views/scheduled.erb +56 -0
- data/web/views/scheduled_job_info.erb +8 -0
- metadata +159 -237
- data/.gitignore +0 -6
- data/.rvmrc +0 -4
- data/COMM-LICENSE +0 -75
- data/Gemfile +0 -10
- data/LICENSE +0 -22
- data/Rakefile +0 -9
- data/TODO.md +0 -1
- data/bin/client +0 -7
- data/bin/sidekiqctl +0 -43
- data/config.ru +0 -8
- data/examples/chef/cookbooks/sidekiq/README.rdoc +0 -11
- data/examples/chef/cookbooks/sidekiq/recipes/default.rb +0 -55
- data/examples/chef/cookbooks/sidekiq/templates/default/monitrc.conf.erb +0 -8
- data/examples/chef/cookbooks/sidekiq/templates/default/sidekiq.erb +0 -219
- data/examples/chef/cookbooks/sidekiq/templates/default/sidekiq.yml.erb +0 -22
- data/examples/config.yml +0 -9
- data/examples/monitrc.conf +0 -6
- data/examples/por.rb +0 -27
- data/examples/scheduling.rb +0 -37
- data/examples/sinkiq.rb +0 -57
- data/examples/web-ui.png +0 -0
- data/lib/sidekiq/capistrano.rb +0 -32
- data/lib/sidekiq/extensions/action_mailer.rb +0 -26
- data/lib/sidekiq/extensions/active_record.rb +0 -27
- data/lib/sidekiq/extensions/generic_proxy.rb +0 -21
- data/lib/sidekiq/middleware/client/unique_jobs.rb +0 -32
- data/lib/sidekiq/middleware/server/active_record.rb +0 -13
- data/lib/sidekiq/middleware/server/exception_handler.rb +0 -38
- data/lib/sidekiq/middleware/server/failure_jobs.rb +0 -24
- data/lib/sidekiq/middleware/server/logging.rb +0 -27
- data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -59
- data/lib/sidekiq/middleware/server/unique_jobs.rb +0 -15
- data/lib/sidekiq/retry.rb +0 -57
- data/lib/sidekiq/util.rb +0 -61
- data/lib/sidekiq/worker.rb +0 -37
- data/myapp/.gitignore +0 -15
- data/myapp/Capfile +0 -5
- data/myapp/Gemfile +0 -19
- data/myapp/Gemfile.lock +0 -143
- data/myapp/Rakefile +0 -7
- data/myapp/app/controllers/application_controller.rb +0 -3
- data/myapp/app/controllers/work_controller.rb +0 -38
- data/myapp/app/helpers/application_helper.rb +0 -2
- data/myapp/app/mailers/.gitkeep +0 -0
- data/myapp/app/mailers/user_mailer.rb +0 -9
- data/myapp/app/models/.gitkeep +0 -0
- data/myapp/app/models/post.rb +0 -5
- data/myapp/app/views/layouts/application.html.erb +0 -14
- data/myapp/app/views/user_mailer/greetings.html.erb +0 -3
- data/myapp/app/views/work/index.html.erb +0 -1
- data/myapp/app/workers/hard_worker.rb +0 -9
- data/myapp/config/application.rb +0 -59
- data/myapp/config/boot.rb +0 -6
- data/myapp/config/database.yml +0 -25
- data/myapp/config/deploy.rb +0 -15
- data/myapp/config/environment.rb +0 -5
- data/myapp/config/environments/development.rb +0 -38
- data/myapp/config/environments/production.rb +0 -67
- data/myapp/config/environments/test.rb +0 -37
- data/myapp/config/initializers/backtrace_silencers.rb +0 -7
- data/myapp/config/initializers/inflections.rb +0 -15
- data/myapp/config/initializers/mime_types.rb +0 -5
- data/myapp/config/initializers/secret_token.rb +0 -7
- data/myapp/config/initializers/session_store.rb +0 -8
- data/myapp/config/initializers/sidekiq.rb +0 -6
- data/myapp/config/initializers/wrap_parameters.rb +0 -14
- data/myapp/config/locales/en.yml +0 -5
- data/myapp/config/routes.rb +0 -10
- data/myapp/config.ru +0 -4
- data/myapp/db/migrate/20120123214055_create_posts.rb +0 -10
- data/myapp/db/seeds.rb +0 -7
- data/myapp/lib/assets/.gitkeep +0 -0
- data/myapp/lib/tasks/.gitkeep +0 -0
- data/myapp/log/.gitkeep +0 -0
- data/myapp/script/rails +0 -6
- data/test/config.yml +0 -9
- data/test/fake_env.rb +0 -0
- data/test/helper.rb +0 -15
- data/test/test_cli.rb +0 -168
- data/test/test_client.rb +0 -105
- data/test/test_extensions.rb +0 -68
- data/test/test_manager.rb +0 -43
- data/test/test_middleware.rb +0 -92
- data/test/test_processor.rb +0 -32
- data/test/test_retry.rb +0 -83
- data/test/test_stats.rb +0 -78
- data/test/test_testing.rb +0 -65
- data/test/test_web.rb +0 -61
- data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
- data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-alert.js +0 -91
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-button.js +0 -98
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-carousel.js +0 -154
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-collapse.js +0 -136
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-dropdown.js +0 -92
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-modal.js +0 -210
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-popover.js +0 -95
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-scrollspy.js +0 -125
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-tab.js +0 -130
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-tooltip.js +0 -270
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-transition.js +0 -51
- data/web/assets/javascripts/vendor/bootstrap/bootstrap-typeahead.js +0 -271
- data/web/assets/javascripts/vendor/bootstrap.js +0 -12
- data/web/assets/javascripts/vendor/jquery.js +0 -9266
- data/web/assets/stylesheets/vendor/bootstrap-responsive.css +0 -567
- data/web/assets/stylesheets/vendor/bootstrap.css +0 -3365
- data/web/views/index.slim +0 -62
- data/web/views/layout.slim +0 -24
- data/web/views/queue.slim +0 -11
data/test/test_extensions.rb
DELETED
@@ -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
|
data/test/test_middleware.rb
DELETED
@@ -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
|
data/test/test_processor.rb
DELETED
@@ -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
|
Binary file
|
Binary file
|
@@ -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 )
|