dry-schema 1.10.1 → 1.10.2

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: 8aa8d227152a712ff8580d62686ad5a4b83b4439dc8d58f42651b869e203697c
4
- data.tar.gz: e22028010d0ac11567a8a615725496f77db8a2acd107350363b20174da01a20c
3
+ metadata.gz: 0e0f30051a5014afc7cf0dc8f66f23a20f05e83dd3b2a970491d85d84e5be988
4
+ data.tar.gz: 771b790fd369f36abf86367a95afaac387825df4b041bdc325c02f7f41cd3487
5
5
  SHA512:
6
- metadata.gz: ad3350414c764971f4c0e69ca07044901d67488625c691f2a7396c6d17b33d31a2714e8959d5f07598c03894883b7854090c6d77b182f7569acc7a32b43be3d3
7
- data.tar.gz: 93320abcdadd4f3c48666507f829d4aaba2c9fc5ae181d2cd68f44e28eb850a8ead7adec29c7be935e17fe4112df09d17ac735dac9f50c49d45e5031f15d1ce6
6
+ metadata.gz: 12759b86883bd94e85480124539c44a3280491935a86addacd02c799696cce5d5e1cec54238b17d89c05cbe704e2394ac4749c9349e9f8e1bbe6ed92f344af73
7
+ data.tar.gz: 57b2a77a57ef8587a3a520eeecc7cc3dd5d766a92ba5096ed2306c0e466ee0c9580e7550c3ef475e88eb61a58ce7c92de3860442e29455f5590ccfa0bd7b5eda
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  <!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
2
2
 
