marloss 0.2.0 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 11111f0e9d75f96a957474f886c63db4686e0329c4a4457beafb0a0aae83be2c
4
- data.tar.gz: fea9eec8c522ca462ede12c94aa7228cf56ae6d9540d0e8b4925e3249e88c71c
3
+ metadata.gz: 0e4551d19620ac54dab98243f0c7cff6b0fd60e6dbc93d69a85d86c9b22ac2bc
4
+ data.tar.gz: 5c3c13ca93eb5ec41946be009a3bb1cbc4cec93aafd53573753841f15cdbd199
5
5
  SHA512:
6
- metadata.gz: 69787108adc8ef5f2c8da6cb553d3e4033492c076267af966c9ea80d8b2d25e3175a809561327dc2f13eb13bfd08e02e38827258e94a9dcb40e732ade97f3421
7
- data.tar.gz: cab2f65c3b4191a63c6bd30b461a3b82412dbac16267ee8ca1e0272fc9859c6f97c2aad276df371c2952cc222dbf83fb632799b0bbc4ec2594cb788973c1a411
6
+ metadata.gz: a1b6c0bbdc40d80566ce5fedff3d96180e88eac10cd946c2d6e0fd94fc8cd63d17c6982e02d7e57aa83162846d718ce25dd8d971d959892110c5d02a2cee82fa
7
+ data.tar.gz: 9ca7d34daa20a435ddc28a36509ed3390116b58ab3c46c0f07639a352f0f256a9803804cc7f63f774c9f949858c2c0bc7564832df4c2be3e582c0b282bbc6600
@@ -0,0 +1,130 @@
1
+ Metrics/LineLength:
2
+ Max: 100
3
+
4
+ Style/StringLiterals:
5
+ EnforcedStyle: double_quotes
6
+
7
+ Layout/MultilineMethodCallIndentation:
8
+ EnforcedStyle: indented
9
+
10
+ Style/AccessModifierDeclarations:
11
+ EnforcedStyle: inline
12
+
13
+ Style/Documentation:
14
+ Enabled: false # disable for now
15
+
16
+ Metrics/BlockLength:
17
+ Exclude:
18
+ - "spec/**/*"
19
+ - "marloss.gemspec"
20
+
21
+ Layout/EmptyLinesAroundAttributeAccessor:
22
+ Enabled: true
23
+
24
+ Layout/SpaceAroundMethodCallOperator:
25
+ Enabled: true
26
+
27
+ Lint/BinaryOperatorWithIdenticalOperands:
28
+ Enabled: true
29
+
30
+ Lint/DeprecatedOpenSSLConstant:
31
+ Enabled: true
32
+
33
+ Lint/DuplicateElsifCondition:
34
+ Enabled: true
35
+
36
+ Lint/DuplicateRescueException:
37
+ Enabled: true
38
+
39
+ Lint/EmptyConditionalBody:
40
+ Enabled: true
41
+
42
+ Lint/FloatComparison:
43
+ Enabled: true
44
+
45
+ Lint/MissingSuper:
46
+ Enabled: true
47
+
48
+ Lint/MixedRegexpCaptureTypes:
49
+ Enabled: true
50
+
51
+ Lint/OutOfRangeRegexpRef:
52
+ Enabled: true
53
+
54
+ Lint/RaiseException:
55
+ Enabled: true
56
+
57
+ Lint/SelfAssignment:
58
+ Enabled: true
59
+
60
+ Lint/StructNewOverride:
61
+ Enabled: true
62
+
63
+ Lint/TopLevelReturnWithArgument:
64
+ Enabled: true
65
+
66
+ Lint/UnreachableLoop:
67
+ Enabled: true
68
+
69
+ Style/AccessorGrouping:
70
+ Enabled: true
71
+
72
+ Style/ArrayCoercion:
73
+ Enabled: true
74
+
75
+ Style/BisectedAttrAccessor:
76
+ Enabled: true
77
+
78
+ Style/CaseLikeIf:
79
+ Enabled: true
80
+
81
+ Style/ExplicitBlockArgument:
82
+ Enabled: true
83
+
84
+ Style/ExponentialNotation:
85
+ Enabled: true
86
+
87
+ Style/GlobalStdStream:
88
+ Enabled: true
89
+
90
+ Style/HashAsLastArrayItem:
91
+ Enabled: true
92
+
93
+ Style/HashEachMethods:
94
+ Enabled: true
95
+
96
+ Style/HashLikeCase:
97
+ Enabled: true
98
+
99
+ Style/HashTransformKeys:
100
+ Enabled: true
101
+
102
+ Style/HashTransformValues:
103
+ Enabled: true
104
+
105
+ Style/OptionalBooleanParameter:
106
+ Enabled: true
107
+
108
+ Style/RedundantAssignment:
109
+ Enabled: true
110
+
111
+ Style/RedundantFetchBlock:
112
+ Enabled: true
113
+
114
+ Style/RedundantFileExtensionInRequire:
115
+ Enabled: true
116
+
117
+ Style/RedundantRegexpCharacterClass:
118
+ Enabled: true
119
+
120
+ Style/RedundantRegexpEscape:
121
+ Enabled: true
122
+
123
+ Style/SingleArgumentDig:
124
+ Enabled: true
125
+
126
+ Style/SlicingWithRange:
127
+ Enabled: true
128
+
129
+ Style/StringConcatenation:
130
+ Enabled: true
@@ -1,6 +1,11 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.3.3
4
- - 2.3.1
3
+ - 2.7.1
4
+ - 2.6.6
5
+ - 2.5.8
6
+ - 2.4.10
5
7
  notifications:
6
8
  email: false
9
+ script:
10
+ - bundle exec rubocop
11
+ - bundle exec rspec
@@ -1,3 +1,34 @@
1
+ ## 0.5.0 11/02/2019
2
+
3
+ IMPROVEMENTS:
4
+
5
+ * Add the option to specify a `custom_process_id` [#15](https://github.com/eredi93/marloss/pull/15)
6
+
7
+ ## 0.4.0 01/09/2018
8
+
9
+ IMPROVEMENTS:
10
+
11
+ * Custom ttl attribute name instead of hardcoding `Expires` [#12](https://github.com/eredi93/marloss/pull/12)
12
+ * Add possiblity to pass retries to `wait_until_lock_obtained` preventing spin lock [#11](https://github.com/eredi93/marloss/pull/11)
13
+
14
+ ## 0.3.1 01/09/2018
15
+
16
+ IMPROVEMENTS:
17
+
18
+ * Make `create_table` wait for table [#8](https://github.com/eredi93/marloss/pull/8)
19
+
20
+ ## 0.3.0 29/11/2017
21
+
22
+ IMPROVEMENTS:
23
+
24
+ * remove `with_refreshed_lock` as is not safe [#4](https://github.com/eredi93/marloss/pull/4)
25
+
26
+ ## 0.2.1 29/11/2017
27
+
28
+ IMPROVEMENTS:
29
+
30
+ * Log when deleting the lock
31
+
1
32
  ## 0.2.0 29/11/2017
2
33
 
3
34
  IMPROVEMENTS:
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org"
2
4
 
3
5
  gemspec
data/README.md CHANGED
@@ -7,6 +7,8 @@ Marloss is a general DynamoDB-based lock implementation.
7
7
 
8
8
  ![rusty-lock](https://user-images.githubusercontent.com/10990391/33243215-aa602a6c-d2d9-11e7-8fc6-d4a0c2a5b30d.jpg)
9
9
 
10
+ This Gem is tested using Ruby 2.6, 2.5, 2.4, 2.3
11
+
10
12
  ### Installation
11
13
 
12
14
  Add this line to your application's Gemfile:
@@ -48,16 +50,11 @@ end
48
50
  now you can simply wrap the code that needs to be locked
49
51
 
50
52
  ```ruby
51
- with_marloss_locker("my_lock")
52
- # execute code
53
- end
54
- ```
55
-
56
- if you have a long running task and you need to make sure you don't lose the lock
57
-
58
- ```ruby
59
- with_refreshed_marloss_locker("my_lock")
53
+ with_marloss_locker("my_lock") do |locker|
60
54
  # execute code
55
+ # ...
56
+ # refresh lock if needed
57
+ locker.refresh
61
58
  end
62
59
  ```
63
60
 
@@ -69,6 +66,11 @@ Firstly, we need to initialize a lock store:
69
66
  store = Marloss::Store.new("lock_table_name", "LockHashKeyName")
70
67
  ```
71
68
 
69
+ Create table if it does not exist:
70
+ ```ruby
71
+ store.create_table
72
+ ```
73
+
72
74
  We can use this store to create a single lock
73
75
 
74
76
  ```ruby
@@ -81,12 +83,7 @@ locker.obtain_lock
81
83
  locker.wait_until_lock_obtained
82
84
 
83
85
  # refresh the lock once
84
- locker.refresh
85
-
86
- # or execute block with lock being refreshed
87
- locker.with_refreshed_lock do
88
- # execute long running code
89
- end
86
+ locker.refresh_lock
90
87
 
91
88
  # delete the lock
92
89
  locker.release_lock
@@ -110,4 +107,4 @@ Marloss.logger = Logger.new("my_app.log")
110
107
 
111
108
  ### Contributing
112
109
 
113
- This repository is [open to contributions](.github/CONTRIBUTING.md).
110
+ This repository is [open to contributions](CONTRIBUTING.md).
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bundler/gem_tasks"
2
4
  require "rspec/core/rake_task"
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- #
2
+
3
3
  require "aws-sdk-dynamodb"
4
4
 
5
5
  require "marloss/version"
@@ -8,9 +8,8 @@ require "marloss/store"
8
8
  require "marloss/locker"
9
9
 
10
10
  module Marloss
11
-
12
11
  def self.logger
13
- @logger ||= ::Logger.new(STDOUT)
12
+ @logger ||= ::Logger.new($stdout)
14
13
  end
15
14
 
16
15
  def self.logger=(logger)
@@ -19,10 +18,10 @@ module Marloss
19
18
 
20
19
  def self.included(base)
21
20
  base.define_singleton_method(:marloss_options) do |opts|
22
- if opts[:table].nil?
23
- raise(MissingParameterError, "DynamoDB Hash Key not set")
24
- elsif opts[:hash_key].nil?
25
- raise(MissingParameterError, "DynamoDB Table not set")
21
+ %i[table hash_key].each do |key|
22
+ next unless opts[key].nil?
23
+
24
+ raise(MissingParameterError, "DynamoDB #{key.to_s.capitalize.tr('_', ' ')} not set")
26
25
  end
27
26
 
28
27
  define_method(:marloss_options_hash) { opts }
@@ -34,13 +33,12 @@ module Marloss
34
33
  end
35
34
 
36
35
  module InstanceMethods
37
-
38
36
  def marloss_store
39
- @marloss_store ||=begin
37
+ @marloss_store ||= begin
40
38
  table = marloss_options_hash[:table]
41
39
  hash_key = marloss_options_hash[:hash_key]
42
- options = marloss_options_hash.reject do |k, v|
43
- k == :table || k == :hash_key
40
+ options = marloss_options_hash.reject do |k, _|
41
+ %i[table hash_key].include?(k)
44
42
  end
45
43
 
46
44
  Store.new(table, hash_key, options)
@@ -52,25 +50,15 @@ module Marloss
52
50
  end
53
51
 
54
52
  def with_marloss_locker(name, opts = {})
53
+ has_lock = false
55
54
  locker = marloss_locker(name)
56
55
 
57
56
  locker.wait_until_lock_obtained(opts)
57
+ has_lock = true
58
58
 
59
- yield
60
-
61
- locker.release_lock
62
- end
63
-
64
- def with_refreshed_marloss_locker(name, opts = {})
65
- locker = marloss_locker(name)
66
-
67
- locker.wait_until_lock_obtained(opts)
68
-
69
- locker.with_refreshed_lock { yield }
70
-
71
- locker.release_lock
59
+ yield(locker)
60
+ ensure
61
+ locker.release_lock if has_lock
72
62
  end
73
-
74
63
  end
75
-
76
64
  end
@@ -1,17 +1,15 @@
1
1
  # frozen_string_literal: true
2
- #
2
+
3
3
  module Marloss
4
+ class Error < StandardError; end
4
5
 
5
- class Error < StandardError
6
- end
6
+ class CreateTableError < Error; end
7
7
 
8
- class LockNotObtainedError < Error
9
- end
8
+ class SetTableTtlError < Error; end
10
9
 
11
- class LockNotRefreshedError < Error
12
- end
10
+ class LockNotObtainedError < Error; end
13
11
 
14
- class MissingParameterError < Error
15
- end
12
+ class LockNotRefreshedError < Error; end
16
13
 
14
+ class MissingParameterError < Error; end
17
15
  end
@@ -1,8 +1,7 @@
1
1
  # frozen_string_literal: true
2
- #
2
+
3
3
  module Marloss
4
4
  class Locker
5
-
6
5
  attr_reader :store, :name
7
6
 
8
7
  def initialize(store, name)
@@ -22,31 +21,17 @@ module Marloss
22
21
  store.delete_lock(name)
23
22
  end
24
23
 
25
- def wait_until_lock_obtained(sleep_seconds: 3)
24
+ def wait_until_lock_obtained(sleep_seconds: 3, retries: nil)
26
25
  store.create_lock(name)
27
26
  rescue LockNotObtainedError
28
27
  sleep(sleep_seconds)
29
- retry
30
- end
31
28
 
32
- def with_refreshed_lock
33
- thr = Thread.new do
34
- loop do
35
- begin
36
- store.refresh_lock(name)
37
- rescue Exception => e
38
- Thread.main.raise(e)
39
- end
40
-
41
- sleep(store.ttl / 3.0)
42
- end
29
+ unless retries.nil?
30
+ retries -= 1
31
+ raise if retries.zero?
43
32
  end
44
33
 
45
- yield
46
-
47
- ensure
48
- thr.kill
34
+ retry
49
35
  end
50
-
51
36
  end
52
37
  end
@@ -1,49 +1,83 @@
1
1
  # frozen_string_literal: true
2
- #
3
- module Marloss
4
- class Store
5
2
 
6
- attr_reader :client, :table, :hash_key, :ttl
3
+ module Marloss
4
+ class Store # rubocop:disable Metrics/ClassLength
5
+ attr_reader :client, :table, :hash_key, :expires_key, :ttl, :process_id
7
6
 
8
- def initialize(table, hash_key, ttl: 30, client_options: {})
7
+ def initialize(table, hash_key, **options)
8
+ client_options = options.fetch(:client_options, {})
9
9
  @client = Aws::DynamoDB::Client.new(client_options)
10
10
  @table = table
11
11
  @hash_key = hash_key
12
- @ttl = ttl
12
+ @expires_key = options.fetch(:expires_key, "Expires")
13
+ @ttl = options.fetch(:ttl, 30)
14
+ @process_id = options[:custom_process_id] || host_process_id
13
15
  end
14
16
 
15
17
  def create_table
18
+ create_ddb_table
19
+ wait_until_ddb_table_exists
20
+ set_ddb_table_ttl
21
+ end
22
+
23
+ private def create_ddb_table # rubocop:disable Metrics/MethodLength
16
24
  client.create_table(
17
25
  attribute_definitions: [
18
26
  {
19
27
  attribute_name: hash_key,
20
- attribute_type: "S",
28
+ attribute_type: "S"
21
29
  }
22
30
  ],
23
31
  key_schema: [
24
32
  {
25
33
  attribute_name: hash_key,
26
- key_type: "HASH",
34
+ key_type: "HASH"
27
35
  }
28
36
  ],
29
37
  provisioned_throughput: {
30
38
  read_capacity_units: 5,
31
- write_capacity_units: 5,
39
+ write_capacity_units: 5
32
40
  },
33
41
  table_name: table
34
42
  )
35
43
 
36
44
  Marloss.logger.info("DynamoDB table created successfully")
45
+ rescue Aws::DynamoDB::Errors::ResourceInUseException => e
46
+ case e.message
47
+ when "Table already exists: #{table}"
48
+ Marloss.logger.warn("DynamoDB table #{table} already exists")
49
+ else
50
+ raise(CreateTableError, e.message)
51
+ end
52
+ end
37
53
 
54
+ private def wait_until_ddb_table_exists
55
+ client.wait_until(:table_exists, table_name: table) do |w|
56
+ w.max_attempts = 10
57
+ w.delay = 1
58
+ end
59
+ rescue Aws::Waiters::Errors::WaiterFailed => e
60
+ Marloss.logger.error("Failed waiting for initialization of table #{table}")
61
+ raise(CreateTableError, e.message)
62
+ end
63
+
64
+ private def set_ddb_table_ttl # rubocop:disable Metrics/MethodLength
38
65
  client.update_time_to_live(
39
66
  table_name: table,
40
67
  time_to_live_specification: {
41
68
  enabled: true,
42
- attribute_name: "Expires"
69
+ attribute_name: expires_key
43
70
  }
44
71
  )
45
72
 
46
73
  Marloss.logger.info("DynamoDB table TTL configured successfully")
74
+ rescue Aws::DynamoDB::Errors::ValidationException => e
75
+ case e.message
76
+ when "TimeToLive is already enabled"
77
+ Marloss.logger.warn("TTL attribute is already configured for table #{table}")
78
+ else
79
+ raise(SetTableTtlError, e.message)
80
+ end
47
81
  end
48
82
 
49
83
  def delete_table
@@ -52,53 +86,51 @@ module Marloss
52
86
  Marloss.logger.info("DynamoDB table deleted successfully")
53
87
  end
54
88
 
55
- def create_lock(name)
89
+ def create_lock(name) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
56
90
  client.put_item(
57
91
  table_name: table,
58
92
  item: {
59
93
  hash_key => name,
60
94
  "ProcessID" => process_id,
61
- "Expires" => (Time.now + ttl).to_i
95
+ expires_key => (Time.now + ttl).to_i
62
96
  },
63
97
  expression_attribute_names: {
64
- "#E" => "Expires",
98
+ "#E" => expires_key,
65
99
  "#P" => "ProcessID"
66
100
  },
67
101
  expression_attribute_values: {
68
102
  ":now" => Time.now.to_i,
69
- ":process_id" => process_id,
103
+ ":process_id" => process_id
70
104
  },
71
105
  condition_expression: "attribute_not_exists(#{hash_key}) OR #E < :now OR #P = :process_id"
72
106
  )
73
107
 
74
108
  Marloss.logger.info("Lock for #{name} created successfully, will expire in #{ttl} seconds")
75
109
  rescue Aws::DynamoDB::Errors::ConditionalCheckFailedException => e
76
-
77
110
  Marloss.logger.error("Failed to create lock for #{name}")
78
111
 
79
112
  raise(LockNotObtainedError, e.message)
80
113
  end
81
114
 
82
- def refresh_lock(name)
115
+ def refresh_lock(name) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
83
116
  client.update_item(
84
117
  table_name: table,
85
118
  key: { hash_key => name },
86
119
  expression_attribute_names: {
87
- "#E" => "Expires",
120
+ "#E" => expires_key,
88
121
  "#P" => "ProcessID"
89
122
  },
90
123
  expression_attribute_values: {
91
124
  ":expires" => (Time.now + ttl).to_i,
92
125
  ":now" => Time.now.to_i,
93
- ":process_id" => process_id,
126
+ ":process_id" => process_id
94
127
  },
95
- update_expression: "SET #E = :expires",
128
+ update_expression: "SET #E = :expires",
96
129
  condition_expression: "attribute_exists(#{hash_key}) AND (#E < :now OR #P = :process_id)"
97
130
  )
98
131
 
99
132
  Marloss.logger.info("Lock for #{name} refreshed successfully, will expire in #{ttl} seconds")
100
133
  rescue Aws::DynamoDB::Errors::ConditionalCheckFailedException => e
101
-
102
134
  Marloss.logger.error("Failed to refresh lock for #{name}")
103
135
 
104
136
  raise(LockNotRefreshedError, e.message)
@@ -106,14 +138,15 @@ module Marloss
106
138
 
107
139
  def delete_lock(name)
108
140
  client.delete_item(key: { hash_key => name }, table_name: table)
141
+
142
+ Marloss.logger.info("Lock for #{name} deleted successfully")
109
143
  end
110
144
 
111
- private def process_id
145
+ private def host_process_id
112
146
  hostname = `hostname`.chomp
113
147
  pid = Process.pid
114
148
 
115
149
  "#{hostname}:#{pid}"
116
150
  end
117
-
118
151
  end
119
152
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
- #
3
- module Marloss
4
-
5
- VERSION = "0.2.0"
6
2
 
3
+ module Marloss
4
+ VERSION = "0.5.2"
7
5
  end
@@ -1,25 +1,33 @@
1
- # coding: utf-8
2
- lib = File.expand_path("../lib", __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path("lib", __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require "marloss/version"
5
6
 
7
+ files = `git ls-files -z`.split("\x0")
8
+ .reject { |f| f.match(%r{^(script|spec)/}) }
9
+
6
10
  Gem::Specification.new do |spec|
11
+ spec.required_ruby_version = ">= 2.4.0"
12
+
7
13
  spec.name = "marloss"
8
14
  spec.version = Marloss::VERSION
9
15
  spec.authors = ["Jacopo Scrinzi"]
10
16
  spec.email = "scrinzi.jcopo@gmail.com"
11
17
 
12
- spec.summary = %q{AWS DynamoDB based Locking}
13
- spec.description = %q{Distributed locking using AWS DynamoDB}
18
+ spec.summary = "AWS DynamoDB based Locking"
19
+ spec.description = "Distributed locking using AWS DynamoDB"
14
20
  spec.homepage = "https://github.com/eredi93/marloss"
15
21
  spec.license = "MIT"
16
22
 
17
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
- spec.require_paths = %w(lib)
23
+ spec.files = files
24
+ spec.require_paths = %w[lib]
19
25
 
20
- spec.add_dependency "aws-sdk-dynamodb", "~> 1.2"
26
+ spec.add_dependency "aws-sdk-dynamodb", "~> 1"
21
27
 
22
- spec.add_development_dependency "bundler"
23
- spec.add_development_dependency "rake"
24
- spec.add_development_dependency "rspec"
28
+ spec.add_development_dependency "bundler", ">= 1"
29
+ spec.add_development_dependency "gem-release", "~> 2.1"
30
+ spec.add_development_dependency "rake", "~> 12.3"
31
+ spec.add_development_dependency "rspec", "~> 3.9"
32
+ spec.add_development_dependency "rubocop", "= 0.89.1"
25
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marloss
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jacopo Scrinzi
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-29 00:00:00.000000000 Z
11
+ date: 2020-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-dynamodb
@@ -16,56 +16,84 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.2'
19
+ version: '1'
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: '1.2'
26
+ version: '1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '1'
34
34
  type: :development
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: '0'
40
+ version: '1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: gem-release
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.1'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.1'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
- - - ">="
59
+ - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '0'
61
+ version: '12.3'
48
62
  type: :development
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: '0'
68
+ version: '12.3'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rspec
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - ">="
73
+ - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '0'
75
+ version: '3.9'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - ">="
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.9'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
67
88
  - !ruby/object:Gem::Version
68
- version: '0'
89
+ version: 0.89.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 0.89.1
69
97
  description: Distributed locking using AWS DynamoDB
70
98
  email: scrinzi.jcopo@gmail.com
71
99
  executables: []
@@ -73,6 +101,7 @@ extensions: []
73
101
  extra_rdoc_files: []
74
102
  files:
75
103
  - ".gitignore"
104
+ - ".rubocop.yml"
76
105
  - ".travis.yml"
77
106
  - CHANGELOG.md
78
107
  - CONTRIBUTING.md
@@ -90,7 +119,7 @@ homepage: https://github.com/eredi93/marloss
90
119
  licenses:
91
120
  - MIT
92
121
  metadata: {}
93
- post_install_message:
122
+ post_install_message:
94
123
  rdoc_options: []
95
124
  require_paths:
96
125
  - lib
@@ -98,16 +127,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
98
127
  requirements:
99
128
  - - ">="
100
129
  - !ruby/object:Gem::Version
101
- version: '0'
130
+ version: 2.4.0
102
131
  required_rubygems_version: !ruby/object:Gem::Requirement
103
132
  requirements:
104
133
  - - ">="
105
134
  - !ruby/object:Gem::Version
106
135
  version: '0'
107
136
  requirements: []
108
- rubyforge_project:
109
- rubygems_version: 2.7.2
110
- signing_key:
137
+ rubygems_version: 3.0.3
138
+ signing_key:
111
139
  specification_version: 4
112
140
  summary: AWS DynamoDB based Locking
113
141
  test_files: []