sidekiq 6.4.1 → 7.0.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.

Potentially problematic release.


This version of sidekiq might be problematic. Click here for more details.

Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +107 -5
  3. data/README.md +14 -13
  4. data/bin/sidekiq +3 -8
  5. data/bin/sidekiqload +26 -29
  6. data/lib/sidekiq/api.rb +232 -157
  7. data/lib/sidekiq/capsule.rb +110 -0
  8. data/lib/sidekiq/cli.rb +80 -86
  9. data/lib/sidekiq/client.rb +54 -42
  10. data/lib/sidekiq/component.rb +66 -0
  11. data/lib/sidekiq/config.rb +271 -0
  12. data/lib/sidekiq/deploy.rb +62 -0
  13. data/lib/sidekiq/embedded.rb +61 -0
  14. data/lib/sidekiq/fetch.rb +20 -19
  15. data/lib/sidekiq/job.rb +375 -10
  16. data/lib/sidekiq/job_logger.rb +1 -1
  17. data/lib/sidekiq/job_retry.rb +74 -53
  18. data/lib/sidekiq/job_util.rb +17 -11
  19. data/lib/sidekiq/launcher.rb +63 -69
  20. data/lib/sidekiq/logger.rb +6 -45
  21. data/lib/sidekiq/manager.rb +33 -32
  22. data/lib/sidekiq/metrics/query.rb +153 -0
  23. data/lib/sidekiq/metrics/shared.rb +95 -0
  24. data/lib/sidekiq/metrics/tracking.rb +134 -0
  25. data/lib/sidekiq/middleware/chain.rb +84 -42
  26. data/lib/sidekiq/middleware/current_attributes.rb +18 -17
  27. data/lib/sidekiq/middleware/i18n.rb +6 -4
  28. data/lib/sidekiq/middleware/modules.rb +21 -0
  29. data/lib/sidekiq/monitor.rb +1 -1
  30. data/lib/sidekiq/paginator.rb +10 -2
  31. data/lib/sidekiq/processor.rb +56 -59
  32. data/lib/sidekiq/rails.rb +10 -9
  33. data/lib/sidekiq/redis_client_adapter.rb +118 -0
  34. data/lib/sidekiq/redis_connection.rb +13 -82
  35. data/lib/sidekiq/ring_buffer.rb +29 -0
  36. data/lib/sidekiq/scheduled.rb +65 -37
  37. data/lib/sidekiq/testing/inline.rb +4 -4
  38. data/lib/sidekiq/testing.rb +41 -68
  39. data/lib/sidekiq/transaction_aware_client.rb +44 -0
  40. data/lib/sidekiq/version.rb +2 -1
  41. data/lib/sidekiq/web/action.rb +3 -3
  42. data/lib/sidekiq/web/application.rb +22 -6
  43. data/lib/sidekiq/web/csrf_protection.rb +3 -3
  44. data/lib/sidekiq/web/helpers.rb +21 -19
  45. data/lib/sidekiq/web.rb +3 -14
  46. data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  47. data/lib/sidekiq.rb +84 -207
  48. data/sidekiq.gemspec +29 -5
  49. data/web/assets/javascripts/application.js +58 -26
  50. data/web/assets/javascripts/base-charts.js +106 -0
  51. data/web/assets/javascripts/chart.min.js +13 -0
  52. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  53. data/web/assets/javascripts/dashboard-charts.js +166 -0
  54. data/web/assets/javascripts/dashboard.js +3 -240
  55. data/web/assets/javascripts/metrics.js +236 -0
  56. data/web/assets/stylesheets/application-rtl.css +2 -91
  57. data/web/assets/stylesheets/application.css +64 -297
  58. data/web/locales/ar.yml +70 -70
  59. data/web/locales/cs.yml +62 -62
  60. data/web/locales/da.yml +52 -52
  61. data/web/locales/de.yml +65 -65
  62. data/web/locales/el.yml +43 -24
  63. data/web/locales/en.yml +82 -69
  64. data/web/locales/es.yml +68 -68
  65. data/web/locales/fa.yml +65 -65
  66. data/web/locales/fr.yml +67 -67
  67. data/web/locales/he.yml +65 -64
  68. data/web/locales/hi.yml +59 -59
  69. data/web/locales/it.yml +53 -53
  70. data/web/locales/ja.yml +71 -68
  71. data/web/locales/ko.yml +52 -52
  72. data/web/locales/lt.yml +66 -66
  73. data/web/locales/nb.yml +61 -61
  74. data/web/locales/nl.yml +52 -52
  75. data/web/locales/pl.yml +45 -45
  76. data/web/locales/pt-br.yml +63 -55
  77. data/web/locales/pt.yml +51 -51
  78. data/web/locales/ru.yml +67 -66
  79. data/web/locales/sv.yml +53 -53
  80. data/web/locales/ta.yml +60 -60
  81. data/web/locales/uk.yml +62 -61
  82. data/web/locales/ur.yml +64 -64
  83. data/web/locales/vi.yml +67 -67
  84. data/web/locales/zh-cn.yml +37 -11
  85. data/web/locales/zh-tw.yml +42 -8
  86. data/web/views/_footer.erb +5 -2
  87. data/web/views/_nav.erb +1 -1
  88. data/web/views/_summary.erb +1 -1
  89. data/web/views/busy.erb +9 -4
  90. data/web/views/dashboard.erb +36 -4
  91. data/web/views/metrics.erb +80 -0
  92. data/web/views/metrics_for_job.erb +69 -0
  93. data/web/views/queue.erb +5 -1
  94. metadata +69 -22
  95. data/lib/sidekiq/delay.rb +0 -43
  96. data/lib/sidekiq/exception_handler.rb +0 -27
  97. data/lib/sidekiq/extensions/action_mailer.rb +0 -48
  98. data/lib/sidekiq/extensions/active_record.rb +0 -43
  99. data/lib/sidekiq/extensions/class_methods.rb +0 -43
  100. data/lib/sidekiq/extensions/generic_proxy.rb +0 -33
  101. data/lib/sidekiq/util.rb +0 -108
  102. data/lib/sidekiq/worker.rb +0 -362
  103. /data/{LICENSE → LICENSE.txt} +0 -0
