simple_mutex 1.0.1 → 1.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 003ab1f3d7a72c1ed87d20272d4e7e84c8b486fd7dc3a34539ee8ce21688199d
4
- data.tar.gz: e392b0b025b830ea18f062e402c1608562ad3992d3c8c100a266e77f7392dbb5
3
+ metadata.gz: 0a4ce21298ffcca5c95af76310c29841548fff255770558e5c1444c63e5fdccf
4
+ data.tar.gz: fa7eec6953a65ab8f6db36b6d93f6744a8ff3ff5f2a34a622d2f731c2e9ed516
5
5
  SHA512:
6
- metadata.gz: 4385df59ccb07e0781ff83575d2137907ebc022e2971d2cb9e5f000c70075f7685585e5f93ac3b8dcf5d8798dbb28400441f1bf263c6d34167a22740f1661edd
7
- data.tar.gz: 1c0bd82fce378dfe91f8d778792a325f14191547ce3e6d464cb1b472299480378299283a28340c4299ff5a1d4dd63ab49204e825d31ba85adcc7e7f0f8719784
6
+ metadata.gz: 1822c4930ee9f2d8f6b30af2f6a7c984e94744e58c0533731dd31cd14af5d144862e008d0b4e6bae5e62d8390ae416eb2196a21689ca470832ed4fb505de15c8
7
+ data.tar.gz: b275b789bab42e4b666aebcd9b234757de7d0ba90580b58d2a2d585f24eaefc0155bf70010be342f86aa50a287e4281e21a9f8df62d387da15b34dae637f4c7f
@@ -1,18 +1,21 @@
1
1
  name: CI
2
2
 
3
- on: [push, pull_request]
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - "*"
7
+ push:
8
+ branches:
9
+ - main
4
10
 
5
11
  jobs:
6
12
  test:
7
13
  runs-on: ubuntu-latest
8
14
 
9
- # We want to run on external PRs, but not on our own internal PRs as they'll be run on push event
10
- if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != 'umbrellio/table_sync'
11
-
12
15
  strategy:
13
16
  fail-fast: false
14
17
  matrix:
15
- ruby: ["2.6", "2.7", "3.0"]
18
+ ruby: ["2.7", "3.0", "3.1", "3.2"]
16
19
 
17
20
  name: ${{ matrix.ruby }}
18
21
 
@@ -24,7 +27,7 @@ jobs:
24
27
  ruby-version: ${{ matrix.ruby }}
25
28
  bundler-cache: true
26
29
 
27
- - run: bundle exec rake bundle:audit
30
+ - run: bundle exec bundle-audit check --update
28
31
  - run: bundle exec rubocop
29
32
  - run: bundle exec rspec
30
33
 
data/.rubocop.yml CHANGED
@@ -1,6 +1,9 @@
1
1
  inherit_gem:
2
2
  rubocop-config-umbrellio: lib/rubocop.yml
3
3
 
4
+ AllCops:
5
+ TargetRubyVersion: 2.7
6
+
4
7
  Layout/HashAlignment:
5
8
  EnforcedHashRocketStyle:
6
9
  - key
@@ -9,6 +12,12 @@ Layout/HashAlignment:
9
12
  - key
10
13
  - table
11
14
 
15
+ RSpec/IndexedLet:
16
+ Max: 3
17
+
12
18
  Naming/VariableNumber:
13
19
  Exclude:
14
20
  - 'spec/**/*'
21
+
22
+ Performance/StringIdentifierArgument:
23
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [1.1.0]
6
+ - Updated Ruby version to 2.7, because version below is no longer officially used.
7
+ - Update 'redis' to the latest version to support redis-sentinel.
8
+ - Redis-namespace dependency moved to development dependency.
9
+ - Lock development dependency gem versions.
10
+
11
+ ## [1.0.2]
12
+ - Redis-namespace dependency now requires version 1.8.2 or more recent, because thread safety was broken in 1.8.1
13
+ - Adds processing for case when `watch` fails in redis transactions (during unlocking).
14
+
5
15
  ## [1.0.1]
6
16
 
7
17
  - Bugfix with active job/batches memoization in `SimpleMutex::SidekiqSupport::JobCleaner` and
@@ -11,4 +21,4 @@ All notable changes to this project will be documented in this file.
11
21
 
12
22
  ## [1.0.0]
13
23
 
