sidekiq 7.3.5 → 7.3.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changes.md +20 -0
- data/bin/sidekiqload +21 -12
- data/lib/active_job/queue_adapters/sidekiq_adapter.rb +1 -1
- data/lib/sidekiq/cli.rb +1 -1
- data/lib/sidekiq/component.rb +22 -0
- data/lib/sidekiq/config.rb +6 -0
- data/lib/sidekiq/paginator.rb +6 -0
- data/lib/sidekiq/rails.rb +2 -2
- data/lib/sidekiq/version.rb +1 -1
- data/lib/sidekiq/web/action.rb +14 -2
- data/lib/sidekiq/web/application.rb +34 -52
- data/lib/sidekiq/web/helpers.rb +10 -9
- data/lib/sidekiq/web.rb +5 -0
- data/sidekiq.gemspec +1 -0
- data/web/views/filtering.erb +1 -2
- data/web/views/metrics.erb +1 -2
- data/web/views/morgue.erb +2 -2
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec7c9a4bea6982200a069a9a2f7c134811ccbf1aaceb56a8cb708893cab6e301
|
4
|
+
data.tar.gz: e59152e78eccbf714e485a7772e3a62681974abd114ebd608432c5ab93f55211
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5aac99a9f1a385baaac0204c2799b9821c2146ca045eb2cdabc92ac54da8f20ae6239183eed5256bd96e8c45a8538596aa13714f5dc8fb4943565ec86df16dc9
|
7
|
+
data.tar.gz: 7ae68faedfc60d2354335709e36b51d9217bead4bfcf2e2d9d60a4b321cfcafdf931680f298bae061ac412e26d898b82dc7c7f15549909834f93251f7745bb13
|
data/Changes.md
CHANGED
@@ -2,6 +2,26 @@
|
|
2
2
|
|
3
3
|
[Sidekiq Changes](https://github.com/sidekiq/sidekiq/blob/main/Changes.md) | [Sidekiq Pro Changes](https://github.com/sidekiq/sidekiq/blob/main/Pro-Changes.md) | [Sidekiq Enterprise Changes](https://github.com/sidekiq/sidekiq/blob/main/Ent-Changes.md)
|
4
4
|
|
5
|
+
7.3.8
|
6
|
+
----------
|
7
|
+
|
8
|
+
- Fix dead tag links [#6554]
|
9
|
+
- Massive Web UI performance improvement, some pages up to 15x faster [#6555]
|
10
|
+
|
11
|
+
7.3.7
|
12
|
+
----------
|
13
|
+
|
14
|
+
- Backport `Sidekiq::Web.configure` for compatibility with 8.0 [#6532]
|
15
|
+
- Backport `url_params(key)` and `route_params(key)` for compatibility with 8.0 [#6532]
|
16
|
+
- Various fixes for UI filtering [#6508]
|
17
|
+
- Tune `inspect` for internal S::Components to keep size managable [#6553]
|
18
|
+
|
19
|
+
7.3.6
|
20
|
+
----------
|
21
|
+
|
22
|
+
- Forward compatibility fixes for Ruby 3.4
|
23
|
+
- Filtering in the Web UI now works via GET so you can bookmark a filtered view. [#6497]
|
24
|
+
|
5
25
|
7.3.5
|
6
26
|
----------
|
7
27
|
|
data/bin/sidekiqload
CHANGED
@@ -50,7 +50,7 @@ if ENV["AJ"]
|
|
50
50
|
ActiveJob::Base.logger.level = Logger::WARN
|
51
51
|
|
52
52
|
class LoadJob < ActiveJob::Base
|
53
|
-
def perform(idx, ts = nil)
|
53
|
+
def perform(string, idx, hash, ts = nil)
|
54
54
|
puts(Time.now.to_f - ts) if !ts.nil?
|
55
55
|
end
|
56
56
|
end
|
@@ -58,12 +58,21 @@ end
|
|
58
58
|
|
59
59
|
class LoadWorker
|
60
60
|
include Sidekiq::Job
|
61
|
+
$count = 0
|
62
|
+
$lock = Mutex.new
|
63
|
+
|
61
64
|
sidekiq_options retry: 1
|
62
65
|
sidekiq_retry_in do |x|
|
63
66
|
1
|
64
67
|
end
|
65
68
|
|
66
|
-
def perform(idx, ts = nil)
|
69
|
+
def perform(string, idx, hash, ts = nil)
|
70
|
+
$lock.synchronize do
|
71
|
+
$count += 1
|
72
|
+
if $count % 100_000 == 0
|
73
|
+
logger.warn("#{Time.now} Done #{$count}")
|
74
|
+
end
|
75
|
+
end
|
67
76
|
puts(Time.now.to_f - ts) if !ts.nil?
|
68
77
|
# raise idx.to_s if idx % 100 == 1
|
69
78
|
end
|
@@ -133,13 +142,13 @@ class Loader
|
|
133
142
|
start = Time.now
|
134
143
|
if ENV["AJ"]
|
135
144
|
@iter.times do
|
136
|
-
@count.times do |idx|
|
137
|
-
LoadJob.
|
138
|
-
end
|
145
|
+
ActiveJob.perform_all_later(@count.times.map do |idx|
|
146
|
+
LoadJob.new("mike", idx, {mike: "bob"})
|
147
|
+
end)
|
139
148
|
end
|
140
149
|
else
|
141
150
|
@iter.times do
|
142
|
-
arr = Array.new(@count) { |idx| [idx] }
|
151
|
+
arr = Array.new(@count) { |idx| ["string", idx, {"mike" => "bob"}] }
|
143
152
|
Sidekiq::Client.push_bulk("class" => LoadWorker, "args" => arr)
|
144
153
|
end
|
145
154
|
end
|
@@ -163,13 +172,13 @@ class Loader
|
|
163
172
|
Sidekiq.logger.error("Now here's the latency for three jobs")
|
164
173
|
|
165
174
|
if ENV["AJ"]
|
166
|
-
LoadJob.perform_later(1, Time.now.to_f)
|
167
|
-
LoadJob.perform_later(2, Time.now.to_f)
|
168
|
-
LoadJob.perform_later(3, Time.now.to_f)
|
175
|
+
LoadJob.perform_later("", 1, {}, Time.now.to_f)
|
176
|
+
LoadJob.perform_later("", 2, {}, Time.now.to_f)
|
177
|
+
LoadJob.perform_later("", 3, {}, Time.now.to_f)
|
169
178
|
else
|
170
|
-
LoadWorker.perform_async(1, Time.now.to_f)
|
171
|
-
LoadWorker.perform_async(2, Time.now.to_f)
|
172
|
-
LoadWorker.perform_async(3, Time.now.to_f)
|
179
|
+
LoadWorker.perform_async("", 1, {}, Time.now.to_f)
|
180
|
+
LoadWorker.perform_async("", 2, {}, Time.now.to_f)
|
181
|
+
LoadWorker.perform_async("", 3, {}, Time.now.to_f)
|
173
182
|
end
|
174
183
|
|
175
184
|
sleep 0.1
|
@@ -16,7 +16,7 @@ end
|
|
16
16
|
module ActiveJob
|
17
17
|
module QueueAdapters
|
18
18
|
# Explicitly remove the implementation existing in older rails'.
|
19
|
-
remove_const(:SidekiqAdapter) if
|
19
|
+
remove_const(:SidekiqAdapter) if const_defined?(:SidekiqAdapter)
|
20
20
|
|
21
21
|
# Sidekiq adapter for Active Job
|
22
22
|
#
|
data/lib/sidekiq/cli.rb
CHANGED
@@ -101,7 +101,7 @@ module Sidekiq # :nodoc:
|
|
101
101
|
# Touch middleware so it isn't lazy loaded by multiple threads, #3043
|
102
102
|
@config.server_middleware
|
103
103
|
|
104
|
-
::Process.warmup if warmup && ::Process.respond_to?(:warmup)
|
104
|
+
::Process.warmup if warmup && ::Process.respond_to?(:warmup) && ENV["RUBY_DISABLE_WARMUP"] != "1"
|
105
105
|
|
106
106
|
# Before this point, the process is initializing with just the main thread.
|
107
107
|
# Starting here the process will now have multiple threads running.
|
data/lib/sidekiq/component.rb
CHANGED
@@ -64,5 +64,27 @@ module Sidekiq
|
|
64
64
|
end
|
65
65
|
arr.clear if oneshot # once we've fired an event, we never fire it again
|
66
66
|
end
|
67
|
+
|
68
|
+
# When you have a large tree of components, the `inspect` output
|
69
|
+
# can get out of hand, especially with lots of Sidekiq::Config
|
70
|
+
# references everywhere. We avoid calling `inspect` on more complex
|
71
|
+
# state and use `to_s` instead to keep output manageable, #6553
|
72
|
+
def inspect
|
73
|
+
"#<#{self.class.name} #{
|
74
|
+
instance_variables.map do |name|
|
75
|
+
value = instance_variable_get(name)
|
76
|
+
case value
|
77
|
+
when Proc
|
78
|
+
"#{name}=#{value}"
|
79
|
+
when Sidekiq::Config
|
80
|
+
"#{name}=#{value}"
|
81
|
+
when Sidekiq::Component
|
82
|
+
"#{name}=#{value}"
|
83
|
+
else
|
84
|
+
"#{name}=#{value.inspect}"
|
85
|
+
end
|
86
|
+
end.join(", ")
|
87
|
+
}>"
|
88
|
+
end
|
67
89
|
end
|
68
90
|
end
|
data/lib/sidekiq/config.rb
CHANGED
@@ -61,6 +61,12 @@ module Sidekiq
|
|
61
61
|
def_delegators :@options, :[], :[]=, :fetch, :key?, :has_key?, :merge!, :dig
|
62
62
|
attr_reader :capsules
|
63
63
|
|
64
|
+
def inspect
|
65
|
+
"#<#{self.class.name} @options=#{
|
66
|
+
@options.except(:lifecycle_events, :reloader, :death_handlers, :error_handlers).inspect
|
67
|
+
}>"
|
68
|
+
end
|
69
|
+
|
64
70
|
def to_json(*)
|
65
71
|
Sidekiq.dump_json(@options)
|
66
72
|
end
|
data/lib/sidekiq/paginator.rb
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
|
3
3
|
module Sidekiq
|
4
4
|
module Paginator
|
5
|
+
TYPE_CACHE = {
|
6
|
+
"dead" => "zset",
|
7
|
+
"retry" => "zset",
|
8
|
+
"schedule" => "zset"
|
9
|
+
}
|
10
|
+
|
5
11
|
def page(key, pageidx = 1, page_size = 25, opts = nil)
|
6
12
|
current_page = (pageidx.to_i < 1) ? 1 : pageidx.to_i
|
7
13
|
pageidx = current_page - 1
|
data/lib/sidekiq/rails.rb
CHANGED
@@ -38,9 +38,9 @@ module Sidekiq
|
|
38
38
|
# end
|
39
39
|
# end
|
40
40
|
initializer "sidekiq.active_job_integration" do
|
41
|
-
|
42
|
-
require "active_job/queue_adapters/sidekiq_adapter"
|
41
|
+
require "active_job/queue_adapters/sidekiq_adapter"
|
43
42
|
|
43
|
+
ActiveSupport.on_load(:active_job) do
|
44
44
|
include ::Sidekiq::Job::Options unless respond_to?(:sidekiq_options)
|
45
45
|
end
|
46
46
|
end
|
data/lib/sidekiq/version.rb
CHANGED
data/lib/sidekiq/web/action.rb
CHANGED
@@ -27,6 +27,7 @@ module Sidekiq
|
|
27
27
|
redirect current_location
|
28
28
|
end
|
29
29
|
|
30
|
+
# deprecated, will warn in 8.0
|
30
31
|
def params
|
31
32
|
indifferent_hash = Hash.new { |hash, key| hash[key.to_s] if Symbol === key }
|
32
33
|
|
@@ -36,8 +37,19 @@ module Sidekiq
|
|
36
37
|
indifferent_hash
|
37
38
|
end
|
38
39
|
|
39
|
-
|
40
|
-
|
40
|
+
# Use like `url_params("page")` within your action blocks
|
41
|
+
def url_params(key)
|
42
|
+
request.params[key]
|
43
|
+
end
|
44
|
+
|
45
|
+
# Use like `route_params(:name)` within your action blocks
|
46
|
+
# key is required in 8.0, nil is only used for backwards compatibility
|
47
|
+
def route_params(key = nil)
|
48
|
+
if key
|
49
|
+
env[WebRouter::ROUTE_PARAMS][key]
|
50
|
+
else
|
51
|
+
env[WebRouter::ROUTE_PARAMS]
|
52
|
+
end
|
41
53
|
end
|
42
54
|
|
43
55
|
def session
|
@@ -67,11 +67,15 @@ module Sidekiq
|
|
67
67
|
end
|
68
68
|
|
69
69
|
get "/metrics" do
|
70
|
+
x = params[:substr]
|
71
|
+
class_filter = (x.nil? || x == "") ? nil : Regexp.new(Regexp.escape(x), Regexp::IGNORECASE)
|
72
|
+
|
70
73
|
q = Sidekiq::Metrics::Query.new
|
71
74
|
@period = h((params[:period] || "")[0..1])
|
72
75
|
@periods = METRICS_PERIODS
|
73
76
|
minutes = @periods.fetch(@period, @periods.values.first)
|
74
|
-
@query_result = q.top_jobs(minutes: minutes)
|
77
|
+
@query_result = q.top_jobs(minutes: minutes, class_filter: class_filter)
|
78
|
+
|
75
79
|
erb(:metrics)
|
76
80
|
end
|
77
81
|
|
@@ -153,9 +157,15 @@ module Sidekiq
|
|
153
157
|
end
|
154
158
|
|
155
159
|
get "/morgue" do
|
156
|
-
|
157
|
-
|
158
|
-
|
160
|
+
x = params[:substr]
|
161
|
+
|
162
|
+
if x && x != ""
|
163
|
+
@dead = search(Sidekiq::DeadSet.new, x)
|
164
|
+
else
|
165
|
+
@count = (params["count"] || 25).to_i
|
166
|
+
(@current_page, @total_size, @dead) = page("dead", params["page"], @count, reverse: true)
|
167
|
+
@dead = @dead.map { |msg, score| Sidekiq::SortedEntry.new(nil, score, msg) }
|
168
|
+
end
|
159
169
|
|
160
170
|
erb(:morgue)
|
161
171
|
end
|
@@ -174,7 +184,7 @@ module Sidekiq
|
|
174
184
|
end
|
175
185
|
|
176
186
|
post "/morgue" do
|
177
|
-
redirect(request.path) unless
|
187
|
+
redirect(request.path) unless url_params("key")
|
178
188
|
|
179
189
|
params["key"].each do |key|
|
180
190
|
job = Sidekiq::DeadSet.new.fetch(*parse_params(key)).first
|
@@ -197,7 +207,7 @@ module Sidekiq
|
|
197
207
|
end
|
198
208
|
|
199
209
|
post "/morgue/:key" do
|
200
|
-
key = route_params
|
210
|
+
key = route_params(:key)
|
201
211
|
halt(404) unless key
|
202
212
|
|
203
213
|
job = Sidekiq::DeadSet.new.fetch(*parse_params(key)).first
|
@@ -207,9 +217,15 @@ module Sidekiq
|
|
207
217
|
end
|
208
218
|
|
209
219
|
get "/retries" do
|
210
|
-
|
211
|
-
|
212
|
-
|
220
|
+
x = url_params("substr")
|
221
|
+
|
222
|
+
if x && x != ""
|
223
|
+
@retries = search(Sidekiq::RetrySet.new, x)
|
224
|
+
else
|
225
|
+
@count = (params["count"] || 25).to_i
|
226
|
+
(@current_page, @total_size, @retries) = page("retry", params["page"], @count)
|
227
|
+
@retries = @retries.map { |msg, score| Sidekiq::SortedEntry.new(nil, score, msg) }
|
228
|
+
end
|
213
229
|
|
214
230
|
erb(:retries)
|
215
231
|
end
|
@@ -262,9 +278,15 @@ module Sidekiq
|
|
262
278
|
end
|
263
279
|
|
264
280
|
get "/scheduled" do
|
265
|
-
|
266
|
-
|
267
|
-
|
281
|
+
x = params[:substr]
|
282
|
+
|
283
|
+
if x && x != ""
|
284
|
+
@scheduled = search(Sidekiq::ScheduledSet.new, x)
|
285
|
+
else
|
286
|
+
@count = (params["count"] || 25).to_i
|
287
|
+
(@current_page, @total_size, @scheduled) = page("schedule", params["page"], @count)
|
288
|
+
@scheduled = @scheduled.map { |msg, score| Sidekiq::SortedEntry.new(nil, score, msg) }
|
289
|
+
end
|
268
290
|
|
269
291
|
erb(:scheduled)
|
270
292
|
end
|
@@ -328,46 +350,6 @@ module Sidekiq
|
|
328
350
|
json Sidekiq::Stats.new.queues
|
329
351
|
end
|
330
352
|
|
331
|
-
########
|
332
|
-
# Filtering
|
333
|
-
|
334
|
-
route :get, :post, "/filter/metrics" do
|
335
|
-
x = params[:substr]
|
336
|
-
return redirect "#{root_path}metrics" unless x && x != ""
|
337
|
-
|
338
|
-
q = Sidekiq::Metrics::Query.new
|
339
|
-
@period = h((params[:period] || "")[0..1])
|
340
|
-
@periods = METRICS_PERIODS
|
341
|
-
minutes = @periods.fetch(@period, @periods.values.first)
|
342
|
-
@query_result = q.top_jobs(minutes: minutes, class_filter: Regexp.new(Regexp.escape(x), Regexp::IGNORECASE))
|
343
|
-
|
344
|
-
erb :metrics
|
345
|
-
end
|
346
|
-
|
347
|
-
route :get, :post, "/filter/retries" do
|
348
|
-
x = params[:substr]
|
349
|
-
return redirect "#{root_path}retries" unless x && x != ""
|
350
|
-
|
351
|
-
@retries = search(Sidekiq::RetrySet.new, params[:substr])
|
352
|
-
erb :retries
|
353
|
-
end
|
354
|
-
|
355
|
-
route :get, :post, "/filter/scheduled" do
|
356
|
-
x = params[:substr]
|
357
|
-
return redirect "#{root_path}scheduled" unless x && x != ""
|
358
|
-
|
359
|
-
@scheduled = search(Sidekiq::ScheduledSet.new, params[:substr])
|
360
|
-
erb :scheduled
|
361
|
-
end
|
362
|
-
|
363
|
-
route :get, :post, "/filter/dead" do
|
364
|
-
x = params[:substr]
|
365
|
-
return redirect "#{root_path}morgue" unless x && x != ""
|
366
|
-
|
367
|
-
@dead = search(Sidekiq::DeadSet.new, params[:substr])
|
368
|
-
erb :morgue
|
369
|
-
end
|
370
|
-
|
371
353
|
post "/change_locale" do
|
372
354
|
locale = params["locale"]
|
373
355
|
|
data/lib/sidekiq/web/helpers.rb
CHANGED
@@ -52,11 +52,11 @@ module Sidekiq
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def strings(lang)
|
55
|
-
|
55
|
+
@@strings ||= {}
|
56
56
|
|
57
57
|
# Allow sidekiq-web extensions to add locale paths
|
58
58
|
# so extensions can be localized
|
59
|
-
|
59
|
+
@@strings[lang] ||= settings.locales.each_with_object({}) do |path, global|
|
60
60
|
find_locale_files(lang).each do |file|
|
61
61
|
strs = YAML.safe_load(File.read(file))
|
62
62
|
global.merge!(strs[lang])
|
@@ -77,19 +77,19 @@ module Sidekiq
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def clear_caches
|
80
|
-
|
81
|
-
|
82
|
-
|
80
|
+
@@strings = nil
|
81
|
+
@@locale_files = nil
|
82
|
+
@@available_locales = nil
|
83
83
|
end
|
84
84
|
|
85
85
|
def locale_files
|
86
|
-
|
86
|
+
@@locale_files ||= settings.locales.flat_map { |path|
|
87
87
|
Dir["#{path}/*.yml"]
|
88
88
|
}
|
89
89
|
end
|
90
90
|
|
91
91
|
def available_locales
|
92
|
-
|
92
|
+
@@available_locales ||= Set.new(locale_files.map { |path| File.basename(path, ".yml") })
|
93
93
|
end
|
94
94
|
|
95
95
|
def find_locale_files(lang)
|
@@ -111,7 +111,7 @@ module Sidekiq
|
|
111
111
|
if within.nil?
|
112
112
|
::Rack::Utils.escape_html(jid)
|
113
113
|
else
|
114
|
-
"<a href='#{root_path}
|
114
|
+
"<a href='#{root_path}#{within}?substr=#{jid}'>#{::Rack::Utils.escape_html(jid)}</a>"
|
115
115
|
end
|
116
116
|
end
|
117
117
|
|
@@ -184,7 +184,8 @@ module Sidekiq
|
|
184
184
|
|
185
185
|
# sidekiq/sidekiq#3243
|
186
186
|
def unfiltered?
|
187
|
-
|
187
|
+
s = url_params("substr")
|
188
|
+
yield unless s && s.size > 0
|
188
189
|
end
|
189
190
|
|
190
191
|
def get_locale
|
data/lib/sidekiq/web.rb
CHANGED
data/sidekiq.gemspec
CHANGED
data/web/views/filtering.erb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
<div>
|
2
|
-
<form method="
|
3
|
-
<%= csrf_tag %>
|
2
|
+
<form method="get" class="form-inline" action='<%= root_path %><%= which %>'>
|
4
3
|
<label for="substr"><%= t('Filter') %></label>
|
5
4
|
<input class="search form-control" type="search" name="substr" value="<%= h params[:substr] %>" placeholder="<%= t('AnyJobContent') %>"/>
|
6
5
|
</form>
|
data/web/views/metrics.erb
CHANGED
@@ -9,8 +9,7 @@
|
|
9
9
|
</div>
|
10
10
|
|
11
11
|
<div>
|
12
|
-
<form id="metrics-form" class="form-inline" action="<%= root_path %>
|
13
|
-
<%= csrf_tag %>
|
12
|
+
<form id="metrics-form" class="form-inline" action="<%= root_path %>metrics" method="get">
|
14
13
|
<label for="substr"><%= t('Filter') %></label>
|
15
14
|
<input id="class-filter" class="form-control" type="text" name="substr" placeholder="<%= t('Name') %>" value="<%= h params[:substr] %>">
|
16
15
|
<select id="period-selector" class="form-control" name="period">
|
data/web/views/morgue.erb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
<% if @dead.size > 0 && @total_size > @count %>
|
4
4
|
<%= erb :_paging, locals: { url: "#{root_path}morgue" } %>
|
5
5
|
<% end %>
|
6
|
-
<%= filtering('
|
6
|
+
<%= filtering('morgue') %>
|
7
7
|
</div>
|
8
8
|
|
9
9
|
<% if @dead.size > 0 %>
|
@@ -40,7 +40,7 @@
|
|
40
40
|
</td>
|
41
41
|
<td>
|
42
42
|
<%= entry.display_class %>
|
43
|
-
<%= display_tags(entry, "
|
43
|
+
<%= display_tags(entry, "morgue") %>
|
44
44
|
</td>
|
45
45
|
<td>
|
46
46
|
<div class="args"><%= display_args(entry.display_args) %></div>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.3.
|
4
|
+
version: 7.3.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Perham
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-01-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis-client
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: base64
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
description: Simple, efficient background processing for Ruby.
|
70
84
|
email:
|
71
85
|
- info@contribsys.com
|
@@ -232,7 +246,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
232
246
|
- !ruby/object:Gem::Version
|
233
247
|
version: '0'
|
234
248
|
requirements: []
|
235
|
-
rubygems_version: 3.5.
|
249
|
+
rubygems_version: 3.5.22
|
236
250
|
signing_key:
|
237
251
|
specification_version: 4
|
238
252
|
summary: Simple, efficient background processing for Ruby
|