sidekiq-undertaker 1.3.0 → 1.4.0

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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby-build.yml +30 -2
  3. data/.rubocop.yml +4 -0
  4. data/.rubocop_codeclimate.yml +9 -0
  5. data/CHANGELOG.md +11 -0
  6. data/README.md +2 -1
  7. data/lib/sidekiq/undertaker/dead_job.rb +10 -2
  8. data/lib/sidekiq/undertaker/job_distributor.rb +4 -0
  9. data/lib/sidekiq/undertaker/job_filter.rb +7 -2
  10. data/lib/sidekiq/undertaker/version.rb +1 -1
  11. data/lib/sidekiq/undertaker/web_extension/api_helpers.rb +42 -21
  12. data/lib/sidekiq/undertaker/web_extension.rb +11 -9
  13. data/sidekiq-undertaker.gemspec +4 -5
  14. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_filter_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +3 -3
  15. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +24 -24
  16. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_polled/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +24 -24
  17. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classerror_classbucket_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +231 -0
  18. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classerror_classbucket_page_is_polled/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +231 -0
  19. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_all_failures_and_errors/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +8 -7
  20. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_job_class_error_and_specific_error_message/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +284 -0
  21. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_job_class_error_and_specific_error_message/with_pagination/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +1310 -0
  22. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_specific_job_class_and_a_specific_error/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +6 -5
  23. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_specific_job_class_and_a_specific_error/with_pagination/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +54 -53
  24. data/spec/sidekiq/undertaker/dead_jobs_spec.rb +7 -4
  25. data/spec/sidekiq/undertaker/job_distributor_spec.rb +38 -16
  26. data/spec/sidekiq/undertaker/job_filter_spec.rb +26 -9
  27. data/spec/sidekiq/undertaker/web_extension_spec.rb +60 -17
  28. data/spec/spec_helper.rb +4 -0
  29. data/web/views/filter.erb +1 -1
  30. data/web/views/filter_job_class.erb +8 -8
  31. data/web/views/filter_job_class_error_class.erb +36 -0
  32. data/web/views/morgue.erb +4 -3
  33. metadata +21 -29
  34. data/.travis.yml +0 -51
@@ -8,25 +8,28 @@ module Sidekiq
8
8
  describe ".filter_dead_jobs" do
9
9
  let(:job1) do
10
10
  instance_double(Sidekiq::JobRecord, item: {
11
- "class" => "HardWorkTask",
12
- "failed_at" => Time.now.to_i - (5 * 60),
13
- "error_class" => "NoMethodError"
11
+ "class" => "HardWorkTask",
12
+ "failed_at" => Time.now.to_i - (5 * 60),
13
+ "error_class" => "NoMethodError",
14
+ "error_message" => "undefined method `pause` for H..."
14
15
  })
15
16
  end
16
17
 
17
18
  let(:job2) do
18
19
  instance_double(Sidekiq::JobRecord, item: {
19
- "class" => "HardWorkTask",
20
- "failed_at" => Time.now.to_i - (2 * 60 * 60),
21
- "error_class" => "RandomError"
20
+ "class" => "HardWorkTask",
21
+ "failed_at" => Time.now.to_i - (2 * 60 * 60),
22
+ "error_class" => "RandomError",
23
+ "error_message" => "random error message"
22
24
  })
23
25
  end
24
26
 
25
27
  let(:job3) do
26
28
  instance_double(Sidekiq::JobRecord, item: {
27
- "class" => "LazyWorkTask",
28
- "failed_at" => Time.now.to_i - (2 * 60 * 60),
29
- "error_class" => "NoMethodError"
29
+ "class" => "LazyWorkTask",
30
+ "failed_at" => Time.now.to_i - (2 * 60 * 60),
31
+ "error_class" => "NoMethodError",
32
+ "error_message" => "undefined method `work_hard` for LazyWork:Class"
30
33
  })
31
34
  end
32
35
 
@@ -85,6 +88,20 @@ module Sidekiq
85
88
  it { expect(dead_jobs.size).to eq 2 }
86
89
  end
87
90
 
91
+ context "when the error_msg filter is given" do
92
+ subject(:dead_jobs) do
93
+ described_class.filter_dead_jobs("error_msg" => "undefined method `pause` for H...")
94
+ end
95
+
96
+ it "filters jobs based on error_message" do
97
+ dead_jobs.each do |dead_job|
98
+ expect(dead_job.error_msg).to eq "undefined method `pause` for H..."
99
+ end
100
+ end
101
+
102
+ it { expect(dead_jobs.size).to eq 1 }
103
+ end
104
+
88
105
  context "when no filters are applied" do