14
- Initial public release
24
+ Initial public release
data/Gemfile.lock CHANGED
@@ -1,123 +1,141 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simple_mutex (1.0.1)
5
- redis
6
- redis-namespace
4
+ simple_mutex (1.1.0)
5
+ redis (>= 5.0)
7
6
  sidekiq
8
7
 
9
8
  GEM
10
9
  remote: https://rubygems.org/
11
10
  specs:
12
- activesupport (6.1.4.1)
11
+ activesupport (7.1.0)
12
+ base64
13
+ bigdecimal
13
14
  concurrent-ruby (~> 1.0, >= 1.0.2)
15
+ connection_pool (>= 2.2.5)
16
+ drb
14
17
  i18n (>= 1.6, < 2)
15
18
  minitest (>= 5.1)
19
+ mutex_m
16
20
  tzinfo (~> 2.0)
17
- zeitwerk (~> 2.3)
18
21
  ast (2.4.2)
19
- bundler-audit (0.9.0.1)
22
+ base64 (0.1.1)
23
+ bigdecimal (3.1.4)
24
+ bundler-audit (0.9.1)
20
25
  bundler (>= 1.2.0, < 3)
21
26
  thor (~> 1.0)
22
- concurrent-ruby (1.1.9)
23
- connection_pool (2.2.5)
24
- diff-lcs (1.4.4)
27
+ concurrent-ruby (1.2.2)
28
+ connection_pool (2.4.1)
29
+ diff-lcs (1.5.0)
25
30
  docile (1.4.0)
26
- i18n (1.8.10)
27
- concurrent-ruby (~> 1.0)
28
- minitest (5.14.4)
29
- mock_redis (0.29.0)
31
+ drb (2.1.1)
30
32
  ruby2_keywords
31
- parallel (1.21.0)
32
- parser (3.0.2.0)
33
+ i18n (1.14.1)
34
+ concurrent-ruby (~> 1.0)
35
+ json (2.6.3)
36
+ minitest (5.20.0)
37
+ mock_redis (0.37.0)
38
+ mutex_m (0.1.2)
39
+ parallel (1.23.0)
40
+ parser (3.2.2.4)
33
41
  ast (~> 2.4.1)
34
- rack (2.2.3)
35
- rainbow (3.0.0)
36
- redis (4.5.1)
37
- redis-namespace (1.8.1)
38
- redis (>= 3.0.4)
39
- regexp_parser (2.1.1)
40
- rexml (3.2.5)
41
- rspec (3.10.0)
42
- rspec-core (~> 3.10.0)
43
- rspec-expectations (~> 3.10.0)
44
- rspec-mocks (~> 3.10.0)
45
- rspec-core (3.10.1)
46
- rspec-support (~> 3.10.0)
47
- rspec-expectations (3.10.1)
42
+ racc
43
+ racc (1.7.1)
44
+ rack (3.0.8)
45
+ rainbow (3.1.1)
46
+ redis (5.0.7)
47
+ redis-client (>= 0.9.0)
48
+ redis-client (0.17.0)
49
+ connection_pool
50
+ redis-namespace (1.11.0)
51
+ redis (>= 4)
52
+ regexp_parser (2.8.1)
53
+ rexml (3.2.6)
54
+ rspec (3.12.0)
55
+ rspec-core (~> 3.12.0)
56
+ rspec-expectations (~> 3.12.0)
57
+ rspec-mocks (~> 3.12.0)
58
+ rspec-core (3.12.2)
59
+ rspec-support (~> 3.12.0)
60
+ rspec-expectations (3.12.3)
48
61
  diff-lcs (>= 1.2.0, < 2.0)
49
- rspec-support (~> 3.10.0)
50
- rspec-mocks (3.10.2)
62
+ rspec-support (~> 3.12.0)
63
+ rspec-mocks (3.12.6)
51
64
  diff-lcs (>= 1.2.0, < 2.0)
52
- rspec-support (~> 3.10.0)
53
- rspec-support (3.10.2)
54
- rubocop (1.17.0)
65
+ rspec-support (~> 3.12.0)
66
+ rspec-support (3.12.1)
67
+ rubocop (1.50.2)
68
+ json (~> 2.3)
55
69
  parallel (~> 1.10)
56
- parser (>= 3.0.0.0)
70
+ parser (>= 3.2.0.0)
57
71
  rainbow (>= 2.2.2, < 4.0)
