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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +696 -239
- data/LICENSE +1 -1
- data/README.md +15 -12
- data/config/errors.yml +3 -88
- data/dry-validation.gemspec +31 -17
- data/lib/dry-validation.rb +3 -1
- data/lib/dry/validation.rb +45 -28
- data/lib/dry/validation/config.rb +24 -0
- data/lib/dry/validation/constants.rb +43 -0
- data/lib/dry/validation/contract.rb +171 -0
- data/lib/dry/validation/contract/class_interface.rb +230 -0
- data/lib/dry/validation/evaluator.rb +224 -0
- data/lib/dry/validation/extensions/hints.rb +67 -0
- data/lib/dry/validation/extensions/monads.rb +24 -8
- data/lib/dry/validation/extensions/predicates_as_macros.rb +75 -0
- data/lib/dry/validation/failures.rb +70 -0
- data/lib/dry/validation/function.rb +44 -0
- data/lib/dry/validation/macro.rb +38 -0
- data/lib/dry/validation/macros.rb +104 -0
- data/lib/dry/validation/message.rb +80 -80
- data/lib/dry/validation/message_set.rb +80 -105
- data/lib/dry/validation/messages/resolver.rb +131 -0
- data/lib/dry/validation/result.rb +183 -41
- data/lib/dry/validation/rule.rb +135 -0
- data/lib/dry/validation/schema_ext.rb +19 -0
- data/lib/dry/validation/values.rb +104 -0
- data/lib/dry/validation/version.rb +3 -1
- metadata +47 -336
- data/.codeclimate.yml +0 -17
- data/.gitignore +0 -9
- data/.rspec +0 -3
- data/.travis.yml +0 -26
- data/CONTRIBUTING.md +0 -31
- data/Gemfile +0 -33
- data/Rakefile +0 -22
- data/benchmarks/benchmark_form_invalid.rb +0 -64
- data/benchmarks/benchmark_form_valid.rb +0 -64
- data/benchmarks/benchmark_schema_invalid_huge.rb +0 -52
- data/benchmarks/profile_schema_call_invalid.rb +0 -20
- data/benchmarks/profile_schema_call_valid.rb +0 -20
- data/benchmarks/profile_schema_definition.rb +0 -14
- data/benchmarks/profile_schema_huge_invalid.rb +0 -30
- data/benchmarks/profile_schema_messages_invalid.rb +0 -20
- data/benchmarks/suite.rb +0 -5
- data/examples/basic.rb +0 -15
- data/examples/each.rb +0 -14
- data/examples/json.rb +0 -12
- data/examples/multiple.rb +0 -27
- data/examples/nested.rb +0 -22
- data/examples/params.rb +0 -11
- data/lib/dry/validation/compat/form.rb +0 -67
- data/lib/dry/validation/deprecations.rb +0 -24
- data/lib/dry/validation/executor.rb +0 -91
- data/lib/dry/validation/extensions.rb +0 -7
- data/lib/dry/validation/extensions/struct.rb +0 -32
- data/lib/dry/validation/input_processor_compiler.rb +0 -135
- data/lib/dry/validation/input_processor_compiler/json.rb +0 -45
- data/lib/dry/validation/input_processor_compiler/params.rb +0 -49
- data/lib/dry/validation/input_processor_compiler/sanitizer.rb +0 -47
- data/lib/dry/validation/message_compiler.rb +0 -192
- data/lib/dry/validation/message_compiler/visitor_opts.rb +0 -37
- data/lib/dry/validation/messages.rb +0 -14
- data/lib/dry/validation/messages/abstract.rb +0 -112
- data/lib/dry/validation/messages/i18n.rb +0 -35
- data/lib/dry/validation/messages/namespaced.rb +0 -32
- data/lib/dry/validation/messages/yaml.rb +0 -54
- data/lib/dry/validation/predicate_registry.rb +0 -115
- data/lib/dry/validation/schema.rb +0 -126
- data/lib/dry/validation/schema/check.rb +0 -37
- data/lib/dry/validation/schema/class_interface.rb +0 -189
- data/lib/dry/validation/schema/deprecated.rb +0 -30
- data/lib/dry/validation/schema/dsl.rb +0 -118
- data/lib/dry/validation/schema/form.rb +0 -9
- data/lib/dry/validation/schema/json.rb +0 -21
- data/lib/dry/validation/schema/key.rb +0 -71
- data/lib/dry/validation/schema/params.rb +0 -22
- data/lib/dry/validation/schema/rule.rb +0 -202
- data/lib/dry/validation/schema/value.rb +0 -211
- data/lib/dry/validation/schema_compiler.rb +0 -81
- data/lib/dry/validation/type_specs.rb +0 -70
- data/spec/extensions/monads/result_spec.rb +0 -40
- data/spec/extensions/struct/schema_spec.rb +0 -32
- data/spec/fixtures/locales/en.yml +0 -6
- data/spec/fixtures/locales/pl.yml +0 -18
- data/spec/integration/custom_error_messages_spec.rb +0 -48
- data/spec/integration/custom_predicates_spec.rb +0 -228
- data/spec/integration/hints_spec.rb +0 -170
- data/spec/integration/injecting_rules_spec.rb +0 -30
- data/spec/integration/json/defining_base_schema_spec.rb +0 -41
- data/spec/integration/localized_error_messages_spec.rb +0 -72
- data/spec/integration/message_compiler_spec.rb +0 -405
- data/spec/integration/messages/i18n_spec.rb +0 -94
- data/spec/integration/optional_keys_spec.rb +0 -28
- data/spec/integration/params/predicates/array_spec.rb +0 -287
- data/spec/integration/params/predicates/empty_spec.rb +0 -263
- data/spec/integration/params/predicates/eql_spec.rb +0 -327
- data/spec/integration/params/predicates/even_spec.rb +0 -455
- data/spec/integration/params/predicates/excluded_from_spec.rb +0 -455
- data/spec/integration/params/predicates/excludes_spec.rb +0 -391
- data/spec/integration/params/predicates/false_spec.rb +0 -455
- data/spec/integration/params/predicates/filled_spec.rb +0 -467
- data/spec/integration/params/predicates/format_spec.rb +0 -454
- data/spec/integration/params/predicates/gt_spec.rb +0 -519
- data/spec/integration/params/predicates/gteq_spec.rb +0 -519
- data/spec/integration/params/predicates/included_in_spec.rb +0 -455
- data/spec/integration/params/predicates/includes_spec.rb +0 -391
- data/spec/integration/params/predicates/key_spec.rb +0 -67
- data/spec/integration/params/predicates/lt_spec.rb +0 -519
- data/spec/integration/params/predicates/lteq_spec.rb +0 -519
- data/spec/integration/params/predicates/max_size_spec.rb +0 -391
- data/spec/integration/params/predicates/min_size_spec.rb +0 -391
- data/spec/integration/params/predicates/none_spec.rb +0 -265
- data/spec/integration/params/predicates/not_eql_spec.rb +0 -327
- data/spec/integration/params/predicates/odd_spec.rb +0 -455
- data/spec/integration/params/predicates/size/fixed_spec.rb +0 -393
- data/spec/integration/params/predicates/size/range_spec.rb +0 -396
- data/spec/integration/params/predicates/true_spec.rb +0 -455
- data/spec/integration/params/predicates/type_spec.rb +0 -391
- data/spec/integration/result_spec.rb +0 -81
- data/spec/integration/schema/array_schema_spec.rb +0 -59
- data/spec/integration/schema/check_rules_spec.rb +0 -119
- data/spec/integration/schema/check_with_nested_el_spec.rb +0 -37
- data/spec/integration/schema/check_with_nth_el_spec.rb +0 -25
- data/spec/integration/schema/default_settings_spec.rb +0 -11
- data/spec/integration/schema/defining_base_schema_spec.rb +0 -41
- data/spec/integration/schema/dynamic_predicate_args_spec.rb +0 -43
- data/spec/integration/schema/each_with_set_spec.rb +0 -70
- data/spec/integration/schema/extending_dsl_spec.rb +0 -27
- data/spec/integration/schema/form_spec.rb +0 -236
- data/spec/integration/schema/hash_schema_spec.rb +0 -47
- data/spec/integration/schema/inheriting_schema_spec.rb +0 -31
- data/spec/integration/schema/input_processor_spec.rb +0 -46
- data/spec/integration/schema/json/explicit_types_spec.rb +0 -157
- data/spec/integration/schema/json_spec.rb +0 -163
- data/spec/integration/schema/macros/confirmation_spec.rb +0 -35
- data/spec/integration/schema/macros/each_spec.rb +0 -268
- data/spec/integration/schema/macros/filled_spec.rb +0 -87
- data/spec/integration/schema/macros/input_spec.rb +0 -139
- data/spec/integration/schema/macros/maybe_spec.rb +0 -99
- data/spec/integration/schema/macros/rule_spec.rb +0 -75
- data/spec/integration/schema/macros/value_spec.rb +0 -119
- data/spec/integration/schema/macros/when_spec.rb +0 -62
- data/spec/integration/schema/nested_schemas_spec.rb +0 -236
- data/spec/integration/schema/nested_values_spec.rb +0 -46
- data/spec/integration/schema/not_spec.rb +0 -34
- data/spec/integration/schema/numbers_spec.rb +0 -19
- data/spec/integration/schema/option_with_default_spec.rb +0 -64
- data/spec/integration/schema/or_spec.rb +0 -87
- data/spec/integration/schema/params/defining_base_schema_spec.rb +0 -41
- data/spec/integration/schema/params/explicit_types_spec.rb +0 -195
- data/spec/integration/schema/params_spec.rb +0 -234
- data/spec/integration/schema/predicate_verification_spec.rb +0 -9
- data/spec/integration/schema/predicates/array_spec.rb +0 -295
- data/spec/integration/schema/predicates/custom_spec.rb +0 -103
- data/spec/integration/schema/predicates/empty_spec.rb +0 -263
- data/spec/integration/schema/predicates/eql_spec.rb +0 -327
- data/spec/integration/schema/predicates/even_spec.rb +0 -455
- data/spec/integration/schema/predicates/excluded_from/array_spec.rb +0 -459
- data/spec/integration/schema/predicates/excluded_from/range_spec.rb +0 -459
- data/spec/integration/schema/predicates/excludes_spec.rb +0 -391
- data/spec/integration/schema/predicates/filled_spec.rb +0 -467
- data/spec/integration/schema/predicates/format_spec.rb +0 -455
- data/spec/integration/schema/predicates/gt_spec.rb +0 -519
- data/spec/integration/schema/predicates/gteq_spec.rb +0 -519
- data/spec/integration/schema/predicates/hash_spec.rb +0 -69
- data/spec/integration/schema/predicates/included_in/array_spec.rb +0 -459
- data/spec/integration/schema/predicates/included_in/range_spec.rb +0 -459
- data/spec/integration/schema/predicates/includes_spec.rb +0 -391
- data/spec/integration/schema/predicates/key_spec.rb +0 -88
- data/spec/integration/schema/predicates/lt_spec.rb +0 -520
- data/spec/integration/schema/predicates/lteq_spec.rb +0 -519
- data/spec/integration/schema/predicates/max_size_spec.rb +0 -391
- data/spec/integration/schema/predicates/min_size_spec.rb +0 -391
- data/spec/integration/schema/predicates/none_spec.rb +0 -265
- data/spec/integration/schema/predicates/not_eql_spec.rb +0 -391
- data/spec/integration/schema/predicates/odd_spec.rb +0 -455
- data/spec/integration/schema/predicates/size/fixed_spec.rb +0 -398
- data/spec/integration/schema/predicates/size/range_spec.rb +0 -395
- data/spec/integration/schema/predicates/type_spec.rb +0 -413
- data/spec/integration/schema/reusing_schema_spec.rb +0 -33
- data/spec/integration/schema/using_types_spec.rb +0 -135
- data/spec/integration/schema/validate_spec.rb +0 -120
- data/spec/integration/schema/xor_spec.rb +0 -35
- data/spec/integration/schema_builders_spec.rb +0 -17
- data/spec/integration/schema_spec.rb +0 -173
- data/spec/shared/message_compiler.rb +0 -11
- data/spec/shared/predicate_helper.rb +0 -15
- data/spec/shared/rule_compiler.rb +0 -8
- data/spec/spec_helper.rb +0 -58
- data/spec/support/define_struct.rb +0 -25
- data/spec/support/matchers.rb +0 -38
- data/spec/support/mutant.rb +0 -9
- data/spec/support/predicates_integration.rb +0 -7
- data/spec/unit/input_processor_compiler/json_spec.rb +0 -283
- data/spec/unit/input_processor_compiler/params_spec.rb +0 -328
- data/spec/unit/message_compiler/visit_failure_spec.rb +0 -38
- data/spec/unit/message_compiler/visit_spec.rb +0 -16
- data/spec/unit/message_compiler_spec.rb +0 -7
- data/spec/unit/predicate_registry_spec.rb +0 -34
- data/spec/unit/schema/key_spec.rb +0 -38
- data/spec/unit/schema/rule_spec.rb +0 -42
- data/spec/unit/schema/value_spec.rb +0 -131
- data/spec/unit/schema_spec.rb +0 -35
@@ -1,120 +0,0 @@
|
|
1
|
-
RSpec.describe Dry::Validation::Schema, 'arbitrary validation blocks' do
|
2
|
-
context 'with a single value' do
|
3
|
-
subject(:schema) do
|
4
|
-
Dry::Validation.Schema do
|
5
|
-
configure do
|
6
|
-
option :email_regex, /@/
|
7
|
-
|
8
|
-
def self.messages
|
9
|
-
super.merge(en: { errors: { email?: '%{value} looks like an invalid email' } })
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
required(:email).filled
|
14
|
-
|
15
|
-
validate(email?: :email) do |value|
|
16
|
-
email_regex.match(value)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'returns success for valid input' do
|
22
|
-
expect(schema.(email: 'jane@doe.org')).to be_success
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'returns failure for invalid input' do
|
26
|
-
expect(schema.(email: 'jane')).to be_failure
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'adds correct error message' do
|
30
|
-
expect(schema.(email: 'jane').messages).to eql(
|
31
|
-
email: ['jane looks like an invalid email']
|
32
|
-
)
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'is not executed when deps are invalid' do
|
36
|
-
expect(schema.(email: nil)).to be_failure
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
context 'with more than one value' do
|
41
|
-
subject(:schema) do
|
42
|
-
Dry::Validation.Schema do
|
43
|
-
configure do
|
44
|
-
def self.messages
|
45
|
-
super.merge(en: { errors: { email_required: 'provide email' }})
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
required(:email).maybe(:str?)
|
50
|
-
required(:newsletter).value(:bool?)
|
51
|
-
|
52
|
-
validate(email_required: %i[newsletter email]) do |newsletter, email|
|
53
|
-
if newsletter == true
|
54
|
-
!email.nil?
|
55
|
-
else
|
56
|
-
true
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'returns success for valid input' do
|
63
|
-
expect(schema.(newsletter: false, email: nil)).to be_success
|
64
|
-
expect(schema.(newsletter: true, email: 'jane@doe.org')).to be_success
|
65
|
-
end
|
66
|
-
|
67
|
-
it 'returns failure for invalid input' do
|
68
|
-
expect(schema.(newsletter: true, email: nil)).to be_failure
|
69
|
-
end
|
70
|
-
|
71
|
-
it 'adds correct error message' do
|
72
|
-
expect(schema.(newsletter: true, email: nil).errors).to eql(
|
73
|
-
email_required: ['provide email']
|
74
|
-
)
|
75
|
-
end
|
76
|
-
|
77
|
-
it 'is not executed when deps are invalid' do
|
78
|
-
expect(schema.(newsletter: 'oops', email: '').errors).to eql(
|
79
|
-
newsletter: ['must be boolean']
|
80
|
-
)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
context 'with more than one validation' do
|
85
|
-
subject(:schema) do
|
86
|
-
Dry::Validation.Schema do
|
87
|
-
configure do
|
88
|
-
option :email_regex, /@/
|
89
|
-
|
90
|
-
def self.messages
|
91
|
-
super.merge(en: {
|
92
|
-
errors: {
|
93
|
-
email?: '%{value} looks like an invalid email',
|
94
|
-
google_email?: '%{value} is not a google email'
|
95
|
-
} })
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
required(:email).filled
|
100
|
-
|
101
|
-
validate(email?: :email) do |value|
|
102
|
-
email_regex.match(value)
|
103
|
-
end
|
104
|
-
|
105
|
-
validate(google_email?: :email) do |value|
|
106
|
-
value.end_with?('@google.com')
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
it 'returns errors message for both validate' do
|
112
|
-
expect(schema.(email: 'jane').messages).to eql(
|
113
|
-
email: [
|
114
|
-
'jane looks like an invalid email',
|
115
|
-
'jane is not a google email'
|
116
|
-
]
|
117
|
-
)
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
RSpec.describe 'Schema with xor rules' do
|
2
|
-
subject(:schema) do
|
3
|
-
Dry::Validation.Schema do
|
4
|
-
configure do
|
5
|
-
def self.messages
|
6
|
-
Messages.default.merge(
|
7
|
-
en: { errors: { be_reasonable: 'you cannot eat cake and have cake!' } }
|
8
|
-
)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
required(:eat_cake).filled
|
13
|
-
|
14
|
-
required(:have_cake).filled
|
15
|
-
|
16
|
-
rule(be_reasonable: %i[eat_cake have_cake]) do |ec, hc|
|
17
|
-
ec.eql?('yes!') ^ hc.eql?('yes!')
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe '#messages' do
|
23
|
-
it 'passes when only one option is selected' do
|
24
|
-
messages = schema.(eat_cake: 'yes!', have_cake: 'no!').messages[:be_reasonable]
|
25
|
-
|
26
|
-
expect(messages).to be(nil)
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'fails when both options are selected' do
|
30
|
-
expect(schema.(eat_cake: 'yes!', have_cake: 'yes!').messages).to eql(
|
31
|
-
be_reasonable: ['you cannot eat cake and have cake!']
|
32
|
-
)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
RSpec.describe 'Building schemas' do
|
2
|
-
describe 'Dry::Validation.Schema' do
|
3
|
-
it 'builds a schema class with custom predicate set' do
|
4
|
-
predicates = Module.new do
|
5
|
-
include Dry::Logic::Predicates
|
6
|
-
|
7
|
-
def zomg?(*)
|
8
|
-
true
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
schema = Dry::Validation.Schema(predicates: predicates, build: false)
|
13
|
-
|
14
|
-
expect(schema.predicates[:key?]).to be_a(Method)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,173 +0,0 @@
|
|
1
|
-
RSpec.describe Dry::Validation::Schema, 'defining key-based schema' do
|
2
|
-
describe 'with a flat structure' do
|
3
|
-
subject(:schema) do
|
4
|
-
Dry::Validation.Schema do
|
5
|
-
configure do
|
6
|
-
config.input_processor = :params
|
7
|
-
config.type_specs = true
|
8
|
-
end
|
9
|
-
|
10
|
-
required(:email, :string).filled
|
11
|
-
required(:age, [:nil, :integer]) { none? | (int? & gt?(18)) }
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'passes when input is valid' do
|
16
|
-
expect(schema.(email: 'jane@doe', age: 19)).to be_success
|
17
|
-
expect(schema.(email: 'jane@doe', age: nil)).to be_success
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'fails when input is not valid' do
|
21
|
-
expect(schema.(email: 'jane@doe', age: 17)).to_not be_success
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'returns result which quacks like hash' do
|
25
|
-
input = { email: 'jane@doe', age: 19 }
|
26
|
-
result = schema.(input)
|
27
|
-
|
28
|
-
expect(result[:email]).to eql('jane@doe')
|
29
|
-
expect(Hash[result]).to eql(input)
|
30
|
-
|
31
|
-
expect(result.to_a).to eql([[:email, 'jane@doe'], [:age, 19]])
|
32
|
-
end
|
33
|
-
|
34
|
-
describe '#type_map' do
|
35
|
-
it 'returns key=>type map' do
|
36
|
-
expect(schema.type_map).to eql(
|
37
|
-
email: Types::String, age: Types::Params::Nil | Types::Params::Integer
|
38
|
-
)
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'uses type_map for input processor when it is not empty' do
|
42
|
-
expect(schema.(email: 'jane@doe.org', age: '18').to_h).to eql(
|
43
|
-
email: 'jane@doe.org', age: 18
|
44
|
-
)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
describe 'with nested structures' do
|
50
|
-
subject(:schema) do
|
51
|
-
class Test::CountrySchema
|
52
|
-
def self.schema
|
53
|
-
Dry::Validation.Schema do
|
54
|
-
required(:name).filled
|
55
|
-
required(:code).filled
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
Dry::Validation.Schema do
|
61
|
-
required(:email).filled
|
62
|
-
|
63
|
-
required(:age).maybe(:int?, gt?: 18)
|
64
|
-
|
65
|
-
required(:address).schema do
|
66
|
-
required(:city).filled(min_size?: 3)
|
67
|
-
|
68
|
-
required(:street).filled
|
69
|
-
|
70
|
-
required(:country).schema(Test::CountrySchema)
|
71
|
-
end
|
72
|
-
|
73
|
-
required(:phone_numbers).each(:str?)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
let(:input) do
|
78
|
-
{
|
79
|
-
email: 'jane@doe.org',
|
80
|
-
age: 19,
|
81
|
-
address: { city: 'NYC', street: 'Street 1/2', country: { code: 'US', name: 'USA' } },
|
82
|
-
phone_numbers: [
|
83
|
-
'123456', '234567'
|
84
|
-
]
|
85
|
-
}.freeze
|
86
|
-
end
|
87
|
-
|
88
|
-
describe '#messages' do
|
89
|
-
it 'returns compiled error messages' do
|
90
|
-
expect(schema.(input.merge(email: '')).messages).to eql(
|
91
|
-
email: ['must be filled']
|
92
|
-
)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
describe '#call' do
|
97
|
-
it 'passes when attributes are valid' do
|
98
|
-
expect(schema.(input)).to be_success
|
99
|
-
end
|
100
|
-
|
101
|
-
it 'validates presence of an email and min age value' do
|
102
|
-
expect(schema.(input.merge(email: '', age: 18)).messages).to eql(
|
103
|
-
email: ['must be filled'], age: ['must be greater than 18']
|
104
|
-
)
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'validates presence of the email key and type of age value' do
|
108
|
-
attrs = {
|
109
|
-
name: 'Jane',
|
110
|
-
age: '18',
|
111
|
-
address: input[:address], phone_numbers: input[:phone_numbers]
|
112
|
-
}
|
113
|
-
|
114
|
-
expect(schema.(attrs).messages).to eql(
|
115
|
-
email: ['is missing'],
|
116
|
-
age: ['must be an integer', 'must be greater than 18']
|
117
|
-
)
|
118
|
-
end
|
119
|
-
|
120
|
-
it 'validates presence of the address and phone_number keys' do
|
121
|
-
attrs = { email: 'jane@doe.org', age: 19 }
|
122
|
-
|
123
|
-
expect(schema.(attrs).messages).to eql(
|
124
|
-
address: ['is missing'], phone_numbers: ['is missing']
|
125
|
-
)
|
126
|
-
end
|
127
|
-
|
128
|
-
it 'validates presence of keys under address and min size of the city value' do
|
129
|
-
attrs = input.merge(address: { city: 'NY' })
|
130
|
-
|
131
|
-
expect(schema.(attrs).messages).to eql(
|
132
|
-
address: {
|
133
|
-
street: ['is missing'],
|
134
|
-
country: ['is missing'],
|
135
|
-
city: ['size cannot be less than 3']
|
136
|
-
}
|
137
|
-
)
|
138
|
-
end
|
139
|
-
|
140
|
-
it 'validates address type' do
|
141
|
-
expect(schema.(input.merge(address: 'totally not a hash')).messages).to eql(
|
142
|
-
address: ['must be a hash']
|
143
|
-
)
|
144
|
-
end
|
145
|
-
|
146
|
-
it 'validates address code and name values' do
|
147
|
-
attrs = input.merge(
|
148
|
-
address: input[:address].merge(country: { code: 'US', name: '' })
|
149
|
-
)
|
150
|
-
|
151
|
-
expect(schema.(attrs).messages).to eql(
|
152
|
-
address: { country: { name: ['must be filled'] } }
|
153
|
-
)
|
154
|
-
end
|
155
|
-
|
156
|
-
it 'validates each phone number' do
|
157
|
-
attrs = input.merge(phone_numbers: ['123', 312])
|
158
|
-
|
159
|
-
expect(schema.(attrs).messages).to eql(
|
160
|
-
phone_numbers: { 1 => ['must be a string'] }
|
161
|
-
)
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
context 'nested keys' do
|
167
|
-
it 'raises error when defining nested keys without `schema` block`' do
|
168
|
-
expect {
|
169
|
-
Dry::Validation.Schema { required(:foo).value { required(:bar).value(:str?) } }
|
170
|
-
}.to raise_error(ArgumentError, /required/)
|
171
|
-
end
|
172
|
-
end
|
173
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
RSpec.shared_context 'predicate helper' do
|
2
|
-
def p(name, *args)
|
3
|
-
Dry::Logic::Rule::Predicate.new(predicates[name], args: args).to_ast
|
4
|
-
end
|
5
|
-
|
6
|
-
let!(:predicates) do
|
7
|
-
Module.new {
|
8
|
-
include Dry::Logic::Predicates
|
9
|
-
|
10
|
-
def self.email?(value)
|
11
|
-
true
|
12
|
-
end
|
13
|
-
}
|
14
|
-
end
|
15
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
if ENV['COVERAGE'] == 'true' && RUBY_ENGINE == 'ruby' && RUBY_VERSION == '2.3.1'
|
2
|
-
require "simplecov"
|
3
|
-
SimpleCov.start do
|
4
|
-
add_filter '/spec/'
|
5
|
-
end
|
6
|
-
end
|
7
|
-
|
8
|
-
begin
|
9
|
-
require 'pry'
|
10
|
-
require 'pry-byebug'
|
11
|
-
rescue LoadError
|
12
|
-
end
|
13
|
-
|
14
|
-
require 'dry-validation'
|
15
|
-
require 'dry/core/constants'
|
16
|
-
require 'ostruct'
|
17
|
-
|
18
|
-
SPEC_ROOT = Pathname(__dir__)
|
19
|
-
|
20
|
-
Dir[SPEC_ROOT.join('shared/**/*.rb')].each(&method(:require))
|
21
|
-
Dir[SPEC_ROOT.join('support/**/*.rb')].each(&method(:require))
|
22
|
-
|
23
|
-
include Dry::Validation
|
24
|
-
|
25
|
-
module Types
|
26
|
-
include Dry::Types.module
|
27
|
-
end
|
28
|
-
|
29
|
-
Dry::Validation::Deprecations.configure do |config|
|
30
|
-
config.logger = Logger.new(SPEC_ROOT.join('../log/deprecations.log'))
|
31
|
-
end
|
32
|
-
|
33
|
-
RSpec.configure do |config|
|
34
|
-
config.disable_monkey_patching!
|
35
|
-
config.warnings = true
|
36
|
-
|
37
|
-
config.after do
|
38
|
-
if defined?(I18n)
|
39
|
-
I18n.load_path = Dry::Validation.messages_paths.dup
|
40
|
-
I18n.backend.reload!
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
config.include PredicatesIntegration
|
45
|
-
|
46
|
-
config.before do
|
47
|
-
module Test
|
48
|
-
def self.remove_constants
|
49
|
-
constants.each { |const| remove_const(const) }
|
50
|
-
self
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
config.after do
|
56
|
-
Object.send(:remove_const, Test.remove_constants.name)
|
57
|
-
end
|
58
|
-
end
|