89
106
  subject(:dead_jobs) { described_class.filter_dead_jobs }
90
107
 
@@ -33,13 +33,15 @@ module Sidekiq
33
33
  "class" => "HardWorker",
34
34
  "args" => ["asdf", 1234],
35
35
  "queue" => "foo",
36
- "error_message" => "Some fake message",
36
+ "error_message" => "Option 'data/file_name' is required! This is an extra long error message.",
37
37
  "error_class" => "RuntimeError",
38
38
  "retry_count" => 0,
39
39
  "failed_at" => Time.now.utc
40
40
  }
41
41
  end
42
42
 
43
+ let(:encoded_error_msg) { "T3B0aW9uICdkYXRhL2ZpbGVfbmFtZScgaXMgcmVxLi4u" }
44
+
43
45
  # rubocop:disable RSpec/AnyInstance
44
46
  before do
45
47
  Timecop.freeze(Time.gm(2018, 12, 16, 20, 57))
@@ -101,6 +103,20 @@ module Sidekiq
101
103
 
102
104
  it_behaves_like "a page"
103
105
  end
106
+
107
+ # /undertaker/filter/:job_class/:error_class/:bucket_name
108
+ context "when job-class/error-class/bucket page is called" do
109
+ subject { get "/undertaker/filter/HardWorker/RuntimeError/1_hour" }
110
+
111
+ it_behaves_like "a page"
112
+ end
113
+
114
+ # /undertaker/filter/:job_class/:error_class/:bucket_name?poll=true
115
+ context "when job-class/error-class/bucket page is polled" do
116
+ subject { get "/undertaker/filter/HardWorker/RuntimeError/1_hour?poll=true" }
117
+
118
+ it_behaves_like "a page"
119
+ end
104
120
  end
105
121
 
106
122
  describe "show morgue" do
@@ -108,10 +124,28 @@ module Sidekiq
108
124
  allow_any_instance_of(Sidekiq::Web::CsrfProtection).to receive(:mask_token).and_return("stubbed-csrf-token")
109
125
  end
110
126
 
111
- # /undertaker/morgue/:job_class/:error_class/:bucket_name
127
+ # /undertaker/morgue/:job_class/:error_class/:error_msg/:bucket_name
112
128
  context "when job-class/error/bucket is called" do
113
129
  context "with specific job-class and a specific error" do
114
- subject { get "/undertaker/morgue/HardWorker/RuntimeError/1_hour" }
130
+ subject { get "/undertaker/morgue/HardWorker/RuntimeError/all/1_hour" }
131
+
132
+ it_behaves_like "a page"
133
+
134
+ context "with pagination" do
135
+ before do
136
+ 50.times do |i|
137
+ job_refs.push add_dead("jid" => i.to_s)
138
+ end
139
+ end
140
+
141
+ it_behaves_like "a page"
142
+ end
143
+ end
144
+
145
+ context "with job-class, error and specific error message" do
146
+ subject do
147
+ get "/undertaker/morgue/HardWorker/RuntimeError/#{encoded_error_msg}/1_hour"
148
+ end
115
149
 
116
150
  it_behaves_like "a page"
117
151
 
@@ -127,7 +161,7 @@ module Sidekiq
127
161
  end
128
162
 
129
163
  context "with all failures and errors" do
130
- subject { get "/undertaker/morgue/all/all/total_dead" }
164
+ subject { get "/undertaker/morgue/all/all/all/total_dead" }
131
165
 
132
166
  it_behaves_like "a page"
133
167
  end
@@ -136,12 +170,17 @@ module Sidekiq
136
170
  # rubocop:enable RSpec/AnyInstance
137
171
 
138
172
  describe "delete" do
139
- context "when job-class, error and bucket are given" do
140
- subject { post "/undertaker/morgue/HardWorker/RuntimeError/1_hour/delete" }
173
+ context "when job-class, error, error message and bucket are given" do
174
+ subject do
175
+ post "/undertaker/morgue/HardWorker/RuntimeError/#{encoded_error_msg}/1_hour/delete"
176
+ end
141
177
 