58
72
  regexp_parser (>= 1.8, < 3.0)
59
- rexml
60
- rubocop-ast (>= 1.7.0, < 2.0)
73
+ rexml (>= 3.2.5, < 4.0)
74
+ rubocop-ast (>= 1.28.0, < 2.0)
61
75
  ruby-progressbar (~> 1.7)
62
- unicode-display_width (>= 1.4.0, < 3.0)
63
- rubocop-ast (1.12.0)
64
- parser (>= 3.0.1.1)
65
- rubocop-config-umbrellio (1.17.0.53)
66
- rubocop (= 1.17.0)
67
- rubocop-performance (= 1.10.0)
68
- rubocop-rails (= 2.9.1)
69
- rubocop-rake (= 0.5.1)
70
- rubocop-rspec (= 2.2.0)
71
- rubocop-sequel (= 0.2.0)
72
- rubocop-performance (1.10.0)
73
- rubocop (>= 0.90.0, < 2.0)
76
+ unicode-display_width (>= 2.4.0, < 3.0)
77
+ rubocop-ast (1.29.0)
78
+ parser (>= 3.2.1.0)
79
+ rubocop-capybara (2.19.0)
80
+ rubocop (~> 1.41)
81
+ rubocop-config-umbrellio (1.50.0.85)
82
+ rubocop (~> 1.50.0)
83
+ rubocop-performance (~> 1.17.0)
84
+ rubocop-rails (~> 2.19.0)
85
+ rubocop-rake (~> 0.6.0)
86
+ rubocop-rspec (~> 2.20.0)
87
+ rubocop-sequel (~> 0.3.3)
88
+ rubocop-performance (1.17.1)
89
+ rubocop (>= 1.7.0, < 2.0)
74
90
  rubocop-ast (>= 0.4.0)
75
- rubocop-rails (2.9.1)
91
+ rubocop-rails (2.19.1)
76
92
  activesupport (>= 4.2.0)
77
93
  rack (>= 1.1)
78
- rubocop (>= 0.90.0, < 2.0)
79
- rubocop-rake (0.5.1)
80
- rubocop
81
- rubocop-rspec (2.2.0)
94
+ rubocop (>= 1.33.0, < 2.0)
95
+ rubocop-rake (0.6.0)
82
96
  rubocop (~> 1.0)
83
- rubocop-ast (>= 1.1.0)
84
- rubocop-sequel (0.2.0)
97
+ rubocop-rspec (2.20.0)
98
+ rubocop (~> 1.33)
99
+ rubocop-capybara (~> 2.17)
100
+ rubocop-sequel (0.3.4)
85
101
  rubocop (~> 1.0)
86
- ruby-progressbar (1.11.0)
102
+ ruby-progressbar (1.13.0)
87
103
  ruby2_keywords (0.0.5)
88
- sidekiq (6.3.1)
89
- connection_pool (>= 2.2.2)
90
- rack (~> 2.0)
91
- redis (>= 4.2.0)
92
- simplecov (0.21.2)
104
+ sidekiq (7.1.5)
105
+ concurrent-ruby (< 2)
106
+ connection_pool (>= 2.3.0)
107
+ rack (>= 2.2.4)
108
+ redis-client (>= 0.14.0)
109
+ simplecov (0.22.0)
93
110
  docile (~> 1.1)
94
111
  simplecov-html (~> 0.11)
95
112
  simplecov_json_formatter (~> 0.1)
96
113
  simplecov-html (0.12.3)
97
114
  simplecov-lcov (0.8.0)
98
- simplecov_json_formatter (0.1.3)
99
- thor (1.1.0)
100
- timecop (0.9.4)
101
- tzinfo (2.0.4)
115
+ simplecov_json_formatter (0.1.4)
116
+ thor (1.2.2)
117
+ timecop (0.9.8)
118
+ tzinfo (2.0.6)
102
119
  concurrent-ruby (~> 1.0)
103
- unicode-display_width (2.1.0)
104
- zeitwerk (2.5.1)
120
+ unicode-display_width (2.5.0)
105
121
 
106
122
  PLATFORMS
107
- ruby
123
+ x86_64-darwin-21
124
+ x86_64-linux
108
125
 
109
126
  DEPENDENCIES
