dry-types 0.14.1 → 1.5.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 +4 -4
- data/CHANGELOG.md +631 -134
- data/LICENSE +17 -17
- data/README.md +15 -13
- data/dry-types.gemspec +27 -30
- data/lib/dry/types/any.rb +32 -12
- data/lib/dry/types/array/constructor.rb +32 -0
- data/lib/dry/types/array/member.rb +75 -16
- data/lib/dry/types/array.rb +19 -6
- data/lib/dry/types/builder.rb +131 -15
- data/lib/dry/types/builder_methods.rb +49 -20
- data/lib/dry/types/coercions/json.rb +43 -7
- data/lib/dry/types/coercions/params.rb +118 -31
- data/lib/dry/types/coercions.rb +76 -22
- data/lib/dry/types/compat.rb +0 -2
- data/lib/dry/types/compiler.rb +56 -41
- data/lib/dry/types/constrained/coercible.rb +36 -6
- data/lib/dry/types/constrained.rb +81 -32
- data/lib/dry/types/constraints.rb +18 -4
- data/lib/dry/types/constructor/function.rb +216 -0
- data/lib/dry/types/constructor/wrapper.rb +94 -0
- data/lib/dry/types/constructor.rb +126 -56
- data/lib/dry/types/container.rb +7 -0
- data/lib/dry/types/core.rb +54 -21
- data/lib/dry/types/decorator.rb +38 -17
- data/lib/dry/types/default.rb +61 -16
- data/lib/dry/types/enum.rb +43 -20
- data/lib/dry/types/errors.rb +75 -9
- data/lib/dry/types/extensions/maybe.rb +74 -16
- data/lib/dry/types/extensions/monads.rb +29 -0
- data/lib/dry/types/extensions.rb +7 -1
- data/lib/dry/types/fn_container.rb +6 -1
- data/lib/dry/types/hash/constructor.rb +33 -0
- data/lib/dry/types/hash.rb +86 -67
- data/lib/dry/types/inflector.rb +3 -1
- data/lib/dry/types/json.rb +18 -16
- data/lib/dry/types/lax.rb +75 -0
- data/lib/dry/types/map.rb +76 -33
- data/lib/dry/types/meta.rb +51 -0
- data/lib/dry/types/module.rb +120 -0
- data/lib/dry/types/nominal.rb +210 -0
- data/lib/dry/types/options.rb +13 -26
- data/lib/dry/types/params.rb +39 -25
- data/lib/dry/types/predicate_inferrer.rb +238 -0
- data/lib/dry/types/predicate_registry.rb +34 -0
- data/lib/dry/types/primitive_inferrer.rb +97 -0
- data/lib/dry/types/printable.rb +16 -0
- data/lib/dry/types/printer.rb +315 -0
- data/lib/dry/types/result.rb +29 -3
- data/lib/dry/types/schema/key.rb +156 -0
- data/lib/dry/types/schema.rb +408 -0
- data/lib/dry/types/spec/types.rb +103 -33
- data/lib/dry/types/sum.rb +84 -35
- data/lib/dry/types/type.rb +49 -0
- data/lib/dry/types/version.rb +3 -1
- data/lib/dry/types.rb +156 -76
- data/lib/dry-types.rb +3 -1
- metadata +65 -78
- data/.gitignore +0 -10
- data/.rspec +0 -2
- data/.travis.yml +0 -27
- data/.yardopts +0 -5
- data/CONTRIBUTING.md +0 -29
- data/Gemfile +0 -24
- data/Rakefile +0 -20
- data/benchmarks/hash_schemas.rb +0 -51
- data/lib/dry/types/compat/form_types.rb +0 -27
- data/lib/dry/types/compat/int.rb +0 -14
- data/lib/dry/types/definition.rb +0 -113
- data/lib/dry/types/hash/schema.rb +0 -199
- data/lib/dry/types/hash/schema_builder.rb +0 -75
- data/lib/dry/types/safe.rb +0 -59
- data/log/.gitkeep +0 -0
@@ -0,0 +1,315 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Dry
|
4
|
+
module Types
|
5
|
+
# @api private
|
6
|
+
class Printer
|
7
|
+
MAPPING = {
|
8
|
+
Nominal => :visit_nominal,
|
9
|
+
Constructor => :visit_constructor,
|
10
|
+
Constrained => :visit_constrained,
|
11
|
+
Constrained::Coercible => :visit_constrained,
|
12
|
+
Hash => :visit_hash,
|
13
|
+
Schema => :visit_schema,
|
14
|
+
Schema::Key => :visit_key,
|
15
|
+
Map => :visit_map,
|
16
|
+
Array => :visit_array,
|
17
|
+
Array::Member => :visit_array_member,
|
18
|
+
Lax => :visit_lax,
|
19
|
+
Enum => :visit_enum,
|
20
|
+
Default => :visit_default,
|
21
|
+
Default::Callable => :visit_default,
|
22
|
+
Sum => :visit_sum,
|
23
|
+
Sum::Constrained => :visit_sum,
|
24
|
+
Any.class => :visit_any
|
25
|
+
}
|
26
|
+
|
27
|
+
def call(type)
|
28
|
+
output = "".dup
|
29
|
+
visit(type) { |str| output << str }
|
30
|
+
"#<Dry::Types[#{output}]>"
|
31
|
+
end
|
32
|
+
|
33
|
+
def visit(type, &block)
|
34
|
+
print_with = MAPPING.fetch(type.class) do
|
35
|
+
if type.class < Constructor
|
36
|
+
:visit_constructor
|
37
|
+
elsif type.is_a?(Type)
|
38
|
+
return yield type.inspect
|
39
|
+
else
|
40
|
+
raise ArgumentError, "Do not know how to print #{type.class}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
send(print_with, type, &block)
|
44
|
+
end
|
45
|
+
|
46
|
+
def visit_any(_)
|
47
|
+
yield "Any"
|
48
|
+
end
|
49
|
+
|
50
|
+
def visit_array(type)
|
51
|
+
visit_options(EMPTY_HASH, type.meta) do |opts|
|
52
|
+
yield "Array#{opts}"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def visit_array_member(array)
|
57
|
+
visit(array.member) do |type|
|
58
|
+
visit_options(EMPTY_HASH, array.meta) do |opts|
|
59
|
+
yield "Array<#{type}#{opts}>"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def visit_constructor(constructor)
|
65
|
+
visit(constructor.type) do |type|
|
66
|
+
visit_callable(constructor.fn.fn) do |fn|
|
67
|
+
options = constructor.options.dup
|
68
|
+
options.delete(:fn)
|
69
|
+
|
70
|
+
visit_options(options) do |opts|
|
71
|
+
yield "Constructor<#{type} fn=#{fn}#{opts}>"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def visit_constrained(constrained)
|
78
|
+
visit(constrained.type) do |type|
|
79
|
+
options = constrained.options.dup
|
80
|
+
rule = options.delete(:rule)
|
81
|
+
|
82
|
+
visit_options(options) do |_opts|
|
83
|
+
yield "Constrained<#{type} rule=[#{rule}]>"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def visit_schema(schema)
|
89
|
+
options = schema.options.dup
|
90
|
+
size = schema.count
|
91
|
+
key_fn_str = ""
|
92
|
+
type_fn_str = ""
|
93
|
+
strict_str = ""
|
94
|
+
|
95
|
+
strict_str = "strict " if options.delete(:strict)
|
96
|
+
|
97
|
+
if key_fn = options.delete(:key_transform_fn)
|
98
|
+
visit_callable(key_fn) do |fn|
|
99
|
+
key_fn_str = "key_fn=#{fn} "
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
if type_fn = options.delete(:type_transform_fn)
|
104
|
+
visit_callable(type_fn) do |fn|
|
105
|
+
type_fn_str = "type_fn=#{fn} "
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
keys = options.delete(:keys)
|
110
|
+
|
111
|
+
visit_options(options, schema.meta) do |opts|
|
112
|
+
opts = "#{opts[1..-1]} " unless opts.empty?
|
113
|
+
schema_parameters = "#{key_fn_str}#{type_fn_str}#{strict_str}#{opts}"
|
114
|
+
|
115
|
+
header = "Schema<#{schema_parameters}keys={"
|
116
|
+
|
117
|
+
if size.zero?
|
118
|
+
yield "#{header}}>"
|
119
|
+
else
|
120
|
+
yield header.dup << keys.map { |key|
|
121
|
+
visit(key) { |type| type }
|
122
|
+
}.join(" ") << "}>"
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def visit_map(map)
|
128
|
+
visit(map.key_type) do |key|
|
129
|
+
visit(map.value_type) do |value|
|
130
|
+
options = map.options.dup
|
131
|
+
options.delete(:key_type)
|
132
|
+
options.delete(:value_type)
|
133
|
+
|
134
|
+
visit_options(options) do |_opts|
|
135
|
+
yield "Map<#{key} => #{value}>"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def visit_key(key)
|
142
|
+
visit(key.type) do |type|
|
143
|
+
if key.required?
|
144
|
+
yield "#{key.name}: #{type}"
|
145
|
+
else
|
146
|
+
yield "#{key.name}?: #{type}"
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def visit_sum(sum)
|
152
|
+
visit_sum_constructors(sum) do |constructors|
|
153
|
+
visit_options(sum.options, sum.meta) do |opts|
|
154
|
+
yield "Sum<#{constructors}#{opts}>"
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def visit_sum_constructors(sum)
|
160
|
+
case sum.left
|
161
|
+
when Sum
|
162
|
+
visit_sum_constructors(sum.left) do |left|
|
163
|
+
case sum.right
|
164
|
+
when Sum
|
165
|
+
visit_sum_constructors(sum.right) do |right|
|
166
|
+
yield "#{left} | #{right}"
|
167
|
+
end
|
168
|
+
else
|
169
|
+
visit(sum.right) do |right|
|
170
|
+
yield "#{left} | #{right}"
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
else
|
175
|
+
visit(sum.left) do |left|
|
176
|
+
case sum.right
|
177
|
+
when Sum
|
178
|
+
visit_sum_constructors(sum.right) do |right|
|
179
|
+
yield "#{left} | #{right}"
|
180
|
+
end
|
181
|
+
else
|
182
|
+
visit(sum.right) do |right|
|
183
|
+
yield "#{left} | #{right}"
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def visit_enum(enum)
|
191
|
+
visit(enum.type) do |type|
|
192
|
+
options = enum.options.dup
|
193
|
+
mapping = options.delete(:mapping)
|
194
|
+
|
195
|
+
visit_options(options) do |opts|
|
196
|
+
if mapping == enum.inverted_mapping
|
197
|
+
values = mapping.values.map(&:inspect).join(", ")
|
198
|
+
yield "Enum<#{type} values={#{values}}#{opts}>"
|
199
|
+
else
|
200
|
+
mapping_str = mapping.map { |key, value|
|
201
|
+
"#{key.inspect}=>#{value.inspect}"
|
202
|
+
}.join(", ")
|
203
|
+
yield "Enum<#{type} mapping={#{mapping_str}}#{opts}>"
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
def visit_default(default)
|
210
|
+
visit(default.type) do |type|
|
211
|
+
visit_options(default.options) do |opts|
|
212
|
+
if default.is_a?(Default::Callable)
|
213
|
+
visit_callable(default.value) do |fn|
|
214
|
+
yield "Default<#{type} value_fn=#{fn}#{opts}>"
|
215
|
+
end
|
216
|
+
else
|
217
|
+
yield "Default<#{type} value=#{default.value.inspect}#{opts}>"
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
def visit_nominal(type)
|
224
|
+
visit_options(type.options, type.meta) do |opts|
|
225
|
+
yield "Nominal<#{type.primitive}#{opts}>"
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
def visit_lax(lax)
|
230
|
+
visit(lax.type) do |type|
|
231
|
+
yield "Lax<#{type}>"
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
def visit_hash(hash)
|
236
|
+
options = hash.options.dup
|
237
|
+
type_fn_str = ""
|
238
|
+
|
239
|
+
if type_fn = options.delete(:type_transform_fn)
|
240
|
+
visit_callable(type_fn) do |fn|
|
241
|
+
type_fn_str = "type_fn=#{fn}"
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
visit_options(options, hash.meta) do |opts|
|
246
|
+
if opts.empty? && type_fn_str.empty?
|
247
|
+
yield "Hash"
|
248
|
+
else
|
249
|
+
yield "Hash<#{type_fn_str}#{opts}>"
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
def visit_callable(callable)
|
255
|
+
fn = callable.is_a?(String) ? FnContainer[callable] : callable
|
256
|
+
|
257
|
+
case fn
|
258
|
+
when ::Method
|
259
|
+
yield "#{fn.receiver}.#{fn.name}"
|
260
|
+
when ::Proc
|
261
|
+
path, line = fn.source_location
|
262
|
+
|
263
|
+
if line&.zero?
|
264
|
+
yield ".#{path}"
|
265
|
+
elsif path
|
266
|
+
yield "#{path.sub(Dir.pwd + "/", EMPTY_STRING)}:#{line}"
|
267
|
+
else
|
268
|
+
match = fn.to_s.match(/\A#<Proc:0x\h+\(&:(?<name>\w+)\)(:? \(lambda\))?>\z/)
|
269
|
+
|
270
|
+
if match
|
271
|
+
yield ".#{match[:name]}"
|
272
|
+
elsif fn.lambda?
|
273
|
+
yield "(lambda)"
|
274
|
+
else
|
275
|
+
yield "(proc)"
|
276
|
+
end
|
277
|
+
end
|
278
|
+
else
|
279
|
+
call = fn.method(:call)
|
280
|
+
|
281
|
+
if call.owner == fn.class
|
282
|
+
yield "#{fn.class}#call"
|
283
|
+
else
|
284
|
+
yield "#{fn}.call"
|
285
|
+
end
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
def visit_options(options, meta = EMPTY_HASH)
|
290
|
+
if options.empty? && meta.empty?
|
291
|
+
yield ""
|
292
|
+
else
|
293
|
+
opts = options.empty? ? "" : " options=#{options.inspect}"
|
294
|
+
|
295
|
+
if meta.empty?
|
296
|
+
yield opts
|
297
|
+
else
|
298
|
+
values = meta.map do |key, value|
|
299
|
+
case key
|
300
|
+
when Symbol
|
301
|
+
"#{key}: #{value.inspect}"
|
302
|
+
else
|
303
|
+
"#{key.inspect}=>#{value.inspect}"
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
yield "#{opts} meta={#{values.join(", ")}}"
|
308
|
+
end
|
309
|
+
end
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
PRINTER = Printer.new.freeze
|
314
|
+
end
|
315
|
+
end
|
data/lib/dry/types/result.rb
CHANGED
@@ -1,54 +1,80 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/core/equalizer"
|
2
4
|
|
3
5
|
module Dry
|
4
6
|
module Types
|
7
|
+
# Result class used by {Type#try}
|
8
|
+
#
|
9
|
+
# @api public
|
5
10
|
class Result
|
6
|
-
include Dry::Equalizer(:input)
|
11
|
+
include ::Dry::Equalizer(:input, immutable: true)
|
7
12
|
|
8
13
|
# @return [Object]
|
9
14
|
attr_reader :input
|
10
15
|
|
11
16
|
# @param [Object] input
|
17
|
+
#
|
18
|
+
# @api private
|
12
19
|
def initialize(input)
|
13
20
|
@input = input
|
14
21
|
end
|
15
22
|
|
23
|
+
# Success result
|
24
|
+
#
|
25
|
+
# @api public
|
16
26
|
class Success < Result
|
17
27
|
# @return [true]
|
28
|
+
#
|
29
|
+
# @api public
|
18
30
|
def success?
|
19
31
|
true
|
20
32
|
end
|
21
33
|
|
22
34
|
# @return [false]
|
35
|
+
#
|
36
|
+
# @api public
|
23
37
|
def failure?
|
24
38
|
false
|
25
39
|
end
|
26
40
|
end
|
27
41
|
|
42
|
+
# Failure result
|
43
|
+
#
|
44
|
+
# @api public
|
28
45
|
class Failure < Result
|
29
|
-
include Dry::Equalizer(:input, :error)
|
46
|
+
include ::Dry::Equalizer(:input, :error, immutable: true)
|
30
47
|
|
31
48
|
# @return [#to_s]
|
32
49
|
attr_reader :error
|
33
50
|
|
34
51
|
# @param [Object] input
|
52
|
+
#
|
35
53
|
# @param [#to_s] error
|
54
|
+
#
|
55
|
+
# @api private
|
36
56
|
def initialize(input, error)
|
37
57
|
super(input)
|
38
58
|
@error = error
|
39
59
|
end
|
40
60
|
|
41
61
|
# @return [String]
|
62
|
+
#
|
63
|
+
# @api private
|
42
64
|
def to_s
|
43
65
|
error.to_s
|
44
66
|
end
|
45
67
|
|
46
68
|
# @return [false]
|
69
|
+
#
|
70
|
+
# @api public
|
47
71
|
def success?
|
48
72
|
false
|
49
73
|
end
|
50
74
|
|
51
75
|
# @return [true]
|
76
|
+
#
|
77
|
+
# @api public
|
52
78
|
def failure?
|
53
79
|
true
|
54
80
|
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/core/equalizer"
|
4
|
+
require "dry/core/deprecations"
|
5
|
+
|
6
|
+
module Dry
|
7
|
+
module Types
|
8
|
+
# Schema is a hash with explicit member types defined
|
9
|
+
#
|
10
|
+
# @api public
|
11
|
+
class Schema < Hash
|
12
|
+
# Proxy type for schema keys. Contains only key name and
|
13
|
+
# whether it's required or not. All other calls deletaged
|
14
|
+
# to the wrapped type.
|
15
|
+
#
|
16
|
+
# @see Dry::Types::Schema
|
17
|
+
class Key
|
18
|
+
extend ::Dry::Core::Deprecations[:'dry-types']
|
19
|
+
include Type
|
20
|
+
include Dry::Equalizer(:name, :type, :options, inspect: false, immutable: true)
|
21
|
+
include Decorator
|
22
|
+
include Builder
|
23
|
+
include Printable
|
24
|
+
|
25
|
+
# @return [Symbol]
|
26
|
+
attr_reader :name
|
27
|
+
|
28
|
+
# @api private
|
29
|
+
def initialize(type, name, required: Undefined, **options)
|
30
|
+
required = Undefined.default(required) do
|
31
|
+
type.meta.fetch(:required) { !type.meta.fetch(:omittable, false) }
|
32
|
+
end
|
33
|
+
|
34
|
+
unless name.is_a?(::Symbol)
|
35
|
+
raise ArgumentError, "Schemas can only contain symbol keys, #{name.inspect} given"
|
36
|
+
end
|
37
|
+
|
38
|
+
super(type, name, required: required, **options)
|
39
|
+
@name = name
|
40
|
+
end
|
41
|
+
|
42
|
+
# @api private
|
43
|
+
def call_safe(input, &block)
|
44
|
+
type.call_safe(input, &block)
|
45
|
+
end
|
46
|
+
|
47
|
+
# @api private
|
48
|
+
def call_unsafe(input)
|
49
|
+
type.call_unsafe(input)
|
50
|
+
end
|
51
|
+
|
52
|
+
# @see Dry::Types::Nominal#try
|
53
|
+
#
|
54
|
+
# @api public
|
55
|
+
def try(input, &block)
|
56
|
+
type.try(input, &block)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Whether the key is required in schema input
|
60
|
+
#
|
61
|
+
# @return [Boolean]
|
62
|
+
#
|
63
|
+
# @api public
|
64
|
+
def required?
|
65
|
+
options.fetch(:required)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Control whether the key is required
|
69
|
+
#
|
70
|
+
# @overload required
|
71
|
+
# @return [Boolean]
|
72
|
+
#
|
73
|
+
# @overload required(required)
|
74
|
+
# Change key's "requireness"
|
75
|
+
#
|
76
|
+
# @param [Boolean] required New value
|
77
|
+
# @return [Dry::Types::Schema::Key]
|
78
|
+
#
|
79
|
+
# @api public
|
80
|
+
def required(required = Undefined)
|
81
|
+
if Undefined.equal?(required)
|
82
|
+
options.fetch(:required)
|
83
|
+
else
|
84
|
+
with(required: required)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Make key not required
|
89
|
+
#
|
90
|
+
# @return [Dry::Types::Schema::Key]
|
91
|
+
#
|
92
|
+
# @api public
|
93
|
+
def omittable
|
94
|
+
required(false)
|
95
|
+
end
|
96
|
+
|
97
|
+
# Turn key into a lax type. Lax types are not strict hence such keys are not required
|
98
|
+
#
|
99
|
+
# @return [Lax]
|
100
|
+
#
|
101
|
+
# @api public
|
102
|
+
def lax
|
103
|
+
__new__(type.lax).required(false)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Make wrapped type optional
|
107
|
+
#
|
108
|
+
# @return [Key]
|
109
|
+
#
|
110
|
+
# @api public
|
111
|
+
def optional
|
112
|
+
__new__(type.optional)
|
113
|
+
end
|
114
|
+
|
115
|
+
# Dump to internal AST representation
|
116
|
+
#
|
117
|
+
# @return [Array]
|
118
|
+
#
|
119
|
+
# @api public
|
120
|
+
def to_ast(meta: true)
|
121
|
+
[
|
122
|
+
:key,
|
123
|
+
[
|
124
|
+
name,
|
125
|
+
required,
|
126
|
+
type.to_ast(meta: meta)
|
127
|
+
]
|
128
|
+
]
|
129
|
+
end
|
130
|
+
|
131
|
+
# @see Dry::Types::Meta#meta
|
132
|
+
#
|
133
|
+
# @api public
|
134
|
+
def meta(data = Undefined)
|
135
|
+
if Undefined.equal?(data) || !data.key?(:omittable)
|
136
|
+
super
|
137
|
+
else
|
138
|
+
self.class.warn(
|
139
|
+
"Using meta for making schema keys is deprecated, " \
|
140
|
+
"please use .omittable or .required(false) instead" \
|
141
|
+
"\n" + Core::Deprecations::STACK.()
|
142
|
+
)
|
143
|
+
super.required(!data[:omittable])
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
private
|
148
|
+
|
149
|
+
# @api private
|
150
|
+
def decorate?(response)
|
151
|
+
response.is_a?(Type)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|