142
- let(:expected_redirect_url) { "http://example.org/undertaker/morgue/HardWorker/RuntimeError/1_hour" }
178
+ let(:expected_redirect_url) { "http://example.org/undertaker/morgue/HardWorker/RuntimeError/#{encoded_error_msg}/1_hour" }
143
179
 
144
- let(:params) { { "job_class" => "HardWorker", "error_class" => "RuntimeError", "bucket_name" => "1_hour" } }
180
+ let(:params) do
181
+ { "job_class" => "HardWorker", "error_class" => "RuntimeError", "bucket_name" => "1_hour",
182
+ "error_msg" => "Option 'data/file_name' is req..." }
183
+ end
145
184
  let(:dead_jobs_set) { [dead_job1, dead_job2] }
146
185
  let(:dead_job1) { Sidekiq::Undertaker::DeadJob.to_dead_job(Sidekiq::DeadSet.new.find_job(jid1)) }
147
186
  let(:dead_job2) { Sidekiq::Undertaker::DeadJob.to_dead_job(Sidekiq::DeadSet.new.find_job(jid2)) }
@@ -161,7 +200,7 @@ module Sidekiq
161
200
  expect { subject }.to change { Sidekiq::DeadSet.new.size }.from(4).to(2)
162
201
  end
163
202
 
164
- it "redirects to /undertaker/morgue/HardWorker/RuntimeError/1_hour after the delete" do
203
+ it "redirects to morgue view after the delete" do
165
204
  subject
166
205
  expect(last_response.status).to eq 302
167
206
 
@@ -269,11 +308,14 @@ module Sidekiq
269
308
 
270
309
  describe "retry" do
271
310
  context "when job class, error and bucket are given" do
272
- subject { post "/undertaker/morgue/HardWorker/RuntimeError/1_hour/retry" }
311
+ subject { post "/undertaker/morgue/HardWorker/RuntimeError/all/1_hour/retry" }
273
312
 
274
- let(:expected_redirect_url) { "http://example.org/undertaker/morgue/HardWorker/RuntimeError/1_hour" }
313
+ let(:expected_redirect_url) { "http://example.org/undertaker/morgue/HardWorker/RuntimeError/all/1_hour" }
275
314
 
276
- let(:params) { { "job_class" => "HardWorker", "error_class" => "RuntimeError", "bucket_name" => "1_hour" } }
315
+ let(:params) do
316
+ { "job_class" => "HardWorker", "error_class" => "RuntimeError", "bucket_name" => "1_hour",
317
+ "error_msg" => "all" }
318
+ end
277
319
  let(:dead_jobs_set) { [dead_job1, dead_job2] }
278
320
  let(:dead_job1) { Sidekiq::Undertaker::DeadJob.to_dead_job(Sidekiq::DeadSet.new.find_job(jid1)) }
279
321
  let(:dead_job2) { Sidekiq::Undertaker::DeadJob.to_dead_job(Sidekiq::DeadSet.new.find_job(jid2)) }
@@ -326,13 +368,14 @@ module Sidekiq
326
368
 
327
369
  describe "export" do
328
370
  context "when job class, error and bucket are given" do
329
- subject { post "/undertaker/morgue/HardWorker/RuntimeError/1_hour/export" }
371
+ subject { post "/undertaker/morgue/HardWorker/RuntimeError/all/1_hour/export" }
330
372
 
331
- let(:expected_redirect_url) { "http://example.org/undertaker/morgue/HardWorker/RuntimeError/1_hour" }
373
+ let(:expected_redirect_url) { "http://example.org/undertaker/morgue/HardWorker/RuntimeError/all/1_hour" }
332
374
  let(:expected_content_disposition_header) { "attachment; filename=\"2018-12-16_20-57.json\"" }
333
375
 
334
376
  let(:params) do
335
- { "job_class" => "HardWorker", "error_class" => "RuntimeError", "bucket_name" => "1_hour" }
377
+ { "job_class" => "HardWorker", "error_class" => "RuntimeError", "bucket_name" => "1_hour",
378
+ "error_msg" => "all" }
336
379
  end
337
380
  let(:dead_jobs_set) { [dead_job1, dead_job2] }
338
381
  let(:dead_job1) { Sidekiq::Undertaker::DeadJob.to_dead_job(Sidekiq::DeadSet.new.find_job(jid1)) }
@@ -400,9 +443,9 @@ module Sidekiq
400
443
  it "redirects on specific retry post" do
401
444
  post("/undertaker/morgue",
402
445
  "key[]=#{job_refs[0]}&retry=Retry+Now",
403
- "HTTP_REFERER" => "/undertaker/morgue/all/all/total_dead")
446
+ "HTTP_REFERER" => "/undertaker/morgue/all/all/all/total_dead")
404
447
  expect(last_response.status).to eq 302
405
- expect(last_response.header["Location"]).to include("/undertaker/morgue/all/all/total_dead")
448
+ expect(last_response.header["Location"]).to include("/undertaker/morgue/all/all/all/total_dead")
406
449
  end
407
450
  end
408
451
  end
data/spec/spec_helper.rb CHANGED
@@ -19,6 +19,10 @@ require "timecop"
19
19
 
20
20
  if ENV["COVERAGE"]
21
21
  require "simplecov"
22
+ require "simplecov_json_formatter"
23
+
24
+ SimpleCov.formatter = SimpleCov::Formatter::JSONFormatter
25
+
22
26
  SimpleCov.start do
23
27
  add_group "lib", "lib"
24
28
  add_group "spec", "spec"
data/web/views/filter.erb CHANGED
@@ -21,7 +21,7 @@
21
21
  </thead>
22
22
  <% @distribution.each do |group, bucket_counts| %>
23
23
  <tr>
24
- <td><a href='<%= "#{root_path}undertaker/morgue/#{group}/all/total_dead" %>'> <%= group %></a></td>
24
+ <td><a href='<%= "#{root_path}undertaker/morgue/#{group}/all/all/total_dead" %>'> <%= group %></a></td>
25
25
  <td><a href='<%= "#{root_path}undertaker/filter/#{group}/total_dead" %>'><%= bucket_counts['total_dead']%></a></td>
26
26
  <td><a href='<%= "#{root_path}undertaker/filter/#{group}/1_hour" %>'><%= bucket_counts['1_hour']%></a></td>
27
27
  <td><a href='<%= "#{root_path}undertaker/filter/#{group}/3_hours" %>'><%= bucket_counts['3_hours']%></a></td>
@@ -22,14 +22,14 @@
22
22
  </thead>
23
23
  <% @distribution.each do |group, bucket_counts| %>
24
24
  <tr>
25
- <td><a href='<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{group}/total_dead" %>'><%= group %></a></td>
26
- <td><a href='<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{group}/total_dead" %>'><%= bucket_counts['total_dead'] %></a></td>
27
- <td><a href='<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{group}/1_hour" %>'><%= bucket_counts['1_hour']%></a></td>
28
- <td><a href='<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{group}/3_hours" %>'><%= bucket_counts['3_hours']%></a></td>
29
- <td><a href='<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{group}/1_day" %>'><%= bucket_counts['1_day']%></a></td>
30
- <td><a href='<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{group}/3_days" %>'><%= bucket_counts['3_days']%></a></td>
31
- <td><a href='<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{group}/1_week" %>'><%= bucket_counts['1_week']%></a></td>
32
- <td><a href='<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{group}/older" %>'><%= bucket_counts['older']%></a></td>
25
+ <td><a href='<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{group}/all/total_dead" %>'><%= group %></a></td>
26
+ <td><a href='<%= "#{root_path}undertaker/filter/#{@req_job_class}/#{group}/total_dead" %>'><%= bucket_counts['total_dead'] %></a></td>
27
+ <td><a href='<%= "#{root_path}undertaker/filter/#{@req_job_class}/#{group}/1_hour" %>'><%= bucket_counts['1_hour']%></a></td>
28
+ <td><a href='<%= "#{root_path}undertaker/filter/#{@req_job_class}/#{group}/3_hours" %>'><%= bucket_counts['3_hours']%></a></td>
29
+ <td><a href='<%= "#{root_path}undertaker/filter/#{@req_job_class}/#{group}/1_day" %>'><%= bucket_counts['1_day']%></a></td>
30
+ <td><a href='<%= "#{root_path}undertaker/filter/#{@req_job_class}/#{group}/3_days" %>'><%= bucket_counts['3_days']%></a></td>
31
+ <td><a href='<%= "#{root_path}undertaker/filter/#{@req_job_class}/#{group}/1_week" %>'><%= bucket_counts['1_week']%></a></td>
32
+ <td><a href='<%= "#{root_path}undertaker/filter/#{@req_job_class}/#{group}/older" %>'><%= bucket_counts['older']%></a></td>
33
33
  </tr>
34
34
  <% end %>