110
- bundler
111
- bundler-audit
112
- mock_redis
113
- rspec
114
- rubocop
115
- rubocop-config-umbrellio
116
- rubocop-rspec
127
+ bundler (~> 2.4, >= 2.4.20)
128
+ bundler-audit (~> 0.9.1)
129
+ mock_redis (~> 0.37.0)
130
+ redis-namespace (~> 1.11)
131
+ rspec (~> 3.12)
132
+ rubocop (~> 1.50, >= 1.50)
133
+ rubocop-config-umbrellio (~> 1.50, >= 1.50.0.85)
134
+ rubocop-rspec (~> 2.20, >= 2.20)
117
135
  simple_mutex!
118
- simplecov
119
- simplecov-lcov
120
- timecop
136
+ simplecov (~> 0.22.0)
137
+ simplecov-lcov (~> 0.8.0)
138
+ timecop (~> 0.9.8)
121
139
 
122
140
  BUNDLED WITH
123
- 2.2.22
141
+ 2.4.20
@@ -2,35 +2,54 @@
2
2
 
3
3
  module SimpleMutex
4
4
  class BaseCleaner
5
+ MAX_DEL_ATTEMPTS = 3
6
+
7
+ class SynchronizationAnomalyError < ::StandardError; end
8
+
9
+ # rubocop:disable Metrics/MethodLength
5
10
  def unlock
6
11
  ::SimpleMutex.redis_check!
7
12
 
8
13
  logger&.info(start_msg)
9
14
 
10
15
  redis.keys.select do |lock_key|
11
- redis.watch(lock_key) do
12
- raw_data = redis.get(lock_key)
16
+ attempt = 0
17
+
18
+ begin
19
+ redis.watch(lock_key) do
20
+ raw_data = redis.get(lock_key)
21
+ raw_data = raw_data.value if raw_data.is_a?(Redis::Future)
22
+
23
+ next if raw_data.nil?
24
+
25
+ parsed_data = safe_parse(raw_data)
13
26
 
14
- next redis.unwatch if raw_data.nil?
27
+ next unless parsed_data&.dig("payload", "type") == type
15
28
 
16
- parsed_data = safe_parse(raw_data)
29
+ entity_id = parsed_data&.dig(*path_to_entity_id)
17
30
 
18
- next redis.unwatch unless parsed_data&.dig("payload", "type") == type
31
+ next if entity_id.nil? || active?(entity_id)
19
32
 
20
- entity_id = parsed_data&.dig(*path_to_entity_id)
33
+ return_value = redis.multi { |multi| multi.del(lock_key) }
21
34
 
22
- next redis.unwatch if entity_id.nil? || active?(entity_id)
35
+ log_iteration(lock_key, raw_data, return_value) unless logger.nil?
23
36
 
24
- return_value = redis.multi { |multi| multi.del(lock_key) }
37
+ result = return_value&.first
25
38
 
26
- log_iteration(lock_key, raw_data, return_value) unless logger.nil?
39
+ raise SynchronizationAnomalyError, "Sync anomaly." unless result.is_a?(Integer)
27
40
 
28
- return_value&.first&.positive?
41
+ result.positive?
42
+ ensure
43
+ redis.unwatch
44
+ end
45
+ rescue SynchronizationAnomalyError
46
+ retry if (attempt += 1) < MAX_DEL_ATTEMPTS
29
47
  end
30
48
  end
31
49
 
32
50
  logger&.info(end_msg)
33
51
  end
52
+ # rubocop:enable Metrics/MethodLength
34
53
 
35
54
  private
36
55
 
@@ -74,9 +93,9 @@ module SimpleMutex
74
93
  end
75
94
 
76
95
  def generate_log_msg(lock_key, raw_data, return_value)
77
- "Trying to delete row with key <#{lock_key.inspect}> "\
78
- "and value <#{raw_data.inspect}>. "\
79
- "MULTI returned value <#{return_value.inspect}>."
96
+ "Trying to delete row with key <#{lock_key.inspect}> " \
97
+ "and value <#{raw_data.inspect}>. " \
98
+ "MULTI returned value <#{return_value.inspect}>."
80
99
  end
81
100
 
82
101
  def redis
@@ -29,39 +29,37 @@ module SimpleMutex
29
29
  }
30
30
  end
31
31
 
32
- # rubocop:disable Metrics/MethodLength, Style/HashEachMethods, Performance/CollectionLiteralInLoop
32
+ # rubocop:disable Style/HashEachMethods
33
33
  def list(mode: :default)
34
34
  check_mode(mode)
35
35
 
36
36
  result = []
37
+ job_types = %i[job default]
38
+ batch_types = %i[batch default]
37
39
 
38
40
  redis.keys.each do |lock_key|
39
- redis.watch(lock_key) do
40
- raw_data = redis.get(lock_key)
41
-
42
- unless raw_data.nil?
43
- parsed_data = safe_parse(raw_data)
44
-
45
- if parsed_data.nil?
46
- result << { key: lock_key, value: raw_data } if mode == :all
47
- else
48
- lock_type = parsed_data&.dig("payload", "type")
49
-
50
- if (mode == :all) ||
51
- (lock_type == "Job" && %i[job default].include?(mode)) ||
52
- (lock_type == "Batch" && %i[batch default].include?(mode))
53
- result << { key: lock_key, value: parsed_data }
54
- end
55
- end
56
- end
41
+ raw_data = redis.get(lock_key)
42
+
43
+ next if raw_data.nil?
44
+
45
+ parsed_data = safe_parse(raw_data)
57
46
 
58
- redis.unwatch
47
+ if parsed_data.nil?
48
+ result << { key: lock_key, value: raw_data } if mode == :all
49
+ else
50
+ lock_type = parsed_data&.dig("payload", "type")
51
+
52
+ if (mode == :all) ||
53
+ (lock_type == "Job" && job_types.include?(mode)) ||
54
+ (lock_type == "Batch" && batch_types.include?(mode))
55
+ result << { key: lock_key, value: parsed_data }
56
+ end
59
57
  end
60
58
  end
61
59
 
62
60
  result
63
61
  end
64
- # rubocop:enable Metrics/MethodLength, Style/HashEachMethods, Performance/CollectionLiteralInLoop
62
+ # rubocop:enable Style/HashEachMethods
65
63
 
66
64
  private
67
65
 
@@ -6,8 +6,9 @@ require "json"
6
6
  module SimpleMutex
7
7
  class Mutex
8
8
  DEFAULT_EXPIRES_IN = 60 * 60 # 1 hour
9
+ MAX_DEL_ATTEMPTS = 3
9
10
 
10
- ERR_MSGS = {
11
+ ERROR_MESSAGES = {
11
12
  unlock: {
12
13
  unknown: lambda do |lock_key|
13
14
  "something when wrong when deleting lock key <#{lock_key}>."
@@ -18,6 +19,9 @@ module SimpleMutex
18
19
  signature_mismatch: lambda do |lock_key|
19
20
  "signature mismatch for lock key <#{lock_key}>."
20
21
  end,
22
+ repeated_synchronization_anomaly: lambda do |lock_key|
23
+ "repeated synchronization anomaly for <#{lock_key}>."
24
+ end,
21
25
  }.freeze,
22
26
  lock: {
23
27
  basic: lambda do |lock_key|
@@ -26,6 +30,8 @@ module SimpleMutex
26
30
  }.freeze,
27
31
  }.freeze
28
32
 
33
+ SynchronizationAnomalyError = Class.new(::StandardError)
34
+
29
35
  BaseError = Class.new(::StandardError) do
30
36
  attr_reader :lock_key
31
37
 
@@ -54,41 +60,62 @@ module SimpleMutex
54
60
 
55
61
  redis = ::SimpleMutex.redis
56
62
 
57
- redis.watch(lock_key) do
58
- raw_data = redis.get(lock_key)
63
+ attempt = 0
64
+
65
+ begin
66
+ redis.watch(lock_key) do
67
+ raw_data = redis.get(lock_key)
68
+ raw_data = raw_data.value if raw_data.is_a?(Redis::Future)
69
+
70
+ return false if raw_data.nil?
71
+ return false unless force || signature_valid?(raw_data, signature)
59
72
 
60
- if raw_data && (force || signature_valid?(raw_data, signature))
61
- redis.multi { |multi| multi.del(lock_key) }.first.positive?
62
- else
73
+ result = redis.multi { |multi| multi.del(lock_key) }.first
74
+
75
+ raise SynchronizationAnomalyError, "Sync anomaly." unless result.is_a?(Integer)
76
+
77
+ result.positive?
78
+ ensure
63
79
  redis.unwatch
64
- false
65
80
  end
81
+ rescue SynchronizationAnomalyError
82
+ retry if (attempt += 1) < MAX_DEL_ATTEMPTS
83
+ raise_error(UnlockError, :repeated_synchronization_anomaly, lock_key)
66
84
  end
67
85
  end
68
86
 
87
+ # rubocop:disable Metrics/MethodLength
69
88
  def unlock!(lock_key, signature: nil, force: false)
70
89
  ::SimpleMutex.redis_check!
71
90
 
72
91
  redis = ::SimpleMutex.redis
73
92
 
74
- redis.watch(lock_key) do
75
- raw_data = redis.get(lock_key)
93
+ attempt = 0
94
+
95
+ begin
96
+ redis.watch(lock_key) do
97
+ raw_data = redis.get(lock_key)
98
+ raw_data = raw_data.value if raw_data.is_a?(Redis::Future)
76
99
 
77
- begin
78
- raise_error(UnlockError, :key_not_found, lock_key) unless raw_data
100
+ raise_error(UnlockError, :key_not_found, lock_key) if raw_data.nil?
79
101
 
80
102
  unless force || signature_valid?(raw_data, signature)
81
103
  raise_error(UnlockError, :signature_mismatch, lock_key)
82
104
  end
83
105
 
84
- success = redis.multi { |multi| multi.del(lock_key) }.first.positive?
106
+ result = redis.multi { |multi| multi.del(lock_key) }.first
85
107
 
86
- raise_error(UnlockError, :unknown, lock_key) unless success
108
+ raise SynchronizationAnomalyError, "Sync anomaly." unless result.is_a?(Integer)
109
+ raise_error(UnlockError, :unknown, lock_key) unless result.positive?
87
110
  ensure
88
111
  redis.unwatch
89
112
  end
113
+ rescue SynchronizationAnomalyError
114
+ retry if (attempt += 1) < MAX_DEL_ATTEMPTS
115
+ raise_error(UnlockError, :repeated_synchronization_anomaly, lock_key)
90
116
  end
91
117
  end
118
+ # rubocop:enable Metrics/MethodLength
92
119
 
93
120
  def with_lock(lock_key, **options, &block)
94
121
  new(lock_key, **options).with_lock(&block)
@@ -96,7 +123,7 @@ module SimpleMutex
96
123
 
97
124
  def raise_error(error_class, msg_template, lock_key)
98
125
  template_base = error_class.name.split("::").last.gsub("Error", "").downcase.to_sym
99
- error_msg = ERR_MSGS[template_base][msg_template].call(lock_key)
126
+ error_msg = ERROR_MESSAGES[template_base][msg_template].call(lock_key)
100
127
 
101
128
  raise(error_class.new(error_msg, lock_key))
102
129
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SimpleMutex
4
- VERSION = "1.0.1"
4
+ VERSION = "1.1.0"
5
5
  end
data/simple_mutex.gemspec CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
13
13
  spec.homepage = "https://github.com/umbrellio/simple_mutex"
14
14
  spec.license = "MIT"
15
15
 
16
- spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
16
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
17
17
 
18
18
  # Specify which files should be added to the gem when it is released.
19
19
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -25,18 +25,18 @@ Gem::Specification.new do |spec|
25
25
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
26
  spec.require_paths = ["lib"]
27
27
 
28
- spec.add_runtime_dependency "redis"
29
- spec.add_runtime_dependency "redis-namespace"
28
+ spec.add_runtime_dependency "redis", ">= 5.0"
30
29
  spec.add_runtime_dependency "sidekiq"
31
30
 
32
- spec.add_development_dependency "bundler"
33
- spec.add_development_dependency "bundler-audit"
34
- spec.add_development_dependency "mock_redis"
35
- spec.add_development_dependency "rspec"
36
- spec.add_development_dependency "rubocop"
37
- spec.add_development_dependency "rubocop-config-umbrellio"
38
- spec.add_development_dependency "rubocop-rspec"
39
- spec.add_development_dependency "simplecov"
40
- spec.add_development_dependency "simplecov-lcov"
41
- spec.add_development_dependency "timecop"
31
+ spec.add_development_dependency "bundler", "~> 2.4", ">= 2.4.20"
32
+ spec.add_development_dependency "bundler-audit", "~> 0.9.1"
33
+ spec.add_development_dependency "mock_redis", "~> 0.37.0"
34
+ spec.add_development_dependency "redis-namespace", "~> 1.11"
35
+ spec.add_development_dependency "rspec", "~> 3.12"
36
+ spec.add_development_dependency "rubocop", "~> 1.50", ">= 1.50"
37
+ spec.add_development_dependency "rubocop-config-umbrellio", "~> 1.50", ">= 1.50.0.85"
38
+ spec.add_development_dependency "rubocop-rspec", "~> 2.20", ">= 2.20"
39
+ spec.add_development_dependency "simplecov", "~> 0.22.0"
40
+ spec.add_development_dependency "simplecov-lcov", "~> 0.8.0"
41
+ spec.add_development_dependency "timecop", "~> 0.9.8"
42
42
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_mutex
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - bob-umbr
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-11-19 00:00:00.000000000 Z
11
+ date: 2023-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -16,16 +16,16 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '5.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: '0'
26
+ version: '5.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: redis-namespace
28
+ name: sidekiq
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,159 +39,183 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: sidekiq
42
+ name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.4'
45
48
  - - ">="
46
49
  - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
50
+ version: 2.4.20
51
+ type: :development
49
52
  prerelease: false
50
53
  version_requirements: !ruby/object:Gem::Requirement
51
54
  requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '2.4'
52
58
  - - ">="
53
59
  - !ruby/object:Gem::Version
54
- version: '0'
60
+ version: 2.4.20
55
61
  - !ruby/object:Gem::Dependency
56
- name: bundler
62
+ name: bundler-audit
57
63
  requirement: !ruby/object:Gem::Requirement
58
64
  requirements:
59
- - - ">="
65
+ - - "~>"
60
66
  - !ruby/object:Gem::Version
61
- version: '0'
67
+ version: 0.9.1
62
68
  type: :development
63
69
  prerelease: false
64
70
  version_requirements: !ruby/object:Gem::Requirement
65
71
  requirements:
66
- - - ">="
72
+ - - "~>"
67
73
  - !ruby/object:Gem::Version
68
- version: '0'
74
+ version: 0.9.1
69
75
  - !ruby/object:Gem::Dependency
70
- name: bundler-audit
76
+ name: mock_redis
71
77
  requirement: !ruby/object:Gem::Requirement
72
78
  requirements:
73
- - - ">="
79
+ - - "~>"
74
80
  - !ruby/object:Gem::Version
75
- version: '0'
81
+ version: 0.37.0
76
82
  type: :development
77
83
  prerelease: false
78
84
  version_requirements: !ruby/object:Gem::Requirement
79
85
  requirements:
80
- - - ">="
86
+ - - "~>"
81
87
  - !ruby/object:Gem::Version
82
- version: '0'
88
+ version: 0.37.0
83
89
  - !ruby/object:Gem::Dependency
84
- name: mock_redis
90
+ name: redis-namespace
85
91
  requirement: !ruby/object:Gem::Requirement
86
92
  requirements:
87
- - - ">="
93
+ - - "~>"
88
94
  - !ruby/object:Gem::Version
89
- version: '0'
95
+ version: '1.11'
90
96
  type: :development
91
97
  prerelease: false
92
98
  version_requirements: !ruby/object:Gem::Requirement
93
99
  requirements:
94
- - - ">="
100
+ - - "~>"
95
101
  - !ruby/object:Gem::Version
96
- version: '0'
102
+ version: '1.11'
97
103
  - !ruby/object:Gem::Dependency
98
104
  name: rspec
99
105
  requirement: !ruby/object:Gem::Requirement
100
106
  requirements:
101
- - - ">="
107
+ - - "~>"
102
108
  - !ruby/object:Gem::Version
103
- version: '0'
109
+ version: '3.12'
104
110
  type: :development
105
111
  prerelease: false
106
112
  version_requirements: !ruby/object:Gem::Requirement
107
113
  requirements:
108
- - - ">="
114
+ - - "~>"
109
115
  - !ruby/object:Gem::Version
110
- version: '0'
116
+ version: '3.12'
111
117
  - !ruby/object:Gem::Dependency
112
118
  name: rubocop
113
119
  requirement: !ruby/object:Gem::Requirement
114
120
  requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.50'
115
124
  - - ">="
116
125
  - !ruby/object:Gem::Version
117
- version: '0'
126
+ version: '1.50'
118
127
  type: :development
119
128
  prerelease: false
120
129
  version_requirements: !ruby/object:Gem::Requirement
121
130
  requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '1.50'
122
134
  - - ">="
123
135
  - !ruby/object:Gem::Version
124
- version: '0'
136
+ version: '1.50'
125
137
  - !ruby/object:Gem::Dependency
126
138
  name: rubocop-config-umbrellio
127
139
  requirement: !ruby/object:Gem::Requirement
128
140
  requirements:
141
+ - - "~>"
142
+ - !ruby/object:Gem::Version
143
+ version: '1.50'
129
144
  - - ">="
130
145
  - !ruby/object:Gem::Version
131
- version: '0'
146
+ version: 1.50.0.85
132
147
  type: :development
133
148
  prerelease: false
134
149
  version_requirements: !ruby/object:Gem::Requirement
135
150
  requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: '1.50'
136
154
  - - ">="
137
155
  - !ruby/object:Gem::Version
138
- version: '0'
156
+ version: 1.50.0.85
139
157
  - !ruby/object:Gem::Dependency
140
158
  name: rubocop-rspec
141
159
  requirement: !ruby/object:Gem::Requirement
142
160
  requirements:
161
+ - - "~>"
162
+ - !ruby/object:Gem::Version
163
+ version: '2.20'
143
164
  - - ">="
144
165
  - !ruby/object:Gem::Version
145
- version: '0'
166
+ version: '2.20'
146
167
  type: :development
147
168
  prerelease: false
148
169
  version_requirements: !ruby/object:Gem::Requirement
149
170
  requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '2.20'
150
174
  - - ">="
151
175
  - !ruby/object:Gem::Version
152
- version: '0'
176
+ version: '2.20'
153
177
  - !ruby/object:Gem::Dependency
154
178
  name: simplecov
155
179
  requirement: !ruby/object:Gem::Requirement
156
180
  requirements:
157
- - - ">="
181
+ - - "~>"
158
182
  - !ruby/object:Gem::Version
159
- version: '0'
183
+ version: 0.22.0
160
184
  type: :development
161
185
  prerelease: false
162
186
  version_requirements: !ruby/object:Gem::Requirement
163
187
  requirements:
164
- - - ">="
188
+ - - "~>"
165
189
  - !ruby/object:Gem::Version
166
- version: '0'
190
+ version: 0.22.0
167
191
  - !ruby/object:Gem::Dependency
168
192
  name: simplecov-lcov
169
193
  requirement: !ruby/object:Gem::Requirement
170
194
  requirements:
171
- - - ">="
195
+ - - "~>"
172
196
  - !ruby/object:Gem::Version
173
- version: '0'
197
+ version: 0.8.0
174
198
  type: :development
175
199
  prerelease: false
176
200
  version_requirements: !ruby/object:Gem::Requirement
177
201
  requirements:
178
- - - ">="
202
+ - - "~>"
179
203
  - !ruby/object:Gem::Version
180
- version: '0'
204
+ version: 0.8.0
181
205
  - !ruby/object:Gem::Dependency
182
206
  name: timecop
183
207
  requirement: !ruby/object:Gem::Requirement
184
208
  requirements:
185
- - - ">="
209
+ - - "~>"
186
210
  - !ruby/object:Gem::Version
187
- version: '0'
211
+ version: 0.9.8
188
212
  type: :development
189
213
  prerelease: false
190
214
  version_requirements: !ruby/object:Gem::Requirement
191
215
  requirements:
192
- - - ">="
216
+ - - "~>"
193
217
  - !ruby/object:Gem::Version
194
- version: '0'
218
+ version: 0.9.8
195
219
  description: Redis-based mutex library for using with sidekiq jobs and batches.
196
220
  email:
197
221
  - bob@umbrellio.biz
@@ -235,14 +259,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
235
259
  requirements:
236
260
  - - ">="
237
261
  - !ruby/object:Gem::Version
238
- version: 2.5.0
262
+ version: 2.7.0
239
263
  required_rubygems_version: !ruby/object:Gem::Requirement
240
264
  requirements:
241
265
  - - ">="
242
266
  - !ruby/object:Gem::Version
243
267
  version: '0'
244
268
  requirements: []
245
- rubygems_version: 3.2.3
269
+ rubygems_version: 3.4.10
246
270
  signing_key:
247
271
  specification_version: 4
248
272
  summary: Redis-based mutex library for using with sidekiq jobs and batches.