sidekiq-undertaker 1.0.0.rc01

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +6 -0
  3. data/.gitignore +22 -0
  4. data/.rubocop.yml +5 -0
  5. data/.rubocop_todo.yml +23 -0
  6. data/.travis.yml +53 -0
  7. data/Demo_Filter.png +0 -0
  8. data/Demo_Job_Filter.png +0 -0
  9. data/Demo_Morgue_1_Job.png +0 -0
  10. data/Demo_Morgue_all.png +0 -0
  11. data/Gemfile +11 -0
  12. data/LICENSE.txt +21 -0
  13. data/README.md +95 -0
  14. data/Rakefile +34 -0
  15. data/lib/sidekiq/undertaker.rb +16 -0
  16. data/lib/sidekiq/undertaker/bucket.rb +29 -0
  17. data/lib/sidekiq/undertaker/dead_job.rb +64 -0
  18. data/lib/sidekiq/undertaker/job_distributor.rb +64 -0
  19. data/lib/sidekiq/undertaker/job_filter.rb +46 -0
  20. data/lib/sidekiq/undertaker/version.rb +7 -0
  21. data/lib/sidekiq/undertaker/web_extension.rb +37 -0
  22. data/lib/sidekiq/undertaker/web_extension/api_helpers.rb +120 -0
  23. data/sidekiq-undertaker.gemspec +55 -0
  24. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_filter_page_is_called/behaves_like_a_page/the_displayed_page_is_correct.approved.txt +240 -0
  25. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_called/behaves_like_a_page/the_displayed_page_is_correct.approved.txt +241 -0
  26. data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_polled/behaves_like_a_page/the_displayed_page_is_correct.approved.txt +241 -0
  27. 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.approved.txt +316 -0
  28. 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.approved.txt +274 -0
  29. data/spec/sidekiq/undertaker/bucket_spec.rb +26 -0
  30. data/spec/sidekiq/undertaker/dead_jobs_spec.rb +90 -0
  31. data/spec/sidekiq/undertaker/job_distributor_spec.rb +104 -0
  32. data/spec/sidekiq/undertaker/job_filter_spec.rb +105 -0
  33. data/spec/sidekiq/undertaker/web_extension_spec.rb +270 -0
  34. data/spec/spec_helper.rb +76 -0
  35. data/web/locales/en.yml +5 -0
  36. data/web/views/filter.erb +34 -0
  37. data/web/views/filter_job_class.erb +35 -0
  38. data/web/views/morgue.erb +75 -0
  39. metadata +378 -0
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file was generated by the `rspec --init` command. Conventionally, all
4
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
5
+ # Require this file using `require "spec_helper"` to ensure that it is only
6
+ # loaded once.
7
+ #
8
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
9
+
10
+ ENV["RACK_ENV"] ||= ENV["ENVIRONMENT"] ||= "test"
11
+
12
+ require "bundler/setup"
13
+ Bundler.setup
14
+ require "approvals/rspec"
15
+ require "mock_redis"
16
+ require "pry"
17
+ require "sidekiq"
18
+ require "timecop"
19
+
20
+ if ENV["COVERAGE"]
21
+ require "simplecov"
22
+ SimpleCov.start do
23
+ add_group "lib", "lib"
24
+ add_group "spec", "spec"
25
+
26
+ maximum_coverage_drop 2
27
+ # FIXME: JRuby reports different coverage on multi-line boolean statements like in `dead_job.rb`
28
+ minimum_coverage_by_file 70 # 95
29
+ minimum_coverage 95
30
+ end
31
+ end
32
+
33
+ require "sidekiq/undertaker"
34
+
35
+ RSpec.configure do |config|
36
+ config.run_all_when_everything_filtered = true
37
+ config.filter_run :focus
38
+
39
+ # Run specs in random order to surface order dependencies. If you find an
40
+ # order dependency and want to debug it, you can fix the order by providing
41
+ # the seed, which is printed after each run.
42
+ # --seed 1234
43
+ config.order = "random"
44
+
45
+ RSpec.configure do |con|
46
+ con.approvals_default_format = :txt
47
+ end
48
+
49
+ config.before do
50
+ ::Sidekiq.redis(&:flushdb)
51
+ end
52
+ end
53
+
54
+ def apply_custom_excludes(data)
55
+ data.gsub!("Sidekiq v#{Sidekiq::VERSION}", "Sidekiq v*EXCLUDED*")
56
+ end
57
+
58
+ def build_job(item)
59
+ Sidekiq::Job.new(item)
60
+ end
61
+
62
+ def job_to_sorted_entry(job, score: Time.now.utc.to_i, set: Sidekiq::SortedSet.new("test-jobs"))
63
+ Sidekiq::SortedEntry.new(set, score, job.item)
64
+ end
65
+
66
+ def kill_job(job)
67
+ dead_set = Sidekiq::DeadSet.new
68
+ dead_set.kill(Sidekiq.dump_json(job.item))
69
+ dead_set.find_job(job.jid)
70
+ end
71
+
72
+ def push_job(params)
73
+ jid = Sidekiq::Client.push(params)
74
+ queue_name = params["queue"] || "default"
75
+ Sidekiq::Queue.new(queue_name).find_job(jid)
76
+ end
@@ -0,0 +1,5 @@
1
+ en:
2
+ UndertakerBury: Bury
3
+ UndertakerBuryAll: Bury All
4
+ UndertakerRevive: Revive
5
+ UndertakerReviveAll: Revive All
@@ -0,0 +1,34 @@
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
+ </h3>
6
+ </div>
7
+ </header>
8
+
9
+ <table class="table table-striped table-bordered table-white">
10
+ <thead>
11
+ <tr>
12
+ <th style="width: 20%"><%= t('Jobs') %></th>
13
+ <th style="width: 10%"><%= t('All') %></th>
14
+ <th style="width: 10%"><%= t('1 hour') %></th>
15
+ <th style="width: 10%"><%= t('3 hours') %></th>
16
+ <th style="width: 10%"><%= t('1 day') %></th>
17
+ <th style="width: 10%"><%= t('3 days') %></th>
18
+ <th style="width: 10%"><%= t('1 week') %></th>
19
+ <th style="width: 10%"><%= t('Older') %></th>
20
+ </tr>
21
+ </thead>
22
+ <% @distribution.each do |group, bucket_counts| %>
23
+ <tr>
24
+ <td><a href='<%= "#{root_path}undertaker/morgue/#{group}/all/total_dead" %>'> <%= group %></a></td>
25
+ <td><a href='<%= "#{env['REQUEST_PATH']}/#{group}/total_dead" %>'><%= bucket_counts['total_dead']%></a></td>
26
+ <td><a href='<%= "#{env['REQUEST_PATH']}/#{group}/1_hour" %>'><%= bucket_counts['1_hour']%></a></td>
27
+ <td><a href='<%= "#{env['REQUEST_PATH']}/#{group}/3_hours" %>'><%= bucket_counts['3_hours']%></a></td>
28
+ <td><a href='<%= "#{env['REQUEST_PATH']}/#{group}/1_day" %>'><%= bucket_counts['1_day']%></a></td>
29
+ <td><a href='<%= "#{env['REQUEST_PATH']}/#{group}/3_days" %>'><%= bucket_counts['3_days']%></a></td>
30
+ <td><a href='<%= "#{env['REQUEST_PATH']}/#{group}/1_week" %>'><%= bucket_counts['1_week']%></a></td>
31
+ <td><a href='<%= "#{env['REQUEST_PATH']}/#{group}/older" %>'><%= bucket_counts['older']%></a></td>
32
+ </tr>
33
+ <% end %>
34
+ </table>
@@ -0,0 +1,35 @@
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" %>
6
+ </h3>
7
+ </div>
8
+ </header>
9
+
10
+ <table class="table table-striped table-bordered table-white">
11
+ <thead>
12
+ <tr>
13
+ <th style="width: 20%"><%= t('Error') %></th>
14
+ <th style="width: 10%"><%= t('All') %></th>
15
+ <th style="width: 10%"><%= t('1 hour') %></th>
16
+ <th style="width: 10%"><%= t('3 hours') %></th>
17
+ <th style="width: 10%"><%= t('1 day') %></th>
18
+ <th style="width: 10%"><%= t('3 days') %></th>
19
+ <th style="width: 10%"><%= t('1 week') %></th>
20
+ <th style="width: 10%"><%= t('Older') %></th>
21
+ </tr>
22
+ </thead>
23
+ <% @distribution.each do |group, bucket_counts| %>
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>
33
+ </tr>
34
+ <% end %>
35
+ </table>
@@ -0,0 +1,75 @@
1
+ <header class="row head">
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" %>
6
+ <%= " with <b>#{@req_error_class}</b> exception" %>
7
+ <%= " in <b>#{@req_bucket_name}</b> bucket" %>
8
+ </h3>
9
+ </div>
10
+ <div class="col-sm-12">
11
+ <% if @total_dead > 0 && @total_dead > @count %>
12
+ <div class="col-sm-4">
13
+ <%= erb :_paging, :locals => { :url => "#{root_path}" + @undertaker_path } %>
14
+ </div>
15
+ <% end %>
16
+ </div>
17
+ </header>
18
+
19
+ <% if @dead_jobs.size > 0 %>
20
+ <form action="<%= "#{root_path}undertaker/morgue" %>" method="post">
21
+ <%= respond_to?(:csrf_tag) && csrf_tag %>
22
+ <table class="table table-striped table-bordered table-white">
23
+ <thead>
24
+ <tr>
25
+ <th width="20px" class="table-checkbox">
26
+ <label>
27
+ <input type="checkbox" class="check_all" />
28
+ </label>
29
+ </th>
30
+ <th width="25%"><%= t('LastRetry') %></th>
31
+ <th><%= t('Queue') %></th>
32
+ <th><%= t('Job') %></th>
33
+ <th><%= t('Arguments') %></th>
34
+ <th><%= t('Error') %></th>
35
+ </tr>
36
+ </thead>
37
+ <% @dead_jobs.each do |entry| %>
38
+ <tr>
39
+ <td class="table-checkbox">
40
+ <label>
41
+ <input type='checkbox' name='key[]' value='<%= job_params(entry.item, entry.score) %>' />
42
+ </label>
43
+ </td>
44
+ <td>
45
+ <a href="<%= root_path %>morgue/<%= job_params(entry.item, entry.score) %>"><%= relative_time(entry.at) %></a>
46
+ </td>
47
+ <td>
48
+ <a href="<%= root_path %>queues/<%= entry.queue %>"><%= entry.queue %></a>
49
+ </td>
50
+ <td><%= entry.klass %></td>
51
+ <td>
52
+ <div class="args"><%= display_args(entry.args) %></div>
53
+ </td>
54
+ <td>
55
+ <div><%= h truncate("#{entry['error_class']}: #{entry['error_message']}", 200) %></div>
56
+ </td>
57
+ </tr>
58
+ <% end %>
59
+ </table>
60
+ <input class="btn btn-primary btn-xs pull-left" type="submit" name="retry" value="<%= t('UndertakerRevive') %>" />
61
+ <input class="btn btn-danger btn-xs pull-left" type="submit" name="delete" value="<%= t('UndertakerBury') %>" />
62
+ </form>
63
+
64
+ <form action="<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{@req_error_class}/#{@req_bucket_name}/delete" %>" method="post">
65
+ <%= respond_to?(:csrf_tag) && csrf_tag %>
66
+ <input class="btn btn-danger btn-xs pull-right" type="submit" name="delete" value="<%= t('UndertakerBuryAll') %>" data-confirm="<%= t('AreYouSure') %>" />
67
+ </form>
68
+
69
+ <form action="<%= "#{root_path}undertaker/morgue/#{@req_job_class}/#{@req_error_class}/#{@req_bucket_name}/retry" %>" method="post">
70
+ <%= respond_to?(:csrf_tag) && csrf_tag %>
71
+ <input class="btn btn-danger btn-xs pull-right" type="submit" name="retry" value="<%= t('UndertakerReviveAll') %>" data-confirm="<%= t('AreYouSure') %>" />
72
+ </form>
73
+ <% else %>
74
+ <div class="alert alert-success"><%= t('NoDeadJobsFound') %></div>
75
+ <% end %>
metadata ADDED
@@ -0,0 +1,378 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sidekiq-undertaker
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.rc01
5
+ platform: ruby
6
+ authors:
7
+ - Thomas Koppensteiner
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-12-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '1.17'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '3'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '1.17'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '3'
33
+ - !ruby/object:Gem::Dependency
34
+ name: rake
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '12.3'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '12.3'
47
+ - !ruby/object:Gem::Dependency
48
+ name: approvals
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.0'
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 0.0.24
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '0.0'
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 0.0.24
67
+ - !ruby/object:Gem::Dependency
68
+ name: mock_redis
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '0.19'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '0.19'
81
+ - !ruby/object:Gem::Dependency
82
+ name: pry
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '0.12'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '0.12'
95
+ - !ruby/object:Gem::Dependency
96
+ name: rack-test
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '1.1'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '1.1'
109
+ - !ruby/object:Gem::Dependency
110
+ name: rb-readline
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '0.5'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '0.5'
123
+ - !ruby/object:Gem::Dependency
124
+ name: rspec
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '3.8'
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - "~>"
135
+ - !ruby/object:Gem::Version
136
+ version: '3.8'
137
+ - !ruby/object:Gem::Dependency
138
+ name: rspec-core
139
+ requirement: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - "~>"
142
+ - !ruby/object:Gem::Version
143
+ version: '3.8'
144
+ type: :development
145
+ prerelease: false
146
+ version_requirements: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - "~>"
149
+ - !ruby/object:Gem::Version
150
+ version: '3.8'
151
+ - !ruby/object:Gem::Dependency
152
+ name: rspec-mocks
153
+ requirement: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - "~>"
156
+ - !ruby/object:Gem::Version
157
+ version: '3.8'
158
+ type: :development
159
+ prerelease: false
160
+ version_requirements: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - "~>"
163
+ - !ruby/object:Gem::Version
164
+ version: '3.8'
165
+ - !ruby/object:Gem::Dependency
166
+ name: rspec-sidekiq
167
+ requirement: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - "~>"
170
+ - !ruby/object:Gem::Version
171
+ version: '3.0'
172
+ type: :development
173
+ prerelease: false
174
+ version_requirements: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - "~>"
177
+ - !ruby/object:Gem::Version
178
+ version: '3.0'
179
+ - !ruby/object:Gem::Dependency
180
+ name: rt_rubocop_defaults
181
+ requirement: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - "~>"
184
+ - !ruby/object:Gem::Version
185
+ version: '1.2'
186
+ type: :development
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - "~>"
191
+ - !ruby/object:Gem::Version
192
+ version: '1.2'
193
+ - !ruby/object:Gem::Dependency
194
+ name: rubocop
195
+ requirement: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - "~>"
198
+ - !ruby/object:Gem::Version
199
+ version: '0.77'
200
+ type: :development
201
+ prerelease: false
202
+ version_requirements: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - "~>"
205
+ - !ruby/object:Gem::Version
206
+ version: '0.77'
207
+ - !ruby/object:Gem::Dependency
208
+ name: rubocop-rspec
209
+ requirement: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - "~>"
212
+ - !ruby/object:Gem::Version
213
+ version: '1.30'
214
+ type: :development
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - "~>"
219
+ - !ruby/object:Gem::Version
220
+ version: '1.30'
221
+ - !ruby/object:Gem::Dependency
222
+ name: rubocop_runner
223
+ requirement: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - "~>"
226
+ - !ruby/object:Gem::Version
227
+ version: '2.1'
228
+ type: :development
229
+ prerelease: false
230
+ version_requirements: !ruby/object:Gem::Requirement
231
+ requirements:
232
+ - - "~>"
233
+ - !ruby/object:Gem::Version
234
+ version: '2.1'
235
+ - !ruby/object:Gem::Dependency
236
+ name: simplecov
237
+ requirement: !ruby/object:Gem::Requirement
238
+ requirements:
239
+ - - "~>"
240
+ - !ruby/object:Gem::Version
241
+ version: '0.14'
242
+ type: :development
243
+ prerelease: false
244
+ version_requirements: !ruby/object:Gem::Requirement
245
+ requirements:
246
+ - - "~>"
247
+ - !ruby/object:Gem::Version
248
+ version: '0.14'
249
+ - !ruby/object:Gem::Dependency
250
+ name: sinatra
251
+ requirement: !ruby/object:Gem::Requirement
252
+ requirements:
253
+ - - "~>"
254
+ - !ruby/object:Gem::Version
255
+ version: '2.0'
256
+ type: :development
257
+ prerelease: false
258
+ version_requirements: !ruby/object:Gem::Requirement
259
+ requirements:
260
+ - - "~>"
261
+ - !ruby/object:Gem::Version
262
+ version: '2.0'
263
+ - !ruby/object:Gem::Dependency
264
+ name: timecop
265
+ requirement: !ruby/object:Gem::Requirement
266
+ requirements:
267
+ - - "~>"
268
+ - !ruby/object:Gem::Version
269
+ version: '0.9'
270
+ type: :development
271
+ prerelease: false
272
+ version_requirements: !ruby/object:Gem::Requirement
273
+ requirements:
274
+ - - "~>"
275
+ - !ruby/object:Gem::Version
276
+ version: '0.9'
277
+ - !ruby/object:Gem::Dependency
278
+ name: sidekiq
279
+ requirement: !ruby/object:Gem::Requirement
280
+ requirements:
281
+ - - "~>"
282
+ - !ruby/object:Gem::Version
283
+ version: '5.2'
284
+ type: :runtime
285
+ prerelease: false
286
+ version_requirements: !ruby/object:Gem::Requirement
287
+ requirements:
288
+ - - "~>"
289
+ - !ruby/object:Gem::Version
290
+ version: '5.2'
291
+ description: |2
292
+ Sidekiq::Undertaker is a plugin for Sidekiq.
293
+ It makes exploring the dead job queue easier
294
+ by breaking down the dead jobs into time windows (buckets) of hours and days.
295
+ The gems allows retrying or deleting a certain subset of failures.
296
+ email:
297
+ - 'thomas.koppensteiner@gmx.net '
298
+ executables: []
299
+ extensions: []
300
+ extra_rdoc_files: []
301
+ files:
302
+ - ".codeclimate.yml"
303
+ - ".gitignore"
304
+ - ".rubocop.yml"
305
+ - ".rubocop_todo.yml"
306
+ - ".travis.yml"
307
+ - Demo_Filter.png
308
+ - Demo_Job_Filter.png
309
+ - Demo_Morgue_1_Job.png
310
+ - Demo_Morgue_all.png
311
+ - Gemfile
312
+ - LICENSE.txt
313
+ - README.md
314
+ - Rakefile
315
+ - lib/sidekiq/undertaker.rb
316
+ - lib/sidekiq/undertaker/bucket.rb
317
+ - lib/sidekiq/undertaker/dead_job.rb
318
+ - lib/sidekiq/undertaker/job_distributor.rb
319
+ - lib/sidekiq/undertaker/job_filter.rb
320
+ - lib/sidekiq/undertaker/version.rb
321
+ - lib/sidekiq/undertaker/web_extension.rb
322
+ - lib/sidekiq/undertaker/web_extension/api_helpers.rb
323
+ - sidekiq-undertaker.gemspec
324
+ - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_filter_page_is_called/behaves_like_a_page/the_displayed_page_is_correct.approved.txt
325
+ - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_called/behaves_like_a_page/the_displayed_page_is_correct.approved.txt
326
+ - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_polled/behaves_like_a_page/the_displayed_page_is_correct.approved.txt
327
+ - 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.approved.txt
328
+ - 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.approved.txt
329
+ - spec/sidekiq/undertaker/bucket_spec.rb
330
+ - spec/sidekiq/undertaker/dead_jobs_spec.rb
331
+ - spec/sidekiq/undertaker/job_distributor_spec.rb
332
+ - spec/sidekiq/undertaker/job_filter_spec.rb
333
+ - spec/sidekiq/undertaker/web_extension_spec.rb
334
+ - spec/spec_helper.rb
335
+ - web/locales/en.yml
336
+ - web/views/filter.erb
337
+ - web/views/filter_job_class.erb
338
+ - web/views/morgue.erb
339
+ homepage: https://github.com/ThomasKoppensteiner/sidekiq-undertaker
340
+ licenses:
341
+ - MIT
342
+ metadata:
343
+ homepage_uri: https://github.com/ThomasKoppensteiner/sidekiq-undertaker
344
+ source_code_uri: https://github.com/ThomasKoppensteiner/sidekiq-undertaker
345
+ bug_tracker_uri: https://github.com/ThomasKoppensteiner/sidekiq-undertaker/issues
346
+ build_status_uri: https://travis-ci.org/ThomasKoppensteiner/sidekiq-undertaker
347
+ post_install_message:
348
+ rdoc_options: []
349
+ require_paths:
350
+ - lib
351
+ - lib/sidekiq/undertaker
352
+ required_ruby_version: !ruby/object:Gem::Requirement
353
+ requirements:
354
+ - - ">="
355
+ - !ruby/object:Gem::Version
356
+ version: '0'
357
+ required_rubygems_version: !ruby/object:Gem::Requirement
358
+ requirements:
359
+ - - ">"
360
+ - !ruby/object:Gem::Version
361
+ version: 1.3.1
362
+ requirements: []
363
+ rubygems_version: 3.0.2
364
+ signing_key:
365
+ specification_version: 4
366
+ summary: Sidekiq::Undertaker makes exploring the Sidekiq dead job queue easier
367
+ test_files:
368
+ - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_filter_page_is_called/behaves_like_a_page/the_displayed_page_is_correct.approved.txt
369
+ - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_called/behaves_like_a_page/the_displayed_page_is_correct.approved.txt
370
+ - spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_polled/behaves_like_a_page/the_displayed_page_is_correct.approved.txt
371
+ - 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.approved.txt
372
+ - 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.approved.txt
373
+ - spec/sidekiq/undertaker/bucket_spec.rb
374
+ - spec/sidekiq/undertaker/dead_jobs_spec.rb
375
+ - spec/sidekiq/undertaker/job_distributor_spec.rb
376
+ - spec/sidekiq/undertaker/job_filter_spec.rb
377
+ - spec/sidekiq/undertaker/web_extension_spec.rb
378
+ - spec/spec_helper.rb