@@ -0,0 +1,80 @@
1
+ <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js"></script>
2
+ <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js"></script>
3
+ <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js"></script>
4
+ <script type="text/javascript" src="<%= root_path %>javascripts/metrics.js"></script>
5
+
6
+ <div class="header-container">
7
+ <h1><%= t('Metrics') %></h1>
8
+
9
+ <div>
10
+ <a target="blank" href="https://github.com/mperham/sidekiq/wiki/Metrics"><span class="info-circle" title="Click to learn more about metrics">?</span></a>
11
+ </div>
12
+ </div>
13
+
14
+ <%
15
+ table_limit = 20
16
+ chart_limit = 5
17
+ job_results = @query_result.job_results.sort_by { |(kls, jr)| jr.totals["s"] }.reverse.first(table_limit)
18
+ visible_kls = job_results.first(chart_limit).map(&:first)
19
+ %>
20
+
21
+ <% if job_results.any? %>
22
+ <canvas id="job-metrics-overview-chart"></canvas>
23
+
24
+ <script>
25
+ window.jobMetricsChart = new JobMetricsOverviewChart(
26
+ document.getElementById("job-metrics-overview-chart"),
27
+ <%= Sidekiq.dump_json({
28
+ series: job_results.map { |(kls, jr)| [kls, jr.dig("series", "s")] }.to_h,
29
+ marks: @query_result.marks.map { |m| [m.bucket, m.label] },
30
+ labels: @query_result.buckets,
31
+ visibleKls: visible_kls,
32
+ yLabel: t('TotalExecutionTime'),
33
+ units: t('Seconds').downcase,
34
+ markLabel: t('Deploy'),
35
+ }) %>
36
+ )
37
+ </script>
38
+ <% end %>
39
+
40
+ <div class="table_container">
41
+ <table class="table table-bordered table-striped table-hover">
42
+ <tbody>
43
+ <tr>
44
+ <th><%= t('Name') %></th>
45
+ <th><%= t('Success') %></th>
46
+ <th><%= t('Failure') %></th>
47
+ <th><%= t('TotalExecutionTime') %></th>
48
+ <th><%= t('AvgExecutionTime') %></th>
49
+ </tr>
50
+ <% if job_results.any? %>
51
+ <% job_results.each_with_index do |(kls, jr), i| %>
52
+ <tr>
53
+ <td>
54
+ <div class="metrics-swatch-wrapper">
55
+ <% id = "metrics-swatch-#{kls}" %>
56
+ <input
57
+ type="checkbox"
58
+ id="<%= id %>"
59
+ class="metrics-swatch"
60
+ value="<%= kls %>"
61
+ <%= visible_kls.include?(kls) ? 'checked' : '' %>
62
+ />
63
+ <code><a href="<%= root_path %>metrics/<%= kls %>"><%= kls %></a></code>
64
+ </div>
65
+ <script>jobMetricsChart.registerSwatch("<%= id %>")</script>
66
+ </td>
67
+ <td><%= jr.dig("totals", "p") - jr.dig("totals", "f") %></td>
68
+ <td><%= jr.dig("totals", "f") %></td>
69
+ <td><%= jr.dig("totals", "s").round(2) %> seconds</td>
70
+ <td><%= jr.total_avg("s").round(2) %> seconds</td>
71
+ </tr>
72
+ <% end %>
73
+ <% else %>
74
+ <tr><td colspan=5><%= t("NoDataFound") %></td></tr>
75
+ <% end %>
76
+ </tbody>
77
+ </table>
78
+ </div>
79
+
80
+ <p><small>Data from <%= @query_result.starts_at %> to <%= @query_result.ends_at %></small></p>
@@ -0,0 +1,69 @@
1
+ <script type="text/javascript" src="<%= root_path %>javascripts/chart.min.js"></script>
2
+ <script type="text/javascript" src="<%= root_path %>javascripts/chartjs-plugin-annotation.min.js"></script>
3
+ <script type="text/javascript" src="<%= root_path %>javascripts/base-charts.js"></script>
4
+ <script type="text/javascript" src="<%= root_path %>javascripts/metrics.js"></script>
5
+
6
+ <%
7
+ job_result = @query_result.job_results[@name]
8
+ hist_totals = job_result.hist.values.first.zip(*job_result.hist.values[1..-1]).map(&:sum)
9
+ bucket_labels =Sidekiq::Metrics::Histogram::LABELS
10
+ bucket_intervals =Sidekiq::Metrics::Histogram::BUCKET_INTERVALS.reverse
11
+
12
+ # Replace INFINITY since it can't be represented as JSON
13
+ bucket_intervals[0] = bucket_intervals[1] * 2
14
+ %>
15
+
16
+ <% if job_result.totals["s"] > 0 %>
17
+ <div class="header-container">
18
+ <h1>
19
+ <a href="<%= root_path %>metrics"><%= t(:metrics).to_s.titleize %></a> /
20
+ <%= h @name %>
21
+ </h1>
22
+
23
+ <div>
24
+ <a target="blank" href="https://github.com/mperham/sidekiq/wiki/Metrics"><span class="info-circle" title="Click to learn more about metrics">?</span></a>
25
+ </div>
26
+ </div>
27
+
28
+ <canvas id="hist-totals-chart"></canvas>
29
+
30
+ <script>
31
+ window.histTotalsChart = new HistTotalsChart(
32
+ document.getElementById("hist-totals-chart"),
33
+ <%= Sidekiq.dump_json({
34
+ series: hist_totals,
35
+ labels: bucket_labels,
36
+ xLabel: t('ExecutionTime'),
37
+ yLabel: t('Jobs'),
38
+ units: t('Jobs').downcase,
39
+ }) %>
40
+ )
41
+ </script>
42
+
43
+ <canvas id="hist-bubble-chart"></canvas>
44
+
45
+ <script>
46
+ window.histBubbleChart = new HistBubbleChart(
47
+ document.getElementById("hist-bubble-chart"),
48
+ <%= Sidekiq.dump_json({
49
+ hist: job_result.hist,
50
+ marks: @query_result.marks.map { |m| [m.bucket, m.label] },
51
+ labels: @query_result.buckets,
52
+ histIntervals: bucket_intervals,
53
+ yLabel: t('ExecutionTime'),
54
+ markLabel: t('Deploy'),
55
+ yUnits: t('Seconds').downcase,
56
+ zUnits: t('Jobs').downcase,
57
+ }) %>
58
+ )
59
+ </script>
60
+
61
+ <p><small>Data from <%= @query_result.starts_at %> to <%= @query_result.ends_at %></small></p>
62
+ <% else %>
63
+ <h1>
64
+ <a href="<%= root_path %>/metrics"><%= t(:metrics).to_s.titleize %></a> /
65
+ <%= h @name %>
66
+ </h1>
67
+
68
+ <div class="alert alert-success"><%= t('NoJobMetricsFound') %></div>
69
+ <% end %>
data/web/views/queue.erb CHANGED
@@ -18,6 +18,7 @@
18
18
  <th><a href="<%= url %>?direction=<%= params[:direction] == 'asc' ? 'desc' : 'asc' %>"># <%= sort_direction_label %></a></th>
