dry-validation 0.13.3 → 1.7.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 (207) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +506 -95
  3. data/LICENSE +1 -1
  4. data/README.md +16 -12
  5. data/config/errors.yml +3 -88
  6. data/dry-validation.gemspec +37 -24
  7. data/lib/dry/validation/config.rb +24 -0
  8. data/lib/dry/validation/constants.rb +43 -0
  9. data/lib/dry/validation/contract/class_interface.rb +230 -0
  10. data/lib/dry/validation/contract.rb +171 -0
  11. data/lib/dry/validation/evaluator.rb +224 -0
  12. data/lib/dry/validation/extensions/hints.rb +67 -0
  13. data/lib/dry/validation/extensions/monads.rb +24 -8
  14. data/lib/dry/validation/extensions/predicates_as_macros.rb +75 -0
  15. data/lib/dry/validation/failures.rb +70 -0
  16. data/lib/dry/validation/function.rb +44 -0
  17. data/lib/dry/validation/macro.rb +38 -0
  18. data/lib/dry/validation/macros.rb +104 -0
  19. data/lib/dry/validation/message.rb +80 -80
  20. data/lib/dry/validation/message_set.rb +80 -105
  21. data/lib/dry/validation/messages/resolver.rb +131 -0
  22. data/lib/dry/validation/result.rb +183 -41
  23. data/lib/dry/validation/rule.rb +135 -0
  24. data/lib/dry/validation/schema_ext.rb +19 -0
  25. data/lib/dry/validation/values.rb +104 -0
  26. data/lib/dry/validation/version.rb +3 -1
  27. data/lib/dry/validation.rb +45 -28
  28. data/lib/dry-validation.rb +3 -1
  29. metadata +46 -344
  30. data/.codeclimate.yml +0 -17
  31. data/.gitignore +0 -9
  32. data/.rspec +0 -3
  33. data/.travis.yml +0 -29
  34. data/CONTRIBUTING.md +0 -31
  35. data/Gemfile +0 -25
  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/struct.rb +0 -32
  56. data/lib/dry/validation/extensions.rb +0 -7
  57. data/lib/dry/validation/input_processor_compiler/json.rb +0 -45
  58. data/lib/dry/validation/input_processor_compiler/params.rb +0 -49
  59. data/lib/dry/validation/input_processor_compiler/sanitizer.rb +0 -47
  60. data/lib/dry/validation/input_processor_compiler.rb +0 -137
  61. data/lib/dry/validation/message_compiler/visitor_opts.rb +0 -37
  62. data/lib/dry/validation/message_compiler.rb +0 -188
  63. data/lib/dry/validation/messages/abstract.rb +0 -119
  64. data/lib/dry/validation/messages/i18n.rb +0 -47
  65. data/lib/dry/validation/messages/namespaced.rb +0 -39
  66. data/lib/dry/validation/messages/yaml.rb +0 -61
  67. data/lib/dry/validation/messages.rb +0 -14
  68. data/lib/dry/validation/predicate_registry.rb +0 -115
  69. data/lib/dry/validation/predicates.rb +0 -19
  70. data/lib/dry/validation/schema/check.rb +0 -37
  71. data/lib/dry/validation/schema/class_interface.rb +0 -190
  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.rb +0 -126
  81. data/lib/dry/validation/schema_compiler.rb +0 -81
  82. data/lib/dry/validation/template.rb +0 -66
  83. data/lib/dry/validation/type_specs.rb +0 -70
  84. data/log/.gitkeep +0 -0
  85. data/spec/extensions/monads/result_spec.rb +0 -40
  86. data/spec/extensions/struct/schema_spec.rb +0 -32
  87. data/spec/fixtures/locales/en.yml +0 -8
  88. data/spec/fixtures/locales/pl.yml +0 -22
  89. data/spec/integration/custom_error_messages_spec.rb +0 -54
  90. data/spec/integration/custom_predicates_spec.rb +0 -228
  91. data/spec/integration/hints_spec.rb +0 -170
  92. data/spec/integration/injecting_rules_spec.rb +0 -30
  93. data/spec/integration/json/defining_base_schema_spec.rb +0 -41
  94. data/spec/integration/localized_error_messages_spec.rb +0 -72
  95. data/spec/integration/message_compiler_spec.rb +0 -405
  96. data/spec/integration/messages/i18n_spec.rb +0 -104
  97. data/spec/integration/optional_keys_spec.rb +0 -28
  98. data/spec/integration/params/predicates/array_spec.rb +0 -287
  99. data/spec/integration/params/predicates/empty_spec.rb +0 -263
  100. data/spec/integration/params/predicates/eql_spec.rb +0 -327
  101. data/spec/integration/params/predicates/even_spec.rb +0 -455
  102. data/spec/integration/params/predicates/excluded_from_spec.rb +0 -455
  103. data/spec/integration/params/predicates/excludes_spec.rb +0 -391
  104. data/spec/integration/params/predicates/false_spec.rb +0 -455
  105. data/spec/integration/params/predicates/filled_spec.rb +0 -467
  106. data/spec/integration/params/predicates/format_spec.rb +0 -454
  107. data/spec/integration/params/predicates/gt_spec.rb +0 -519
  108. data/spec/integration/params/predicates/gteq_spec.rb +0 -519
  109. data/spec/integration/params/predicates/included_in_spec.rb +0 -455
  110. data/spec/integration/params/predicates/includes_spec.rb +0 -391
  111. data/spec/integration/params/predicates/key_spec.rb +0 -67
  112. data/spec/integration/params/predicates/lt_spec.rb +0 -519
  113. data/spec/integration/params/predicates/lteq_spec.rb +0 -519
  114. data/spec/integration/params/predicates/max_size_spec.rb +0 -391
  115. data/spec/integration/params/predicates/min_size_spec.rb +0 -391
  116. data/spec/integration/params/predicates/none_spec.rb +0 -265
  117. data/spec/integration/params/predicates/not_eql_spec.rb +0 -327
  118. data/spec/integration/params/predicates/odd_spec.rb +0 -455
  119. data/spec/integration/params/predicates/size/fixed_spec.rb +0 -393
  120. data/spec/integration/params/predicates/size/range_spec.rb +0 -396
  121. data/spec/integration/params/predicates/true_spec.rb +0 -455
  122. data/spec/integration/params/predicates/type_spec.rb +0 -391
  123. data/spec/integration/result_spec.rb +0 -81
  124. data/spec/integration/schema/array_schema_spec.rb +0 -59
  125. data/spec/integration/schema/check_rules_spec.rb +0 -119
  126. data/spec/integration/schema/check_with_nested_el_spec.rb +0 -37
  127. data/spec/integration/schema/check_with_nth_el_spec.rb +0 -25
  128. data/spec/integration/schema/default_settings_spec.rb +0 -11
  129. data/spec/integration/schema/defining_base_schema_spec.rb +0 -41
  130. data/spec/integration/schema/dynamic_predicate_args_spec.rb +0 -43
  131. data/spec/integration/schema/each_with_set_spec.rb +0 -70
  132. data/spec/integration/schema/extending_dsl_spec.rb +0 -27
  133. data/spec/integration/schema/form_spec.rb +0 -236
  134. data/spec/integration/schema/hash_schema_spec.rb +0 -47
  135. data/spec/integration/schema/inheriting_schema_spec.rb +0 -31
  136. data/spec/integration/schema/input_processor_spec.rb +0 -46
  137. data/spec/integration/schema/json/explicit_types_spec.rb +0 -157
  138. data/spec/integration/schema/json_spec.rb +0 -163
  139. data/spec/integration/schema/macros/confirmation_spec.rb +0 -35
  140. data/spec/integration/schema/macros/each_spec.rb +0 -268
  141. data/spec/integration/schema/macros/filled_spec.rb +0 -87
  142. data/spec/integration/schema/macros/input_spec.rb +0 -139
  143. data/spec/integration/schema/macros/maybe_spec.rb +0 -99
  144. data/spec/integration/schema/macros/rule_spec.rb +0 -75
  145. data/spec/integration/schema/macros/value_spec.rb +0 -119
  146. data/spec/integration/schema/macros/when_spec.rb +0 -62
  147. data/spec/integration/schema/nested_schemas_spec.rb +0 -236
  148. data/spec/integration/schema/nested_values_spec.rb +0 -46
  149. data/spec/integration/schema/not_spec.rb +0 -34
  150. data/spec/integration/schema/numbers_spec.rb +0 -19
  151. data/spec/integration/schema/option_with_default_spec.rb +0 -64
  152. data/spec/integration/schema/or_spec.rb +0 -87
  153. data/spec/integration/schema/params/defining_base_schema_spec.rb +0 -41
  154. data/spec/integration/schema/params/explicit_types_spec.rb +0 -195
  155. data/spec/integration/schema/params_spec.rb +0 -234
  156. data/spec/integration/schema/predicate_verification_spec.rb +0 -9
  157. data/spec/integration/schema/predicates/array_spec.rb +0 -295
  158. data/spec/integration/schema/predicates/custom_spec.rb +0 -103
  159. data/spec/integration/schema/predicates/empty_spec.rb +0 -263
  160. data/spec/integration/schema/predicates/eql_spec.rb +0 -327
  161. data/spec/integration/schema/predicates/even_spec.rb +0 -455
  162. data/spec/integration/schema/predicates/excluded_from/array_spec.rb +0 -459
  163. data/spec/integration/schema/predicates/excluded_from/range_spec.rb +0 -459
  164. data/spec/integration/schema/predicates/excludes_spec.rb +0 -391
  165. data/spec/integration/schema/predicates/filled_spec.rb +0 -467
  166. data/spec/integration/schema/predicates/format_spec.rb +0 -455
  167. data/spec/integration/schema/predicates/gt_spec.rb +0 -519
  168. data/spec/integration/schema/predicates/gteq_spec.rb +0 -519
  169. data/spec/integration/schema/predicates/hash_spec.rb +0 -69
  170. data/spec/integration/schema/predicates/included_in/array_spec.rb +0 -459
  171. data/spec/integration/schema/predicates/included_in/range_spec.rb +0 -459
  172. data/spec/integration/schema/predicates/includes_spec.rb +0 -391
  173. data/spec/integration/schema/predicates/key_spec.rb +0 -88
  174. data/spec/integration/schema/predicates/lt_spec.rb +0 -520
  175. data/spec/integration/schema/predicates/lteq_spec.rb +0 -519
  176. data/spec/integration/schema/predicates/max_size_spec.rb +0 -391
  177. data/spec/integration/schema/predicates/min_size_spec.rb +0 -391
  178. data/spec/integration/schema/predicates/none_spec.rb +0 -265
  179. data/spec/integration/schema/predicates/not_eql_spec.rb +0 -391
  180. data/spec/integration/schema/predicates/odd_spec.rb +0 -455
  181. data/spec/integration/schema/predicates/size/fixed_spec.rb +0 -398
  182. data/spec/integration/schema/predicates/size/range_spec.rb +0 -395
  183. data/spec/integration/schema/predicates/type_spec.rb +0 -413
  184. data/spec/integration/schema/reusing_schema_spec.rb +0 -33
  185. data/spec/integration/schema/using_types_spec.rb +0 -135
  186. data/spec/integration/schema/validate_spec.rb +0 -120
  187. data/spec/integration/schema/xor_spec.rb +0 -35
  188. data/spec/integration/schema_builders_spec.rb +0 -17
  189. data/spec/integration/schema_spec.rb +0 -173
  190. data/spec/shared/message_compiler.rb +0 -11
  191. data/spec/shared/predicate_helper.rb +0 -15
  192. data/spec/shared/rule_compiler.rb +0 -8
  193. data/spec/spec_helper.rb +0 -62
  194. data/spec/support/define_struct.rb +0 -25
  195. data/spec/support/matchers.rb +0 -38
  196. data/spec/support/mutant.rb +0 -9
  197. data/spec/support/predicates_integration.rb +0 -7
  198. data/spec/unit/input_processor_compiler/json_spec.rb +0 -283
  199. data/spec/unit/input_processor_compiler/params_spec.rb +0 -328
  200. data/spec/unit/message_compiler/visit_failure_spec.rb +0 -38
  201. data/spec/unit/message_compiler/visit_spec.rb +0 -16
  202. data/spec/unit/message_compiler_spec.rb +0 -7
  203. data/spec/unit/predicate_registry_spec.rb +0 -34
  204. data/spec/unit/schema/key_spec.rb +0 -38
  205. data/spec/unit/schema/rule_spec.rb +0 -42
  206. data/spec/unit/schema/value_spec.rb +0 -131
  207. data/spec/unit/schema_spec.rb +0 -35
@@ -1,64 +0,0 @@
1
- require 'benchmark/ips'
2
- require 'active_model'
3
-
4
- require 'dry-validation'
5
-
6
- I18n.locale = :en
7
- I18n.backend.load_translations
8
-
9
- class User
10
- include ActiveModel::Validations
11
-
12
- attr_reader :email, :age
13
-
14
- validates :email, :age, presence: true
15
- validates :age, numericality: { greater_than: 18 }
16
-
17
- def initialize(attrs)
18
- @email, @age = attrs.values_at('email', 'age')
19
- end
20
- end
21
-
22
- schema = Dry::Validation.Schema do
23
- configure do
24
- config.messages = :i18n
25
- end
26
-
27
- required(:email).filled
28
- required(:age).filled(:int?, gt?: 18)
29
- end
30
-
31
- form = Dry::Validation.Params do
32
- configure do
33
- config.messages = :i18n
34
- config.type_specs = true
35
- end
36
-
37
- required(:email, :string).filled
38
- required(:age, :integer).filled(:int?, gt?: 18)
39
- end
40
-
41
- params = { 'email' => '', 'age' => '18' }
42
- coerced = { email: nil, age: 18 }
43
-
44
- puts schema.(coerced).inspect
45
- puts form.(params).inspect
46
- puts User.new(params).validate
47
-
48
- Benchmark.ips do |x|
49
- x.report('ActiveModel::Validations') do
50
- user = User.new(params)
51
- user.validate
52
- user.errors
53
- end
54
-
55
- x.report('dry-validation / schema') do
56
- schema.(coerced).messages
57
- end
58
-
59
- x.report('dry-validation / form') do
60
- form.(params).messages
61
- end
62
-
63
- x.compare!
64
- end
@@ -1,64 +0,0 @@
1
- require 'benchmark/ips'
2
- require 'active_model'
3
-
4
- require 'dry-validation'
5
-
6
- I18n.locale = :en
7
- I18n.backend.load_translations
8
-
9
- class User
10
- include ActiveModel::Validations
11
-
12
- attr_reader :email, :age
13
-
14
- validates :email, :age, presence: true
15
- validates :age, numericality: { greater_than: 18 }
16
-
17
- def initialize(attrs)
18
- @email, @age = attrs.values_at('email', 'age')
19
- end
20
- end
21
-
22
- schema = Dry::Validation.Schema do
23
- configure do
24
- config.messages = :i18n
25
- end
26
-
27
- required(:email).filled
28
- required(:age).filled(:int?, gt?: 18)
29
- end
30
-
31
- form = Dry::Validation.Params do
32
- configure do
33
- config.messages = :i18n
34
- config.type_specs = true
35
- end
36
-
37
- required(:email, :string).filled
38
- required(:age, :integer).filled(:int?, gt?: 18)
39
- end
40
-
41
- params = { 'email' => 'foo@bar.baz', 'age' => '19' }
42
- coerced = { email: 'foo@bar.baz', age: 19 }
43
-
44
- puts schema.(coerced).inspect
45
- puts form.(params).inspect
46
- puts User.new(params).validate
47
-
48
- Benchmark.ips do |x|
49
- x.report('ActiveModel::Validations') do
50
- user = User.new(params)
51
- user.validate
52
- user.errors
53
- end
54
-
55
- x.report('dry-validation / schema') do
56
- schema.(coerced).messages
57
- end
58
-
59
- x.report('dry-validation / form') do
60
- form.(params).messages
61
- end
62
-
63
- x.compare!
64
- end
@@ -1,52 +0,0 @@
1
- require 'benchmark/ips'
2
-
3
- require 'active_model'
4
- require 'dry-validation'
5
-
6
- I18n.locale = :en
7
- I18n.backend.load_translations
8
-
9
- COUNT = ENV['COUNT'].to_i
10
- FIELDS = COUNT.times.map { |i| :"field_#{i}" }
11
-
12
- class User
13
- include ActiveModel::Validations
14
-
15
- attr_reader(*FIELDS)
16
- validates(*FIELDS, presence: true, numericality: { greater_than: FIELDS.size / 2 })
17
-
18
- def initialize(attrs)
19
- attrs.each do |field, value|
20
- instance_variable_set(:"@#{field}", value)
21
- end
22
- end
23
- end
24
-
25
- schema = Dry::Validation.Schema do
26
- configure do
27
- config.messages = :i18n
28
- end
29
-
30
- FIELDS.each do |field|
31
- required(field).value(:int?, gt?: FIELDS.size / 2)
32
- end
33
- end
34
-
35
- data = FIELDS.reduce({}) { |h, f| h.update(f => FIELDS.index(f) + 1) }
36
-
37
- puts schema.(data).inspect
38
- puts User.new(data).validate
39
-
40
- Benchmark.ips do |x|
41
- x.report('ActiveModel::Validations') do
42
- user = User.new(data)
43
- user.validate
44
- user.errors
45
- end
46
-
47
- x.report('dry-validation / schema') do
48
- schema.(data).messages
49
- end
50
-
51
- x.compare!
52
- end
@@ -1,20 +0,0 @@
1
- require_relative 'suite'
2
- require 'hotch'
3
-
4
- schema = Dry::Validation.Schema do
5
- configure { config.messages = :i18n }
6
-
7
- required(:email).filled
8
- required(:age).filled(:int?, gt?: 18)
9
- required(:address).filled(:hash?)
10
- end
11
-
12
- input = { email: '', age: 18, address: {} }
13
-
14
- puts schema.(input).inspect
15
-
16
- Hotch() do
17
- 10_000.times do
18
- schema.(input)
19
- end
20
- end
@@ -1,20 +0,0 @@
1
- require_relative 'suite'
2
- require 'hotch'
3
-
4
- schema = Dry::Validation.Schema do
5
- configure { config.messages = :i18n }
6
-
7
- required(:email).filled
8
- required(:age).filled(:int?, gt?: 18)
9
- required(:address).filled(:hash?)
10
- end
11
-
12
- input = { email: 'jane@doe.org', age: 19, address: { city: 'Krakow' } }
13
-
14
- puts schema.(input).inspect
15
-
16
- Hotch() do
17
- 10_000.times do
18
- schema.(input)
19
- end
20
- end
@@ -1,14 +0,0 @@
1
- require_relative 'suite'
2
- require 'hotch'
3
-
4
- Hotch() do
5
- 1000.times do
6
- Dry::Validation.Schema do
7
- configure { config.messages = :i18n }
8
-
9
- required(:email).filled
10
- required(:age).filled(:int?, gt?: 18)
11
- required(:address).filled(:hash?)
12
- end
13
- end
14
- end
@@ -1,30 +0,0 @@
1
- require_relative 'suite'
2
- require 'hotch'
3
-
4
- require 'dry-validation'
5
-
6
- I18n.locale = :en
7
- I18n.backend.load_translations
8
-
9
- COUNT = ENV['COUNT'].to_i
10
- FIELDS = COUNT.times.map { |i| :"field_#{i}" }
11
-
12
- schema = Dry::Validation.Schema do
13
- configure do
14
- config.messages = :i18n
15
- end
16
-
17
- FIELDS.each do |field|
18
- required(field).filled(gt?: FIELDS.size / 2)
19
- end
20
- end
21
-
22
- data = FIELDS.reduce({}) { |h, f| h.update(f => FIELDS.index(f) + 1) }
23
-
24
- puts schema.(data).inspect
25
-
26
- Hotch() do
27
- 100.times do
28
- schema.(data).messages
29
- end
30
- end
@@ -1,20 +0,0 @@
1
- require_relative 'suite'
2
- require 'hotch'
3
-
4
- schema = Dry::Validation.Schema do
5
- configure { config.messages = :i18n }
6
-
7
- required(:email).filled
8
- required(:age).filled(:int?, gt?: 18)
9
- required(:address).filled(:hash?)
10
- end
11
-
12
- input = { email: '', age: 18, address: {} }
13
-
14
- puts schema.(input).inspect
15
-
16
- Hotch() do
17
- 10_000.times do
18
- schema.(input).messages
19
- end
20
- end
data/benchmarks/suite.rb DELETED
@@ -1,5 +0,0 @@
1
- require 'i18n'
2
- require 'dry-validation'
3
-
4
- I18n.locale = :en
5
- I18n.backend.load_translations
data/examples/basic.rb DELETED
@@ -1,15 +0,0 @@
1
- require 'dry-validation'
2
-
3
- schema = Dry::Validation.Schema do
4
- required(:email).filled
5
-
6
- required(:age).filled(:int?, gt?: 18)
7
- end
8
-
9
- errors = schema.call(email: 'jane@doe.org', age: 19).messages
10
-
11
- puts errors.inspect
12
-
13
- errors = schema.call(email: nil, age: 19).messages
14
-
15
- puts errors.inspect
data/examples/each.rb DELETED
@@ -1,14 +0,0 @@
1
- require 'byebug'
2
- require 'dry-validation'
3
-
4
- schema = Dry::Validation.Schema do
5
- key(:phone_numbers).each(:str?)
6
- end
7
-
8
- errors = schema.call(phone_numbers: '').messages
9
-
10
- puts errors.inspect
11
-
12
- errors = schema.call(phone_numbers: ['123456789', 123456789]).messages
13
-
14
- puts errors.inspect
data/examples/json.rb DELETED
@@ -1,12 +0,0 @@
1
- require 'json'
2
- require 'dry-validation'
3
-
4
- schema = Dry::Validation.JSON do
5
- required(:email).filled
6
-
7
- required(:age).filled(:int?, gt?: 18)
8
- end
9
-
10
- errors = schema.call(JSON.parse('{"email": "", "age": "18"}')).messages
11
-
12
- puts errors.inspect
data/examples/multiple.rb DELETED
@@ -1,27 +0,0 @@
1
- require 'dry-validation'
2
-
3
- schema = Dry::Validation.Schema do
4
- configure do
5
- def self.messages
6
- super.merge(en: {
7
- errors: {
8
- john_email?: '%{value} is not a john email',
9
- example_email?: '%{value} is not a example email'
10
- } })
11
- end
12
- end
13
-
14
- required(:email).filled
15
-
16
- validate(example_email?: :email) do |value|
17
- value.end_with?('@example.com')
18
- end
19
-
20
- validate(john_email?: :email) do |value|
21
- value.start_with?('john')
22
- end
23
- end
24
-
25
- errors = schema.call(email: 'jane@doe.org').messages
26
-
27
- puts errors.inspect
data/examples/nested.rb DELETED
@@ -1,22 +0,0 @@
1
- require 'dry-validation'
2
-
3
- schema = Dry::Validation.Schema do
4
- required(:address).schema do
5
- required(:city).filled(min_size?: 3)
6
-
7
- required(:street).filled
8
-
9
- required(:country).schema do
10
- required(:name).filled
11
- required(:code).filled
12
- end
13
- end
14
- end
15
-
16
- errors = schema.call({}).messages
17
-
18
- puts errors.inspect
19
-
20
- errors = schema.call(address: { city: 'NYC' }).messages
21
-
22
- puts errors.inspect
data/examples/params.rb DELETED
@@ -1,11 +0,0 @@
1
- require 'dry-validation'
2
-
3
- schema = Dry::Validation.Params do
4
- required(:email).filled
5
-
6
- required(:age).filled(:int?, gt?: 18)
7
- end
8
-
9
- errors = schema.call('email' => '', 'age' => '18').messages
10
-
11
- puts errors.inspect
@@ -1,67 +0,0 @@
1
- require 'dry/core/deprecations'
2
-
3
- Dry::Core::Deprecations.warn('Form was renamed to Params and will be removed in the next version', tag: :'dry-validation')
4
-
5
- require 'dry/types/compat/int'
6
- require 'dry/types/compat/form_types'
7
- require 'dry/validation/input_processor_compiler/params'
8
- require 'dry/validation/schema/params'
9
-
10
-
11
- module Dry
12
- module Validation
13
- class InputProcessorCompiler::Form < InputProcessorCompiler
14
- PREDICATE_MAP = {
15
- default: 'string',
16
- none?: 'form.nil',
17
- bool?: 'form.bool',
18
- true?: 'form.true',
19
- false?: 'form.false',
20
- str?: 'string',
21
- int?: 'form.integer',
22
- float?: 'form.float',
23
- decimal?: 'form.decimal',
24
- date?: 'form.date',
25
- date_time?: 'form.date_time',
26
- time?: 'form.time',
27
- hash?: 'form.hash',
28
- array?: 'form.array'
29
- }.freeze
30
-
31
- CONST_MAP = {
32
- NilClass => 'form.nil',
33
- String => 'string',
34
- Integer => 'form.integer',
35
- Float => 'form.float',
36
- BigDecimal => 'form.decimal',
37
- Array => 'form.array',
38
- Hash => 'form.hash',
39
- Date => 'form.date',
40
- DateTime => 'form.date_time',
41
- Time => 'form.time',
42
- TrueClass => 'form.true',
43
- FalseClass => 'form.false'
44
- }.freeze
45
-
46
- def identifier
47
- :form
48
- end
49
-
50
- def hash_node(schema)
51
- [:form_hash, [schema, {}]]
52
- end
53
-
54
- def array_node(members)
55
- [:form_array, [members, {}]]
56
- end
57
- end
58
-
59
- class << self
60
- alias_method :Form, :Params
61
- end
62
-
63
- Schema::Form = Schema::Params
64
-
65
- Schema::DEFAULT_PROCESSOR_MAP[:form] = InputProcessorCompiler::Form.new
66
- end
67
- end
@@ -1,24 +0,0 @@
1
- require 'logger'
2
- require 'dry/configurable'
3
-
4
- module Dry
5
- module Validation
6
- module Deprecations
7
- extend Dry::Configurable
8
-
9
- setting :logger, Logger.new($stdout)
10
-
11
- def self.format(msg, caller)
12
- "#{msg} [#{caller[1].split(':')[0..1].join(' line ')}]"
13
- end
14
-
15
- def logger
16
- @logger ||= Deprecations.config.logger
17
- end
18
-
19
- def warn(msg)
20
- logger.warn(Deprecations.format(msg, ::Kernel.caller))
21
- end
22
- end
23
- end
24
- end
@@ -1,91 +0,0 @@
1
- module Dry
2
- module Validation
3
- class ProcessInput
4
- attr_reader :processor
5
-
6
- def initialize(processor)
7
- @processor = processor
8
- end
9
-
10
- def call(input, *)
11
- processor.(input)
12
- end
13
- end
14
-
15
- class ApplyInputRule
16
- attr_reader :rule
17
-
18
- def initialize(rule)
19
- @rule = rule
20
- end
21
-
22
- def call(input, result)
23
- rule_res = rule.(input)
24
- result.update(nil => rule_res) unless rule_res.success?
25
- input
26
- end
27
- end
28
-
29
- class ApplyRules
30
- attr_reader :rules
31
-
32
- def initialize(rules)
33
- @rules = rules
34
- end
35
-
36
- def call(input, result)
37
- rules.each_with_object(result) do |(name, rule), hash|
38
- hash[name] = rule.(input)
39
- end
40
- input
41
- end
42
- end
43
-
44
- class ApplyChecks < ApplyRules
45
- def call(input, result)
46
- rules.each_with_object(result) do |(name, checks), hash|
47
- checks.each do |check|
48
- check_res = check.is_a?(Guard) ? check.(input, result) : check.(input)
49
- if hash.key?(name)
50
- if hash[name].is_a?(Array)
51
- hash[name] << check_res
52
- else
53
- hash[name] = [hash[name], check_res]
54
- end
55
- else
56
- hash[name] = check_res if check_res
57
- end
58
- end
59
- end
60
- input
61
- end
62
- end
63
-
64
- class BuildErrors
65
- def call(result)
66
- result.values.flatten.compact.select(&:failure?)
67
- end
68
- end
69
-
70
- class Executor
71
- attr_reader :steps, :final
72
-
73
- def self.new(&block)
74
- super(BuildErrors.new).tap { |executor| yield(executor.steps) }.freeze
75
- end
76
-
77
- def initialize(final)
78
- @steps = []
79
- @final = final
80
- end
81
-
82
- def call(input, result = {})
83
- output = steps.reduce(input) do |a, e|
84
- return [a, final.(result)] if result.key?(nil)
85
- e.call(a, result)
86
- end
87
- [output, final.(result)]
88
- end
89
- end
90
- end
91
- end
@@ -1,32 +0,0 @@
1
- require 'dry-struct'
2
-
3
- module Dry
4
- module Validation
5
- class Schema
6
- module StructClassBuilder
7
- def create_class(target, other = nil)
8
- if other.is_a?(Class) && other < Dry::Struct
9
- super do
10
- other.schema.each { |attr, type| required(attr).filled(type) }
11
- end
12
- else
13
- super
14
- end
15
- end
16
- end
17
-
18
- module StructNode
19
- def node(input, *)
20
- if input.is_a?(::Class) && input < ::Dry::Struct
21
- [type, [name, [:schema, Schema.create_class(self, input)]]]
22
- else
23
- super
24
- end
25
- end
26
- end
27
-
28
- singleton_class.prepend(StructClassBuilder)
29
- Value.prepend(StructNode)
30
- end
31
- end
32
- end
@@ -1,7 +0,0 @@
1
- Dry::Validation.register_extension(:monads) do
2
- require 'dry/validation/extensions/monads'
3
- end
4
-
5
- Dry::Validation.register_extension(:struct) do
6
- require 'dry/validation/extensions/struct'
7
- end
@@ -1,45 +0,0 @@
1
- module Dry
2
- module Validation
3
- class InputProcessorCompiler::JSON < InputProcessorCompiler
4
- PREDICATE_MAP = {
5
- default: 'string',
6
- none?: 'json.nil',
7
- bool?: 'bool',
8
- str?: 'string',
9
- int?: 'integer',
10
- float?: 'float',
11
- decimal?: 'json.decimal',
12
- date?: 'json.date',
13
- date_time?: 'json.date_time',
14
- time?: 'json.time'
15
- }.freeze
16
-
17
- CONST_MAP = {
18
- NilClass => 'nil',
19
- String => 'string',
20
- Integer => 'integer',
21
- Float => 'float',
22
- BigDecimal => 'json.decimal',
23
- Array => 'json.array',
24
- Hash => 'json.hash',
25
- Date => 'json.date',
26
- DateTime => 'json.date_time',
27
- Time => 'json.time',
28
- TrueClass => 'true',
29
- FalseClass => 'false'
30
- }.freeze
31
-
32
- def identifier
33
- :json
34
- end
35
-
36
- def hash_node(schema)
37
- [:json_hash, [schema, {}]]
38
- end
39
-
40
- def array_node(members)
41
- [:json_array, [members, {}]]
42
- end
43
- end
44
- end
45
- end