sidekiq-undertaker 1.0.0.rc01

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 (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