3
+ ## 1.10.2 2022-08-23
4
+
5
+
6
+ ### Fixed
7
+
8
+ - Fix value coercion for composed schemas (via #421) (@robhanlon22)
9
+
10
+
11
+ [Compare v1.10.1...v1.10.2](https://github.com/dry-rb/dry-schema/compare/v1.10.1...v1.10.2)
12
+
3
13
  ## 1.10.1 2022-08-22
4
14
 
5
15
 
@@ -288,13 +288,20 @@ module Dry
288
288
 
289
289
  # Return type schema used by the value coercer
290
290
  #
291
- # @return [Dry::Types::Safe]
291
+ # @return [Dry::Types::Lax]
292
292
  #
293
293
  # @api private
294
294
  def type_schema
295
- our_schema = type_registry["hash"].schema(types).lax
296
- schemas = [*parents.map(&:type_schema), our_schema]
297
- schemas.inject { |result, schema| result.schema(schema.to_a) }
295
+ strict_type_schema.lax
296
+ end
297
+
298
+ # Return type schema used when composing subschemas
299
+ #
300
+ # @return [Dry::Types::Schema]
301
+ #
302
+ # @api private
303
+ def strict_type_schema
304
+ type_registry["hash"].schema(types)
298
305
  end
299
306
 
300
307
  # Return a new DSL instance using the same processor type
@@ -316,7 +323,7 @@ module Dry
316
323
  # @api private
317
324
  def set_type(name, spec)
318
325
  type = resolve_type(spec)
319
- meta = {required: false, maybe: type.optional?}
326
+ meta = {required: true, maybe: type.optional?}
320
327
 
321
328
  @types[name] = type.meta(meta)
322
329
  end
@@ -62,11 +62,11 @@ module Dry
62
62
  schema = definition.call
63
63
  type_schema =
64
64
  if array_type?(parent_type)
65
- build_array_type(parent_type, definition.type_schema)
65
+ build_array_type(parent_type, definition.strict_type_schema)
66
66
  elsif redefined_schema?(args)
67
67
  parent_type.schema(definition.types)
68
68
  else
69
- definition.type_schema
69
+ definition.strict_type_schema
70
70
  end
71
71
  final_type = optional? ? type_schema.optional : type_schema
72
72
 
@@ -30,9 +30,9 @@ module Dry
30
30
 
31
31
  updated_type =
32
32
  if array_type?(current_type)
33
- build_array_type(current_type, schema.type_schema)
33
+ build_array_type(current_type, schema.strict_type_schema)
34
34
  else
35
- schema.type_schema
35
+ schema.strict_type_schema
36
36
  end
37
37
 
38
38
  import_steps(schema)
@@ -138,13 +138,22 @@ module Dry
138
138
 
139
139
  # Return the type schema
140
140
  #
141
- # @return [Dry::Types::Safe]
141
+ # @return [Dry::Types::Lax]
142
142
  #
143
143
  # @api private
144
144
  def type_schema
145
145
  steps.type_schema
146
146
  end
147
147
 
148
+ # Return type schema used when composing subschemas
149
+ #
150
+ # @return [Dry::Types::Schema]
151
+ #
152
+ # @api private
153
+ def strict_type_schema
154
+ schema_dsl.strict_type_schema
155
+ end
156
+
148
157
  # Return the rule applier
149
158
  #
150
159
  # @api private
@@ -27,34 +27,34 @@ module Dry
27
27
 
28
28
  # @api private
29
29
  def call
30
- handlers.fetch(op_class).call
30
+ if op_class <= Dry::Logic::Operations::Or
31
+ merge_or
32
+ elsif op_class <= Dry::Logic::Operations::And
33
+ merge_and
34
+ elsif op_class <= Dry::Logic::Operations::Implication
35
+ merge_implication
36
+ else
37
+ raise ArgumentError, <<~MESSAGE
38
+ Can't merge operations, op_class=#{op_class}
39
+ MESSAGE
40
+ end
31
41
  end
32
42
 
33
43
  private
34
44
 
35
45
  # @api private
36
- def handlers
37
- @handlers ||=
38
- {
39
- Dry::Logic::Operations::Or => method(:handle_or),
40
- Dry::Logic::Operations::And => method(:handle_and),
41
- Dry::Logic::Operations::Implication => method(:handle_implication)
42
- }
43
- end
44
-
45
- # @api private
46
- def handle_or
46
+ def merge_or
47
47
  old | new
48
48
  end
49
49
 
50
50
  # @api private
51
- def handle_ordered
51
+ def merge_ordered
52
52
  return old if old == new
53
53
 
54
54
  unwrapped_old, old_rule = unwrap_type(old)
55
55
  unwrapped_new, new_rule = unwrap_type(new)
56
56
 
57
- type = merge_underlying_types(unwrapped_old, unwrapped_new)
57
+ type = merge_unwrapped_types(unwrapped_old, unwrapped_new)
58
58
 
59
59
  rule = [old_rule, new_rule].compact.reduce { op_class.new(_1, _2) }
60
60
 
@@ -63,32 +63,44 @@ module Dry
63
63
  type
64
64
  end
65
65
 
66
- alias_method :handle_and, :handle_ordered
67
- alias_method :handle_implication, :handle_ordered
66
+ alias_method :merge_and, :merge_ordered
67
+ alias_method :merge_implication, :merge_ordered
68
68
 
69
69
  # @api private
70
- def merge_underlying_types(unwrapped_old, unwrapped_new)
70
+ def merge_unwrapped_types(unwrapped_old, unwrapped_new)
71
71
  case [unwrapped_old, unwrapped_new]
72
72
  in Dry::Types::Schema, Dry::Types::Schema
73
- types_merger.type_registry["hash"].schema(
74
- types_merger.call(
75
- op_class,
76
- unwrapped_old.name_key_map,
77
- unwrapped_new.name_key_map
78
- )
79
- )
73
+ merge_schemas(unwrapped_old, unwrapped_new)
80
74
  in [Dry::Types::AnyClass, _] | [Dry::Types::Hash, Dry::Types::Schema]
81
75
  unwrapped_new
82
- in [Dry::Types::Hash, Dry::Types::Schema] | [_, Dry::Types::AnyClass]
76
+ in [Dry::Types::Schema, Dry::Types::Hash] | [_, Dry::Types::AnyClass]
83
77
  unwrapped_old
84
78
  else
85
- if unwrapped_old.primitive != unwrapped_new.primitive
86
- raise ArgumentError, <<~MESSAGE
87
- Can't merge types, unwrapped_old=#{unwrapped_old.inspect}, unwrapped_new=#{unwrapped_new.inspect}
88
- MESSAGE
89
- end
79
+ merge_equivalent_types(unwrapped_old, unwrapped_new)
80
+ end
81
+ end
90
82
 
83
+ # @api private
84
+ def merge_schemas(unwrapped_old, unwrapped_new)
85
+ types_merger.type_registry["hash"].schema(
86
+ types_merger.call(
87
+ op_class,
88
+ unwrapped_old.name_key_map,
89
+ unwrapped_new.name_key_map
90
+ )
91
+ )
92
+ end
93
+
94
+ # @api private
95
+ def merge_equivalent_types(unwrapped_old, unwrapped_new)
96
+ if unwrapped_old.primitive <= unwrapped_new.primitive
97
+ unwrapped_new
98
+ elsif unwrapped_new.primitive <= unwrapped_old.primitive
91
99
  unwrapped_old
100
+ else
101
+ raise ArgumentError, <<~MESSAGE
102
+ Can't merge types, unwrapped_old=#{unwrapped_old.inspect}, unwrapped_new=#{unwrapped_new.inspect}
103
+ MESSAGE
92
104
  end
93
105
  end
94
106
 
@@ -96,13 +108,15 @@ module Dry
96
108
  def unwrap_type(type)
97
109
  rules = []
98
110
 
99
- while type.is_a?(Dry::Types::Decorator)
100
- rules << type.rule if type.is_a?(Dry::Types::Constrained)
111
+ loop do
112
+ rules << type.rule if type.respond_to?(:rule)
101
113
 
102
- if type.meta[:maybe] & type.respond_to?(:right)
103
- type = type.right
104
- else
114
+ if type.optional?
115
+ type = type.left.primitive?(nil) ? type.right : type.left
116
+ elsif type.is_a?(Dry::Types::Decorator)
105
117
  type = type.type
118
+ else
119
+ break
106
120
  end
107
121
  end
108
122
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Dry
4
4
  module Schema
5
- VERSION = "1.10.1"
5
+ VERSION = "1.10.2"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.1
4
+ version: 1.10.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-22 00:00:00.000000000 Z
11
+ date: 2022-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby