dry-validation 0.13.3 → 1.0.0.alpha1

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 (196) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -25
  3. data/LICENSE +1 -1
  4. data/README.md +9 -4
  5. data/lib/dry-validation.rb +2 -0
  6. data/lib/dry/validation.rb +8 -35
  7. data/lib/dry/validation/constants.rb +12 -0
  8. data/lib/dry/validation/contract.rb +132 -0
  9. data/lib/dry/validation/contract/class_interface.rb +114 -0
  10. data/lib/dry/validation/evaluator.rb +121 -0
  11. data/lib/dry/validation/extensions/monads.rb +23 -7
  12. data/lib/dry/validation/messages.rb +50 -6
  13. data/lib/dry/validation/result.rb +109 -45
  14. data/lib/dry/validation/rule.rb +37 -0
  15. data/lib/dry/validation/version.rb +3 -1
  16. metadata +36 -337
  17. data/.codeclimate.yml +0 -17
  18. data/.gitignore +0 -9
  19. data/.rspec +0 -3
  20. data/.travis.yml +0 -29
  21. data/CONTRIBUTING.md +0 -31
  22. data/Gemfile +0 -25
  23. data/Rakefile +0 -22
  24. data/benchmarks/benchmark_form_invalid.rb +0 -64
  25. data/benchmarks/benchmark_form_valid.rb +0 -64
  26. data/benchmarks/benchmark_schema_invalid_huge.rb +0 -52
  27. data/benchmarks/profile_schema_call_invalid.rb +0 -20
  28. data/benchmarks/profile_schema_call_valid.rb +0 -20
  29. data/benchmarks/profile_schema_definition.rb +0 -14
  30. data/benchmarks/profile_schema_huge_invalid.rb +0 -30
  31. data/benchmarks/profile_schema_messages_invalid.rb +0 -20
  32. data/benchmarks/suite.rb +0 -5
  33. data/config/errors.yml +0 -89
  34. data/dry-validation.gemspec +0 -28
  35. data/examples/basic.rb +0 -15
  36. data/examples/each.rb +0 -14
  37. data/examples/json.rb +0 -12
  38. data/examples/multiple.rb +0 -27
  39. data/examples/nested.rb +0 -22
  40. data/examples/params.rb +0 -11
  41. data/lib/dry/validation/compat/form.rb +0 -67
  42. data/lib/dry/validation/deprecations.rb +0 -24
  43. data/lib/dry/validation/executor.rb +0 -91
  44. data/lib/dry/validation/extensions.rb +0 -7
  45. data/lib/dry/validation/extensions/struct.rb +0 -32
  46. data/lib/dry/validation/input_processor_compiler.rb +0 -137
  47. data/lib/dry/validation/input_processor_compiler/json.rb +0 -45
  48. data/lib/dry/validation/input_processor_compiler/params.rb +0 -49
  49. data/lib/dry/validation/input_processor_compiler/sanitizer.rb +0 -47
  50. data/lib/dry/validation/message.rb +0 -98
  51. data/lib/dry/validation/message_compiler.rb +0 -188
  52. data/lib/dry/validation/message_compiler/visitor_opts.rb +0 -37
  53. data/lib/dry/validation/message_set.rb +0 -122
  54. data/lib/dry/validation/messages/abstract.rb +0 -119
  55. data/lib/dry/validation/messages/i18n.rb +0 -47
  56. data/lib/dry/validation/messages/namespaced.rb +0 -39
  57. data/lib/dry/validation/messages/yaml.rb +0 -61
  58. data/lib/dry/validation/predicate_registry.rb +0 -115
  59. data/lib/dry/validation/predicates.rb +0 -19
  60. data/lib/dry/validation/schema.rb +0 -126
  61. data/lib/dry/validation/schema/check.rb +0 -37
  62. data/lib/dry/validation/schema/class_interface.rb +0 -190
  63. data/lib/dry/validation/schema/deprecated.rb +0 -30
  64. data/lib/dry/validation/schema/dsl.rb +0 -118
  65. data/lib/dry/validation/schema/form.rb +0 -9
  66. data/lib/dry/validation/schema/json.rb +0 -21
  67. data/lib/dry/validation/schema/key.rb +0 -71
  68. data/lib/dry/validation/schema/params.rb +0 -22
  69. data/lib/dry/validation/schema/rule.rb +0 -202
  70. data/lib/dry/validation/schema/value.rb +0 -211
  71. data/lib/dry/validation/schema_compiler.rb +0 -81
  72. data/lib/dry/validation/template.rb +0 -66
  73. data/lib/dry/validation/type_specs.rb +0 -70
  74. data/spec/extensions/monads/result_spec.rb +0 -40
  75. data/spec/extensions/struct/schema_spec.rb +0 -32
  76. data/spec/fixtures/locales/en.yml +0 -8
  77. data/spec/fixtures/locales/pl.yml +0 -22
  78. data/spec/integration/custom_error_messages_spec.rb +0 -54
  79. data/spec/integration/custom_predicates_spec.rb +0 -228
  80. data/spec/integration/hints_spec.rb +0 -170
  81. data/spec/integration/injecting_rules_spec.rb +0 -30
  82. data/spec/integration/json/defining_base_schema_spec.rb +0 -41
  83. data/spec/integration/localized_error_messages_spec.rb +0 -72
  84. data/spec/integration/message_compiler_spec.rb +0 -405
  85. data/spec/integration/messages/i18n_spec.rb +0 -104
  86. data/spec/integration/optional_keys_spec.rb +0 -28
  87. data/spec/integration/params/predicates/array_spec.rb +0 -287
  88. data/spec/integration/params/predicates/empty_spec.rb +0 -263
  89. data/spec/integration/params/predicates/eql_spec.rb +0 -327
  90. data/spec/integration/params/predicates/even_spec.rb +0 -455
  91. data/spec/integration/params/predicates/excluded_from_spec.rb +0 -455
  92. data/spec/integration/params/predicates/excludes_spec.rb +0 -391
  93. data/spec/integration/params/predicates/false_spec.rb +0 -455
  94. data/spec/integration/params/predicates/filled_spec.rb +0 -467
  95. data/spec/integration/params/predicates/format_spec.rb +0 -454
  96. data/spec/integration/params/predicates/gt_spec.rb +0 -519
  97. data/spec/integration/params/predicates/gteq_spec.rb +0 -519
  98. data/spec/integration/params/predicates/included_in_spec.rb +0 -455
  99. data/spec/integration/params/predicates/includes_spec.rb +0 -391
  100. data/spec/integration/params/predicates/key_spec.rb +0 -67
  101. data/spec/integration/params/predicates/lt_spec.rb +0 -519
  102. data/spec/integration/params/predicates/lteq_spec.rb +0 -519
  103. data/spec/integration/params/predicates/max_size_spec.rb +0 -391
  104. data/spec/integration/params/predicates/min_size_spec.rb +0 -391
  105. data/spec/integration/params/predicates/none_spec.rb +0 -265
  106. data/spec/integration/params/predicates/not_eql_spec.rb +0 -327
  107. data/spec/integration/params/predicates/odd_spec.rb +0 -455
  108. data/spec/integration/params/predicates/size/fixed_spec.rb +0 -393
  109. data/spec/integration/params/predicates/size/range_spec.rb +0 -396
  110. data/spec/integration/params/predicates/true_spec.rb +0 -455
  111. data/spec/integration/params/predicates/type_spec.rb +0 -391
  112. data/spec/integration/result_spec.rb +0 -81
  113. data/spec/integration/schema/array_schema_spec.rb +0 -59
  114. data/spec/integration/schema/check_rules_spec.rb +0 -119
  115. data/spec/integration/schema/check_with_nested_el_spec.rb +0 -37
  116. data/spec/integration/schema/check_with_nth_el_spec.rb +0 -25
  117. data/spec/integration/schema/default_settings_spec.rb +0 -11
  118. data/spec/integration/schema/defining_base_schema_spec.rb +0 -41
  119. data/spec/integration/schema/dynamic_predicate_args_spec.rb +0 -43
  120. data/spec/integration/schema/each_with_set_spec.rb +0 -70
  121. data/spec/integration/schema/extending_dsl_spec.rb +0 -27
  122. data/spec/integration/schema/form_spec.rb +0 -236
  123. data/spec/integration/schema/hash_schema_spec.rb +0 -47
  124. data/spec/integration/schema/inheriting_schema_spec.rb +0 -31
  125. data/spec/integration/schema/input_processor_spec.rb +0 -46
  126. data/spec/integration/schema/json/explicit_types_spec.rb +0 -157
  127. data/spec/integration/schema/json_spec.rb +0 -163
  128. data/spec/integration/schema/macros/confirmation_spec.rb +0 -35
  129. data/spec/integration/schema/macros/each_spec.rb +0 -268
  130. data/spec/integration/schema/macros/filled_spec.rb +0 -87
  131. data/spec/integration/schema/macros/input_spec.rb +0 -139
  132. data/spec/integration/schema/macros/maybe_spec.rb +0 -99
  133. data/spec/integration/schema/macros/rule_spec.rb +0 -75
  134. data/spec/integration/schema/macros/value_spec.rb +0 -119
  135. data/spec/integration/schema/macros/when_spec.rb +0 -62
  136. data/spec/integration/schema/nested_schemas_spec.rb +0 -236
  137. data/spec/integration/schema/nested_values_spec.rb +0 -46
  138. data/spec/integration/schema/not_spec.rb +0 -34
  139. data/spec/integration/schema/numbers_spec.rb +0 -19
  140. data/spec/integration/schema/option_with_default_spec.rb +0 -64
  141. data/spec/integration/schema/or_spec.rb +0 -87
  142. data/spec/integration/schema/params/defining_base_schema_spec.rb +0 -41
  143. data/spec/integration/schema/params/explicit_types_spec.rb +0 -195
  144. data/spec/integration/schema/params_spec.rb +0 -234
  145. data/spec/integration/schema/predicate_verification_spec.rb +0 -9
  146. data/spec/integration/schema/predicates/array_spec.rb +0 -295
  147. data/spec/integration/schema/predicates/custom_spec.rb +0 -103
  148. data/spec/integration/schema/predicates/empty_spec.rb +0 -263
  149. data/spec/integration/schema/predicates/eql_spec.rb +0 -327
  150. data/spec/integration/schema/predicates/even_spec.rb +0 -455
  151. data/spec/integration/schema/predicates/excluded_from/array_spec.rb +0 -459
  152. data/spec/integration/schema/predicates/excluded_from/range_spec.rb +0 -459
  153. data/spec/integration/schema/predicates/excludes_spec.rb +0 -391
  154. data/spec/integration/schema/predicates/filled_spec.rb +0 -467
  155. data/spec/integration/schema/predicates/format_spec.rb +0 -455
  156. data/spec/integration/schema/predicates/gt_spec.rb +0 -519
  157. data/spec/integration/schema/predicates/gteq_spec.rb +0 -519
  158. data/spec/integration/schema/predicates/hash_spec.rb +0 -69
  159. data/spec/integration/schema/predicates/included_in/array_spec.rb +0 -459
  160. data/spec/integration/schema/predicates/included_in/range_spec.rb +0 -459
  161. data/spec/integration/schema/predicates/includes_spec.rb +0 -391
  162. data/spec/integration/schema/predicates/key_spec.rb +0 -88
  163. data/spec/integration/schema/predicates/lt_spec.rb +0 -520
  164. data/spec/integration/schema/predicates/lteq_spec.rb +0 -519
  165. data/spec/integration/schema/predicates/max_size_spec.rb +0 -391
  166. data/spec/integration/schema/predicates/min_size_spec.rb +0 -391
  167. data/spec/integration/schema/predicates/none_spec.rb +0 -265
  168. data/spec/integration/schema/predicates/not_eql_spec.rb +0 -391
  169. data/spec/integration/schema/predicates/odd_spec.rb +0 -455
  170. data/spec/integration/schema/predicates/size/fixed_spec.rb +0 -398
  171. data/spec/integration/schema/predicates/size/range_spec.rb +0 -395
  172. data/spec/integration/schema/predicates/type_spec.rb +0 -413
  173. data/spec/integration/schema/reusing_schema_spec.rb +0 -33
  174. data/spec/integration/schema/using_types_spec.rb +0 -135
  175. data/spec/integration/schema/validate_spec.rb +0 -120
  176. data/spec/integration/schema/xor_spec.rb +0 -35
  177. data/spec/integration/schema_builders_spec.rb +0 -17
  178. data/spec/integration/schema_spec.rb +0 -173
  179. data/spec/shared/message_compiler.rb +0 -11
  180. data/spec/shared/predicate_helper.rb +0 -15
  181. data/spec/shared/rule_compiler.rb +0 -8
  182. data/spec/spec_helper.rb +0 -62
  183. data/spec/support/define_struct.rb +0 -25
  184. data/spec/support/matchers.rb +0 -38
  185. data/spec/support/mutant.rb +0 -9
  186. data/spec/support/predicates_integration.rb +0 -7
  187. data/spec/unit/input_processor_compiler/json_spec.rb +0 -283
  188. data/spec/unit/input_processor_compiler/params_spec.rb +0 -328
  189. data/spec/unit/message_compiler/visit_failure_spec.rb +0 -38
  190. data/spec/unit/message_compiler/visit_spec.rb +0 -16
  191. data/spec/unit/message_compiler_spec.rb +0 -7
  192. data/spec/unit/predicate_registry_spec.rb +0 -34
  193. data/spec/unit/schema/key_spec.rb +0 -38
  194. data/spec/unit/schema/rule_spec.rb +0 -42
  195. data/spec/unit/schema/value_spec.rb +0 -131
  196. data/spec/unit/schema_spec.rb +0 -35
