hash_validator 0.7.1 → 0.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2e9643ea0272321ae3212a9c811044f18fcbf3a2
4
- data.tar.gz: eedaa6b41b8e3c812fa9cc49c9282d7ac59cac07
3
+ metadata.gz: d3f14e426a06042aa90d83cd7addfc6453f759e4
4
+ data.tar.gz: 7fd7178c50fc0491bf276696b2c42b1cca24d3a7
5
5
  SHA512:
6
- metadata.gz: 603d75b24833ba30bc6b9a8a6b730fd90b88ca00515c1cdaa157290b42424c801c7fc4fd84ea8ce8f992fb44ddbcdf4d8004399c5c193c48b899b89fbb55acbb
7
- data.tar.gz: 52e365ac0b3e587c38519634db61e84737bf75526836f56aadbf7a9a2b7430adda18851de718a00bc4c31509ab3ae63c8cb803cef0674ff0c77f41dddb20d554
6
+ metadata.gz: 44fc5928ebd086077dac64d7a53e91a3c14b144e9831b07389aa5b086ffdd63f6271659ae3fc3bc695e73d6d06767077147e48748ddcf32bb149b82aa1fdbe97
7
+ data.tar.gz: 2589013673495b01ac126c5a250528059e69c5f0610003d9db0ab5c852d3b837a51efd2eb18d22f3b81058a2b07acf292db0c199ad9da637a363ddc5ff171fc1
data/README.md CHANGED
@@ -116,6 +116,19 @@ validator.valid? # => true
116
116
  validator.errors # => {}
117
117
  ```
118
118
 
119
+ ## Multiple validators
120
+
121
+ Multiple validators can be applied to a single key, e.g.
122
+
123
+ ```ruby
124
+ HashValidator.validate(
125
+ { foo: 73 },
126
+ { foo: HashValidator.multiple('numeric', 1..100) }
127
+ )
128
+ ```
129
+
130
+ This is particularly useful when defining custom validators.
131
+
119
132
  ## Contributing
120
133
 
121
134
  1. Fork it
@@ -10,6 +10,10 @@ module HashValidator
10
10
  def self.many(validation)
11
11
  Validations::Many.new(validation)
12
12
  end
13
+
14
+ def self.multiple(*validations)
15
+ Validations::Multiple.new(validations)
16
+ end
13
17
  end
14
18
 
15
19
  require 'hash_validator/base'
@@ -6,3 +6,4 @@ end
6
6
  # Load validators
7
7
  require 'hash_validator/validations/optional'
8
8
  require 'hash_validator/validations/many'
9
+ require 'hash_validator/validations/multiple'
@@ -0,0 +1,8 @@
1
+ module HashValidator::Validations
2
+ class Multiple
3
+ attr_reader :validations
4
+ def initialize(validations)
5
+ @validations = validations
6
+ end
7
+ end
8
+ end
@@ -35,3 +35,4 @@ require 'hash_validator/validators/regex_validator'
35
35
  require 'hash_validator/validators/lambda_validator'
36
36
  require 'hash_validator/validators/optional_validator'
37
37
  require 'hash_validator/validators/many_validator'
38
+ require 'hash_validator/validators/multiple_validator'
@@ -18,7 +18,7 @@ class HashValidator::Validator::Base
18
18
  "#{self.name} required"
19
19
  end
20
20
 
21
- def validate(key, value, validations, errors)
21
+ def validate(*)
22
22
  raise StandardError.new('validate should not be called directly on BaseValidator')
23
23
  end
24
24
  end
@@ -3,7 +3,7 @@ class HashValidator::Validator::BooleanValidator < HashValidator::Validator::Bas
3
3
  super('boolean') # The name of the validator
4
4
  end
5
5
 
6
- def validate(key, value, validations, errors)
6
+ def validate(key, value, _validations, errors)
7
7
  unless [TrueClass, FalseClass].include?(value.class)
8
8
  errors[key] = presence_error_message
9
9
  end
@@ -7,11 +7,11 @@ class HashValidator::Validator::EmailValidator < HashValidator::Validator::Base
7
7
  'is not a valid email'
8
8
  end
9
9
 
10
- def validate(key, value, validations, errors)
10
+ def validate(key, value, _validations, errors)
11
11
  unless value.is_a?(String) && value.include?("@")
12
12
  errors[key] = presence_error_message
13
13
  end
14
14
  end
15
15
  end
16
16
 
17
- HashValidator.append_validator(HashValidator::Validator::EmailValidator.new)
17
+ HashValidator.append_validator(HashValidator::Validator::EmailValidator.new)
@@ -20,7 +20,7 @@ class HashValidator::Validator::HashValidator < HashValidator::Validator::Base
20
20
  validations.each do |v_key, v_value|
21
21
  HashValidator.validator_for(v_value).validate(v_key, value[v_key], v_value, errors)
22
22
  end
23
-
23
+
24
24
  if HashValidator::Base.strict?
25
25
  value.keys.each do |k|
26
26
  errors[k] = 'key not expected' unless validations[k]
@@ -28,7 +28,7 @@ class HashValidator::Validator::HashValidator < HashValidator::Validator::Base
28
28
  end
29
29
 
30
30
  # Cleanup errors (remove any empty nested errors)
31
- errors.delete_if { |k,v| v.empty? }
31
+ errors.delete_if { |_,v| v.empty? }
32
32
  end
33
33
  end
34
34
 
@@ -0,0 +1,27 @@
1
+ module HashValidator
2
+ module Validator
3
+ class MultipleValidator < Base
4
+ def initialize
5
+ super('_multiple') # The name of the validator, underscored as it won't usually be directly invoked (invoked through use of validator)
6
+ end
7
+
8
+ def should_validate?(validation)
9
+ validation.is_a?(Validations::Multiple)
10
+ end
11
+
12
+ def validate(key, value, validations, errors)
13
+ multiple_errors = []
14
+
15
+ validations.validations.each do |validation|
16
+ validation_error = {}
17
+ ::HashValidator.validator_for(validation).validate(key, value, validation, validation_error)
18
+ multiple_errors << validation_error[key] if validation_error[key]
19
+ end
20
+
21
+ errors[key] = multiple_errors.join(', ') if multiple_errors.any?
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ HashValidator.append_validator(HashValidator::Validator::MultipleValidator.new)
@@ -7,7 +7,7 @@ class HashValidator::Validator::PresenceValidator < HashValidator::Validator::Ba
7
7
  'is required'
8
8
  end
9
9
 
10
- def validate(key, value, validations, errors)
10
+ def validate(key, value, _validations, errors)
11
11
  if value.nil?
12
12
  errors[key] = presence_error_message
13
13
  end
@@ -12,7 +12,7 @@ class HashValidator::Validator::SimpleValidator < HashValidator::Validator::Base
12
12
  self.lambda = lambda
13
13
  end
14
14
 
15
- def validate(key, value, validations, errors)
15
+ def validate(key, value, _validations, errors)
16
16
  unless lambda.call(value)
17
17
  errors[key] = presence_error_message
18
18
  end
@@ -1,3 +1,3 @@
1
1
  module HashValidator
2
- VERSION = '0.7.1'
2
+ VERSION = '0.8.0'
3
3
  end
@@ -239,6 +239,22 @@ describe HashValidator do
239
239
  expect(v.errors).to eq({ bar: 'string required', user: { likes: 'enumerable required' } })
240
240
  end
241
241
  end
242
+
243
+ describe 'multiple validations' do
244
+ let(:validations) {{ foo: 'numeric', user: { age: HashValidator.multiple('numeric', 1..100) } }}
245
+
246
+ it 'should validate a complex hash' do
247
+ v = validate(complex_hash, validations)
248
+ expect(v.valid?).to eq true
249
+ expect(v.errors).to be_empty
250
+ end
251
+
252
+ it 'should not validate a complex hash 2' do
253
+ v = validate(invalid_complex_hash, validations)
254
+ expect(v.valid?).to eq false
255
+ expect(v.errors).to eq({ user: { age: 'numeric required, value from list required' } })
256
+ end
257
+ end
242
258
  end
243
259
  end
244
260
  end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe HashValidator::Validator::Base do
4
+ let(:validator) { HashValidator::Validator::MultipleValidator.new }
5
+ let(:errors) { Hash.new }
6
+
7
+ def multiple(*validations)
8
+ HashValidator::Validations::Multiple.new(validations)
9
+ end
10
+
11
+ describe '#should_validate?' do
12
+ it 'should validate an Multiple validation' do
13
+ expect(validator.should_validate?(multiple('numeric', 1..10))).to eq true
14
+ end
15
+
16
+ it 'should not validate other things' do
17
+ expect(validator.should_validate?('string')).to eq false
18
+ expect(validator.should_validate?('array')).to eq false
19
+ expect(validator.should_validate?(nil)).to eq false
20
+ end
21
+ end
22
+
23
+ describe '#validate' do
24
+ it 'should accept an empty collection of validators' do
25
+ validator.validate(:key, 73, multiple(), errors)
26
+
27
+ expect(errors).to be_empty
28
+ end
29
+
30
+ it 'should accept an collection of validators' do
31
+ validator.validate(:key, 73, multiple('numeric', 1..100), errors)
32
+
33
+ expect(errors).to be_empty
34
+ end
35
+ end
36
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hash_validator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Brooks
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-06 00:00:00.000000000 Z
11
+ date: 2017-06-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -85,6 +85,7 @@ files:
85
85
  - lib/hash_validator/base.rb
86
86
  - lib/hash_validator/validations.rb
87
87
  - lib/hash_validator/validations/many.rb
88
+ - lib/hash_validator/validations/multiple.rb
88
89
  - lib/hash_validator/validations/optional.rb
89
90
  - lib/hash_validator/validators.rb
90
91
  - lib/hash_validator/validators/base.rb
@@ -94,6 +95,7 @@ files:
94
95
  - lib/hash_validator/validators/hash_validator.rb
95
96
  - lib/hash_validator/validators/lambda_validator.rb
96
97
  - lib/hash_validator/validators/many_validator.rb
98
+ - lib/hash_validator/validators/multiple_validator.rb
97
99
  - lib/hash_validator/validators/optional_validator.rb
98
100
  - lib/hash_validator/validators/presence_validator.rb
99
101
  - lib/hash_validator/validators/regex_validator.rb
@@ -109,6 +111,7 @@ files:
109
111
  - spec/validators/in_enumerable_spec.rb
110
112
  - spec/validators/lambda_spec.rb
111
113
  - spec/validators/many_spec.rb
114
+ - spec/validators/multiple_spec.rb
112
115
  - spec/validators/optional_spec.rb
113
116
  - spec/validators/presence_spec.rb
114
117
  - spec/validators/regexp_spec.rb
@@ -149,6 +152,7 @@ test_files:
149
152
  - spec/validators/in_enumerable_spec.rb
150
153
  - spec/validators/lambda_spec.rb
151
154
  - spec/validators/many_spec.rb
155
+ - spec/validators/multiple_spec.rb
152
156
  - spec/validators/optional_spec.rb
153
157
  - spec/validators/presence_spec.rb
154
158
  - spec/validators/regexp_spec.rb