35
35
  </table>
@@ -0,0 +1,36 @@
1
+ <header class="row header">
2
+ <div class="col-sm-12">
3
+ <h3>
4
+ <%= "<b>#{@total_dead}</b> dead #{@total_dead == 1 ? 'job' : 'jobs'}" %>
5
+ <%= " of <b>#{@req_job_class}</b> class" unless @req_job_class == "all" %>
6
+ <%= " with <b>#{@req_error_class}</b> exception" unless @req_error_class == "all" %>
7
+ </h3>
8
+ </div>
9
+ </header>
10
+
11
+ <table class="table table-striped table-bordered table-white">
12
+ <thead>
13
+ <tr>
14
+ <th style="width: 20%"><%= t('Error Message') %></th>
15
+ <th style="width: 10%"><%= t('All') %></th>
16
+ <th style="width: 10%"><%= t('1 hour') %></th>
17
+ <th style="width: 10%"><%= t('3 hours') %></th>
18
+ <th style="width: 10%"><%= t('1 day') %></th>
19
+ <th style="width: 10%"><%= t('3 days') %></th>
20
+ <th style="width: 10%"><%= t('1 week') %></th>
21
+ <th style="width: 10%"><%= t('Older') %></th>
22
+ </tr>
23
+ </thead>
24
+ <% @distribution.each do |group, bucket_counts| %>
25
+ <tr>
26
+ <td><a href='<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{@req_error_class}/#{Base64.urlsafe_encode64(group)}/total_dead" %>'><%= group %></a></td>
27
+ <td><a href='<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{@req_error_class}/#{Base64.urlsafe_encode64(group)}/total_dead" %>'><%= bucket_counts['total_dead'] %></a></td>
28
+ <td><a href='<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{@req_error_class}/#{Base64.urlsafe_encode64(group)}/1_hour" %>'><%= bucket_counts['1_hour']%></a></td>
29
+ <td><a href='<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{@req_error_class}/#{Base64.urlsafe_encode64(group)}/3_hours" %>'><%= bucket_counts['3_hours']%></a></td>
30
+ <td><a href='<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{@req_error_class}/#{Base64.urlsafe_encode64(group)}/1_day" %>'><%= bucket_counts['1_day']%></a></td>
31
+ <td><a href='<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{@req_error_class}/#{Base64.urlsafe_encode64(group)}/3_days" %>'><%= bucket_counts['3_days']%></a></td>
32
+ <td><a href='<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{@req_error_class}/#{Base64.urlsafe_encode64(group)}/1_week" %>'><%= bucket_counts['1_week']%></a></td>
33
+ <td><a href='<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{@req_error_class}/#{Base64.urlsafe_encode64(group)}/older" %>'><%= bucket_counts['older']%></a></td>
34
+ </tr>
35
+ <% end %>
36
+ </table>
data/web/views/morgue.erb CHANGED
@@ -4,6 +4,7 @@
4
4
  <%= "<b>#{@total_dead}</b> dead #{@total_dead == 1 ? 'job' : 'jobs'}" %>
5
5
  <%= " of <b>#{@req_job_class}</b> class" unless @req_job_class == "all" %>
6
6
  <%= " with <b>#{@req_error_class}</b> exception" unless @req_error_class == "all" %>
7
+ <%= " with <b>#{@req_error_msg}</b> message" unless @req_error_msg == "all" %>
7
8
  <%= " in <b>#{@req_bucket_name}</b> bucket" %>
8
9
  </h3>
9
10
  </div>
@@ -60,17 +61,17 @@
60
61
  <input class="btn btn-danger btn-xs pull-left" type="submit" name="delete" value="<%= t('UndertakerBury') %>" />
61
62
  </form>
62
63
 
63
- <form action="<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{@req_error_class}/#{@req_bucket_name}/delete" %>" method="post">
64
+ <form action="<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{@req_error_class}/#{Base64.urlsafe_encode64(@req_error_msg)}/#{@req_bucket_name}/delete" %>" method="post">
64
65
  <%= respond_to?(:csrf_tag) && csrf_tag %>
65
66
  <input class="btn btn-danger btn-xs pull-right" type="submit" name="delete" value="<%= t('UndertakerBuryAll') %>" data-confirm="<%= t('AreYouSure') %>" />
66
67
  </form>
67
68
 
68
- <form action="<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{@req_error_class}/#{@req_bucket_name}/export" %>" method="post">
69
+ <form action="<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{@req_error_class}/#{Base64.urlsafe_encode64(@req_error_msg)}/#{@req_bucket_name}/export" %>" method="post">
69
70
  <%= respond_to?(:csrf_tag) && csrf_tag %>
70
71
  <input class="btn btn-secondary btn-xs pull-right" type="submit" name="export" value="<%= t('UndertakerExportAll') %>" />
71
72
  </form>
72
73
 
73
- <form action="<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{@req_error_class}/#{@req_bucket_name}/retry" %>" method="post">
74
+ <form action="<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{@req_error_class}/#{Base64.urlsafe_encode64(@req_error_msg)}/#{@req_bucket_name}/retry" %>" method="post">
74
75
  <%= respond_to?(:csrf_tag) && csrf_tag %>
75
76
  <input class="btn btn-danger btn-xs pull-right" type="submit" name="retry" value="<%= t('UndertakerReviveAll') %>" data-confirm="<%= t('AreYouSure') %>" />
76
77
  </form>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-undertaker
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Koppensteiner
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-04-27 00:00:00.000000000 Z
11
+ date: 2022-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -190,14 +190,14 @@ dependencies:
190
190
  requirements:
191
191
  - - "~>"
192
192
  - !ruby/object:Gem::Version
193
- version: '1.8'
193
+ version: '1.30'
194
194
  type: :development
195
195
  prerelease: false
196
196
  version_requirements: !ruby/object:Gem::Requirement
197
197
  requirements:
198
198
  - - "~>"
199
199
  - !ruby/object:Gem::Version
200
- version: '1.8'
200
+ version: '1.30'
201
201
  - !ruby/object:Gem::Dependency
202
202
  name: rubocop-rake
203
203
  requirement: !ruby/object:Gem::Requirement
@@ -246,14 +246,14 @@ dependencies:
246
246
  requirements:
247
247
  - - "~>"
248
248
  - !ruby/object:Gem::Version
249
- version: '0.14'
249
+ version: '0.21'
250
250
  type: :development
251
251
  prerelease: false
252
252
  version_requirements: !ruby/object:Gem::Requirement
253
253
  requirements:
254
254
  - - "~>"
255
255
  - !ruby/object:Gem::Version
256
- version: '0.14'
256
+ version: '0.21'
257
257
  - !ruby/object:Gem::Dependency
258
258
  name: sinatra
259
259
  requirement: !ruby/object:Gem::Requirement
@@ -286,16 +286,16 @@ dependencies:
286
286
  name: rubyzip
287
287
  requirement: !ruby/object:Gem::Requirement
288
288
  requirements:
289
- - - ">="
289
+ - - "~>"
290
290
  - !ruby/object:Gem::Version
291
- version: '0'
291
+ version: '2.3'
292
292
  type: :runtime
293
293
  prerelease: false
294
294
  version_requirements: !ruby/object:Gem::Requirement
295
295
  requirements:
296
- - - ">="
296
+ - - "~>"
297
297
  - !ruby/object:Gem::Version
298
- version: '0'
298
+ version: '2.3'
299
299
  - !ruby/object:Gem::Dependency
300
300
  name: sidekiq
301
301
  requirement: !ruby/object:Gem::Requirement
@@ -334,7 +334,6 @@ files:
334
334
  - ".rubocop.yml"
335
335
  - ".rubocop_codeclimate.yml"
336
336
  - ".rubocop_todo.yml"
337
- - ".travis.yml"
338
337
  - CHANGELOG.md
339
338
  - Gemfile
340
339
  - LICENSE.txt
@@ -358,7 +357,11 @@ files:
358
357
  - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_filter_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt
359
358
  - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt
360
359
  - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_polled/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt
360
+ - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classerror_classbucket_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt
361
+ - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classerror_classbucket_page_is_polled/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt
361
362
  - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_all_failures_and_errors/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt
363
+ - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_job_class_error_and_specific_error_message/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt
364
+ - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_job_class_error_and_specific_error_message/with_pagination/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt
362
365
  - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_specific_job_class_and_a_specific_error/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt
363
366
  - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_specific_job_class_and_a_specific_error/with_pagination/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt
364
367
  - spec/sidekiq/undertaker/bucket_spec.rb
@@ -370,6 +373,7 @@ files:
370
373
  - web/locales/en.yml
371
374
  - web/views/filter.erb
372
375
  - web/views/filter_job_class.erb
