dry-types 1.4.0 → 1.5.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 +4 -4
- data/CHANGELOG.md +68 -0
- data/LICENSE +1 -1
- data/README.md +1 -1
- data/dry-types.gemspec +2 -3
- data/lib/dry-types.rb +1 -1
- data/lib/dry/types.rb +55 -31
- data/lib/dry/types/any.rb +2 -2
- data/lib/dry/types/array.rb +2 -2
- data/lib/dry/types/array/constructor.rb +1 -1
- data/lib/dry/types/array/member.rb +1 -1
- data/lib/dry/types/builder.rb +66 -18
- data/lib/dry/types/builder_methods.rb +1 -2
- data/lib/dry/types/coercions/json.rb +5 -5
- data/lib/dry/types/coercions/params.rb +3 -3
- data/lib/dry/types/compiler.rb +10 -10
- data/lib/dry/types/constrained.rb +5 -9
- data/lib/dry/types/constraints.rb +3 -3
- data/lib/dry/types/constructor.rb +39 -6
- data/lib/dry/types/constructor/function.rb +31 -2
- data/lib/dry/types/constructor/wrapper.rb +94 -0
- data/lib/dry/types/container.rb +1 -1
- data/lib/dry/types/core.rb +12 -12
- data/lib/dry/types/decorator.rb +2 -2
- data/lib/dry/types/default.rb +13 -1
- data/lib/dry/types/enum.rb +3 -3
- data/lib/dry/types/errors.rb +1 -1
- data/lib/dry/types/extensions.rb +2 -2
- data/lib/dry/types/extensions/maybe.rb +4 -4
- data/lib/dry/types/extensions/monads.rb +1 -1
- data/lib/dry/types/fn_container.rb +1 -1
- data/lib/dry/types/hash.rb +9 -15
- data/lib/dry/types/hash/constructor.rb +1 -1
- data/lib/dry/types/inflector.rb +1 -1
- data/lib/dry/types/json.rb +15 -15
- data/lib/dry/types/lax.rb +2 -2
- data/lib/dry/types/map.rb +2 -2
- data/lib/dry/types/meta.rb +1 -1
- data/lib/dry/types/module.rb +6 -6
- data/lib/dry/types/nominal.rb +10 -11
- data/lib/dry/types/params.rb +30 -28
- data/lib/dry/types/predicate_inferrer.rb +51 -11
- data/lib/dry/types/predicate_registry.rb +1 -1
- data/lib/dry/types/primitive_inferrer.rb +1 -1
- data/lib/dry/types/printer.rb +25 -25
- data/lib/dry/types/result.rb +1 -1
- data/lib/dry/types/schema.rb +5 -13
- data/lib/dry/types/schema/key.rb +4 -4
- data/lib/dry/types/spec/types.rb +57 -45
- data/lib/dry/types/sum.rb +3 -3
- data/lib/dry/types/type.rb +1 -1
- data/lib/dry/types/version.rb +1 -1
- metadata +9 -22
data/lib/dry/types/default.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dry/types/decorator"
|
4
4
|
|
5
5
|
module Dry
|
6
6
|
module Types
|
@@ -17,6 +17,11 @@ module Dry
|
|
17
17
|
def evaluate
|
18
18
|
value.call(type)
|
19
19
|
end
|
20
|
+
|
21
|
+
# @return [true]
|
22
|
+
def callable?
|
23
|
+
true
|
24
|
+
end
|
20
25
|
end
|
21
26
|
|
22
27
|
include Type
|
@@ -111,6 +116,13 @@ module Dry
|
|
111
116
|
Undefined.default(type.call_safe(input, &block)) { evaluate }
|
112
117
|
end
|
113
118
|
end
|
119
|
+
|
120
|
+
# @return [false]
|
121
|
+
#
|
122
|
+
# @api private
|
123
|
+
def callable?
|
124
|
+
false
|
125
|
+
end
|
114
126
|
end
|
115
127
|
end
|
116
128
|
end
|
data/lib/dry/types/enum.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dry/types/decorator"
|
4
4
|
|
5
5
|
module Dry
|
6
6
|
module Types
|
@@ -58,8 +58,8 @@ module Dry
|
|
58
58
|
|
59
59
|
# @api private
|
60
60
|
def default(*)
|
61
|
-
raise
|
62
|
-
|
61
|
+
raise ".enum(*values).default(value) is not supported. Call "\
|
62
|
+
".default(value).enum(*values) instead"
|
63
63
|
end
|
64
64
|
|
65
65
|
# Check whether a value is in the enum
|
data/lib/dry/types/errors.rb
CHANGED
data/lib/dry/types/extensions.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
Dry::Types.register_extension(:maybe) do
|
4
|
-
require
|
4
|
+
require "dry/types/extensions/maybe"
|
5
5
|
end
|
6
6
|
|
7
7
|
Dry::Types.register_extension(:monads) do
|
8
|
-
require
|
8
|
+
require "dry/types/extensions/monads"
|
9
9
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "dry/monads/maybe"
|
4
|
+
require "dry/types/decorator"
|
5
5
|
|
6
6
|
module Dry
|
7
7
|
module Types
|
@@ -79,7 +79,7 @@ module Dry
|
|
79
79
|
# @api public
|
80
80
|
def default(value)
|
81
81
|
if value.nil?
|
82
|
-
raise ArgumentError,
|
82
|
+
raise ArgumentError, "nil cannot be used as a default of a maybe type"
|
83
83
|
else
|
84
84
|
super
|
85
85
|
end
|
@@ -93,7 +93,7 @@ module Dry
|
|
93
93
|
#
|
94
94
|
# @api public
|
95
95
|
def maybe
|
96
|
-
Maybe.new(Types[
|
96
|
+
Maybe.new(Types["nil"] | self)
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
data/lib/dry/types/hash.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dry/types/hash/constructor"
|
4
4
|
|
5
5
|
module Dry
|
6
6
|
module Types
|
@@ -8,7 +8,7 @@ module Dry
|
|
8
8
|
#
|
9
9
|
# @api public
|
10
10
|
class Hash < Nominal
|
11
|
-
NOT_REQUIRED = {
|
11
|
+
NOT_REQUIRED = {required: false}.freeze
|
12
12
|
|
13
13
|
# @overload schema(type_map, meta = EMPTY_HASH)
|
14
14
|
# @param [{Symbol => Dry::Types::Nominal}] type_map
|
@@ -50,8 +50,8 @@ module Dry
|
|
50
50
|
|
51
51
|
# @api private
|
52
52
|
def weak(*)
|
53
|
-
raise
|
54
|
-
|
53
|
+
raise "Support for old hash schemas was removed, please refer to the CHANGELOG "\
|
54
|
+
"on how to proceed with the new API https://github.com/dry-rb/dry-types/blob/master/CHANGELOG.md"
|
55
55
|
end
|
56
56
|
alias_method :permissive, :weak
|
57
57
|
alias_method :strict, :weak
|
@@ -69,7 +69,7 @@ module Dry
|
|
69
69
|
def with_type_transform(proc = nil, &block)
|
70
70
|
fn = proc || block
|
71
71
|
|
72
|
-
raise ArgumentError,
|
72
|
+
raise ArgumentError, "a block or callable argument is required" if fn.nil?
|
73
73
|
|
74
74
|
handle = Dry::Types::FnContainer.register(fn)
|
75
75
|
with(type_transform_fn: handle)
|
@@ -95,13 +95,7 @@ module Dry
|
|
95
95
|
#
|
96
96
|
# @api public
|
97
97
|
def to_ast(meta: true)
|
98
|
-
|
99
|
-
options.slice(:type_transform_fn)
|
100
|
-
else
|
101
|
-
options.select { |k, _| k == :type_transform_fn }
|
102
|
-
end
|
103
|
-
|
104
|
-
[:hash, [opts, meta ? self.meta : EMPTY_HASH]]
|
98
|
+
[:hash, [options.slice(:type_transform_fn), meta ? self.meta : EMPTY_HASH]]
|
105
99
|
end
|
106
100
|
|
107
101
|
private
|
@@ -129,7 +123,7 @@ module Dry
|
|
129
123
|
|
130
124
|
# @api private
|
131
125
|
def key_name(key)
|
132
|
-
if key.to_s.end_with?(
|
126
|
+
if key.to_s.end_with?("?")
|
133
127
|
[key.to_s.chop.to_sym, NOT_REQUIRED]
|
134
128
|
else
|
135
129
|
[key, EMPTY_HASH]
|
@@ -139,5 +133,5 @@ module Dry
|
|
139
133
|
end
|
140
134
|
end
|
141
135
|
|
142
|
-
require
|
143
|
-
require
|
136
|
+
require "dry/types/schema/key"
|
137
|
+
require "dry/types/schema"
|
data/lib/dry/types/inflector.rb
CHANGED
data/lib/dry/types/json.rb
CHANGED
@@ -1,35 +1,35 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dry/types/coercions/json"
|
4
4
|
|
5
5
|
module Dry
|
6
6
|
module Types
|
7
|
-
register(
|
8
|
-
self[
|
7
|
+
register("json.nil") do
|
8
|
+
self["nominal.nil"].constructor(Coercions::JSON.method(:to_nil))
|
9
9
|
end
|
10
10
|
|
11
|
-
register(
|
12
|
-
self[
|
11
|
+
register("json.date") do
|
12
|
+
self["nominal.date"].constructor(Coercions::JSON.method(:to_date))
|
13
13
|
end
|
14
14
|
|
15
|
-
register(
|
16
|
-
self[
|
15
|
+
register("json.date_time") do
|
16
|
+
self["nominal.date_time"].constructor(Coercions::JSON.method(:to_date_time))
|
17
17
|
end
|
18
18
|
|
19
|
-
register(
|
20
|
-
self[
|
19
|
+
register("json.time") do
|
20
|
+
self["nominal.time"].constructor(Coercions::JSON.method(:to_time))
|
21
21
|
end
|
22
22
|
|
23
|
-
register(
|
24
|
-
self[
|
23
|
+
register("json.decimal") do
|
24
|
+
self["nominal.decimal"].constructor(Coercions::JSON.method(:to_decimal))
|
25
25
|
end
|
26
26
|
|
27
|
-
register(
|
28
|
-
self[
|
27
|
+
register("json.symbol") do
|
28
|
+
self["nominal.symbol"].constructor(Coercions::JSON.method(:to_symbol))
|
29
29
|
end
|
30
30
|
|
31
|
-
register(
|
31
|
+
register("json.array") { self["array"] }
|
32
32
|
|
33
|
-
register(
|
33
|
+
register("json.hash") { self["hash"] }
|
34
34
|
end
|
35
35
|
end
|
data/lib/dry/types/lax.rb
CHANGED
data/lib/dry/types/map.rb
CHANGED
@@ -21,7 +21,7 @@ module Dry
|
|
21
21
|
#
|
22
22
|
# @api public
|
23
23
|
class Map < Nominal
|
24
|
-
def initialize(_primitive, key_type: Types[
|
24
|
+
def initialize(_primitive, key_type: Types["any"], value_type: Types["any"], meta: EMPTY_HASH)
|
25
25
|
super(_primitive, key_type: key_type, value_type: value_type, meta: meta)
|
26
26
|
end
|
27
27
|
|
@@ -43,7 +43,7 @@ module Dry
|
|
43
43
|
#
|
44
44
|
# @api public
|
45
45
|
def name
|
46
|
-
|
46
|
+
"Map"
|
47
47
|
end
|
48
48
|
|
49
49
|
# @param [Hash] hash
|
data/lib/dry/types/meta.rb
CHANGED
data/lib/dry/types/module.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "dry/core/deprecations"
|
4
|
+
require "dry/types/builder_methods"
|
5
5
|
|
6
6
|
module Dry
|
7
7
|
module Types
|
@@ -31,7 +31,7 @@ module Dry
|
|
31
31
|
base.instance_exec(const_get(:Nominal, false)) do |nominal|
|
32
32
|
extend Dry::Core::Deprecations[:'dry-types']
|
33
33
|
const_set(:Definition, nominal)
|
34
|
-
deprecate_constant(:Definition, message:
|
34
|
+
deprecate_constant(:Definition, message: "Nominal")
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
@@ -69,7 +69,7 @@ module Dry
|
|
69
69
|
def registry_tree
|
70
70
|
@registry_tree ||= @registry.keys.each_with_object({}) { |key, tree|
|
71
71
|
type = @registry[key]
|
72
|
-
*modules, const_name = key.split(
|
72
|
+
*modules, const_name = key.split(".").map { |part|
|
73
73
|
Inflector.camelize(part).to_sym
|
74
74
|
}
|
75
75
|
next if modules.empty?
|
@@ -87,14 +87,14 @@ module Dry
|
|
87
87
|
referenced.concat(aliases.keys)
|
88
88
|
|
89
89
|
known = @registry.keys.map { |k|
|
90
|
-
ns, *path = k.split(
|
90
|
+
ns, *path = k.split(".")
|
91
91
|
ns.to_sym unless path.empty?
|
92
92
|
}.compact.uniq
|
93
93
|
|
94
94
|
(referenced.uniq - known).each do |name|
|
95
95
|
raise ArgumentError,
|
96
96
|
"#{name.inspect} is not a known type namespace. "\
|
97
|
-
"Supported options are #{known.map(&:inspect).join(
|
97
|
+
"Supported options are #{known.map(&:inspect).join(", ")}"
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
data/lib/dry/types/nominal.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
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
8
|
|
9
9
|
module Dry
|
10
10
|
module Types
|
@@ -98,7 +98,6 @@ module Dry
|
|
98
98
|
end
|
99
99
|
|
100
100
|
# @param [Object] input
|
101
|
-
# @param [#call,nil] block
|
102
101
|
#
|
103
102
|
# @yieldparam [Failure] failure
|
104
103
|
# @yieldreturn [Result]
|
@@ -126,7 +125,7 @@ module Dry
|
|
126
125
|
#
|
127
126
|
# @api public
|
128
127
|
def failure(input, error)
|
129
|
-
raise ArgumentError,
|
128
|
+
raise ArgumentError, "error must be a CoercionError" unless error.is_a?(CoercionError)
|
130
129
|
|
131
130
|
Result::Failure.new(input, error)
|
132
131
|
end
|
@@ -201,10 +200,10 @@ module Dry
|
|
201
200
|
|
202
201
|
extend Dry::Core::Deprecations[:'dry-types']
|
203
202
|
Definition = Nominal
|
204
|
-
deprecate_constant(:Definition, message:
|
203
|
+
deprecate_constant(:Definition, message: "Nominal")
|
205
204
|
end
|
206
205
|
end
|
207
206
|
|
208
|
-
require
|
209
|
-
require
|
210
|
-
require
|
207
|
+
require "dry/types/array"
|
208
|
+
require "dry/types/hash"
|
209
|
+
require "dry/types/map"
|
data/lib/dry/types/params.rb
CHANGED
@@ -1,65 +1,67 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dry/types/coercions/params"
|
4
4
|
|
5
5
|
module Dry
|
6
6
|
module Types
|
7
|
-
register(
|
8
|
-
self[
|
7
|
+
register("params.nil") do
|
8
|
+
self["nominal.nil"].constructor(Coercions::Params.method(:to_nil))
|
9
9
|
end
|
10
10
|
|
11
|
-
register(
|
12
|
-
self[
|
11
|
+
register("params.date") do
|
12
|
+
self["nominal.date"].constructor(Coercions::Params.method(:to_date))
|
13
13
|
end
|
14
14
|
|
15
|
-
register(
|
16
|
-
self[
|
15
|
+
register("params.date_time") do
|
16
|
+
self["nominal.date_time"].constructor(Coercions::Params.method(:to_date_time))
|
17
17
|
end
|
18
18
|
|
19
|
-
register(
|
20
|
-
self[
|
19
|
+
register("params.time") do
|
20
|
+
self["nominal.time"].constructor(Coercions::Params.method(:to_time))
|
21
21
|
end
|
22
22
|
|
23
|
-
register(
|
24
|
-
self[
|
23
|
+
register("params.true") do
|
24
|
+
self["nominal.true"].constructor(Coercions::Params.method(:to_true))
|
25
25
|
end
|
26
26
|
|
27
|
-
register(
|
28
|
-
self[
|
27
|
+
register("params.false") do
|
28
|
+
self["nominal.false"].constructor(Coercions::Params.method(:to_false))
|
29
29
|
end
|
30
30
|
|
31
|
-
register(
|
32
|
-
self[
|
31
|
+
register("params.bool") do
|
32
|
+
self["params.true"] | self["params.false"]
|
33
33
|
end
|
34
34
|
|
35
|
-
register(
|
36
|
-
self[
|
35
|
+
register("params.integer") do
|
36
|
+
self["nominal.integer"].constructor(Coercions::Params.method(:to_int))
|
37
37
|
end
|
38
38
|
|
39
|
-
register(
|
40
|
-
self[
|
39
|
+
register("params.float") do
|
40
|
+
self["nominal.float"].constructor(Coercions::Params.method(:to_float))
|
41
41
|
end
|
42
42
|
|
43
|
-
register(
|
44
|
-
self[
|
43
|
+
register("params.decimal") do
|
44
|
+
self["nominal.decimal"].constructor(Coercions::Params.method(:to_decimal))
|
45
45
|
end
|
46
46
|
|
47
|
-
register(
|
48
|
-
self[
|
47
|
+
register("params.array") do
|
48
|
+
self["nominal.array"].constructor(Coercions::Params.method(:to_ary))
|
49
49
|
end
|
50
50
|
|
51
|
-
register(
|
52
|
-
self[
|
51
|
+
register("params.hash") do
|
52
|
+
self["nominal.hash"].constructor(Coercions::Params.method(:to_hash))
|
53
53
|
end
|
54
54
|
|
55
|
-
register(
|
56
|
-
self[
|
55
|
+
register("params.symbol") do
|
56
|
+
self["nominal.symbol"].constructor(Coercions::Params.method(:to_symbol))
|
57
57
|
end
|
58
58
|
|
59
|
+
register("params.string", self["string"])
|
60
|
+
|
59
61
|
COERCIBLE.each_key do |name|
|
60
62
|
next if name.equal?(:string)
|
61
63
|
|
62
|
-
register("optional.params.#{name}", self[
|
64
|
+
register("optional.params.#{name}", self["params.nil"] | self["params.#{name}"])
|
63
65
|
end
|
64
66
|
end
|
65
67
|
end
|