sidekiq-unique-jobs 7.0.0.beta17 → 7.0.0.beta22

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


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

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8067646614ec63256a43cdbbf8c93779e4a39f7e9e4db493cdcc63a94d1ddf69
4
- data.tar.gz: f467363f7156b40c7b8d2e67f2e00b9df18fcde19831758c9aa272fed50b2570
3
+ metadata.gz: '09650d2cec14e6bfeaf6b74b938286eca9ef889275cd3e885b196cca2ffb1f2f'
4
+ data.tar.gz: 613901dec7e012a67d6e6e1289f1d2b0d9f47e6f6d2764eb1618d2ec389879e7
5
5
  SHA512:
6
- metadata.gz: 15617caf4cc46f2dce4b27fc18e329712508d71c4f246d4348a376920664c849a4fddeddfe1b55e002ee91c9b9c835ab7cc6697942749ae81911b4d84db10a2a
7
- data.tar.gz: b035073d353309d2e9faab2cb84c521b06734fa01cf0854205c31045321f0c582aa87fd194d9516cff3d3e8e0b215a7a06bf3d49d0c50890f255473bf393fdf5
6
+ metadata.gz: 9a12b9d88451356effaeeebfe24e4f69f964aa53d7c85958fa55da58ae2a6a26482a5865dd78b0fbd6389bceb2936449dfde64a6a1238242ed097c24818b26fe
7
+ data.tar.gz: c4284c65010101466e6e3521a4358633c76337f7a5304040f4d188fae8a56f6af2e6f53350da283c5d45f90c4cb28f60d9768a201e3ddf7f19e7ee0cbfa44ffc
@@ -1,5 +1,63 @@
1
1
  # Changelog
2
2
 
