lotus-validations 0.2.0 → 0.2.1
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 +8 -0
- data/lib/lotus/validations/attribute.rb +45 -31
- data/lib/lotus/validations/attribute_set.rb +1 -1
- data/lib/lotus/validations/errors.rb +34 -3
- data/lib/lotus/validations/version.rb +1 -1
- data/lib/lotus/validations.rb +4 -4
- data/lotus-validations.gemspec +3 -3
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 36c1599d9dc59f556a6041f459b41fe23a629e12
|
4
|
+
data.tar.gz: 16fade6ce990dfa2dc5f6bd477dae2bdf0160ab5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b53e4dfe4cc649cd1f7818d00b5de4a8171d6a0ffded3b12e603497abdbec84a31d97d062b87ed38b130e314beef3b06408a4632f957ba257823b9a4bafb22dc
|
7
|
+
data.tar.gz: 32dfdd1ed995e28ce04b631c2f9ee367347c7dfdf05936e9771f2c1254ea0aad763a91c62e0921c4ad9433487f5259bfb71e24a1133f7a7011aed78c9fa604b2
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
# Lotus::Validations
|
2
2
|
Validations mixin for Ruby objects
|
3
3
|
|
4
|
+
## v0.2.1 - 2014-12-23
|
5
|
+
### Added
|
6
|
+
- [Luca Guidi] Introduced `Validations::Errors#to_h` and `to_a`
|
7
|
+
- [Luca Guidi] Introduced `Validations::Errors#any?`
|
8
|
+
|
9
|
+
### Fixed
|
10
|
+
- [Satoshi Amemiya] Made `Validations#valid?` idempotent
|
11
|
+
|
4
12
|
## v0.2.0 - 2014-11-23
|
5
13
|
### Added
|
6
14
|
- [Luca Guidi] Skip attribute whitelisting when a validator does not define any attribute
|
@@ -20,23 +20,24 @@ module Lotus
|
|
20
20
|
#
|
21
21
|
# @see Lotus::Validations::Attribute#confirmation
|
22
22
|
#
|
23
|
-
# @since
|
23
|
+
# @since 0.2.0
|
24
24
|
# @api private
|
25
25
|
CONFIRMATION_TEMPLATE = '%{name}_confirmation'.freeze
|
26
26
|
|
27
|
+
# @since 0.2.0
|
28
|
+
# @api private
|
29
|
+
BLANK_STRING_MATCHER = /\A[[:space:]]*\z/.freeze
|
30
|
+
|
27
31
|
# Instantiate an attribute
|
28
32
|
#
|
29
|
-
# @param
|
30
|
-
#
|
33
|
+
# @param attributes [Hash] a set of attributes and values coming from the
|
34
|
+
# input
|
31
35
|
# @param name [Symbol] the name of the attribute
|
32
|
-
# @param
|
36
|
+
# @param value [Object,nil] the value coming from the input
|
37
|
+
# @param validations [Hash] a set of validation rules
|
33
38
|
#
|
34
|
-
# @since
|
39
|
+
# @since 0.2.0
|
35
40
|
# @api private
|
36
|
-
# def initialize(validator, name, options)
|
37
|
-
# @validator, @name, @options = validator, name, options
|
38
|
-
# @value = _attribute(@name)
|
39
|
-
# end
|
40
41
|
def initialize(attributes, name, value, validations)
|
41
42
|
@attributes = attributes
|
42
43
|
@name = name
|
@@ -46,7 +47,7 @@ module Lotus
|
|
46
47
|
end
|
47
48
|
|
48
49
|
# @api private
|
49
|
-
# @since
|
50
|
+
# @since 0.2.0
|
50
51
|
def validate
|
51
52
|
_with_cleared_errors do
|
52
53
|
presence
|
@@ -57,9 +58,10 @@ module Lotus
|
|
57
58
|
end
|
58
59
|
|
59
60
|
# @api private
|
60
|
-
# @since
|
61
|
+
# @since 0.2.0
|
61
62
|
def value
|
62
63
|
if (coercer = @validations[:type])
|
64
|
+
return nil if blank_value?
|
63
65
|
Lotus::Validations::Coercions.coerce(coercer, @value)
|
64
66
|
else
|
65
67
|
@value
|
@@ -76,7 +78,7 @@ module Lotus
|
|
76
78
|
# @see Lotus::Validations::ClassMethods#attribute
|
77
79
|
# @see Lotus::Validations::Attribute#nil_value?
|
78
80
|
#
|
79
|
-
# @since
|
81
|
+
# @since 0.2.0
|
80
82
|
# @api private
|
81
83
|
def presence
|
82
84
|
_validate(__method__) { !blank_value? }
|
@@ -92,7 +94,7 @@ module Lotus
|
|
92
94
|
# @see Lotus::Validations::ClassMethods#attribute
|
93
95
|
# @see http://www.rubydoc.info/gems/lotus-utils/Lotus/Utils/Kernel#Boolean-class_method
|
94
96
|
#
|
95
|
-
# @since
|
97
|
+
# @since 0.2.0
|
96
98
|
# @api private
|
97
99
|
def acceptance
|
98
100
|
_validate(__method__) { Lotus::Utils::Kernel.Boolean(@value) }
|
@@ -105,7 +107,7 @@ module Lotus
|
|
105
107
|
#
|
106
108
|
# @see Lotus::Validations::ClassMethods#attribute
|
107
109
|
#
|
108
|
-
# @since
|
110
|
+
# @since 0.2.0
|
109
111
|
# @api private
|
110
112
|
def format
|
111
113
|
_validate(__method__) {|matcher| @value.to_s.match(matcher) }
|
@@ -117,10 +119,10 @@ module Lotus
|
|
117
119
|
#
|
118
120
|
# @see Lotus::Validations::ClassMethods#attribute
|
119
121
|
#
|
120
|
-
# @since
|
122
|
+
# @since 0.2.0
|
121
123
|
# @api private
|
122
124
|
def inclusion
|
123
|
-
_validate(__method__) {|collection| collection.include?(
|
125
|
+
_validate(__method__) {|collection| collection.include?(value) }
|
124
126
|
end
|
125
127
|
|
126
128
|
# Validates exclusion of the value in the defined collection.
|
@@ -129,10 +131,10 @@ module Lotus
|
|
129
131
|
#
|
130
132
|
# @see Lotus::Validations::ClassMethods#attribute
|
131
133
|
#
|
132
|
-
# @since
|
134
|
+
# @since 0.2.0
|
133
135
|
# @api private
|
134
136
|
def exclusion
|
135
|
-
_validate(__method__) {|collection| !collection.include?(
|
137
|
+
_validate(__method__) {|collection| !collection.include?(value) }
|
136
138
|
end
|
137
139
|
|
138
140
|
# Validates confirmation of the value with another corresponding value.
|
@@ -143,7 +145,7 @@ module Lotus
|
|
143
145
|
# @see Lotus::Validations::ClassMethods#attribute
|
144
146
|
# @see Lotus::Validations::Attribute::CONFIRMATION_TEMPLATE
|
145
147
|
#
|
146
|
-
# @since
|
148
|
+
# @since 0.2.0
|
147
149
|
# @api private
|
148
150
|
def confirmation
|
149
151
|
_validate(__method__) do
|
@@ -180,15 +182,15 @@ module Lotus
|
|
180
182
|
#
|
181
183
|
# @see Lotus::Validations::ClassMethods#attribute
|
182
184
|
#
|
183
|
-
# @since
|
185
|
+
# @since 0.2.0
|
184
186
|
# @api private
|
185
187
|
def size
|
186
188
|
_validate(__method__) do |validator|
|
187
189
|
case validator
|
188
190
|
when Numeric, ->(v) { v.respond_to?(:to_int) }
|
189
|
-
|
191
|
+
value.size == validator.to_int
|
190
192
|
when Range
|
191
|
-
validator.include?(
|
193
|
+
validator.include?(value.size)
|
192
194
|
else
|
193
195
|
raise ArgumentError.new("Size validator must be a number or a range, it was: #{ validator }")
|
194
196
|
end
|
@@ -221,18 +223,18 @@ module Lotus
|
|
221
223
|
# @see Lotus::Validations::ClassMethods#attribute
|
222
224
|
# @see Lotus::Validations::Coercions
|
223
225
|
#
|
224
|
-
# @since
|
226
|
+
# @since 0.2.0
|
225
227
|
# @api private
|
226
228
|
def coerce
|
227
229
|
_validate(:type) do |coercer|
|
228
|
-
|
230
|
+
Lotus::Validations::Coercions.coerce(coercer, @value)
|
229
231
|
true
|
230
232
|
end
|
231
233
|
end
|
232
234
|
|
233
235
|
# Checks if the value is `nil`.
|
234
236
|
#
|
235
|
-
# @since
|
237
|
+
# @since 0.2.0
|
236
238
|
# @api private
|
237
239
|
def nil_value?
|
238
240
|
@value.nil?
|
@@ -244,15 +246,27 @@ module Lotus
|
|
244
246
|
#
|
245
247
|
# @see Lotus::Validations::Attribute#presence
|
246
248
|
#
|
247
|
-
# @since
|
249
|
+
# @since 0.2.0
|
248
250
|
# @api private
|
249
251
|
def blank_value?
|
250
|
-
nil_value? ||
|
252
|
+
nil_value? || _blank_string? || _empty_value?
|
253
|
+
end
|
254
|
+
|
255
|
+
# @since 0.2.0
|
256
|
+
# @api private
|
257
|
+
def _blank_string?
|
258
|
+
(@value.respond_to?(:match) and @value.match(BLANK_STRING_MATCHER))
|
259
|
+
end
|
260
|
+
|
261
|
+
# @since 0.2.0
|
262
|
+
# @api private
|
263
|
+
def _empty_value?
|
264
|
+
(@value.respond_to?(:empty?) and @value.empty?)
|
251
265
|
end
|
252
266
|
|
253
267
|
# Run the defined validations
|
254
268
|
#
|
255
|
-
# @since
|
269
|
+
# @since 0.2.0
|
256
270
|
# @api private
|
257
271
|
def _run_validations
|
258
272
|
return if skip?
|
@@ -266,7 +280,7 @@ module Lotus
|
|
266
280
|
end
|
267
281
|
|
268
282
|
# @api private
|
269
|
-
# @since
|
283
|
+
# @since 0.2.0
|
270
284
|
def _with_cleared_errors
|
271
285
|
@errors.clear
|
272
286
|
yield
|
@@ -275,7 +289,7 @@ module Lotus
|
|
275
289
|
|
276
290
|
# Reads an attribute from the validator.
|
277
291
|
#
|
278
|
-
# @since
|
292
|
+
# @since 0.2.0
|
279
293
|
# @api private
|
280
294
|
def _attribute(name = @name)
|
281
295
|
@attributes[name.to_sym]
|
@@ -283,7 +297,7 @@ module Lotus
|
|
283
297
|
|
284
298
|
# Run a single validation and collects the results.
|
285
299
|
#
|
286
|
-
# @since
|
300
|
+
# @since 0.2.0
|
287
301
|
# @api private
|
288
302
|
def _validate(validation)
|
289
303
|
if (validator = @validations[validation]) && !(yield validator)
|
@@ -34,7 +34,7 @@ class AttributeSet
|
|
34
34
|
# @raise [ArgumentError] if at least one of the validations are not
|
35
35
|
# recognized
|
36
36
|
#
|
37
|
-
# @since
|
37
|
+
# @since 0.2.0
|
38
38
|
# @api private
|
39
39
|
def validate_options!(name, options)
|
40
40
|
if (unknown = (options.keys - VALIDATIONS)) && unknown.any?
|
@@ -23,10 +23,23 @@ module Lotus
|
|
23
23
|
# @return [TrueClass,FalseClass] the result of the check
|
24
24
|
#
|
25
25
|
# @since 0.1.0
|
26
|
+
#
|
27
|
+
# @see Lotus::Validations::Errors#any?
|
26
28
|
def empty?
|
27
29
|
@errors.empty?
|
28
30
|
end
|
29
31
|
|
32
|
+
# Check if the set has any entry
|
33
|
+
#
|
34
|
+
# @return [TrueClass,FalseClass] the result of the check
|
35
|
+
#
|
36
|
+
# @since 0.2.0
|
37
|
+
#
|
38
|
+
# @see Lotus::Validations::Errors#empty?
|
39
|
+
def any?
|
40
|
+
@errors.any?
|
41
|
+
end
|
42
|
+
|
30
43
|
# Returns how many validations have failed
|
31
44
|
#
|
32
45
|
# @return [Fixnum] the count
|
@@ -74,12 +87,12 @@ module Lotus
|
|
74
87
|
# Add an error to the set
|
75
88
|
#
|
76
89
|
# @param attribute [Symbol] the name of the attribute
|
77
|
-
# @param
|
78
|
-
# @param expected [Object] the expected value
|
79
|
-
# @param actual [Object] the actual value
|
90
|
+
# @param errors [Array] a collection of errors
|
80
91
|
#
|
81
92
|
# @since 0.1.0
|
82
93
|
# @api private
|
94
|
+
#
|
95
|
+
# @see Lotus::Validations::Error
|
83
96
|
def add(attribute, *errors)
|
84
97
|
@errors[attribute].push(*errors) if errors.any?
|
85
98
|
end
|
@@ -108,6 +121,24 @@ module Lotus
|
|
108
121
|
|
109
122
|
alias_method :eql?, :==
|
110
123
|
|
124
|
+
# Return a serializable Hash representation of the errors.
|
125
|
+
#
|
126
|
+
# @return [Lotus::Utils::Hash] the Hash
|
127
|
+
#
|
128
|
+
# @since 0.2.1
|
129
|
+
def to_h
|
130
|
+
Utils::Hash.new(@errors).deep_dup
|
131
|
+
end
|
132
|
+
|
133
|
+
# Return a flat collection of errors.
|
134
|
+
#
|
135
|
+
# @return [Array]
|
136
|
+
#
|
137
|
+
# @since 0.2.1
|
138
|
+
def to_a
|
139
|
+
errors.dup
|
140
|
+
end
|
141
|
+
|
111
142
|
protected
|
112
143
|
# A flatten set of errors for all the attributes
|
113
144
|
#
|
data/lib/lotus/validations.rb
CHANGED
@@ -32,7 +32,7 @@ module Lotus
|
|
32
32
|
#
|
33
33
|
# @param base [Class] the target action
|
34
34
|
#
|
35
|
-
# @since
|
35
|
+
# @since 0.1.0
|
36
36
|
# @api private
|
37
37
|
#
|
38
38
|
# @see http://www.ruby-doc.org/core/Module.html#method-i-included
|
@@ -384,7 +384,7 @@ module Lotus
|
|
384
384
|
# @yieldparam attribute [Symbol] the name of the attribute
|
385
385
|
# @yieldparam value [Object,nil] the value of the attribute
|
386
386
|
#
|
387
|
-
# @since
|
387
|
+
# @since 0.2.0
|
388
388
|
def each(&blk)
|
389
389
|
to_h.each(&blk)
|
390
390
|
end
|
@@ -394,7 +394,7 @@ module Lotus
|
|
394
394
|
#
|
395
395
|
# @return [Hash]
|
396
396
|
#
|
397
|
-
# @since
|
397
|
+
# @since 0.1.0
|
398
398
|
def to_h
|
399
399
|
@attributes.dup
|
400
400
|
end
|
@@ -402,7 +402,7 @@ module Lotus
|
|
402
402
|
private
|
403
403
|
# The set of user defined attributes.
|
404
404
|
#
|
405
|
-
# @since
|
405
|
+
# @since 0.1.0
|
406
406
|
# @api private
|
407
407
|
#
|
408
408
|
# @see Lotus::Validations::ClassMethods#attributes
|
data/lotus-validations.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Lotus::Validations::VERSION
|
9
9
|
spec.authors = ['Luca Guidi']
|
10
10
|
spec.email = ['me@lucaguidi.com']
|
11
|
-
spec.summary = %q{Validations for
|
12
|
-
spec.description = %q{
|
11
|
+
spec.summary = %q{Validations mixin for Ruby objects}
|
12
|
+
spec.description = %q{Validations mixin for Ruby objects and support for Lotus}
|
13
13
|
spec.homepage = 'http://lotusrb.org'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
spec.required_ruby_version = '>= 2.0.0'
|
21
21
|
|
22
|
-
spec.add_dependency 'lotus-utils', '~> 0.3', '>= 0.3.
|
22
|
+
spec.add_dependency 'lotus-utils', '~> 0.3', '>= 0.3.2'
|
23
23
|
|
24
24
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
25
25
|
spec.add_development_dependency 'minitest', '~> 5'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lotus-validations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lotus-utils
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '0.3'
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 0.3.
|
22
|
+
version: 0.3.2
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: '0.3'
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 0.3.
|
32
|
+
version: 0.3.2
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: bundler
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,7 +72,7 @@ dependencies:
|
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: '10'
|
75
|
-
description:
|
75
|
+
description: Validations mixin for Ruby objects and support for Lotus
|
76
76
|
email:
|
77
77
|
- me@lucaguidi.com
|
78
78
|
executables: []
|
@@ -115,6 +115,6 @@ rubyforge_project:
|
|
115
115
|
rubygems_version: 2.2.2
|
116
116
|
signing_key:
|
117
117
|
specification_version: 4
|
118
|
-
summary: Validations for
|
118
|
+
summary: Validations mixin for Ruby objects
|
119
119
|
test_files: []
|
120
120
|
has_rdoc:
|