19
19
  <th><%= t('Job') %></th>
20
20
  <th><%= t('Arguments') %></th>
21
+ <th><%= t('Context') %></th>
21
22
  <th></th>
22
23
  </thead>
23
24
  <% @jobs.each_with_index do |job, index| %>
@@ -35,12 +36,15 @@
35
36
  <% a = job.display_args %>
36
37
  <% if a.inspect.size > 100 %>
37
38
  <span id="job_<%= index %>"><%= h(a.inspect[0..100]) + "... " %></span>
38
- <button data-toggle="job_<%= index %>" class="btn btn-default btn-xs"><%= t('ShowAll') %></button>
39
+ <button data-toggle="job_<%= index %>_full" class="btn btn-default btn-xs"><%= t('ShowAll') %></button>
39
40
  <div class="toggle" id="job_<%= index %>_full"><%= display_args(a) %></div>
40
41
  <% else %>
41
42
  <%= display_args(job.display_args) %>
42
43
  <% end %>
43
44
  </td>
45
+ <td>
46
+ <%= h(job["cattr"].inspect) if job["cattr"]&.any? %>
47
+ </td>
44
48
  <td>
45
49
  <form action="<%= root_path %>queues/<%= CGI.escape(@name) %>/delete" method="post">
46
50
  <%= csrf_tag %>
metadata CHANGED
@@ -1,57 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.4.1
4
+ version: 7.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Perham
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-07 00:00:00.000000000 Z
11
+ date: 2022-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: redis
14
+ name: redis-client
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.2.0
19
+ version: 0.9.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 4.2.0
26
+ version: 0.9.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: connection_pool
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 2.2.2
33
+ version: 2.3.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 2.2.2
40
+ version: 2.3.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rack
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 2.2.4
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 2.2.4
55
+ - !ruby/object:Gem::Dependency
56
+ name: concurrent-ruby
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "<"
46
60
  - !ruby/object:Gem::Version
47
- version: '2.0'
61
+ version: '2'
48
62
  type: :runtime
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - "~>"
66
+ - - "<"
53
67
  - !ruby/object:Gem::Version
54
- version: '2.0'
68
+ version: '2'
55
69
  description: Simple, efficient background processing for Ruby.
56
70
  email:
57
71
  - mperham@gmail.com
@@ -62,7 +76,7 @@ extensions: []
62
76
  extra_rdoc_files: []
63
77
  files:
64
78
  - Changes.md
65
- - LICENSE
79
+ - LICENSE.txt
66
80
  - README.md
67
81
  - bin/sidekiq
68
82
  - bin/sidekiqload
@@ -73,14 +87,13 @@ files:
73
87
  - lib/generators/sidekiq/templates/job_test.rb.erb
74
88
  - lib/sidekiq.rb
75
89
  - lib/sidekiq/api.rb
90
+ - lib/sidekiq/capsule.rb
76
91
  - lib/sidekiq/cli.rb
77
92
  - lib/sidekiq/client.rb
78
- - lib/sidekiq/delay.rb
79
- - lib/sidekiq/exception_handler.rb
80
- - lib/sidekiq/extensions/action_mailer.rb
81
- - lib/sidekiq/extensions/active_record.rb
82
- - lib/sidekiq/extensions/class_methods.rb
83
- - lib/sidekiq/extensions/generic_proxy.rb
93
+ - lib/sidekiq/component.rb
94
+ - lib/sidekiq/config.rb
95
+ - lib/sidekiq/deploy.rb
96
+ - lib/sidekiq/embedded.rb
84
97
  - lib/sidekiq/fetch.rb
85
98
  - lib/sidekiq/job.rb
86
99
  - lib/sidekiq/job_logger.rb
@@ -89,20 +102,26 @@ files:
89
102
  - lib/sidekiq/launcher.rb
90
103
  - lib/sidekiq/logger.rb
91
104
  - lib/sidekiq/manager.rb
105
+ - lib/sidekiq/metrics/query.rb
106
+ - lib/sidekiq/metrics/shared.rb
107
+ - lib/sidekiq/metrics/tracking.rb
92
108
  - lib/sidekiq/middleware/chain.rb
93
109
  - lib/sidekiq/middleware/current_attributes.rb
94
110
  - lib/sidekiq/middleware/i18n.rb
111
+ - lib/sidekiq/middleware/modules.rb
95
112
  - lib/sidekiq/monitor.rb
96
113
  - lib/sidekiq/paginator.rb
97
114
  - lib/sidekiq/processor.rb
98
115
  - lib/sidekiq/rails.rb
116
+ - lib/sidekiq/redis_client_adapter.rb
99
117
  - lib/sidekiq/redis_connection.rb
118
+ - lib/sidekiq/ring_buffer.rb
100
119
  - lib/sidekiq/scheduled.rb
101
120
  - lib/sidekiq/sd_notify.rb
102
121
  - lib/sidekiq/systemd.rb
103
122
  - lib/sidekiq/testing.rb
104
123
  - lib/sidekiq/testing/inline.rb
105
- - lib/sidekiq/util.rb
124
+ - lib/sidekiq/transaction_aware_client.rb
106
125
  - lib/sidekiq/version.rb
107
126
  - lib/sidekiq/web.rb
108
127
  - lib/sidekiq/web/action.rb
@@ -110,14 +129,19 @@ files:
110
129
  - lib/sidekiq/web/csrf_protection.rb
111
130
  - lib/sidekiq/web/helpers.rb
112
131
  - lib/sidekiq/web/router.rb
113
- - lib/sidekiq/worker.rb
132
+ - lib/sidekiq/worker_compatibility_alias.rb
114
133
  - sidekiq.gemspec
115
134
  - web/assets/images/apple-touch-icon.png
116
135
  - web/assets/images/favicon.ico
117
136
  - web/assets/images/logo.png
118
137
  - web/assets/images/status.png
119
138
  - web/assets/javascripts/application.js
139
+ - web/assets/javascripts/base-charts.js
140
+ - web/assets/javascripts/chart.min.js
141
+ - web/assets/javascripts/chartjs-plugin-annotation.min.js
142
+ - web/assets/javascripts/dashboard-charts.js
120
143
  - web/assets/javascripts/dashboard.js
144
+ - web/assets/javascripts/metrics.js
121
145
  - web/assets/stylesheets/application-dark.css
122
146
  - web/assets/stylesheets/application-rtl.css
123
147
  - web/assets/stylesheets/application.css
@@ -162,6 +186,8 @@ files:
162
186
  - web/views/dashboard.erb
163
187
  - web/views/dead.erb
164
188
  - web/views/layout.erb
189
+ - web/views/metrics.erb
190
+ - web/views/metrics_for_job.erb
165
191
  - web/views/morgue.erb
166
192
  - web/views/queue.erb
167
193
  - web/views/queues.erb
@@ -178,7 +204,28 @@ metadata:
178
204
  documentation_uri: https://github.com/mperham/sidekiq/wiki
179
205
  changelog_uri: https://github.com/mperham/sidekiq/blob/main/Changes.md
180
206
  source_code_uri: https://github.com/mperham/sidekiq
181
- post_install_message:
207
+ post_install_message: |2
208
+
209
+ ####################################################
210
+
211
+
212
+ █████████ █████ ██████████ ██████████ █████ ████ █████ ██████ ██████████ █████
213
+ ███░░░░░███░░███ ░░███░░░░███ ░░███░░░░░█░░███ ███░ ░░███ ███░░░░███ ░███░░░░███ ███░░░███
214
+ ░███ ░░░ ░███ ░███ ░░███ ░███ █ ░ ░███ ███ ░███ ███ ░░███ ░░░ ███ ███ ░░███
215
+ ░░█████████ ░███ ░███ ░███ ░██████ ░███████ ░███ ░███ ░███ ███ ░███ ░███
216
+ ░░░░░░░░███ ░███ ░███ ░███ ░███░░█ ░███░░███ ░███ ░███ ██░███ ███ ░███ ░███
217
+ ███ ░███ ░███ ░███ ███ ░███ ░ █ ░███ ░░███ ░███ ░░███ ░░████ ███ ░░███ ███
218
+ ░░█████████ █████ ██████████ ██████████ █████ ░░████ █████ ░░░██████░██ ███ ██ ░░░█████░
219
+ ░░░░░░░░░ ░░░░░ ░░░░░░░░░░ ░░░░░░░░░░ ░░░░░ ░░░░ ░░░░░ ░░░░░░ ░░ ░░░ ░░ ░░░░░░
220
+
221
+
222
+ WARNING: This is a beta release, expect breakage!
223
+
224
+ 1. Use `gem 'sidekiq', '<7'` in your Gemfile if you don't want to be a beta tester.
225
+ 2. Read the release notes at https://github.com/mperham/sidekiq/blob/main/docs/7.0-Upgrade.md
226
+ 3. Search for open/closed issues at https://github.com/mperham/sidekiq/issues/
227
+
228
+ ####################################################
182
229
  rdoc_options: []
183
230
  require_paths:
184
231
  - lib
@@ -186,7 +233,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
186
233
  requirements:
187
234
  - - ">="
188
235
  - !ruby/object:Gem::Version
189
- version: 2.5.0
236
+ version: 2.7.0
190
237
  required_rubygems_version: !ruby/object:Gem::Requirement
191
238
  requirements:
192
239
  - - ">="
data/lib/sidekiq/delay.rb DELETED
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sidekiq
4
- module Extensions
5
- def self.enable_delay!
6
- warn "Sidekiq's Delayed Extensions will be removed in Sidekiq 7.0", uplevel: 1
7
-
8
- if defined?(::ActiveSupport)
9
- require "sidekiq/extensions/active_record"
10
- require "sidekiq/extensions/action_mailer"
11
-
12
- # Need to patch Psych so it can autoload classes whose names are serialized
13
- # in the delayed YAML.
14
- Psych::Visitors::ToRuby.prepend(Sidekiq::Extensions::PsychAutoload)
15
-
16
- ActiveSupport.on_load(:active_record) do
17
- include Sidekiq::Extensions::ActiveRecord
18
- end
19
- ActiveSupport.on_load(:action_mailer) do
20
- extend Sidekiq::Extensions::ActionMailer
21
- end
22
- end
23
-
24
- require "sidekiq/extensions/class_methods"
25
- Module.__send__(:include, Sidekiq::Extensions::Klass)
26
- end
27
-
28
- module PsychAutoload
29
- def resolve_class(klass_name)
30
- return nil if !klass_name || klass_name.empty?
31
- # constantize
32
- names = klass_name.split("::")
33
- names.shift if names.empty? || names.first.empty?
34
-
35
- names.inject(Object) do |constant, name|
36
- constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
37
- end
38
- rescue NameError
39
- super
40
- end
41
- end
42
- end
43
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "sidekiq"
4
-
5
- module Sidekiq
6
- module ExceptionHandler
7
- class Logger
8
- def call(ex, ctx)
9
- Sidekiq.logger.warn(Sidekiq.dump_json(ctx)) unless ctx.empty?
10
- Sidekiq.logger.warn("#{ex.class.name}: #{ex.message}")
11
- Sidekiq.logger.warn(ex.backtrace.join("\n")) unless ex.backtrace.nil?
12
- end
13
-
14
- Sidekiq.error_handlers << Sidekiq::ExceptionHandler::Logger.new
15
- end
16
-
17
- def handle_exception(ex, ctx = {})
18
- Sidekiq.error_handlers.each do |handler|
19
- handler.call(ex, ctx)
20
- rescue => ex
21
- Sidekiq.logger.error "!!! ERROR HANDLER THREW AN ERROR !!!"
22
- Sidekiq.logger.error ex
23
- Sidekiq.logger.error ex.backtrace.join("\n") unless ex.backtrace.nil?
24
- end
25
- end
26
- end
27
- end
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "sidekiq/extensions/generic_proxy"
4
-
5
- module Sidekiq
6
- module Extensions
7
- ##
8
- # Adds +delay+, +delay_for+ and +delay_until+ methods to ActionMailer to offload arbitrary email
9
- # delivery to Sidekiq.
10
- #
11
- # @example
12
- # UserMailer.delay.send_welcome_email(new_user)
13
- # UserMailer.delay_for(5.days).send_welcome_email(new_user)
14
- # UserMailer.delay_until(5.days.from_now).send_welcome_email(new_user)
15
- class DelayedMailer
16
- include Sidekiq::Worker
17
-
18
- def perform(yml)
19
- (target, method_name, args) = YAML.load(yml)
20
- msg = target.public_send(method_name, *args)
21
- # The email method can return nil, which causes ActionMailer to return
22
- # an undeliverable empty message.
23
- if msg
24
- msg.deliver_now
25
- else
26
- raise "#{target.name}##{method_name} returned an undeliverable mail object"
27
- end
28
- end
29
- end
30
-
31
- module ActionMailer
32
- def sidekiq_delay(options = {})
33
- Proxy.new(DelayedMailer, self, options)
34
- end
35
-
36
- def sidekiq_delay_for(interval, options = {})
37
- Proxy.new(DelayedMailer, self, options.merge("at" => Time.now.to_f + interval.to_f))
38
- end
39
-
40
- def sidekiq_delay_until(timestamp, options = {})
41
- Proxy.new(DelayedMailer, self, options.merge("at" => timestamp.to_f))
42
- end
43
- alias_method :delay, :sidekiq_delay
44
- alias_method :delay_for, :sidekiq_delay_for
45
- alias_method :delay_until, :sidekiq_delay_until
46
- end
47
- end
48
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "sidekiq/extensions/generic_proxy"
4
-
5
- module Sidekiq
6
- module Extensions
7
- ##
8
- # Adds +delay+, +delay_for+ and +delay_until+ methods to ActiveRecord to offload instance method
9
- # execution to Sidekiq.
10
- #
11
- # @example
12
- # User.recent_signups.each { |user| user.delay.mark_as_awesome }
13
- #
14
- # Please note, this is not recommended as this will serialize the entire
15
- # object to Redis. Your Sidekiq jobs should pass IDs, not entire instances.
16
- # This is here for backwards compatibility with Delayed::Job only.
17
- class DelayedModel
18
- include Sidekiq::Worker
19
-
20
- def perform(yml)
21
- (target, method_name, args) = YAML.load(yml)
22
- target.__send__(method_name, *args)
23
- end
24
- end
25
-
26
- module ActiveRecord
27
- def sidekiq_delay(options = {})
28
- Proxy.new(DelayedModel, self, options)
29
- end
30
-
31
- def sidekiq_delay_for(interval, options = {})
32
- Proxy.new(DelayedModel, self, options.merge("at" => Time.now.to_f + interval.to_f))
33
- end
34
-
35
- def sidekiq_delay_until(timestamp, options = {})
36
- Proxy.new(DelayedModel, self, options.merge("at" => timestamp.to_f))
37
- end
38
- alias_method :delay, :sidekiq_delay
39
- alias_method :delay_for, :sidekiq_delay_for
40
- alias_method :delay_until, :sidekiq_delay_until
41
- end
42
- end
43
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "sidekiq/extensions/generic_proxy"
4
-
5
- module Sidekiq
6
- module Extensions
7
- ##
8
- # Adds `delay`, `delay_for` and `delay_until` methods to all Classes to offload class method
9
- # execution to Sidekiq.
10
- #
11
- # @example
12
- # User.delay.delete_inactive
13
- # Wikipedia.delay.download_changes_for(Date.today)
14
- #
15
- class DelayedClass
16
- include Sidekiq::Worker
17
-
18
- def perform(yml)
19
- (target, method_name, args) = YAML.load(yml)
20
- target.__send__(method_name, *args)
21
- end
22
- end
23
-
24
- module Klass
25
- def sidekiq_delay(options = {})
26
- Proxy.new(DelayedClass, self, options)
27
- end
28
-
29
- def sidekiq_delay_for(interval, options = {})
30
- Proxy.new(DelayedClass, self, options.merge("at" => Time.now.to_f + interval.to_f))
31
- end
32
-
33
- def sidekiq_delay_until(timestamp, options = {})
34
- Proxy.new(DelayedClass, self, options.merge("at" => timestamp.to_f))
35
- end
36
- alias_method :delay, :sidekiq_delay
37
- alias_method :delay_for, :sidekiq_delay_for
38
- alias_method :delay_until, :sidekiq_delay_until
39
- end
40
- end
41
- end
42
-
43
- Module.__send__(:include, Sidekiq::Extensions::Klass) unless defined?(::Rails)
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "yaml"
4
-
5
- module Sidekiq
6
- module Extensions
7
- SIZE_LIMIT = 8_192
8
-
9
- class Proxy < BasicObject
10
- def initialize(performable, target, options = {})
11
- @performable = performable
12
- @target = target
13
- @opts = options
14
- end
15
-
16
- def method_missing(name, *args)
17
- # Sidekiq has a limitation in that its message must be JSON.
18
- # JSON can't round trip real Ruby objects so we use YAML to
19
- # serialize the objects to a String. The YAML will be converted
20
- # to JSON and then deserialized on the other side back into a
21
- # Ruby object.
22
- obj = [@target, name, args]
23
- marshalled = ::YAML.dump(obj)
24
- if marshalled.size > SIZE_LIMIT
25
- ::Sidekiq.logger.warn { "#{@target}.#{name} job argument is #{marshalled.bytesize} bytes, you should refactor it to reduce the size" }
26
- end
27
- @performable.client_push({"class" => @performable,
28
- "args" => [marshalled],
29
- "display_class" => "#{@target}.#{name}"}.merge(@opts))
30
- end
31
- end
32
- end
33
- end