@@ -1,89 +0,0 @@
1
- en:
2
- errors:
3
- or: "or"
4
- array?: "must be an array"
5
-
6
- empty?: "must be empty"
7
-
8
- excludes?: "must not include %{value}"
9
-
10
- excluded_from?:
11
- arg:
12
- default: "must not be one of: %{list}"
13
- range: "must not be one of: %{list_left} - %{list_right}"
14
- exclusion?: "must not be one of: %{list}"
15
-
16
- eql?: "must be equal to %{left}"
17
-
18
- not_eql?: "must not be equal to %{left}"
19
-
20
- filled?: "must be filled"
21
-
22
- format?: "is in invalid format"
23
-
24
- number?: "must be a number"
25
-
26
- odd?: "must be odd"
27
-
28
- even?: "must be even"
29
-
30
- gt?: "must be greater than %{num}"
31
-
32
- gteq?: "must be greater than or equal to %{num}"
33
-
34
- hash?: "must be a hash"
35
-
36
- included_in?:
37
- arg:
38
- default: "must be one of: %{list}"
39
- range: "must be one of: %{list_left} - %{list_right}"
40
- inclusion?: "must be one of: %{list}"
41
-
42
- includes?: "must include %{value}"
43
-
44
- bool?: "must be boolean"
45
-
46
- true?: "must be true"
47
-
48
- false?: "must be false"
49
-
50
- int?: "must be an integer"
51
-
52
- float?: "must be a float"
53
-
54
- decimal?: "must be a decimal"
55
-
56
- date?: "must be a date"
57
-
58
- date_time?: "must be a date time"
59
-
60
- time?: "must be a time"
61
-
62
- key?: "is missing"
63
-
64
- attr?: "is missing"
65
-
66
- lt?: "must be less than %{num}"
67
-
68
- lteq?: "must be less than or equal to %{num}"
69
-
70
- max_size?: "size cannot be greater than %{num}"
71
-
72
- min_size?: "size cannot be less than %{num}"
73
-
74
- none?: "cannot be defined"
75
-
76
- str?: "must be a string"
77
-
78
- type?: "must be %{type}"
79
-
80
- size?:
81
- arg:
82
- default: "size must be %{size}"
83
- range: "size must be within %{size_left} - %{size_right}"
84
-
85
- value:
86
- string:
87
- arg:
88
- default: "length must be %{size}"
89
- range: "length must be within %{size_left} - %{size_right}"
@@ -1,28 +0,0 @@
1
- require File.expand_path('../lib/dry/validation/version', __FILE__)
2
-
3
- Gem::Specification.new do |spec|
4
- spec.name = 'dry-validation'
5
- spec.version = Dry::Validation::VERSION
6
- spec.authors = ['Andy Holland', 'Piotr Solnica']
7
- spec.email = ['andyholland1991@aol.com', 'piotr.solnica@gmail.com']
8
- spec.summary = 'A simple validation library'
9
- spec.homepage = 'https://github.com/dry-rb/dry-validation'
10
- spec.license = 'MIT'
11
-
12
- spec.files = `git ls-files -z`.split("\x0") - ['bin/console']
13
- spec.executables = []
14
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
- spec.require_paths = ['lib']
16
- spec.required_ruby_version = ">= 2.4.0"
17
-
18
- spec.add_runtime_dependency 'concurrent-ruby', '~> 1.0'
19
- spec.add_runtime_dependency 'dry-configurable', '~> 0.1', '>= 0.1.3'
20
- spec.add_runtime_dependency 'dry-equalizer', '~> 0.2'
21
- spec.add_runtime_dependency 'dry-logic', '~> 0.5', '>= 0.5.0'
22
- spec.add_runtime_dependency 'dry-types', '~> 0.14.0'
23
- spec.add_runtime_dependency 'dry-core', '~> 0.2', '>= 0.2.1'
24
-
25
- spec.add_development_dependency 'bundler'
26
- spec.add_development_dependency 'rake'
27
- spec.add_development_dependency 'rspec'
28
- end
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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,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,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