dry-types 1.5.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -1
  3. data/LICENSE +1 -1
  4. data/README.md +5 -4
  5. data/dry-types.gemspec +17 -15
  6. data/lib/dry/types/array/constructor.rb +0 -2
  7. data/lib/dry/types/array/member.rb +1 -3
  8. data/lib/dry/types/array.rb +0 -3
  9. data/lib/dry/types/builder.rb +4 -12
  10. data/lib/dry/types/builder_methods.rb +1 -1
  11. data/lib/dry/types/coercions/params.rb +4 -3
  12. data/lib/dry/types/compat.rb +1 -0
  13. data/lib/dry/types/compiler.rb +1 -3
  14. data/lib/dry/types/constrained.rb +0 -4
  15. data/lib/dry/types/constraints.rb +3 -7
  16. data/lib/dry/types/constructor/function.rb +8 -8
  17. data/lib/dry/types/constructor.rb +2 -7
  18. data/lib/dry/types/core.rb +2 -3
  19. data/lib/dry/types/decorator.rb +0 -2
  20. data/lib/dry/types/default.rb +3 -5
  21. data/lib/dry/types/enum.rb +0 -2
  22. data/lib/dry/types/errors.rb +13 -1
  23. data/lib/dry/types/extensions/maybe.rb +1 -2
  24. data/lib/dry/types/fn_container.rb +0 -2
  25. data/lib/dry/types/hash/constructor.rb +2 -4
  26. data/lib/dry/types/hash.rb +0 -5
  27. data/lib/dry/types/lax.rb +1 -4
  28. data/lib/dry/types/map.rb +9 -3
  29. data/lib/dry/types/module.rb +13 -8
  30. data/lib/dry/types/nominal.rb +2 -12
  31. data/lib/dry/types/predicate_inferrer.rb +3 -9
  32. data/lib/dry/types/predicate_registry.rb +24 -11
  33. data/lib/dry/types/primitive_inferrer.rb +0 -2
  34. data/lib/dry/types/printer.rb +12 -8
  35. data/lib/dry/types/result.rb +0 -2
  36. data/lib/dry/types/schema/key.rb +1 -4
  37. data/lib/dry/types/schema.rb +6 -4
  38. data/lib/dry/types/sum.rb +3 -6
  39. data/lib/dry/types/type.rb +1 -3
  40. data/lib/dry/types/version.rb +1 -1
  41. data/lib/dry/types.rb +41 -20
  42. metadata +27 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8ffbb2a3ad9a5c532228eccc2c56690e1e7ea8808b579a140f804a46a5263d69
4
- data.tar.gz: 04e2f92495290236be6daf9be2963649f5350c38f69c16a992649610986bbe5e
3
+ metadata.gz: 9875a9faf12df26231bd206db5e75e78cdb104277f34947b01e0d104537b63b4
4
+ data.tar.gz: 8358caef2ad9e5f83b635531b512f507a9b1776b26ba39f3b69090c6edcc1e71
5
5
  SHA512:
6
- metadata.gz: 53f6b6604552a3dacfbfdb64713e8cfdbc47e51b0b0061b6ab186c948ec207b7159c2a076dd17dead3f4d55e4cc300d2133831590f6b56105ac0754bbfd36e99
7
- data.tar.gz: d7050f2070155e72c560f35392121d0de222da270495cbf7f65f0b7c9dcb91f9d9c3db20b119b9a9f1a62c8fae58e49474beaebf81b7df47095cf518607df25c
6
+ metadata.gz: 5bab1e2bb31fc25d9eb8765177717f985d433115cf756bcda8cdedf201bfca90627c942d5183962f428c7c2d67789b08ac95b2e3e0b741c7cccbd39d13ab0ba6
7
+ data.tar.gz: caa7de7d979423fd8d8b5dd0b64642104f40029dcfeec7fe81ff05ef516c76d4bef1a59e341d0580b15022429a3f0d8a89c2f6170fdab0f398c330f157e4cf43
data/CHANGELOG.md CHANGED
@@ -1,6 +1,26 @@
1
1
  <!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
2
2
 
3
- ## 1.5.0 2020-01-21
3
+ ## 1.6.0 2022-10-15
4
+
5
+
6
+ ### Changed
7
+
8
+ - Optimize `PredicateRegistry` for Ruby 2.7+ (see #420 for more details) (@casperisfine)
9
+ - Use zeitwerk for auto-loading (@flash-gordon)
10
+
11
+ [Compare v1.5.1...v1.6.0](https://github.com/dry-rb/dry-types/compare/v1.5.1...v1.6.0)
12
+
13
+ ## 1.5.1 2021-02-16
14
+
15
+
16
+ ### Fixed
17
+
18
+ - Add missing requires for internal usage of `Dry::Equalizer` (@timriley in #418)
19
+
20
+
21
+ [Compare v1.5.0...v1.5.1](https://github.com/dry-rb/dry-types/compare/v1.5.0...v1.5.1)
22
+
23
+ ## 1.5.0 2021-01-21
4
24
 
5
25
 
6
26
  ### 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
@@ -1,3 +1,4 @@
1
+ <!--- this file is synced from dry-rb/template-gem project -->
1
2
  [gem]: https://rubygems.org/gems/dry-types
2
3
  [actions]: https://github.com/dry-rb/dry-types/actions
3
4
  [codacy]: https://www.codacy.com/gh/dry-rb/dry-types
@@ -10,19 +11,19 @@
10
11
  [![CI Status](https://github.com/dry-rb/dry-types/workflows/ci/badge.svg)][actions]
11
12
  [![Codacy Badge](https://api.codacy.com/project/badge/Grade/f2d71613195f4da993acb9ac9d6ea336)][codacy]
12
13
  [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/f2d71613195f4da993acb9ac9d6ea336)][codacy]
13
- [![Inline docs](http://inch-ci.org/github/dry-rb/dry-types.svg?branch=master)][inchpages]
14
+ [![Inline docs](http://inch-ci.org/github/dry-rb/dry-types.svg?branch=main)][inchpages]
14
15
 
15
16
  ## Links
16
17
 
17
- * [User documentation](http://dry-rb.org/gems/dry-types)
18
+ * [User documentation](https://dry-rb.org/gems/dry-types)
18
19
  * [API documentation](http://rubydoc.info/gems/dry-types)
19
20
 
20
21
  ## Supported Ruby versions
21
22
 
22
23
  This library officially supports the following Ruby versions:
23
24
 
24
- * MRI >= `2.5`
25
- * jruby >= `9.2`
25
+ * MRI `>= 2.7.0`
26
+ * jruby `>= 9.3` (postponed until 2.7 is supported)
26
27
 
27
28
  ## License
28
29
 
data/dry-types.gemspec CHANGED
@@ -1,38 +1,40 @@
1
1
  # frozen_string_literal: true
2
- # this file is managed by dry-rb/devtools project
3
2
 
4
- lib = File.expand_path('lib', __dir__)
3
+ # this file is synced from dry-rb/template-gem project
4
+
5
+ lib = File.expand_path("lib", __dir__)
5
6
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
- require 'dry/types/version'
7
+ require "dry/types/version"
7
8
 
8
9
  Gem::Specification.new do |spec|
9
- spec.name = 'dry-types'
10
+ spec.name = "dry-types"
10
11
  spec.authors = ["Piotr Solnica"]
11
12
  spec.email = ["piotr.solnica@gmail.com"]
12
- spec.license = 'MIT'
13
+ spec.license = "MIT"
13
14
  spec.version = Dry::Types::VERSION.dup
14
15
 
15
16
  spec.summary = "Type system for Ruby supporting coercions, constraints and complex types like structs, value objects, enums etc"
16
17
  spec.description = spec.summary
17
- spec.homepage = 'https://dry-rb.org/gems/dry-types'
18
+ spec.homepage = "https://dry-rb.org/gems/dry-types"
18
19
  spec.files = Dir["CHANGELOG.md", "LICENSE", "README.md", "dry-types.gemspec", "lib/**/*"]
19
- spec.bindir = 'bin'
20
+ spec.bindir = "bin"
20
21
  spec.executables = []
21
- spec.require_paths = ['lib']
22
+ spec.require_paths = ["lib"]
22
23
 
23
- spec.metadata['allowed_push_host'] = 'https://rubygems.org'
24
- spec.metadata['changelog_uri'] = 'https://github.com/dry-rb/dry-types/blob/master/CHANGELOG.md'
25
- spec.metadata['source_code_uri'] = 'https://github.com/dry-rb/dry-types'
26
- spec.metadata['bug_tracker_uri'] = 'https://github.com/dry-rb/dry-types/issues'
24
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
25
+ spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-types/blob/main/CHANGELOG.md"
26
+ spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-types"
27
+ spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-types/issues"
27
28
 
28
- spec.required_ruby_version = ">= 2.5.0"
29
+ spec.required_ruby_version = ">= 2.7.0"
29
30
 
30
31
  # to update dependencies edit project.yml
31
32
  spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
32
33
  spec.add_runtime_dependency "dry-container", "~> 0.3"
33
- spec.add_runtime_dependency "dry-core", "~> 0.5", ">= 0.5"
34
+ spec.add_runtime_dependency "dry-core", "~> 0.9", ">= 0.9"
34
35
  spec.add_runtime_dependency "dry-inflector", "~> 0.1", ">= 0.1.2"
35
- spec.add_runtime_dependency "dry-logic", "~> 1.0", ">= 1.0.2"
36
+ spec.add_runtime_dependency "dry-logic", "~> 1.3", ">= 1.3"
37
+ spec.add_runtime_dependency "zeitwerk", "~> 2.6"
36
38
 
37
39
  spec.add_development_dependency "bundler"
38
40
  spec.add_development_dependency "dry-monads", "~> 1.0"
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/types/constructor"
4
-
5
3
  module Dry
6
4
  module Types
7
5
  # @api public
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/types/array/constructor"
4
-
5
3
  module Dry
6
4
  module Types
7
5
  class Array < Nominal
@@ -72,7 +70,7 @@ module Dry
72
70
  # @return [Result,Logic::Result]
73
71
  #
74
72
  # @api public
75
- def try(input, &block)
73
+ def try(input, &block) # rubocop:disable Metrics/PerceivedComplexity
76
74
  if primitive?(input)
77
75
  output = []
78
76
 
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/types/array/member"
4
- require "dry/types/array/constructor"
5
-
6
3
  module Dry
7
4
  module Types
8
5
  # Array type can be used to define an array with optional member type
@@ -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 Types
7
5
  # Common API for building types and composition
@@ -76,7 +74,7 @@ module Dry
76
74
  " value every time. Call `.freeze` when setting the default"\
77
75
  " or pass `shared: true` to discard this warning."\
78
76
  "\n#{where}",
79
- tag: :'dry-types'
77
+ tag: :"dry-types"
80
78
  )
81
79
  end
82
80
 
@@ -105,7 +103,7 @@ module Dry
105
103
  if values.length == 1 && values[0].is_a?(::Hash)
106
104
  values[0]
107
105
  else
108
- ::Hash[values.zip(values)]
106
+ values.zip(values).to_h
109
107
  end
110
108
 
111
109
  Enum.new(constrained(included_in: mapping.keys), mapping: mapping)
@@ -147,7 +145,7 @@ module Dry
147
145
  # @return [Constructor]
148
146
  #
149
147
  # @api public
150
- def fallback(value = Undefined, shared: false, &_fallback)
148
+ def fallback(value = Undefined, shared: false, &_fallback) # rubocop:disable Metrics/PerceivedComplexity
151
149
  if Undefined.equal?(value) && !block_given?
152
150
  raise ::ArgumentError, "fallback value or a block must be given"
153
151
  end
@@ -167,7 +165,7 @@ module Dry
167
165
  " value every time. Call `.freeze` when setting the fallback"\
168
166
  " or pass `shared: true` to discard this warning."\
169
167
  "\n#{where}",
170
- tag: :'dry-types'
168
+ tag: :"dry-types"
171
169
  )
172
170
  end
173
171
 
@@ -184,9 +182,3 @@ module Dry
184
182
  end
185
183
  end
186
184
  end
187
-
188
- require "dry/types/default"
189
- require "dry/types/constrained"
190
- require "dry/types/enum"
191
- require "dry/types/lax"
192
- require "dry/types/sum"
@@ -80,7 +80,7 @@ module Dry
80
80
  # @param [#call,nil] block Value constructor
81
81
  #
82
82
  # @return [Dry::Types::Type]
83
- def Constructor(klass, cons = nil, &block)
83
+ def Constructor(klass, cons = nil, &block) # rubocop:disable Metrics/PerceivedComplexity:
84
84
  if klass.is_a?(Type)
85
85
  if cons || block
86
86
  klass.constructor(cons || block)
@@ -12,9 +12,10 @@ module Dry
12
12
  module Params
13
13
  TRUE_VALUES = %w[1 on On ON t true True TRUE T y yes Yes YES Y].freeze
14
14
  FALSE_VALUES = %w[0 off Off OFF f false False FALSE F n no No NO N].freeze
15
- BOOLEAN_MAP = ::Hash[
16
- TRUE_VALUES.product([true]) + FALSE_VALUES.product([false])
17
- ].merge(true => true, false => false).freeze
15
+ BOOLEAN_MAP = EMPTY_HASH.merge(
16
+ [true, *TRUE_VALUES].to_h { |v| [v, true] },
17
+ [false, *FALSE_VALUES].to_h { |v| [v, false] }
18
+ ).freeze
18
19
 
19
20
  extend Coercions
20
21
 
@@ -0,0 +1 @@
1
+ # frozen_string_literal: true
@@ -1,12 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/core/deprecations"
4
-
5
3
  module Dry
6
4
  module Types
7
5
  # @api private
8
6
  class Compiler
9
- extend ::Dry::Core::Deprecations[:'dry-types']
7
+ extend ::Dry::Core::Deprecations[:"dry-types"]
10
8
 
11
9
  attr_reader :registry
12
10
 
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/types/decorator"
4
- require "dry/types/constraints"
5
- require "dry/types/constrained/coercible"
6
-
7
3
  module Dry
8
4
  module Types
9
5
  # Constrained types apply rules to the input
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/logic/rule_compiler"
4
- require "dry/logic/predicates"
5
- require "dry/logic/rule/predicate"
6
-
7
3
  module Dry
8
4
  # Helper methods for constraint types
9
5
  #
@@ -17,8 +13,8 @@ module Dry
17
13
  def self.Rule(options)
18
14
  rule_compiler.(
19
15
  options.map { |key, val|
20
- Logic::Rule::Predicate.build(
21
- Logic::Predicates[:"#{key}?"]
16
+ ::Dry::Logic::Rule::Predicate.build(
17
+ ::Dry::Logic::Predicates[:"#{key}?"]
22
18
  ).curry(val).to_ast
23
19
  }
24
20
  ).reduce(:and)
@@ -28,7 +24,7 @@ module Dry
28
24
  #
29
25
  # @api private
30
26
  def self.rule_compiler
31
- @rule_compiler ||= Logic::RuleCompiler.new(Logic::Predicates)
27
+ @rule_compiler ||= ::Dry::Logic::RuleCompiler.new(::Dry::Logic::Predicates)
32
28
  end
33
29
  end
34
30
  end
@@ -61,17 +61,17 @@ module Dry
61
61
  ::Module.new do
62
62
  if safe
63
63
  module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
64
- def call(input, &block)
65
- @target.#{method}(input, &block)
66
- end
64
+ def call(input, &block) # def call(input, &block)
65
+ @target.#{method}(input, &block) # @target.coerve(input, &block)
66
+ end # end
67
67
  RUBY
68
68
  else
69
69
  module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
70
- def call(input, &block)
71
- @target.#{method}(input)
72
- rescue ::NoMethodError, ::TypeError, ::ArgumentError => error
73
- CoercionError.handle(error, &block)
74
- end
70
+ def call(input, &block) # def call(input, &block)
71
+ @target.#{method}(input) # @target.coerce(input)
72
+ rescue ::NoMethodError, ::TypeError, ::ArgumentError => error # rescue ::NoMethodError, ::TypeError, ::ArgumentError => error
73
+ CoercionError.handle(error, &block) # CoercionError.handle(error, &block)
74
+ end # end
75
75
  RUBY
76
76
  end
77
77
  end
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/types/fn_container"
4
- require "dry/types/constructor/function"
5
- require "dry/types/constructor/wrapper"
6
-
7
3
  module Dry
8
4
  module Types
9
5
  # Constructor types apply a function to the input that is supposed to return
@@ -48,13 +44,12 @@ module Dry
48
44
 
49
45
  # @api private
50
46
  def self.wrapper_type
51
- @wrapper_type ||= begin
47
+ @wrapper_type ||=
52
48
  if self < Wrapper
53
49
  self
54
50
  else
55
51
  const_set(:Wrapping, ::Class.new(self).include(Wrapper))
56
52
  end
57
- end
58
53
  end
59
54
 
60
55
  # Instantiate a new constructor type instance
@@ -190,7 +185,7 @@ module Dry
190
185
  if type.respond_to?(method)
191
186
  response = type.public_send(method, *args, &block)
192
187
 
193
- if response.is_a?(Type) && type.class.equal?(response.class)
188
+ if response.is_a?(Type) && response.instance_of?(type.class)
194
189
  response.constructor_type[response, **options]
195
190
  else
196
191
  response
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/types/any"
4
-
5
3
  module Dry
6
4
  module Types
7
5
  # Primitives with {Kernel} coercion methods
@@ -60,7 +58,8 @@ module Dry
60
58
 
61
59
  # Register {KERNEL_COERCIBLE} types
62
60
  KERNEL_COERCIBLE.each do |name, primitive|
63
- register("coercible.#{name}", self["nominal.#{name}"].constructor(Kernel.method(primitive.name)))
61
+ register("coercible.#{name}",
62
+ self["nominal.#{name}"].constructor(Kernel.method(primitive.name)))
64
63
  end
65
64
 
66
65
  # Register {METHOD_COERCIBLE} types
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/types/options"
4
-
5
3
  module Dry
6
4
  module Types
7
5
  # Common API for types
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/types/decorator"
4
-
5
3
  module Dry
6
4
  module Types
7
5
  # Default types are useful when a missing value should be replaced by a default one
@@ -52,7 +50,7 @@ module Dry
52
50
  # @param [Object] value
53
51
  #
54
52
  # @api private
55
- def initialize(type, value, **options)
53
+ def initialize(type, value, **)
56
54
  super
57
55
  @value = value
58
56
  end
@@ -64,8 +62,8 @@ module Dry
64
62
  # @return [Default]
65
63
  #
66
64
  # @api public
67
- def constrained(*args)
68
- type.constrained(*args).default(value)
65
+ def constrained(...)
66
+ type.constrained(...).default(value)
69
67
  end
70
68
 
71
69
  # @return [true]
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/types/decorator"
4
-
5
3
  module Dry
6
4
  module Types
7
5
  # Enum types can be used to define an enum on top of an existing type
@@ -51,6 +51,7 @@ module Dry
51
51
 
52
52
  # @param [Array<CoercionError>] errors
53
53
  def initialize(errors)
54
+ super("")
54
55
  @errors = errors
55
56
  end
56
57
 
@@ -66,11 +67,22 @@ module Dry
66
67
  end
67
68
 
68
69
  class SchemaError < CoercionError
70
+ # @return [String, Symbol]
71
+ attr_reader :key
72
+
73
+ # @return [Object]
74
+ attr_reader :value
75
+
69
76
  # @param [String,Symbol] key
70
77
  # @param [Object] value
71
78
  # @param [String, #to_s] result
72
79
  def initialize(key, value, result)
73
- super("#{value.inspect} (#{value.class}) has invalid type for :#{key} violates constraints (#{result} failed)")
80
+ @key = key
81
+ @value = value
82
+ super(
83
+ "#{value.inspect} (#{value.class}) has invalid type "\
84
+ "for :#{key} violates constraints (#{result} failed)"
85
+ )
74
86
  end
75
87
  end
76
88
 
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "dry/monads/maybe"
4
- require "dry/types/decorator"
5
4
 
6
5
  module Dry
7
6
  module Types
@@ -98,7 +97,7 @@ module Dry
98
97
  end
99
98
 
100
99
  # @api private
101
- class Schema::Key
100
+ class Schema::Key # rubocop:disable Style/ClassAndModuleChildren
102
101
  # @api private
103
102
  def maybe
104
103
  __new__(type.maybe)
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/types/container"
4
-
5
3
  module Dry
6
4
  module Types
7
5
  # Internal container for constructor functions used by the built-in types
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/types/constructor"
4
-
5
3
  module Dry
6
4
  module Types
7
5
  # Hash type exposes additional APIs for working with schema hashes
@@ -24,8 +22,8 @@ module Dry
24
22
  # @see Dry::Types::Array#of
25
23
  #
26
24
  # @api public
27
- def schema(*args)
28
- type.schema(*args).constructor(fn, meta: meta)
25
+ def schema(...)
26
+ type.schema(...).constructor(fn, meta: meta)
29
27
  end
30
28
  end
31
29
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/types/hash/constructor"
4
-
5
3
  module Dry
6
4
  module Types
7
5
  # Hash types can be used to define maps and schemas
@@ -132,6 +130,3 @@ module Dry
132
130
  end
133
131
  end
134
132
  end
135
-
136
- require "dry/types/schema/key"
137
- require "dry/types/schema"
data/lib/dry/types/lax.rb CHANGED
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/core/deprecations"
4
- require "dry/types/decorator"
5
-
6
3
  module Dry
7
4
  module Types
8
5
  # Lax types rescue from type-related errors when constructors fail
@@ -68,7 +65,7 @@ module Dry
68
65
  end
69
66
  end
70
67
 
71
- extend ::Dry::Core::Deprecations[:'dry-types']
68
+ extend ::Dry::Core::Deprecations[:"dry-types"]
72
69
  Safe = Lax
73
70
  deprecate_constant(:Safe)
74
71
  end
data/lib/dry/types/map.rb CHANGED
@@ -14,15 +14,17 @@ module Dry
14
14
  # # => {1 => 'right'}
15
15
  #
16
16
  # type.('1' => 'wrong')
17
- # # Dry::Types::MapError: "1" violates constraints (type?(Integer, "1") AND gteq?(1, "1") AND lteq?(10, "1") failed)
17
+ # # Dry::Types::MapError: "1" violates constraints (type?(Integer, "1")
18
+ # # AND gteq?(1, "1")
19
+ # # AND lteq?(10, "1") failed)
18
20
  #
19
21
  # type.(11 => 'wrong')
20
22
  # # Dry::Types::MapError: 11 violates constraints (lteq?(10, 11) failed)
21
23
  #
22
24
  # @api public
23
25
  class Map < Nominal
24
- def initialize(_primitive, key_type: Types["any"], value_type: Types["any"], meta: EMPTY_HASH)
25
- super(_primitive, key_type: key_type, value_type: value_type, meta: meta)
26
+ def initialize(primitive, key_type: Types["any"], value_type: Types["any"], meta: EMPTY_HASH)
27
+ super(primitive, key_type: key_type, value_type: value_type, meta: meta)
26
28
  end
27
29
 
28
30
  # @return [Type]
@@ -100,6 +102,8 @@ module Dry
100
102
  private
101
103
 
102
104
  # @api private
105
+ # rubocop:disable Metrics/PerceivedComplexity
106
+ # rubocop:disable Metrics/AbcSize
103
107
  def coerce(input)
104
108
  unless primitive?(input)
105
109
  return failure(
@@ -131,6 +135,8 @@ module Dry
131
135
  failure(input, MultipleError.new(failures))
132
136
  end
133
137
  end
138
+ # rubocop:enable Metrics/PerceivedComplexity
139
+ # rubocop:enable Metrics/AbcSize
134
140
  end
135
141
  end
136
142
  end
@@ -1,14 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/core/deprecations"
4
- require "dry/types/builder_methods"
5
-
6
3
  module Dry
7
4
  module Types
8
5
  # Export types registered in a container as module constants.
9
6
  # @example
10
7
  # module Types
11
- # include Dry::Types(:strict, :coercible, :nominal, default: :strict)
8
+ # include Dry.Types(:strict, :coercible, :nominal, default: :strict)
12
9
  # end
13
10
  #
14
11
  # Types.constants
@@ -26,10 +23,10 @@ module Dry
26
23
  extend(BuilderMethods)
27
24
 
28
25
  if constants.key?(:Nominal)
29
- singleton_class.send(:define_method, :included) do |base|
26
+ singleton_class.define_method(:included) do |base|
30
27
  super(base)
31
28
  base.instance_exec(const_get(:Nominal, false)) do |nominal|
32
- extend Dry::Core::Deprecations[:'dry-types']
29
+ extend Dry::Core::Deprecations[:"dry-types"]
33
30
  const_set(:Definition, nominal)
34
31
  deprecate_constant(:Definition, message: "Nominal")
35
32
  end
@@ -38,6 +35,9 @@ module Dry
38
35
  end
39
36
 
40
37
  # @api private
38
+ # rubocop:disable Metrics/AbcSize
39
+ # rubocop:disable Metrics/CyclomaticComplexity
40
+ # rubocop:disable Metrics/PerceivedComplexity
41
41
  def type_constants(*namespaces, default: Undefined, **aliases)
42
42
  if namespaces.empty? && aliases.empty? && Undefined.equal?(default)
43
43
  default_ns = :Strict
@@ -64,6 +64,9 @@ module Dry
64
64
  constants.update(value) if key == default_ns
65
65
  end
66
66
  end
67
+ # rubocop:enable Metrics/AbcSize
68
+ # rubocop:enable Metrics/CyclomaticComplexity
69
+ # rubocop:enable Metrics/PerceivedComplexity
67
70
 
68
71
  # @api private
69
72
  def registry_tree
@@ -91,9 +94,11 @@ module Dry
91
94
  ns.to_sym unless path.empty?
92
95
  }.compact.uniq
93
96
 
94
- (referenced.uniq - known).each do |name|
97
+ unknown = (referenced.uniq - known).first
98
+
99
+ if unknown
95
100
  raise ArgumentError,
96
- "#{name.inspect} is not a known type namespace. "\
101
+ "#{unknown.inspect} is not a known type namespace. "\
97
102
  "Supported options are #{known.map(&:inspect).join(", ")}"
98
103
  end
99
104
  end
@@ -1,11 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/core/deprecations"
4
- require "dry/types/builder"
5
- require "dry/types/result"
6
- require "dry/types/options"
7
- require "dry/types/meta"
8
-
9
3
  module Dry
10
4
  module Types
11
5
  # Nominal types define a primitive class and do not apply any constructors or constraints
@@ -19,7 +13,7 @@ module Dry
19
13
  include Meta
20
14
  include Builder
21
15
  include Printable
22
- include Dry::Equalizer(:primitive, :options, :meta, inspect: false, immutable: true)
16
+ include ::Dry::Equalizer(:primitive, :options, :meta, inspect: false, immutable: true)
23
17
 
24
18
  # @return [Class]
25
19
  attr_reader :primitive
@@ -198,12 +192,8 @@ module Dry
198
192
  end
199
193
  end
200
194
 
201
- extend Dry::Core::Deprecations[:'dry-types']
195
+ extend ::Dry::Core::Deprecations[:"dry-types"]
202
196
  Definition = Nominal
203
197
  deprecate_constant(:Definition, message: "Nominal")
204
198
  end
205
199
  end
206
-
207
- require "dry/types/array"
208
- require "dry/types/hash"
209
- require "dry/types/map"
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/core/cache"
4
- require "dry/core/class_attributes"
5
- require "dry/types/predicate_registry"
6
-
7
3
  module Dry
8
4
  module Types
9
5
  # PredicateInferrer returns the list of predicates used by a type.
@@ -55,7 +51,7 @@ module Dry
55
51
  end
56
52
 
57
53
  # @api private
58
- def infer_predicate(type)
54
+ def infer_predicate(type) # rubocop:disable Metrics/PerceivedComplexity
59
55
  pred = TYPE_TO_PREDICATE.fetch(type) do
60
56
  if type.name.nil? || self.class.infer_predicate_by_class_name.equal?(false)
61
57
  nil
@@ -175,9 +171,9 @@ module Dry
175
171
  def visit_predicate(node)
176
172
  pred, args = node
177
173
 
178
- if pred.equal?(:type?)
174
+ if pred.equal?(:type?) || !registry.key?(pred)
179
175
  EMPTY_ARRAY
180
- elsif registry.key?(pred)
176
+ else
181
177
  *curried, _ = args
182
178
  values = curried.map { |_, v| v }
183
179
 
@@ -186,8 +182,6 @@ module Dry
186
182
  else
187
183
  [pred => values[0]]
188
184
  end
189
- else
190
- EMPTY_ARRAY
191
185
  end
192
186
  end
193
187
 
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/logic/predicates"
4
-
5
3
  module Dry
6
4
  module Types
7
5
  # A registry with predicate objects from `Dry::Logic::Predicates`
@@ -14,21 +12,36 @@ module Dry
14
12
  # @api private
15
13
  attr_reader :has_predicate
16
14
 
17
- # @api private
18
- def initialize(predicates = Logic::Predicates)
19
- @predicates = predicates
20
- @has_predicate = ::Kernel.instance_method(:respond_to?).bind(@predicates)
15
+ KERNEL_RESPOND_TO = ::Kernel.instance_method(:respond_to?)
16
+ private_constant(:KERNEL_RESPOND_TO)
17
+
18
+ if ::UnboundMethod.method_defined?(:bind_call)
19
+ # @api private
20
+ def initialize(predicates = Logic::Predicates)
21
+ @predicates = predicates
22
+ end
23
+
24
+ # @api private
25
+ def key?(name)
26
+ KERNEL_RESPOND_TO.bind_call(@predicates, name)
27
+ end
28
+ else
29
+ # @api private
30
+ def initialize(predicates = Logic::Predicates)
31
+ @predicates = predicates
32
+ @has_predicate = KERNEL_RESPOND_TO.bind(@predicates)
33
+ end
34
+
35
+ # @api private
36
+ def key?(name)
37
+ has_predicate.(name)
38
+ end
21
39
  end
22
40
 
23
41
  # @api private
24
42
  def [](name)
25
43
  predicates[name]
26
44
  end
27
-
28
- # @api private
29
- def key?(name)
30
- has_predicate.(name)
31
- end
32
45
  end
33
46
  end
34
47
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/core/cache"
4
-
5
3
  module Dry
6
4
  module Types
7
5
  # PrimitiveInferrer returns the list of classes matching a type.
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dry
4
+ # rubocop:disable Metrics/AbcSize
5
+ # rubocop:disable Metrics/PerceivedComplexity
4
6
  module Types
5
7
  # @api private
6
8
  class Printer
7
- MAPPING = {
9
+ MAPPING = { # rubocop:disable Style/MutableConstant
8
10
  Nominal => :visit_nominal,
9
11
  Constructor => :visit_constructor,
10
12
  Constrained => :visit_constrained,
@@ -94,13 +96,13 @@ module Dry
94
96
 
95
97
  strict_str = "strict " if options.delete(:strict)
96
98
 
97
- if key_fn = options.delete(:key_transform_fn)
99
+ if (key_fn = options.delete(:key_transform_fn))
98
100
  visit_callable(key_fn) do |fn|
99
101
  key_fn_str = "key_fn=#{fn} "
100
102
  end
101
103
  end
102
104
 
103
- if type_fn = options.delete(:type_transform_fn)
105
+ if (type_fn = options.delete(:type_transform_fn))
104
106
  visit_callable(type_fn) do |fn|
105
107
  type_fn_str = "type_fn=#{fn} "
106
108
  end
@@ -109,7 +111,7 @@ module Dry
109
111
  keys = options.delete(:keys)
110
112
 
111
113
  visit_options(options, schema.meta) do |opts|
112
- opts = "#{opts[1..-1]} " unless opts.empty?
114
+ opts = "#{opts[1..]} " unless opts.empty?
113
115
  schema_parameters = "#{key_fn_str}#{type_fn_str}#{strict_str}#{opts}"
114
116
 
115
117
  header = "Schema<#{schema_parameters}keys={"
@@ -236,7 +238,7 @@ module Dry
236
238
  options = hash.options.dup
237
239
  type_fn_str = ""
238
240
 
239
- if type_fn = options.delete(:type_transform_fn)
241
+ if (type_fn = options.delete(:type_transform_fn))
240
242
  visit_callable(type_fn) do |fn|
241
243
  type_fn_str = "type_fn=#{fn}"
242
244
  end
@@ -263,9 +265,9 @@ module Dry
263
265
  if line&.zero?
264
266
  yield ".#{path}"
265
267
  elsif path
266
- yield "#{path.sub(Dir.pwd + "/", EMPTY_STRING)}:#{line}"
268
+ yield "#{path.sub("#{Dir.pwd}/", EMPTY_STRING)}:#{line}"
267
269
  else
268
- match = fn.to_s.match(/\A#<Proc:0x\h+\(&:(?<name>\w+)\)(:? \(lambda\))?>\z/)
270
+ match = fn.to_s.match(/\A#<Proc:0x\h+\(&:(?<name>\w+)\)(:? \(lambda\))?>\z/) # rubocop:disable Lint/MixedRegexpCaptureTypes
269
271
 
270
272
  if match
271
273
  yield ".#{match[:name]}"
@@ -286,7 +288,7 @@ module Dry
286
288
  end
287
289
  end
288
290
 
289
- def visit_options(options, meta = EMPTY_HASH)
291
+ def visit_options(options, meta = EMPTY_HASH) # rubocop:disable Metrics/PerceivedComplexity
290
292
  if options.empty? && meta.empty?
291
293
  yield ""
292
294
  else
@@ -312,4 +314,6 @@ module Dry
312
314
 
313
315
  PRINTER = Printer.new.freeze
314
316
  end
317
+ # rubocop:enable Metrics/AbcSize
318
+ # rubocop:enable Metrics/PerceivedComplexity
315
319
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/core/equalizer"
4
-
5
3
  module Dry
6
4
  module Types
7
5
  # Result class used by {Type#try}
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/core/equalizer"
4
- require "dry/core/deprecations"
5
-
6
3
  module Dry
7
4
  module Types
8
5
  # Schema is a hash with explicit member types defined
@@ -15,7 +12,7 @@ module Dry
15
12
  #
16
13
  # @see Dry::Types::Schema
17
14
  class Key
18
- extend ::Dry::Core::Deprecations[:'dry-types']
15
+ extend ::Dry::Core::Deprecations[:"dry-types"]
19
16
  include Type
20
17
  include Dry::Equalizer(:name, :type, :options, inspect: false, immutable: true)
21
18
  include Decorator
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/types/fn_container"
4
-
5
3
  module Dry
6
4
  module Types
7
5
  # The built-in Hash type can be defined in terms of keys and associated types
@@ -92,6 +90,8 @@ module Dry
92
90
  # @return [Object] if coercion fails and a block is given
93
91
  #
94
92
  # @api public
93
+ # rubocop:disable Metrics/AbcSize
94
+ # rubocop:disable Metrics/PerceivedComplexity
95
95
  def try(input)
96
96
  if primitive?(input)
97
97
  success = true
@@ -138,6 +138,8 @@ module Dry
138
138
  failure
139
139
  end
140
140
  end
141
+ # rubocop:enable Metrics/AbcSize
142
+ # rubocop:enable Metrics/PerceivedComplexity
141
143
 
142
144
  # @param meta [Boolean] Whether to dump the meta to the AST
143
145
  #
@@ -167,7 +169,7 @@ module Dry
167
169
  # @return [Schema]
168
170
  #
169
171
  # @api public
170
- def strict(strict = true)
172
+ def strict(strict = true) # rubocop:disable Style/OptionalBooleanParameter
171
173
  with(strict: strict)
172
174
  end
173
175
 
@@ -368,7 +370,7 @@ module Dry
368
370
  # Try to add missing keys to the hash
369
371
  #
370
372
  # @api private
371
- def resolve_missing_keys(hash, options)
373
+ def resolve_missing_keys(hash, options) # rubocop:disable Metrics/PerceivedComplexity
372
374
  skip_missing = options.fetch(:skip_missing, false)
373
375
  resolve_defaults = options.fetch(:resolve_defaults, true)
374
376
 
data/lib/dry/types/sum.rb CHANGED
@@ -1,8 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/types/options"
4
- require "dry/types/meta"
5
-
6
3
  module Dry
7
4
  module Types
8
5
  # Sum type
@@ -120,10 +117,10 @@ module Dry
120
117
 
121
118
  # @api private
122
119
  def failure(input, _error = nil)
123
- if !left.valid?(input)
124
- left.failure(input, left.try(input).error)
125
- else
120
+ if left.valid?(input)
126
121
  right.failure(input, right.try(input).error)
122
+ else
123
+ left.failure(input, left.try(input).error)
127
124
  end
128
125
  end
129
126
 
@@ -1,14 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "dry/core/deprecations"
4
-
5
3
  module Dry
6
4
  module Types
7
5
  # Common Type module denoting an object is a Type
8
6
  #
9
7
  # @api public
10
8
  module Type
11
- extend ::Dry::Core::Deprecations[:'dry-types']
9
+ extend ::Dry::Core::Deprecations[:"dry-types"]
12
10
 
13
11
  deprecate(:safe, :lax)
14
12
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Dry
4
4
  module Types
5
- VERSION = "1.5.0"
5
+ VERSION = "1.6.0"
6
6
  end
7
7
  end
data/lib/dry/types.rb CHANGED
@@ -3,37 +3,58 @@
3
3
  require "bigdecimal"
4
4
  require "date"
5
5
  require "set"
6
+ require "zeitwerk"
6
7
 
7
8
  require "concurrent/map"
8
9
 
10
+ require "dry/core"
9
11
  require "dry/container"
10
- require "dry/core/extensions"
11
- require "dry/core/constants"
12
- require "dry/core/class_attributes"
13
-
14
- require "dry/types/version"
15
- require "dry/types/container"
16
- require "dry/types/inflector"
17
- require "dry/types/type"
18
- require "dry/types/printable"
19
- require "dry/types/nominal"
20
- require "dry/types/constructor"
21
- require "dry/types/module"
12
+ require "dry/logic"
22
13
 
14
+ require "dry/types/constraints"
23
15
  require "dry/types/errors"
16
+ require "dry/types/version"
24
17
 
25
18
  module Dry
26
19
  # Main library namespace
27
20
  #
28
21
  # @api public
29
22
  module Types
30
- extend Dry::Core::Extensions
31
- extend Dry::Core::ClassAttributes
32
- extend Dry::Core::Deprecations[:'dry-types']
33
- include Dry::Core::Constants
23
+ extend ::Dry::Core::Extensions
24
+ extend ::Dry::Core::ClassAttributes
25
+ extend ::Dry::Core::Deprecations[:"dry-types"]
26
+ include ::Dry::Core::Constants
34
27
 
35
28
  TYPE_SPEC_REGEX = /(.+)<(.+)>/.freeze
36
29
 
30
+ def self.loader
31
+ @loader ||= ::Zeitwerk::Loader.new.tap do |loader|
32
+ root = ::File.expand_path("..", __dir__)
33
+ loader.tag = "dry-types"
34
+ loader.inflector = ::Zeitwerk::GemInflector.new("#{root}/dry-types.rb")
35
+ loader.inflector.inflect("json" => "JSON")
36
+ loader.push_dir(root)
37
+ loader.ignore(
38
+ "#{root}/dry-types.rb",
39
+ "#{root}/dry/types/extensions",
40
+ "#{root}/dry/types/spec/types.rb",
41
+ "#{root}/dry/types/{#{%w[
42
+ compat
43
+ constraints
44
+ core
45
+ errors
46
+ extensions
47
+ json
48
+ params
49
+ printer
50
+ version
51
+ ].join(",")}}.rb"
52
+ )
53
+ end
54
+ end
55
+
56
+ loader.setup
57
+
37
58
  # @see Dry.Types
38
59
  def self.module(*namespaces, default: :nominal, **aliases)
39
60
  ::Module.new(container, *namespaces, default: default, **aliases)
@@ -180,7 +201,7 @@ module Dry
180
201
  #
181
202
  # module Types
182
203
  # # imports all types as constants, uses modules for namespaces
183
- # include Dry::Types()
204
+ # include Dry.Types()
184
205
  # end
185
206
  # # strict types are exported by default
186
207
  # Types::Integer
@@ -191,7 +212,7 @@ module Dry
191
212
  # @example changing default types
192
213
  #
193
214
  # module Types
194
- # include Dry::Types(default: :nominal)
215
+ # include Dry.Types(default: :nominal)
195
216
  # end
196
217
  # Types::Integer
197
218
  # # => #<Dry::Types[Nominal<Integer>]>
@@ -199,7 +220,7 @@ module Dry
199
220
  # @example cherry-picking namespaces
200
221
  #
201
222
  # module Types
202
- # include Dry::Types(:strict, :coercible)
223
+ # include Dry.Types(:strict, :coercible)
203
224
  # end
204
225
  # # cherry-picking discards default types,
205
226
  # # provide the :default option along with the list of
@@ -208,7 +229,7 @@ module Dry
208
229
  #
209
230
  # @example custom names
210
231
  # module Types
211
- # include Dry::Types(coercible: :Kernel)
232
+ # include Dry.Types(coercible: :Kernel)
212
233
  # end
213
234
  # Types::Kernel::Integer
214
235
  # # => #<Dry::Types[Constructor<Nominal<Integer> fn=Kernel.Integer>]>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-types
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-21 00:00:00.000000000 Z
11
+ date: 2022-10-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -44,20 +44,20 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.5'
47
+ version: '0.9'
48
48
  - - ">="
49
49
  - !ruby/object:Gem::Version
50
- version: '0.5'
50
+ version: '0.9'
51
51
  type: :runtime
52
52
  prerelease: false
53
53
  version_requirements: !ruby/object:Gem::Requirement
54
54
  requirements:
55
55
  - - "~>"
56
56
  - !ruby/object:Gem::Version
57
- version: '0.5'
57
+ version: '0.9'
58
58
  - - ">="
59
59
  - !ruby/object:Gem::Version
60
- version: '0.5'
60
+ version: '0.9'
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: dry-inflector
63
63
  requirement: !ruby/object:Gem::Requirement
@@ -84,20 +84,34 @@ dependencies:
84
84
  requirements:
85
85
  - - "~>"
86
86
  - !ruby/object:Gem::Version
87
- version: '1.0'
87
+ version: '1.3'
88
88
  - - ">="
89
89
  - !ruby/object:Gem::Version
90
- version: 1.0.2
90
+ version: '1.3'
91
91
  type: :runtime
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
- version: '1.0'
97
+ version: '1.3'
98
98
  - - ">="
99
99
  - !ruby/object:Gem::Version
100
- version: 1.0.2
100
+ version: '1.3'
101
+ - !ruby/object:Gem::Dependency
102
+ name: zeitwerk
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '2.6'
108
+ type: :runtime
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '2.6'
101
115
  - !ruby/object:Gem::Dependency
102
116
  name: bundler
103
117
  requirement: !ruby/object:Gem::Requirement
@@ -237,7 +251,7 @@ licenses:
237
251
  - MIT
238
252
  metadata:
239
253
  allowed_push_host: https://rubygems.org
240
- changelog_uri: https://github.com/dry-rb/dry-types/blob/master/CHANGELOG.md
254
+ changelog_uri: https://github.com/dry-rb/dry-types/blob/main/CHANGELOG.md
241
255
  source_code_uri: https://github.com/dry-rb/dry-types
242
256
  bug_tracker_uri: https://github.com/dry-rb/dry-types/issues
243
257
  post_install_message:
@@ -248,14 +262,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
248
262
  requirements:
249
263
  - - ">="
250
264
  - !ruby/object:Gem::Version
251
- version: 2.5.0
265
+ version: 2.7.0
252
266
  required_rubygems_version: !ruby/object:Gem::Requirement
253
267
  requirements:
254
268
  - - ">="
255
269
  - !ruby/object:Gem::Version
256
270
  version: '0'
257
271
  requirements: []
258
- rubygems_version: 3.1.4
272
+ rubygems_version: 3.1.6
259
273
  signing_key:
260
274
  specification_version: 4
261
275
  summary: Type system for Ruby supporting coercions, constraints and complex types