3
+ ## [Unreleased](https://github.com/mhenrixon/sidekiq-unique-jobs/tree/HEAD)
4
+
5
+ [Full Changelog](https://github.com/mhenrixon/sidekiq-unique-jobs/compare/v7.0.0.beta21...HEAD)
6
+
7
+ **Fixed bugs:**
8
+
9
+ - Infinite loop in ruby reaper [\#515](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/515)
10
+
11
+ ## [v7.0.0.beta21](https://github.com/mhenrixon/sidekiq-unique-jobs/tree/v7.0.0.beta21) (2020-06-12)
12
+
13
+ [Full Changelog](https://github.com/mhenrixon/sidekiq-unique-jobs/compare/v7.0.0.beta20...v7.0.0.beta21)
14
+
15
+ **Implemented enhancements:**
16
+
17
+ - Move gems to gemfile [\#513](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/513) ([mhenrixon](https://github.com/mhenrixon))
18
+ - Move dev-gems from gemspec to gemfile [\#512](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/512) ([mhenrixon](https://github.com/mhenrixon))
19
+
20
+ **Fixed bugs:**
21
+
22
+ - Prevent indefinitely looping entries [\#516](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/516) ([mhenrixon](https://github.com/mhenrixon))
23
+ - Expire reaper when not checking in [\#508](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/508) ([mhenrixon](https://github.com/mhenrixon))
24
+
25
+ **Closed issues:**
26
+
27
+ - Missing web interface [\#514](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/514)
28
+
29
+ ## [v7.0.0.beta20](https://github.com/mhenrixon/sidekiq-unique-jobs/tree/v7.0.0.beta20) (2020-06-02)
30
+
31
+ [Full Changelog](https://github.com/mhenrixon/sidekiq-unique-jobs/compare/v7.0.0.beta19...v7.0.0.beta20)
32
+
33
+ **Fixed bugs:**
34
+
35
+ - Reaper can't be registered again if sidekiq gets killed by SIGKILL [\#490](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/490)
36
+
37
+ **Closed issues:**
38
+
39
+ - How do I turn this on for only one job class? [\#510](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/510)
40
+
41
+ ## [v7.0.0.beta19](https://github.com/mhenrixon/sidekiq-unique-jobs/tree/v7.0.0.beta19) (2020-05-21)
42
+
43
+ [Full Changelog](https://github.com/mhenrixon/sidekiq-unique-jobs/compare/v7.0.0.beta18...v7.0.0.beta19)
44
+
45
+ ## [v7.0.0.beta18](https://github.com/mhenrixon/sidekiq-unique-jobs/tree/v7.0.0.beta18) (2020-05-21)
46
+
47
+ [Full Changelog](https://github.com/mhenrixon/sidekiq-unique-jobs/compare/v7.0.0.beta17...v7.0.0.beta18)
48
+
49
+ ## [v7.0.0.beta17](https://github.com/mhenrixon/sidekiq-unique-jobs/tree/v7.0.0.beta17) (2020-05-20)
50
+
51
+ [Full Changelog](https://github.com/mhenrixon/sidekiq-unique-jobs/compare/v7.0.0.beta16...v7.0.0.beta17)
52
+
53
+ **Implemented enhancements:**
54
+
55
+ - Try GitHub actions [\#505](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/505) ([mhenrixon](https://github.com/mhenrixon))
56
+
57
+ **Fixed bugs:**
58
+
59
+ - Deep stringify worker options to account for hash in on\_conflict [\#506](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/506) ([jasonbekolay](https://github.com/jasonbekolay))
60
+
3
61
  ## [v7.0.0.beta16](https://github.com/mhenrixon/sidekiq-unique-jobs/tree/v7.0.0.beta16) (2020-05-19)
4
62
 
5
63
  [Full Changelog](https://github.com/mhenrixon/sidekiq-unique-jobs/compare/v6.0.22...v7.0.0.beta16)
@@ -36,6 +94,7 @@
36
94
  - Brpoplpush::RedisScript::LuaError: WRONGTYPE Operation against a key holding the wrong kind of value [\#491](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/491)
37
95
  - Lua script bug [\#489](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/489)
38
96
  - Reaper will delete locks for running jobs [\#488](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/488)
97
+ - Stringify on\_conflict hash in Job prepare method [\#507](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/507) ([jasonbekolay](https://github.com/jasonbekolay))
39
98
  - Fix access to hash members [\#496](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/496) ([mhenrixon](https://github.com/mhenrixon))
40
99
  - Fix cursor assignment [\#494](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/494) ([mhenrixon](https://github.com/mhenrixon))
41
100
  - Prevent reaping of active jobs [\#493](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/493) ([mhenrixon](https://github.com/mhenrixon))
@@ -117,7 +176,6 @@
117
176
  **Merged pull requests:**
118
177
 
119
178
  - README: Use SVG badges ✨ [\#470](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/470) ([olleolleolle](https://github.com/olleolleolle))
120
- - remove deprecated/broken OptionsWithFallback\#unique\_type [\#435](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/435) ([zvkemp](https://github.com/zvkemp))
121
179
 
122
180
  ## [v6.0.19](https://github.com/mhenrixon/sidekiq-unique-jobs/tree/v6.0.19) (2020-03-21)
123
181
 
@@ -260,6 +318,7 @@
260
318
  **Merged pull requests:**
261
319
 
262
320
  - Fix typo and some formatting issues in README [\#442](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/442) ([ajkerr](https://github.com/ajkerr))
321
+ - remove deprecated/broken OptionsWithFallback\#unique\_type [\#435](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/435) ([zvkemp](https://github.com/zvkemp))
263
322
 
264
323
  ## [v7.0.0.beta2](https://github.com/mhenrixon/sidekiq-unique-jobs/tree/v7.0.0.beta2) (2019-10-08)
265
324
 
@@ -646,7 +705,6 @@
646
705
  - Duplicate jobs getting created [\#257](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/257)
647
706
  - Multiple non-unique jobs with until\_executed? [\#255](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/255)
648
707
  - :until\_executing not unlocking when starting to run [\#245](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/245)
649
- - Drop jobs hash [\#282](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/282) ([mhenrixon](https://github.com/mhenrixon))
650
708
 
651
709
  **Closed issues:**
652
710
 
@@ -689,6 +747,10 @@
689
747
  - Reject while scheduling [\#273](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/273) ([mhenrixon](https://github.com/mhenrixon))
690
748
  - Improve testing [\#272](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/272) ([mhenrixon](https://github.com/mhenrixon))
691
749
 
750
+ **Fixed bugs:**
751
+
752
+ - Drop jobs hash [\#282](https://github.com/mhenrixon/sidekiq-unique-jobs/pull/282) ([mhenrixon](https://github.com/mhenrixon))
753
+
692
754
  ## [v6.0.0.beta](https://github.com/mhenrixon/sidekiq-unique-jobs/tree/v6.0.0.beta) (2018-06-17)
693
755
 
694
756
  [Full Changelog](https://github.com/mhenrixon/sidekiq-unique-jobs/compare/v5.0.10...v6.0.0.beta)
@@ -1097,7 +1159,6 @@
1097
1159
  - mock\_redis and the mess [\#62](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/62)
1098
1160
  - What is the exact behavior? [\#47](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/47)
1099
1161
  - Throttling jobs [\#39](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/39)
1100
- - undefined method `get\_sidekiq\_options' for "MyScheduledWorker":String [\#27](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/27)
1101
1162
  - Crash handling [\#14](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/14)
1102
1163
  - Missing info from README [\#6](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/6)
1103
1164
 
@@ -1194,6 +1255,7 @@
1194
1255
  - Short jobs are not unique for the given time window [\#33](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/33)
1195
1256
  - Not all sidekiq:sidekiq\_unique keys are removed from Redis [\#31](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/31)
1196
1257
  - What does uniqueness mean in case of this gem? [\#30](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/30)
1258
+ - undefined method `get\_sidekiq\_options' for "MyScheduledWorker":String [\#27](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/27)
1197
1259
  - Server middleware removes payload hash key before expiration [\#26](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/26)
1198
1260
  - Lock remains when running with Sidekiq::Testing.inline! [\#23](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/23)
1199
1261
  - What is the use case for the uniqueness window? [\#22](https://github.com/mhenrixon/sidekiq-unique-jobs/issues/22)
@@ -40,7 +40,7 @@ module SidekiqUniqueJobs
40
40
  options[:count] = count if count
41
41
 
42
42
  redis do |conn|
43
- conn.zscan_each(key, options).to_a.map { |entry| load_json(entry[0]) }
43
+ conn.zscan_each(key, **options).to_a.map { |entry| load_json(entry[0]) }
44
44
  end
45
45
  end
46
46
 
@@ -80,7 +80,7 @@ module SidekiqUniqueJobs
80
80
  options[:match] = pattern
81
81
  options[:count] = count if count
82
82
 
83
- result = redis { |conn| conn.zscan_each(key, options).to_a }
83
+ result = redis { |conn| conn.zscan_each(key, **options).to_a }
84
84
 
85
85
  result.each_with_object({}) do |entry, hash|
86
86
  hash[entry[0]] = entry[1]
@@ -10,6 +10,7 @@ module SidekiqUniqueJobs
10
10
  # Adds timeout, expiration, lock_args, lock_prefix and lock_digest to the sidekiq job hash
11
11
  # @return [Hash] the job hash
12
12
  def prepare(item)
13
+ stringify_on_conflict_hash(item)
13
14
  add_lock_timeout(item)
14
15
  add_lock_ttl(item)
15
16
  add_digest(item)
@@ -27,6 +28,13 @@ module SidekiqUniqueJobs
27
28
 
28
29
  private
29
30
 
31
+ def stringify_on_conflict_hash(item)
32
+ on_conflict = item[ON_CONFLICT]
33
+ return unless on_conflict.is_a?(Hash)
34
+
35
+ item[ON_CONFLICT] = on_conflict.deep_stringify_keys
36
+ end
37
+
30
38
  def add_lock_ttl(item)
31
39
  item[LOCK_TTL] = SidekiqUniqueJobs::LockTTL.calculate(item)
32
40
  end
@@ -63,7 +63,6 @@ module SidekiqUniqueJobs
63
63
  # @return [Array] args unfiltered when neither of the above
64
64
  def filtered_args
65
65
  return args if lock_args_disabled?
66
- return args if args.empty?
67
66
 
68
67
  json_args = Normalizer.jsonify(args)
69
68
 
@@ -65,11 +65,7 @@ repeat
65
65
  -- TODO: Add check for jobs checked out by process
66
66
  if found ~= true then
67
67
  log_debug("Searching for digest:", digest, "in process sets")
68
- local queue = find_digest_in_process_set(digest)
69
- if queue then
70
- log_debug("found digest:", digest, "in queue:", queue)
71
- found = true
72
- end
68
+ found = find_digest_in_process_set(digest)
73
69
  end
74
70
 
75
71
  if found ~= true then
@@ -4,7 +4,7 @@ local function find_digest_in_process_set(digest)
4
4
  local pattern = "*" .. digest .. "*"
5
5
  local found = false
6
6
 
7
- log_debug("searching in list processes:",
7
+ log_debug("Searching in process list",
8
8
  "for digest:", digest,
9
9
  "cursor:", process_cursor)
10
10
 
@@ -15,15 +15,26 @@ local function find_digest_in_process_set(digest)
15
15
  log_debug("Found number of processes:", #processes, "next cursor:", next_process_cursor)
16
16
 
17
17
  for _, process in ipairs(processes) do
18
+ local workers_key = process .. ":workers"
18
19
  log_debug("searching in process set:", process,
19
20
  "for digest:", digest,
20
21
  "cursor:", process_cursor)
21
22
 
22
- local job = redis.call("HGET", process, "info")
23
+ local jobs = redis.call("HGETALL", workers_key)
23
24
 
24
- if string.find(job, digest) then
25
- log_debug("Found digest", digest, "in process:", process)
26
- found = true
25
+ if #jobs == 0 then
26
+ log_debug("No entries in:", workers_key)
27
+ else
28
+ for i = 1, #jobs, 2 do
29
+ if string.find(jobs[i +1], digest) then
30
+ log_debug("Found digest", digest, "in:", workers_key)
31
+ found = true
32
+ break
33
+ end
34
+ end
35
+ end
36
+
37
+ if found == true then
27
38
  break
28
39
  end
29
40
  end
@@ -111,7 +111,7 @@ module SidekiqUniqueJobs
111
111
  # @return [String] a JSON formatted string
112
112
  #
113
113
  def payload
114
- @payload ||= Sidekiq.dump_json(item)
114
+ @payload ||= dump_json(item)
115
115
  end
116
116
  end
117
117
  end
@@ -10,6 +10,8 @@ module SidekiqUniqueJobs
10
10
  module Manager
11
11
  module_function
12
12
 
13
+ DRIFT_FACTOR = 0.02
14
+
13
15
  include SidekiqUniqueJobs::Connection
14
16
  include SidekiqUniqueJobs::Logging
15
17
 
@@ -56,6 +58,7 @@ module SidekiqUniqueJobs
56
58
  @task ||= Concurrent::TimerTask.new(timer_task_options) do
57
59
  with_logging_context do
58
60
  redis do |conn|
61
+ refresh_reaper_mutex
59
62
  Orphans::Reaper.call(conn)
60
63
  end
61
64
  end
@@ -117,7 +120,9 @@ module SidekiqUniqueJobs
117
120
  # @return [true, false]
118
121
  #
119
122
  def registered?
120
- redis { |conn| conn.get(UNIQUE_REAPER) }.to_i == 1
123
+ redis do |conn|
124
+ conn.get(UNIQUE_REAPER).to_i + drift_reaper_interval > current_timestamp
125
+ end
121
126
  end
122
127
 
123
128
  def disabled?
@@ -131,7 +136,17 @@ module SidekiqUniqueJobs
131
136
  # @return [void]
132
137
  #
133
138
  def register_reaper_process
134
- redis { |conn| conn.set(UNIQUE_REAPER, 1) }
139
+ redis { |conn| conn.set(UNIQUE_REAPER, current_timestamp, nx: true, ex: drift_reaper_interval) }
140
+ end
141
+
142
+ #
143
+ # Updates mutex key
144
+ #
145
+ #
146
+ # @return [void]
147
+ #
148
+ def refresh_reaper_mutex
149
+ redis { |conn| conn.set(UNIQUE_REAPER, current_timestamp, ex: drift_reaper_interval) }
135
150
  end
136
151
 
137
152
  #
@@ -143,6 +158,14 @@ module SidekiqUniqueJobs
143
158
  def unregister_reaper_process
144
159
  redis { |conn| conn.del(UNIQUE_REAPER) }
145
160
  end
161
+
162
+ def drift_reaper_interval
163
+ reaper_interval + (reaper_interval * DRIFT_FACTOR).to_i
164
+ end
165
+
166
+ def current_timestamp
167
+ Time.now.to_i
168
+ end
146
169
  end
147
170
  end
148
171
  end
@@ -117,17 +117,24 @@ module SidekiqUniqueJobs
117
117
  end
118
118
  end
119
119
 
120
- def active?(digest)
120
+ def active?(digest) # rubocop:disable Metrics/MethodLength
121
121
  Sidekiq.redis do |conn|
122
- procs = conn.sscan_each("processes").to_a.sort
122
+ procs = conn.sscan_each("processes").to_a
123
+ return false if procs.empty?
123
124
 
124
- result = conn.pipelined do
125
- procs.map do |key|
126
- conn.hget(key, "info")
125
+ procs.sort.each do |key|
126
+ valid, workers = conn.pipelined do
127
+ conn.exists(key)
128
+ conn.hgetall("#{key}:workers")
127
129
  end
128
- end
129
130
 
130
- result.flatten.compact.any? { |job| load_json(job)[LOCK_DIGEST] == digest }
131
+ next unless valid
132
+ next unless workers.any?
133
+
134
+ workers.each_pair do |_tid, job|
135
+ return true if load_json(job)[LOCK_DIGEST] == digest
136
+ end
137
+ end
131
138
  end
132
139
  end
133
140
 
@@ -157,6 +164,8 @@ module SidekiqUniqueJobs
157
164
  entries = conn.lrange(queue_key, range_start, range_end)
158
165
  page += 1
159
166
 
167
+ break if entries.empty?
168
+
160
169
  entries.each do |entry|
161
170
  yield entry
162
171
  end
@@ -46,7 +46,13 @@ module SidekiqUniqueJobs
46
46
  # @return [false] when not exists
47
47
  #
48
48
  def exist?
49
- redis { |conn| conn.exists(key) }
49
+ redis do |conn|
50
+ value = conn.exists(key)
51
+ return true if value.is_a?(TrueClass)
52
+ return false if value.is_a?(FalseClass)
53
+
54
+ value.positive?
55
+ end
50
56
  end
51
57
 
52
58
  #
@@ -126,7 +126,7 @@ module SidekiqUniqueJobs
126
126
  def batch_scan(match:, count:)
127
127
  cursor = "0"
128
128
  loop do
129
- cursor, values = conn.scan(cursor, match: match, per: count)
129
+ cursor, values = conn.scan(cursor, match: match, count: count)
130
130
  yield values
131
131
  break if cursor == "0"
132
132
  end
@@ -3,5 +3,5 @@
3
3
  module SidekiqUniqueJobs
4
4
  #
5
5
  # @return [String] the current SidekiqUniqueJobs version
6
- VERSION = "7.0.0.beta17"
6
+ VERSION = "7.0.0.beta22"
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-unique-jobs
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.0.beta17
4
+ version: 7.0.0.beta22
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikael Henriksson
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-20 00:00:00.000000000 Z
11
+ date: 2020-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: brpoplpush-redis_script
@@ -90,158 +90,6 @@ dependencies:
90
90
  - - "<"
91
91
  - !ruby/object:Gem::Version
92
92
  version: '2.0'
93
- - !ruby/object:Gem::Dependency
94
- name: bundler
95
- requirement: !ruby/object:Gem::Requirement
96
- requirements:
97
- - - "~>"
98
- - !ruby/object:Gem::Version
99
- version: '2.1'
100
- type: :development
101
- prerelease: false
102
- version_requirements: !ruby/object:Gem::Requirement
103
- requirements:
104
- - - "~>"
105
- - !ruby/object:Gem::Version
106
- version: '2.1'
107
- - !ruby/object:Gem::Dependency
108
- name: rack-test
109
- requirement: !ruby/object:Gem::Requirement
110
- requirements:
111
- - - ">="
112
- - !ruby/object:Gem::Version
113
- version: '1.0'
114
- - - "<"
115
- - !ruby/object:Gem::Version
116
- version: '2.0'
117
- type: :development
118
- prerelease: false
119
- version_requirements: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - ">="
122
- - !ruby/object:Gem::Version
123
- version: '1.0'
124
- - - "<"
125
- - !ruby/object:Gem::Version
126
- version: '2.0'
127
- - !ruby/object:Gem::Dependency
128
- name: rake
129
- requirement: !ruby/object:Gem::Requirement
130
- requirements:
131
- - - "~>"
132
- - !ruby/object:Gem::Version
133
- version: '13.0'
134
- type: :development
135
- prerelease: false
136
- version_requirements: !ruby/object:Gem::Requirement
137
- requirements:
138
- - - "~>"
139
- - !ruby/object:Gem::Version
140
- version: '13.0'
141
- - !ruby/object:Gem::Dependency
142
- name: rspec
143
- requirement: !ruby/object:Gem::Requirement
144
- requirements:
145
- - - "~>"
146
- - !ruby/object:Gem::Version
147
- version: '3.9'
148
- type: :development
149
- prerelease: false
150
- version_requirements: !ruby/object:Gem::Requirement
151
- requirements:
152
- - - "~>"
153
- - !ruby/object:Gem::Version
154
- version: '3.9'
155
- - !ruby/object:Gem::Dependency
156
- name: sinatra
157
- requirement: !ruby/object:Gem::Requirement
158
- requirements:
159
- - - ">="
160
- - !ruby/object:Gem::Version
161
- version: '2.0'
162
- - - "<"
163
- - !ruby/object:Gem::Version
164
- version: '3.0'
165
- type: :development
166
- prerelease: false
167
- version_requirements: !ruby/object:Gem::Requirement
168
- requirements:
169
- - - ">="
170
- - !ruby/object:Gem::Version
171
- version: '2.0'
172
- - - "<"
173
- - !ruby/object:Gem::Version
174
- version: '3.0'
175
- - !ruby/object:Gem::Dependency
176
- name: timecop
177
- requirement: !ruby/object:Gem::Requirement
178
- requirements:
179
- - - "~>"
180
- - !ruby/object:Gem::Version
181
- version: '0.9'
182
- type: :development
183
- prerelease: false
184
- version_requirements: !ruby/object:Gem::Requirement
185
- requirements:
186
- - - "~>"
187
- - !ruby/object:Gem::Version
188
- version: '0.9'
189
- - !ruby/object:Gem::Dependency
190
- name: github-markup
191
- requirement: !ruby/object:Gem::Requirement
192
- requirements:
193
- - - "~>"
194
- - !ruby/object:Gem::Version
195
- version: '3.0'
196
- type: :development
197
- prerelease: false
198
- version_requirements: !ruby/object:Gem::Requirement
199
- requirements:
200
- - - "~>"
201
- - !ruby/object:Gem::Version
202
- version: '3.0'
203
- - !ruby/object:Gem::Dependency
204
- name: github_changelog_generator
205
- requirement: !ruby/object:Gem::Requirement
206
- requirements:
207
- - - "~>"
208
- - !ruby/object:Gem::Version
209
- version: '1.14'
210
- type: :development
211
- prerelease: false
212
- version_requirements: !ruby/object:Gem::Requirement
213
- requirements:
214
- - - "~>"
215
- - !ruby/object:Gem::Version
216
- version: '1.14'
217
- - !ruby/object:Gem::Dependency
218
- name: yard
219
- requirement: !ruby/object:Gem::Requirement
220
- requirements:
221
- - - "~>"
222
- - !ruby/object:Gem::Version
223
- version: 0.9.18
224
- type: :development
225
- prerelease: false
226
- version_requirements: !ruby/object:Gem::Requirement
227
- requirements:
228
- - - "~>"
229
- - !ruby/object:Gem::Version
230
- version: 0.9.18
231
- - !ruby/object:Gem::Dependency
232
- name: gem-release
233
- requirement: !ruby/object:Gem::Requirement
234
- requirements:
235
- - - "~>"
236
- - !ruby/object:Gem::Version
237
- version: '2.0'
238
- type: :development
239
- prerelease: false
240
- version_requirements: !ruby/object:Gem::Requirement
241
- requirements:
242
- - - "~>"
243
- - !ruby/object:Gem::Version
244
- version: '2.0'
245
93
  description: |
246
94
  Prevents simultaneous Sidekiq jobs with the same unique arguments to run.
247
95
  Highly configurable to suite your specific needs.
@@ -391,8 +239,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
391
239
  - !ruby/object:Gem::Version
392
240
  version: 1.3.1
393
241
  requirements: []
394
- rubygems_version: 3.0.3
395
- signing_key:
242
+ rubygems_version: 3.1.4
243
+ signing_key:
396
244
  specification_version: 4
397
245
  summary: Sidekiq middleware that prevents duplicates jobs
398
246
  test_files: []