376
+ - web/views/filter_job_class_error_class.erb
373
377
  - web/views/morgue.erb
374
378
  homepage: https://github.com/ThomasKoppensteiner/sidekiq-undertaker
375
379
  licenses:
@@ -379,9 +383,9 @@ metadata:
379
383
  source_code_uri: https://github.com/ThomasKoppensteiner/sidekiq-undertaker
380
384
  changelog_uri: https://github.com/ThomasKoppensteiner/sidekiq-undertaker/blob/master/CHANGELOG.md
381
385
  bug_tracker_uri: https://github.com/ThomasKoppensteiner/sidekiq-undertaker/issues
382
- build_status_uri: https://travis-ci.org/ThomasKoppensteiner/sidekiq-undertaker
386
+ build_status_uri: https://github.com/ThomasKoppensteiner/sidekiq-undertaker/actions/workflows/ruby-build.yml
383
387
  rubygems_mfa_required: 'true'
384
- post_install_message:
388
+ post_install_message:
385
389
  rdoc_options: []
386
390
  require_paths:
387
391
  - lib
@@ -397,20 +401,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
397
401
  - !ruby/object:Gem::Version
398
402
  version: '0'
399
403
  requirements: []
400
- rubygems_version: 3.2.22
401
- signing_key:
404
+ rubygems_version: 3.1.2
405
+ signing_key:
402
406
  specification_version: 4
403
407
  summary: Sidekiq::Undertaker allows exploring, reviving or burying dead jobs
404
- test_files:
405
- - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_filter_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt
406
- - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt
407
- - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_polled/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt
408
- - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_all_failures_and_errors/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt
409
- - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_specific_job_class_and_a_specific_error/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt
410
- - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_specific_job_class_and_a_specific_error/with_pagination/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt
411
- - spec/sidekiq/undertaker/bucket_spec.rb
412
- - spec/sidekiq/undertaker/dead_jobs_spec.rb
413
- - spec/sidekiq/undertaker/job_distributor_spec.rb
414
- - spec/sidekiq/undertaker/job_filter_spec.rb
415
- - spec/sidekiq/undertaker/web_extension_spec.rb
416
- - spec/spec_helper.rb
408
+ test_files: []
data/.travis.yml DELETED
@@ -1,51 +0,0 @@
1
- language: ruby
2
- cache: bundler
3
- rvm:
4
- - 3.0.1
5
- - 2.7.3
6
- - 2.6.7
7
- - 2.5.8
8
- - jruby # latest
9
- - jruby-9.2.17.0
10
- #
11
- # 1. https://github.com/oracle/truffleruby/issues/1398
12
- # 2. Nokogiri build fails
13
- # - truffleruby # latest
14
- # - truffleruby-21.0.0
15
- jdk:
16
- - oraclejdk11
17
- env:
18
- global:
19
- - CC_TEST_REPORTER_ID=7b2f0f3c9e20e50573e293fe3743a322a74e54087f95abc98d0f1dd1f3dd0a97
20
- matrix:
21
- - "JRUBY_OPTS='--debug'"
22
- - "JRUBY_OPTS='-Xcompile.invokedynamic=true --debug'"
23
-
24
- matrix:
25
- exclude:
26
- - rvm: 3.0.1
27
- env: "JRUBY_OPTS='-Xcompile.invokedynamic=true --debug'"
28
- - rvm: 2.7.3
29
- env: "JRUBY_OPTS='-Xcompile.invokedynamic=true --debug'"
30
- - rvm: 2.6.7
31
- env: "JRUBY_OPTS='-Xcompile.invokedynamic=true --debug'"
32
- - rvm: 2.5.8
33
- env: "JRUBY_OPTS='-Xcompile.invokedynamic=true --debug'"
34
- - rvm: truffleruby-21.0.0
35
- env: "JRUBY_OPTS='-Xcompile.invokedynamic=true --debug'"
36
- - rvm: truffleruby
37
- env: "JRUBY_OPTS='-Xcompile.invokedynamic=true --debug'"
38
- allow_failures:
39
- - rvm: truffleruby
40
- - rvm: truffleruby-21.0.0
41
- services:
42
- - redis-server
43
-
44
- before_script:
45
- - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
46
- - chmod +x ./cc-test-reporter
47
- - ./cc-test-reporter before-build
48
- script:
49
- - COVERAGE=true bundle exec rspec
50
- after_script:
51
- - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT