dry-validation 0.12.0 → 1.6.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.
Files changed (204) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +696 -239
  3. data/LICENSE +1 -1
  4. data/README.md +15 -12
  5. data/config/errors.yml +3 -88
  6. data/dry-validation.gemspec +31 -17
  7. data/lib/dry-validation.rb +3 -1
  8. data/lib/dry/validation.rb +45 -28
  9. data/lib/dry/validation/config.rb +24 -0
  10. data/lib/dry/validation/constants.rb +43 -0
  11. data/lib/dry/validation/contract.rb +171 -0
  12. data/lib/dry/validation/contract/class_interface.rb +230 -0
  13. data/lib/dry/validation/evaluator.rb +224 -0
  14. data/lib/dry/validation/extensions/hints.rb +67 -0
  15. data/lib/dry/validation/extensions/monads.rb +24 -8
  16. data/lib/dry/validation/extensions/predicates_as_macros.rb +75 -0
  17. data/lib/dry/validation/failures.rb +70 -0
  18. data/lib/dry/validation/function.rb +44 -0
  19. data/lib/dry/validation/macro.rb +38 -0
  20. data/lib/dry/validation/macros.rb +104 -0
  21. data/lib/dry/validation/message.rb +80 -80
  22. data/lib/dry/validation/message_set.rb +80 -105
  23. data/lib/dry/validation/messages/resolver.rb +131 -0
  24. data/lib/dry/validation/result.rb +183 -41
  25. data/lib/dry/validation/rule.rb +135 -0
  26. data/lib/dry/validation/schema_ext.rb +19 -0
  27. data/lib/dry/validation/values.rb +104 -0
  28. data/lib/dry/validation/version.rb +3 -1
  29. metadata +47 -336
  30. data/.codeclimate.yml +0 -17
  31. data/.gitignore +0 -9
  32. data/.rspec +0 -3
  33. data/.travis.yml +0 -26
  34. data/CONTRIBUTING.md +0 -31
  35. data/Gemfile +0 -33
  36. data/Rakefile +0 -22
  37. data/benchmarks/benchmark_form_invalid.rb +0 -64
  38. data/benchmarks/benchmark_form_valid.rb +0 -64
  39. data/benchmarks/benchmark_schema_invalid_huge.rb +0 -52
  40. data/benchmarks/profile_schema_call_invalid.rb +0 -20
  41. data/benchmarks/profile_schema_call_valid.rb +0 -20
  42. data/benchmarks/profile_schema_definition.rb +0 -14
  43. data/benchmarks/profile_schema_huge_invalid.rb +0 -30
  44. data/benchmarks/profile_schema_messages_invalid.rb +0 -20
  45. data/benchmarks/suite.rb +0 -5
  46. data/examples/basic.rb +0 -15
  47. data/examples/each.rb +0 -14
  48. data/examples/json.rb +0 -12
  49. data/examples/multiple.rb +0 -27
  50. data/examples/nested.rb +0 -22
  51. data/examples/params.rb +0 -11
  52. data/lib/dry/validation/compat/form.rb +0 -67
  53. data/lib/dry/validation/deprecations.rb +0 -24
  54. data/lib/dry/validation/executor.rb +0 -91
  55. data/lib/dry/validation/extensions.rb +0 -7
  56. data/lib/dry/validation/extensions/struct.rb +0 -32
  57. data/lib/dry/validation/input_processor_compiler.rb +0 -135
  58. data/lib/dry/validation/input_processor_compiler/json.rb +0 -45
  59. data/lib/dry/validation/input_processor_compiler/params.rb +0 -49
  60. data/lib/dry/validation/input_processor_compiler/sanitizer.rb +0 -47
  61. data/lib/dry/validation/message_compiler.rb +0 -192
  62. data/lib/dry/validation/message_compiler/visitor_opts.rb +0 -37
  63. data/lib/dry/validation/messages.rb +0 -14
  64. data/lib/dry/validation/messages/abstract.rb +0 -112
  65. data/lib/dry/validation/messages/i18n.rb +0 -35
  66. data/lib/dry/validation/messages/namespaced.rb +0 -32
  67. data/lib/dry/validation/messages/yaml.rb +0 -54
  68. data/lib/dry/validation/predicate_registry.rb +0 -115
  69. data/lib/dry/validation/schema.rb +0 -126
  70. data/lib/dry/validation/schema/check.rb +0 -37
  71. data/lib/dry/validation/schema/class_interface.rb +0 -189
  72. data/lib/dry/validation/schema/deprecated.rb +0 -30
  73. data/lib/dry/validation/schema/dsl.rb +0 -118
  74. data/lib/dry/validation/schema/form.rb +0 -9
  75. data/lib/dry/validation/schema/json.rb +0 -21
  76. data/lib/dry/validation/schema/key.rb +0 -71
  77. data/lib/dry/validation/schema/params.rb +0 -22
  78. data/lib/dry/validation/schema/rule.rb +0 -202
  79. data/lib/dry/validation/schema/value.rb +0 -211
  80. data/lib/dry/validation/schema_compiler.rb +0 -81
  81. data/lib/dry/validation/type_specs.rb +0 -70
  82. data/spec/extensions/monads/result_spec.rb +0 -40
  83. data/spec/extensions/struct/schema_spec.rb +0 -32
  84. data/spec/fixtures/locales/en.yml +0 -6
  85. data/spec/fixtures/locales/pl.yml +0 -18
  86. data/spec/integration/custom_error_messages_spec.rb +0 -48
  87. data/spec/integration/custom_predicates_spec.rb +0 -228
  88. data/spec/integration/hints_spec.rb +0 -170
  89. data/spec/integration/injecting_rules_spec.rb +0 -30
  90. data/spec/integration/json/defining_base_schema_spec.rb +0 -41
  91. data/spec/integration/localized_error_messages_spec.rb +0 -72
  92. data/spec/integration/message_compiler_spec.rb +0 -405
  93. data/spec/integration/messages/i18n_spec.rb +0 -94
  94. data/spec/integration/optional_keys_spec.rb +0 -28
  95. data/spec/integration/params/predicates/array_spec.rb +0 -287
  96. data/spec/integration/params/predicates/empty_spec.rb +0 -263
  97. data/spec/integration/params/predicates/eql_spec.rb +0 -327
  98. data/spec/integration/params/predicates/even_spec.rb +0 -455
  99. data/spec/integration/params/predicates/excluded_from_spec.rb +0 -455
  100. data/spec/integration/params/predicates/excludes_spec.rb +0 -391
  101. data/spec/integration/params/predicates/false_spec.rb +0 -455
  102. data/spec/integration/params/predicates/filled_spec.rb +0 -467
  103. data/spec/integration/params/predicates/format_spec.rb +0 -454
  104. data/spec/integration/params/predicates/gt_spec.rb +0 -519
  105. data/spec/integration/params/predicates/gteq_spec.rb +0 -519
  106. data/spec/integration/params/predicates/included_in_spec.rb +0 -455
  107. data/spec/integration/params/predicates/includes_spec.rb +0 -391
  108. data/spec/integration/params/predicates/key_spec.rb +0 -67
  109. data/spec/integration/params/predicates/lt_spec.rb +0 -519
  110. data/spec/integration/params/predicates/lteq_spec.rb +0 -519
  111. data/spec/integration/params/predicates/max_size_spec.rb +0 -391
  112. data/spec/integration/params/predicates/min_size_spec.rb +0 -391
  113. data/spec/integration/params/predicates/none_spec.rb +0 -265
  114. data/spec/integration/params/predicates/not_eql_spec.rb +0 -327
  115. data/spec/integration/params/predicates/odd_spec.rb +0 -455
  116. data/spec/integration/params/predicates/size/fixed_spec.rb +0 -393
  117. data/spec/integration/params/predicates/size/range_spec.rb +0 -396
  118. data/spec/integration/params/predicates/true_spec.rb +0 -455
  119. data/spec/integration/params/predicates/type_spec.rb +0 -391
  120. data/spec/integration/result_spec.rb +0 -81
  121. data/spec/integration/schema/array_schema_spec.rb +0 -59
  122. data/spec/integration/schema/check_rules_spec.rb +0 -119
  123. data/spec/integration/schema/check_with_nested_el_spec.rb +0 -37
  124. data/spec/integration/schema/check_with_nth_el_spec.rb +0 -25
  125. data/spec/integration/schema/default_settings_spec.rb +0 -11
  126. data/spec/integration/schema/defining_base_schema_spec.rb +0 -41
  127. data/spec/integration/schema/dynamic_predicate_args_spec.rb +0 -43
  128. data/spec/integration/schema/each_with_set_spec.rb +0 -70
  129. data/spec/integration/schema/extending_dsl_spec.rb +0 -27
  130. data/spec/integration/schema/form_spec.rb +0 -236
  131. data/spec/integration/schema/hash_schema_spec.rb +0 -47
  132. data/spec/integration/schema/inheriting_schema_spec.rb +0 -31
  133. data/spec/integration/schema/input_processor_spec.rb +0 -46
  134. data/spec/integration/schema/json/explicit_types_spec.rb +0 -157
  135. data/spec/integration/schema/json_spec.rb +0 -163
  136. data/spec/integration/schema/macros/confirmation_spec.rb +0 -35
  137. data/spec/integration/schema/macros/each_spec.rb +0 -268
  138. data/spec/integration/schema/macros/filled_spec.rb +0 -87
  139. data/spec/integration/schema/macros/input_spec.rb +0 -139
  140. data/spec/integration/schema/macros/maybe_spec.rb +0 -99
  141. data/spec/integration/schema/macros/rule_spec.rb +0 -75
  142. data/spec/integration/schema/macros/value_spec.rb +0 -119
  143. data/spec/integration/schema/macros/when_spec.rb +0 -62
  144. data/spec/integration/schema/nested_schemas_spec.rb +0 -236
  145. data/spec/integration/schema/nested_values_spec.rb +0 -46
  146. data/spec/integration/schema/not_spec.rb +0 -34
  147. data/spec/integration/schema/numbers_spec.rb +0 -19
  148. data/spec/integration/schema/option_with_default_spec.rb +0 -64
  149. data/spec/integration/schema/or_spec.rb +0 -87
  150. data/spec/integration/schema/params/defining_base_schema_spec.rb +0 -41
  151. data/spec/integration/schema/params/explicit_types_spec.rb +0 -195
  152. data/spec/integration/schema/params_spec.rb +0 -234
  153. data/spec/integration/schema/predicate_verification_spec.rb +0 -9
  154. data/spec/integration/schema/predicates/array_spec.rb +0 -295
  155. data/spec/integration/schema/predicates/custom_spec.rb +0 -103
  156. data/spec/integration/schema/predicates/empty_spec.rb +0 -263
  157. data/spec/integration/schema/predicates/eql_spec.rb +0 -327
  158. data/spec/integration/schema/predicates/even_spec.rb +0 -455
  159. data/spec/integration/schema/predicates/excluded_from/array_spec.rb +0 -459
  160. data/spec/integration/schema/predicates/excluded_from/range_spec.rb +0 -459
  161. data/spec/integration/schema/predicates/excludes_spec.rb +0 -391
  162. data/spec/integration/schema/predicates/filled_spec.rb +0 -467
  163. data/spec/integration/schema/predicates/format_spec.rb +0 -455
  164. data/spec/integration/schema/predicates/gt_spec.rb +0 -519
  165. data/spec/integration/schema/predicates/gteq_spec.rb +0 -519
  166. data/spec/integration/schema/predicates/hash_spec.rb +0 -69
  167. data/spec/integration/schema/predicates/included_in/array_spec.rb +0 -459
  168. data/spec/integration/schema/predicates/included_in/range_spec.rb +0 -459
  169. data/spec/integration/schema/predicates/includes_spec.rb +0 -391
  170. data/spec/integration/schema/predicates/key_spec.rb +0 -88
  171. data/spec/integration/schema/predicates/lt_spec.rb +0 -520
  172. data/spec/integration/schema/predicates/lteq_spec.rb +0 -519
  173. data/spec/integration/schema/predicates/max_size_spec.rb +0 -391
  174. data/spec/integration/schema/predicates/min_size_spec.rb +0 -391
  175. data/spec/integration/schema/predicates/none_spec.rb +0 -265
  176. data/spec/integration/schema/predicates/not_eql_spec.rb +0 -391
  177. data/spec/integration/schema/predicates/odd_spec.rb +0 -455
  178. data/spec/integration/schema/predicates/size/fixed_spec.rb +0 -398
  179. data/spec/integration/schema/predicates/size/range_spec.rb +0 -395
  180. data/spec/integration/schema/predicates/type_spec.rb +0 -413
  181. data/spec/integration/schema/reusing_schema_spec.rb +0 -33
  182. data/spec/integration/schema/using_types_spec.rb +0 -135
  183. data/spec/integration/schema/validate_spec.rb +0 -120
  184. data/spec/integration/schema/xor_spec.rb +0 -35
  185. data/spec/integration/schema_builders_spec.rb +0 -17
  186. data/spec/integration/schema_spec.rb +0 -173
  187. data/spec/shared/message_compiler.rb +0 -11
  188. data/spec/shared/predicate_helper.rb +0 -15
  189. data/spec/shared/rule_compiler.rb +0 -8
  190. data/spec/spec_helper.rb +0 -58
  191. data/spec/support/define_struct.rb +0 -25
  192. data/spec/support/matchers.rb +0 -38
  193. data/spec/support/mutant.rb +0 -9
  194. data/spec/support/predicates_integration.rb +0 -7
  195. data/spec/unit/input_processor_compiler/json_spec.rb +0 -283
  196. data/spec/unit/input_processor_compiler/params_spec.rb +0 -328
  197. data/spec/unit/message_compiler/visit_failure_spec.rb +0 -38
  198. data/spec/unit/message_compiler/visit_spec.rb +0 -16
  199. data/spec/unit/message_compiler_spec.rb +0 -7
  200. data/spec/unit/predicate_registry_spec.rb +0 -34
  201. data/spec/unit/schema/key_spec.rb +0 -38
  202. data/spec/unit/schema/rule_spec.rb +0 -42
  203. data/spec/unit/schema/value_spec.rb +0 -131
  204. data/spec/unit/schema_spec.rb +0 -35
@@ -1,38 +0,0 @@
1
- RSpec.describe Dry::Validation::MessageCompiler, '#visit_failure' do
2
- include_context :message_compiler
3
-
4
- let(:visitor) { :visit_failure }
5
-
6
- context 'with :int? predicate' do
7
- let(:node) do
8
- [:age, [:key, [:age, [:predicate, [:int?, [[:input, '17']]]]]]]
9
- end
10
-
11
- it 'returns a message for :int? failure with :rule name inferred from key-rule' do
12
- expect(result.rule).to be(:age)
13
- expect(result.path).to eql([:age])
14
- expect(result).to eql('must be an integer')
15
- end
16
- end
17
-
18
- context 'with set failure and :int? predicate' do
19
- let(:node) do
20
- [:items, [:key, [:items, [:set, [
21
- [:key, [0, [:predicate, [:int?, [[:input, 'foo']]]]]],
22
- [:key, [2, [:predicate, [:int?, [[:input, 'bar']]]]]]
23
- ]]]]]
24
- end
25
-
26
- it 'returns a message for the first element that failed' do
27
- expect(result[0].rule).to be(:items)
28
- expect(result[0].path).to eql([:items, 0])
29
- expect(result[0]).to eql('must be an integer')
30
- end
31
-
32
- it 'returns a message for the third element that failed' do
33
- expect(result[1].rule).to be(:items)
34
- expect(result[1].path).to eql([:items, 2])
35
- expect(result[1]).to eql('must be an integer')
36
- end
37
- end
38
- end
@@ -1,16 +0,0 @@
1
- RSpec.describe Dry::Validation::MessageCompiler, '#visit' do
2
- include_context :message_compiler
3
-
4
- let(:visitor) { :visit }
5
-
6
- context 'with an anonymous :failure' do
7
- let(:node) do
8
- [:failure, [:age, [:key, [:age, [:predicate, [:int?, [[:input, '17']]]]]]]]
9
- end
10
-
11
- it 'returns a message for :int? failure with :rule name inferred from key-rule' do
12
- expect(result.rule).to be(:age)
13
- expect(result).to eql('must be an integer')
14
- end
15
- end
16
- end
@@ -1,7 +0,0 @@
1
- RSpec.describe MessageCompiler, '#call' do
2
- subject(:message_compiler) { MessageCompiler.new( Messages.default ) }
3
-
4
- it 'returns an empty hash when there are no errors' do
5
- expect(message_compiler.([])).to be_empty
6
- end
7
- end
@@ -1,34 +0,0 @@
1
- require 'dry/validation/predicate_registry'
2
-
3
- RSpec.describe PredicateRegistry do
4
- subject!(:predicate_registry) { schema_class.registry }
5
-
6
- let(:schema_class) { Class.new(Schema) }
7
- let(:schema) { schema_class.new }
8
-
9
- before do
10
- schema_class.class_eval { def dis_ok?; true; end }
11
- end
12
-
13
- describe '.[]' do
14
- it 'returns a registry which collects predicate methods' do
15
- expect(predicate_registry[:dis_ok?]).to be_instance_of(UnboundMethod)
16
- end
17
- end
18
-
19
- describe '#[]' do
20
- it 'gives access to built-in predicates' do
21
- expect(predicate_registry[:filled?].("sutin")).to be(true)
22
- end
23
- end
24
-
25
- describe '#bind' do
26
- it 'binds unbound predicates and return finalized registry' do
27
- registry = predicate_registry.bind(schema)
28
-
29
- expect(registry).to be_frozen
30
- expect(registry[:dis_ok?]).to be_a(Method)
31
- expect(registry[:dis_ok?].()).to be(true)
32
- end
33
- end
34
- end
@@ -1,38 +0,0 @@
1
- RSpec.describe Schema::Key do
2
- include_context 'predicate helper'
3
-
4
- let(:registry) { PredicateRegistry.new(predicates) }
5
-
6
- describe '#str?' do
7
- subject(:user) { Schema::Key[:user, registry: registry] }
8
-
9
- it 'returns a key rule' do
10
- expect(user.str?.to_ast).to eql(
11
- [:rule, [:user, [:key, [:user, [:predicate, [:str?, [[:input, Undefined]]]]]]]]
12
- )
13
- end
14
-
15
- it 'returns a key rule & disjunction rule created within the block' do
16
- user.hash? do
17
- required(:email) { none? | filled? }
18
- end
19
-
20
- expect(user.to_ast).to eql(
21
- [:key, [:user, [:rule, [:user,
22
- [:and, [
23
- [:rule, [:user, [:predicate, [:hash?, [[:input, Undefined]]]]]],
24
- [:rule, [:user, [:key, [:user, [:rule, [:email,
25
- [:and, [
26
- [:rule, [:email, [:predicate, [:key?, [[:name, :email], [:input, Undefined]]]]]],
27
- [:rule, [:user, [:rule, [:email,
28
- [:or, [
29
- [:rule, [:email, [:key, [:email, [:predicate, [:none?, [[:input, Undefined]]]]]]]],
30
- [:rule, [:email, [:key, [:email, [:predicate, [:filled?, [[:input, Undefined]]]]]]]]
31
- ]]]]]]
32
- ]]]]]]]
33
- ]]]
34
- ]]]]
35
- )
36
- end
37
- end
38
- end
@@ -1,42 +0,0 @@
1
- RSpec.describe Schema::Rule do
2
- include_context 'predicate helper'
3
-
4
- let(:filled) { p(:filled?) }
5
- let(:format) { p(:format?, /regex/) }
6
-
7
- let(:left) { Schema::Rule.new(filled, name: :email, target: target) }
8
- let(:right) { Schema::Rule.new(format, name: :email, target: target) }
9
- let(:target) { double(:target, id: :user) }
10
-
11
- describe '#and' do
12
- it 'returns a conjunction' do
13
- expect(left.and(right).to_ast).to match_array(
14
- [:rule, [:email, [:and, [[:rule, [:email, filled]], [:rule, [:email, format]]]]]]
15
- )
16
- end
17
- end
18
-
19
- describe '#or' do
20
- it 'returns a disjunction' do
21
- expect(left.or(right).to_ast).to match_array(
22
- [:rule, [:email, [:or, [[:rule, [:email, filled]], [:rule, [:email, format]]]]]]
23
- )
24
- end
25
- end
26
-
27
- describe '#xor' do
28
- it 'returns an exclusive disjunction' do
29
- expect(left.xor(right).to_ast).to match_array(
30
- [:rule, [:email, [:xor, [[:rule, [:email, filled]], [:rule, [:email, format]]]]]]
31
- )
32
- end
33
- end
34
-
35
- describe '#then' do
36
- it 'returns an implication' do
37
- expect(left.then(right).to_ast).to match_array(
38
- [:rule, [:email, [:implication, [[:rule, [:email, filled]], [:rule, [:email, format]]]]]]
39
- )
40
- end
41
- end
42
- end
@@ -1,131 +0,0 @@
1
- RSpec.describe Schema::Value do
2
- include_context 'rule compiler'
3
- include_context 'predicate helper'
4
-
5
- let(:registry) { PredicateRegistry.new(predicates) }
6
-
7
- describe '#required' do
8
- subject(:value) { Schema::Value.new(registry: registry) }
9
-
10
- let(:expected_ast) do
11
- [:rule, [:address, [:and, [
12
- [:rule, [:address, [:predicate, [:key?, [[:name, :address], [:input, Undefined]]]]]],
13
- [:rule, [:address, [:key, [:address, [:predicate, [:filled?, [[:input, Undefined]]]]]]]]
14
- ]]]]
15
- end
16
-
17
- it 'creates a rule for a specified key using a block' do
18
- rule = value.required(:address, &:filled?)
19
- expect(rule.to_ast).to eql(expected_ast)
20
- end
21
-
22
- it 'creates a rule for a specified key using a macro' do
23
- rule = value.required(:address).filled
24
- expect(rule.to_ast).to eql(expected_ast)
25
- end
26
- end
27
-
28
- describe '#each' do
29
- subject(:value) { Schema::Value.new(registry: registry) }
30
-
31
- it 'creates an each rule with another rule returned from the block' do
32
- rule = value.each { key?(:method) }
33
-
34
- expect(rule.to_ast).to eql(
35
- [:and, [
36
- [:predicate, [:array?, [[:input, Undefined]]]],
37
- [:each, [:predicate, [:key?, [[:name, :method], [:input, Undefined]]]]]
38
- ]]
39
- )
40
- end
41
-
42
- it 'creates an each rule with other rules returned from the block' do
43
- rule = value.each do
44
- required(:method) { str? }
45
- required(:amount) { float? }
46
- end
47
-
48
- expect(rule.to_ast).to eql(
49
- [:and, [
50
- [:predicate, [:array?, [[:input, Undefined]]]],
51
- [:each, [:set, [
52
- [:rule, [:method, [:and, [
53
- [:rule, [:method, [:predicate, [:key?, [[:name, :method], [:input, Undefined]]]]]],
54
- [:rule, [:method, [:key, [:method, [:predicate, [:str?, [[:input, Undefined]]]]]]]]]
55
- ]]],
56
- [:rule, [:amount, [:and, [
57
- [:rule, [:amount, [:predicate, [:key?, [[:name, :amount], [:input, Undefined]]]]]],
58
- [:rule, [:amount, [:key, [:amount, [:predicate, [:float?, [[:input, Undefined]]]]]]]]
59
- ]]]]
60
- ]]]
61
- ]]
62
- )
63
- end
64
- end
65
-
66
- describe '#hash? with block' do
67
- subject(:user) { Schema::Value.new(registry: registry) }
68
-
69
- it 'builds hash? & rule created within the block' do
70
- rule = user.hash? { required(:email).filled }
71
-
72
- expect(rule.to_ast).to eql(
73
- [:and, [
74
- [:predicate, [:hash?, [[:input, Undefined]]]],
75
- [:rule, [:email, [:and, [
76
- [:rule, [:email, [:predicate, [:key?, [[:name, :email], [:input, Undefined]]]]]],
77
- [:rule, [:email, [:key, [:email, [:predicate, [:filled?, [[:input, Undefined]]]]]]]]
78
- ]]]]
79
- ]]
80
- )
81
- end
82
-
83
- it 'builds hash? & rule created within the block with deep nesting' do
84
- rule = user.hash? do
85
- required(:address) do
86
- hash? do
87
- required(:city).filled
88
- required(:zipcode).filled
89
- end
90
- end
91
- end
92
-
93
- expect(rule.to_ast).to eql(
94
- [:and, [
95
- [:predicate, [:hash?, [[:input, Undefined]]]],
96
- [:rule, [:address, [:and, [
97
- [:rule, [:address, [:predicate, [:key?, [[:name, :address], [:input, Undefined]]]]]],
98
- [:rule, [:address, [:and, [
99
- [:rule, [:address, [:predicate, [:hash?, [[:input, Undefined]]]]]],
100
- [:rule, [:address, [:key, [:address, [:set, [
101
- [:rule, [:city, [:and, [
102
- [:rule, [:city, [:predicate, [:key?, [[:name, :city], [:input, Undefined]]]]]],
103
- [:rule, [:city, [:key, [:city, [:predicate, [:filled?, [[:input, Undefined]]]]]]]]
104
- ]]]],
105
- [:rule, [:zipcode, [:and, [
106
- [:rule, [:zipcode, [:predicate, [:key?, [[:name, :zipcode], [:input, Undefined]]]]]],
107
- [:rule, [:zipcode, [:key, [:zipcode, [:predicate, [:filled?, [[:input, Undefined]]]]]]]]
108
- ]]]]
109
- ]]]]]]
110
- ]]]]
111
- ]]]]
112
- ]]
113
- )
114
- end
115
- end
116
-
117
- describe '#not' do
118
- subject(:user) { Schema::Value.new(registry: registry) }
119
-
120
- it 'builds a negated rule' do
121
- not_email = user.required(:email) { str?.not }
122
-
123
- expect(not_email.to_ast).to eql(
124
- [:rule, [:email, [:and, [
125
- [:rule, [:email, [:predicate, [:key?, [[:name, :email], [:input, Undefined]]]]]],
126
- [:rule, [:email, [:not, [:key, [:email, [:predicate, [:str?, [[:input, Undefined]]]]]]]]]]
127
- ]]]
128
- )
129
- end
130
- end
131
- end
@@ -1,35 +0,0 @@
1
- require 'dry/validation/messages/i18n'
2
-
3
- RSpec.describe Schema do
4
- describe '.messages' do
5
- context 'with default setting' do
6
- let(:schema) do
7
- Class.new(Schema)
8
- end
9
-
10
- it 'returns default yaml messages' do
11
- expect(schema.messages).to be_instance_of(Messages::YAML)
12
- end
13
- end
14
-
15
- context 'with i18n setting' do
16
- let(:schema) do
17
- Class.new(Schema) { configure { config.messages = :i18n } }
18
- end
19
-
20
- it 'returns default i18n messages' do
21
- expect(schema.messages).to be_instance_of(Messages::I18n)
22
- end
23
- end
24
-
25
- context 'with an invalid setting' do
26
- let(:schema) do
27
- Class.new(Schema) { configure { config.messages = :oops } }
28
- end
29
-
30
- it 'returns default i18n messages' do
31
- expect { schema.messages }.to raise_error(RuntimeError, /oops/)
32
- end
33
- end
34
- end
35
- end