dry-core 0.7.1 → 0.9.1

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: cb330574bba6050e9a3d0fd466fdbd276ce76749b2661b8091ebf6178a2ef6c9
4
- data.tar.gz: c1319b83600515df992a91556000989aa092d4229f69669b8f544368d93d21a8
3
+ metadata.gz: 81d1266061bbae6eb6d4c08dba39d2787f29f033ec6b8ed8555830e170cae6fc
4
+ data.tar.gz: bb44a8177749013af0a3245e5e7e9c168818700c6d93b5dbbcf4d46d05e9e4fd
5
5
  SHA512:
6
- metadata.gz: 2b1967bb0c991637ea01da5d267df78daa12e4801288932372eca2ecf8aff0c5933ef2cb9cdc06d978d6223da963a31dc5e362f1ad1052490e10ebbc2b39fae6
7
- data.tar.gz: 22662f066d46742cfd12d79eddcfb1e76811ab00b0080be8bac8fef53a1229fa91f5501b9f0b34f09182f5843c7bf995332fc16d1fe192daeadff186cd543cb7
6
+ metadata.gz: 48c5e7b008c7f1b3ec9d23801f020ee67f34199aec9e9690066cd7a4316e7d79e48c77056df180679e22767b367b4988c0f617948c49d931e5d62f3be54a1c4f
7
+ data.tar.gz: a2eb13da61361ef1d7c2ebb52390df5406f1598d1a9f64c2b11de9fc574d51f28920cc34342dfa3027bb9eb73b13802114b0d0aaafd51e0688cda7b66fd647bc
data/CHANGELOG.md CHANGED
@@ -1,5 +1,50 @@
1
1
  <!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
2
2
 
3
+ ## 0.9.1 2022-10-18
4
+
5
+
6
+ ### Changed
7
+
8
+ - Correct missing constant for IDENTITY (issue #75 fixed via #76) (@poloka)
9
+
10
+ [Compare v0.9.0...v0.9.1](https://github.com/dry-rb/dry-core/compare/v0.9.0...v0.9.1)
11
+
12
+ ## 0.9.0 2022-10-15
13
+
14
+
15
+ ### Changed
16
+
17
+ - dry-core now uses zeitwerk for autoloading (@solnic)
18
+
19
+ [Compare v0.8.1...v0.9.0](https://github.com/dry-rb/dry-core/compare/v0.8.1...v0.9.0)
20
+
21
+ ## 0.8.1 2022-07-27
22
+
23
+
24
+ ### Fixed
25
+
26
+ - [memoizable] plays better with inheritance.
27
+ There were cases when cached values from base claesses were used, see #70 (@flash-gordon)
28
+
29
+
30
+
31
+ [Compare v0.8.0...v0.8.1](https://github.com/dry-rb/dry-core/compare/v0.8.0...v0.8.1)
32
+
33
+ ## 0.8.0 2022-07-15
34
+
35
+
36
+ ### Added
37
+
38
+ - `Dry::Core::BasicObject` ported from hanami-utils (@jodosha)
39
+
40
+ ### Changed
41
+
42
+ - [BREAKING] [descendants tracker] switch to using `Class#subclasses` on Ruby 3.1+.
43
+ This changes the order of returned subclasses (immediate subclasses now go first) (@flash-gordon)
44
+
45
+
46
+ [Compare v0.7.1...v0.8.0](https://github.com/dry-rb/dry-core/compare/v0.7.1...v0.8.0)
47
+
3
48
  ## 0.7.1 2021-07-10
4
49
 
5
50
 
@@ -43,7 +88,7 @@ has unnamed params (e.g. happens when the new `...` syntax is used) (@flash-gord
43
88
 
44
89
  [Compare v0.5.0...v0.6.0](https://github.com/dry-rb/dry-core/compare/v0.5.0...v0.6.0)
45
90
 
46
- ## 0.5.0 2012-12-12
91
+ ## 0.5.0 2020-12-12
47
92
 
48
93
 
49
94
  ### Added
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2015-2021 dry-rb team
3
+ Copyright (c) 2015-2022 dry-rb team
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy of
6
6
  this software and associated documentation files (the "Software"), to deal in
data/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  [![CI Status](https://github.com/dry-rb/dry-core/workflows/ci/badge.svg)][actions]
12
12
  [![Codacy Badge](https://api.codacy.com/project/badge/Grade/40946292b9094624beec604a149a6023)][codacy]
13
13
  [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/40946292b9094624beec604a149a6023)][codacy]
14
- [![Inline docs](http://inch-ci.org/github/dry-rb/dry-core.svg?branch=master)][inchpages]
14
+ [![Inline docs](http://inch-ci.org/github/dry-rb/dry-core.svg?branch=main)][inchpages]
15
15
 
16
16
  ## Links
17
17
 
@@ -22,8 +22,8 @@
22
22
 
23
23
  This library officially supports the following Ruby versions:
24
24
 
25
- * MRI `>= 2.6.0`
26
- * ~~jruby~~ `>= 9.3` (we are waiting for [2.6 support](https://github.com/jruby/jruby/issues/6161))
25
+ * MRI `>= 2.7.0`
26
+ * jruby `>= 9.3` (postponed until 2.7 is supported)
27
27
 
28
28
  ## License
29
29
 
data/dry-core.gemspec CHANGED
@@ -22,14 +22,15 @@ Gem::Specification.new do |spec|
22
22
  spec.require_paths = ["lib"]
23
23
 
24
24
  spec.metadata["allowed_push_host"] = "https://rubygems.org"
25
- spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-core/blob/master/CHANGELOG.md"
25
+ spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-core/blob/main/CHANGELOG.md"
26
26
  spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-core"
27
27
  spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-core/issues"
28
28
 
29
- spec.required_ruby_version = ">= 2.6.0"
29
+ spec.required_ruby_version = ">= 2.7.0"
30
30
 
31
31
  # to update dependencies edit project.yml
32
32
  spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
33
+ spec.add_runtime_dependency "zeitwerk", "~> 2.6"
33
34
 
34
35
  spec.add_development_dependency "bundler"
35
36
  spec.add_development_dependency "rake"
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This implementation was imported from `hanami-utils` gem.
4
+ module Dry
5
+ module Core
6
+ # BasicObject
7
+ #
8
+ # @since 0.8.0
9
+ class BasicObject < ::BasicObject
10
+ # Lookups constants at the top-level namespace, if they are missing in the
11
+ # current context.
12
+ #
13
+ # @param name [Symbol] the constant name
14
+ #
15
+ # @return [Object, Module] the constant
16
+ #
17
+ # @raise [NameError] if the constant cannot be found
18
+ #
19
+ # @since 0.8.0
20
+ # @api private
21
+ #
22
+ # @see https://ruby-doc.org/core/Module.html#method-i-const_missing
23
+ def self.const_missing(name)
24
+ ::Object.const_get(name)
25
+ end
26
+
27
+ # Returns the class for debugging purposes.
28
+ #
29
+ # @since 0.8.0
30
+ #
31
+ # @see http://ruby-doc.org/core/Object.html#method-i-class
32
+ def class
33
+ (class << self; self; end).superclass
34
+ end
35
+
36
+ # Bare minimum inspect for debugging purposes.
37
+ #
38
+ # @return [String] the inspect string
39
+ #
40
+ # @since 0.8.0
41
+ #
42
+ # @see http://ruby-doc.org/core/Object.html#method-i-inspect
43
+ inspect_method = ::Kernel.instance_method(:inspect)
44
+ define_method(:inspect) do
45
+ original = inspect_method.bind_call(self)
46
+ "#{original[0...-1]}#{__inspect}>"
47
+ end
48
+
49
+ # @!macro [attach] instance_of?(class)
50
+ #
51
+ # Determines if self is an instance of given class or module
52
+ #
53
+ # @param class [Class,Module] the class of module to verify
54
+ #
55
+ # @return [TrueClass,FalseClass] the result of the check
56
+ #
57
+ # @raise [TypeError] if the given argument is not of the expected types
58
+ #
59
+ # @since 0.8.0
60
+ #
61
+ # @see http://ruby-doc.org/core/Object.html#method-i-instance_of-3F
62
+ define_method :instance_of?, ::Object.instance_method(:instance_of?)
63
+
64
+ # @!macro [attach] is_a?(class)
65
+ #
66
+ # Determines if self is of the type of the object class or module
67
+ #
68
+ # @param class [Class,Module] the class of module to verify
69
+ #
70
+ # @return [TrueClass,FalseClass] the result of the check
71
+ #
72
+ # @raise [TypeError] if the given argument is not of the expected types
73
+ #
74
+ # @since 0.8.0
75
+ #
76
+ # @see http://ruby-doc.org/core/Object.html#method-i-is_a-3F
77
+ define_method :is_a?, ::Object.instance_method(:is_a?)
78
+
79
+ # @!macro [attach] kind_of?(class)
80
+ #
81
+ # Determines if self is of the kind of the object class or module
82
+ #
83
+ # @param class [Class,Module] the class of module to verify
84
+ #
85
+ # @return [TrueClass,FalseClass] the result of the check
86
+ #
87
+ # @raise [TypeError] if the given argument is not of the expected types
88
+ #
89
+ # @since 0.8.0
90
+ #
91
+ # @see http://ruby-doc.org/core/Object.html#method-i-kind_of-3F
92
+ define_method :kind_of?, ::Object.instance_method(:kind_of?)
93
+
94
+ # Alias for __id__
95
+ #
96
+ # @return [Fixnum] the object id
97
+ #
98
+ # @since 0.8.0
99
+ #
100
+ # @see http://ruby-doc.org/core/Object.html#method-i-object_id
101
+ def object_id
102
+ __id__
103
+ end
104
+
105
+ # Interface for pp
106
+ #
107
+ # @param printer [PP] the Pretty Printable printer
108
+ # @return [String] the pretty-printable inspection of the object
109
+ #
110
+ # @since 0.8.0
111
+ #
112
+ # @see https://ruby-doc.org/stdlib/libdoc/pp/rdoc/PP.html
113
+ def pretty_print(printer)
114
+ printer.text(inspect)
115
+ end
116
+
117
+ # Returns true if responds to the given method.
118
+ #
119
+ # @return [TrueClass,FalseClass] the result of the check
120
+ #
121
+ # @since 0.8.0
122
+ #
123
+ # @see http://ruby-doc.org/core/Object.html#method-i-respond_to-3F
124
+ def respond_to?(method_name, include_all = false) # rubocop:disable Style/OptionalBooleanParameter
125
+ respond_to_missing?(method_name, include_all)
126
+ end
127
+
128
+ private
129
+
130
+ # Must be overridden by descendants
131
+ #
132
+ # @since 0.8.0
133
+ # @api private
134
+ def respond_to_missing?(_method_name, _include_all)
135
+ ::Kernel.raise ::NotImplementedError
136
+ end
137
+
138
+ # @since 0.8.0
139
+ # @api private
140
+ def __inspect # rubocop:disable Style/EmptyMethod
141
+ end
142
+ end
143
+ end
144
+ end
@@ -60,8 +60,8 @@ module Dry
60
60
  # @yield An arbitrary block
61
61
  #
62
62
  # @return [Object] block's return value
63
- def fetch_or_store(*args, &block)
64
- self.class.fetch_or_store(*args, &block)
63
+ def fetch_or_store(...)
64
+ self.class.fetch_or_store(...)
65
65
  end
66
66
  end
67
67
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "dry/core/constants"
4
- require "dry/core/errors"
5
4
 
6
5
  module Dry
7
6
  module Core
@@ -10,7 +9,6 @@ module Dry
10
9
  # @api public
11
10
  module ClassAttributes
12
11
  include Constants
13
-
14
12
  # Specify what attributes a class will use
15
13
  #
16
14
  # @example
@@ -80,13 +78,13 @@ module Dry
80
78
  if Undefined.equal?(value)
81
79
  if instance_variable_defined?(ivar)
82
80
  instance_variable_get(ivar)
83
- else # rubocop:disable Style/EmptyElse
81
+ else
84
82
  nil
85
83
  end
86
84
  elsif type === value # rubocop:disable Style/CaseEquality
87
85
  instance_variable_set(ivar, coerce.call(value))
88
86
  else
89
- raise InvalidClassAttributeValue.new(name, value)
87
+ raise InvalidClassAttributeValueError.new(name, value)
90
88
  end
91
89
  end
92
90
  end
@@ -62,7 +62,7 @@ module Dry
62
62
  # 1 + Undefined.default(val, 2)
63
63
  # end
64
64
  #
65
- def undefined.default(x, y = self) # rubocop:disable Naming/MethodParameterName
65
+ def undefined.default(x, y = self)
66
66
  if equal?(x)
67
67
  if equal?(y)
68
68
  yield
@@ -4,7 +4,7 @@ require "logger"
4
4
 
5
5
  module Dry
6
6
  module Core
7
- # An extension for issueing warnings on using deprecated methods.
7
+ # An extension for issuing warnings on using deprecated methods.
8
8
  #
9
9
  # @example
10
10
  #
@@ -1,17 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dry
4
- # Build an equalizer module for the inclusion in other class
5
- #
6
- # ## Credits
7
- #
8
- # Equalizer has been originally imported from the equalizer gem created by Dan Kubb
9
- #
10
- # @api public
11
- def self.Equalizer(*keys, **options)
12
- Dry::Core::Equalizer.new(*keys, **options)
13
- end
14
-
15
4
  module Core
16
5
  # Define equality, equivalence and inspection methods
17
6
  class Equalizer < ::Module
@@ -149,4 +138,19 @@ module Dry
149
138
  end
150
139
  end
151
140
  end
141
+
142
+ # Old modules that depend on dry/core/equalizer may miss
143
+ # this method if dry/core is not required explicitly
144
+ unless singleton_class.method_defined?(:Equalizer)
145
+ # Build an equalizer module for the inclusion in other class
146
+ #
147
+ # ## Credits
148
+ #
149
+ # Equalizer has been originally imported from the equalizer gem created by Dan Kubb
150
+ #
151
+ # @api public
152
+ def self.Equalizer(*keys, **options)
153
+ Dry::Core::Equalizer.new(*keys, **options)
154
+ end
155
+ end
152
156
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Dry
4
4
  module Core
5
- class InvalidClassAttributeValue < StandardError
5
+ class InvalidClassAttributeValueError < StandardError
6
6
  def initialize(name, value)
7
7
  super(
8
8
  "Value #{value.inspect} is invalid for class attribute #{name.inspect}"
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/core/deprecations"
4
-
5
3
  module Dry
6
4
  module Core
7
5
  module Memoizable
@@ -13,6 +11,13 @@ module Dry
13
11
  def memoize(*names)
14
12
  prepend(Memoizer.new(self, names))
15
13
  end
14
+
15
+ def inherited(base)
16
+ super
17
+
18
+ memoizer = base.ancestors.find { _1.is_a?(Memoizer) }
19
+ base.prepend(memoizer.dup)
20
+ end
16
21
  end
17
22
 
18
23
  module BasicObject
@@ -52,6 +57,12 @@ module Dry
52
57
 
53
58
  # @api private
54
59
  class Memoizer < ::Module
60
+ KERNEL = {
61
+ singleton: ::Kernel.instance_method(:singleton_class),
62
+ ivar_set: ::Kernel.instance_method(:instance_variable_set),
63
+ frozen: ::Kernel.instance_method(:frozen?)
64
+ }.freeze
65
+
55
66
  # @api private
56
67
  def initialize(klass, names)
57
68
  super()
@@ -65,20 +76,50 @@ module Dry
65
76
  private
66
77
 
67
78
  # @api private
68
- def define_memoizable(method:) # rubocop:disable Metrics/AbcSize
79
+ # rubocop:disable Metrics/AbcSize
80
+ # rubocop:disable Metrics/PerceivedComplexity
81
+ def define_memoizable(method:)
69
82
  parameters = method.parameters
83
+ mod = self
84
+ kernel = KERNEL
70
85
 
71
86
  if parameters.empty?
72
- key = method.name.hash
73
- module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
74
- def #{method.name} # def slow_fetch
75
- if @__memoized__.key?(#{key}) # if @__memoized__.key?(12345678)
76
- @__memoized__[#{key}] # @__memoized__[12345678]
77
- else # else
78
- @__memoized__[#{key}] = super # @__memoized__[12345678] = super
79
- end # end
80
- end # end
81
- RUBY
87
+ key = "#{object_id}:#{method.name}".hash.abs
88
+
89
+ define_method(method.name) do
90
+ value = super()
91
+
92
+ if kernel[:frozen].bind_call(self)
93
+ # It's not possible to modify singleton classes
94
+ # of frozen objects
95
+ mod.remove_method(method.name)
96
+ mod.module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
97
+ def #{method.name} # def slow_calc
98
+ cached = @__memoized__[#{key}] # cached = @__memoized__[12345678]
99
+ #
100
+ if cached || @__memoized__.key?(#{key}) # if cached || @__memoized__.key?(12345678)
101
+ cached # cached
102
+ else # else
103
+ @__memoized__[#{key}] = super # @__memoized__[12345678] = super
104
+ end # end
105
+ end # end
106
+ RUBY
107
+ else
108
+ # We make an attr_reader for computed value.
109
+ # Readers are "special-cased" in ruby so such
110
+ # access will be the fastest way, faster than you'd
111
+ # expect :)
112
+ attr_name = :"__memozed_#{key}__"
113
+ ivar_name = :"@#{attr_name}"
114
+ kernel[:ivar_set].bind_call(self, ivar_name, value)
115
+ eigenclass = kernel[:singleton].bind_call(self)
116
+ eigenclass.attr_reader(attr_name)
117
+ eigenclass.alias_method(method.name, attr_name)
118
+ eigenclass.remove_method(attr_name)
119
+ end
120
+
121
+ value
122
+ end
82
123
  else
83
124
  mapping = parameters.to_h { |k, v = nil| [k, v] }
84
125
  params, binds = declaration(parameters, mapping)
@@ -95,7 +136,7 @@ module Dry
95
136
 
96
137
  m = module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
97
138
  def #{method.name}(#{params.join(", ")}) # def slow_calc(arg1, arg2, arg3)
98
- key = [:"#{method.name}", #{binds.join(", ")}].hash # [:slow_calc, arg1, arg2, arg3].hash
139
+ key = [:"#{method.name}", #{binds.join(", ")}].hash # key = [:slow_calc, arg1, arg2, arg3].hash
99
140
  #
100
141
  if @__memoized__.key?(key) # if @__memoized__.key?(key)
101
142
  @__memoized__[key] # @__memoized__[key]
@@ -112,6 +153,8 @@ module Dry
112
153
  m
113
154
  end
114
155
  end
156
+ # rubocop:enable Metrics/AbcSize
157
+ # rubocop:enable Metrics/PerceivedComplexity
115
158
 
116
159
  # @api private
117
160
  def declaration(definition, lookup)
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Dry
4
4
  module Core
5
- VERSION = "0.7.1"
5
+ VERSION = "0.9.1"
6
6
  end
7
7
  end
data/lib/dry/core.rb CHANGED
@@ -1,10 +1,44 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "zeitwerk"
4
+
5
+ require "dry/core/constants"
6
+ require "dry/core/errors"
3
7
  require "dry/core/version"
4
8
 
5
9
  # :nodoc:
6
10
  module Dry
7
11
  # :nodoc:
8
12
  module Core
13
+ include Constants
14
+
15
+ def self.loader
16
+ @loader ||= Zeitwerk::Loader.new.tap do |loader|
17
+ root = File.expand_path("..", __dir__)
18
+ loader.tag = "dry-core"
19
+ loader.inflector = Zeitwerk::GemInflector.new("#{root}/dry-core.rb")
20
+ loader.push_dir(root)
21
+ loader.ignore(
22
+ "#{root}/dry-core.rb",
23
+ "#{root}/dry/core/{constants,errors,version}.rb"
24
+ )
25
+ end
26
+ end
27
+
28
+ loader.setup
29
+ end
30
+
31
+ # See dry/core/equalizer.rb
32
+ unless singleton_class.method_defined?(:Equalizer)
33
+ # Build an equalizer module for the inclusion in other class
34
+ #
35
+ # ## Credits
36
+ #
37
+ # Equalizer has been originally imported from the equalizer gem created by Dan Kubb
38
+ #
39
+ # @api public
40
+ def self.Equalizer(*keys, **options)
41
+ Dry::Core::Equalizer.new(*keys, **options)
42
+ end
9
43
  end
10
44
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nikita Shilnikov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-10 00:00:00.000000000 Z
11
+ date: 2022-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: zeitwerk
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.6'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -79,6 +93,7 @@ files:
79
93
  - dry-core.gemspec
80
94
  - lib/dry-core.rb
81
95
  - lib/dry/core.rb
96
+ - lib/dry/core/basic_object.rb
82
97
  - lib/dry/core/cache.rb
83
98
  - lib/dry/core/class_attributes.rb
84
99
  - lib/dry/core/class_builder.rb
@@ -96,7 +111,7 @@ licenses:
96
111
  - MIT
97
112
  metadata:
98
113
  allowed_push_host: https://rubygems.org
99
- changelog_uri: https://github.com/dry-rb/dry-core/blob/master/CHANGELOG.md
114
+ changelog_uri: https://github.com/dry-rb/dry-core/blob/main/CHANGELOG.md
100
115
  source_code_uri: https://github.com/dry-rb/dry-core
101
116
  bug_tracker_uri: https://github.com/dry-rb/dry-core/issues
102
117
  post_install_message:
@@ -107,7 +122,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
107
122
  requirements:
108
123
  - - ">="
109
124
  - !ruby/object:Gem::Version
110
- version: 2.6.0
125
+ version: 2.7.0
111
126
  required_rubygems_version: !ruby/object:Gem::Requirement
112
127
  requirements:
113
128
  - - ">="