can_has_validations 0.6.0 → 0.6.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/README.md +7 -3
- data/lib/can_has_validations/validators/array_validator.rb +4 -4
- data/lib/can_has_validations/validators/email_validator.rb +1 -1
- data/lib/can_has_validations/validators/grandparent_validator.rb +1 -1
- data/lib/can_has_validations/validators/hostname_validator.rb +2 -1
- data/lib/can_has_validations/validators/ordering_validator.rb +9 -6
- data/lib/can_has_validations/validators/url_validator.rb +2 -2
- data/lib/can_has_validations/validators/write_once_validator.rb +1 -1
- data/lib/can_has_validations/version.rb +1 -1
- data/test/dummy/log/test.log +0 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f14277d359dfd7f7a00e948c866c90497ac39d025fc753c83e0770c66102654b
|
4
|
+
data.tar.gz: 747a36b1d4e4c3723e5bb3455b9f5023570a1c0913520a1c21a5a9d18cf6ebae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6891aa12d3765c1338807e0b6de3fa799cacbe7c0eb44f1b8685b105b5cb5dc11eea40962ed637fd00e1cd1d68f1419fedae3ecd3bc4dfafd64bad441afb3e6
|
7
|
+
data.tar.gz: d92195ac58fa2ea3c9bae481b9dbdbcaccc0a2a8afa23c6607b46d1917d636500fd6c410c11cb3839d79ecfbd724fc57193555ce35e5ca728cf9804a274210ba
|
data/README.md
CHANGED
@@ -159,7 +159,9 @@ TLD, so as to not fail as ICANN continues to add TLDs.
|
|
159
159
|
|
160
160
|
Ensures two attribute values maintain a relative order to one another. This is
|
161
161
|
often useful when two date or range values. Validations can be written using
|
162
|
-
either `:before` or `:after` to make them readable.
|
162
|
+
either `:before` or `:after` to make them readable. The special value of `:now`
|
163
|
+
will automatically become Time.now (without needing a lambda).
|
164
|
+
|
163
165
|
|
164
166
|
Always skips over nil values; use `:presence` to validate those.
|
165
167
|
|
@@ -167,7 +169,9 @@ Always skips over nil values; use `:presence` to validate those.
|
|
167
169
|
validates :start_at, before: :finish_at
|
168
170
|
validates :finish_at, after: [:start_at, :alt_start_at]
|
169
171
|
validates :start_at, presence: true, before: :finish_at
|
170
|
-
|
172
|
+
# These two are the same, except `:now` produces a clearer error message:
|
173
|
+
validates :finish_at, after: :now
|
174
|
+
validates :finish_at, after: ->(r){ Time.now }
|
171
175
|
|
172
176
|
# Long versions, if you need to add extra validation options:
|
173
177
|
validates :start_at, before: {value_of: :finish_at, message: "..." }
|
@@ -229,4 +233,4 @@ Default messages are as follows:
|
|
229
233
|
|
230
234
|
## Compatibility ##
|
231
235
|
|
232
|
-
Tested with Ruby 2.3-2.
|
236
|
+
Tested with Ruby 2.3-2.5 and ActiveSupport and ActiveModel 4.2-5.2.
|
@@ -28,7 +28,7 @@ module ActiveModel
|
|
28
28
|
def initialize(options)
|
29
29
|
record_class = options[:class]
|
30
30
|
super
|
31
|
-
record_class.
|
31
|
+
record_class.extend DefaultKeys
|
32
32
|
|
33
33
|
defaults = @options.dup
|
34
34
|
validations = defaults.slice!(*record_class.send(:_validates_default_keys), :attributes)
|
@@ -37,8 +37,8 @@ module ActiveModel
|
|
37
37
|
|
38
38
|
defaults[:attributes] = attributes
|
39
39
|
|
40
|
-
@validators = validations.map do |key,
|
41
|
-
next unless
|
40
|
+
@validators = validations.map do |key, sub_options|
|
41
|
+
next unless sub_options
|
42
42
|
key = "#{key.to_s.camelize}Validator"
|
43
43
|
|
44
44
|
begin
|
@@ -47,7 +47,7 @@ module ActiveModel
|
|
47
47
|
raise ArgumentError, "Unknown validator: '#{key}'"
|
48
48
|
end
|
49
49
|
|
50
|
-
|
50
|
+
klass.new(defaults.merge(_parse_validates_options(sub_options)))
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
@@ -8,7 +8,7 @@ module ActiveModel::Validations
|
|
8
8
|
|
9
9
|
def validate_each(record, attribute, value)
|
10
10
|
unless value =~ EMAIL_REGEXP
|
11
|
-
record.errors.add(attribute, :invalid_email, options)
|
11
|
+
record.errors.add(attribute, :invalid_email, options.merge(value: value))
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -20,7 +20,7 @@ module ActiveModel::Validations
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
unless all_match
|
23
|
-
record.errors.add(attribute, :invalid, options.except(:allow_nil, :parent, :scope))
|
23
|
+
record.errors.add(attribute, :invalid, options.except(:allow_nil, :parent, :scope).merge!(value: value))
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -30,6 +30,7 @@ module ActiveModel::Validations
|
|
30
30
|
|
31
31
|
LABEL_REGEXP = /\A([a-zA-Z0-9_]([a-zA-Z0-9_-]+)?)?[a-zA-Z0-9]\z/
|
32
32
|
FINAL_LABEL_REGEXP = /\A(xn--[a-zA-Z0-9]{2,}|[a-zA-Z]{2,})\z/
|
33
|
+
RESERVED_OPTIONS = %i(allow_ip allow_underscore allow_wildcard)
|
33
34
|
|
34
35
|
def validate_each(record, attribute, value)
|
35
36
|
case options[:allow_ip]
|
@@ -65,7 +66,7 @@ module ActiveModel::Validations
|
|
65
66
|
end
|
66
67
|
|
67
68
|
unless is_valid
|
68
|
-
record.errors.add(attribute, :invalid_hostname, options)
|
69
|
+
record.errors.add(attribute, :invalid_hostname, options.except(*RESERVED_OPTIONS).merge!(value: value))
|
69
70
|
end
|
70
71
|
end
|
71
72
|
|
@@ -1,10 +1,11 @@
|
|
1
1
|
# Attribute ordering
|
2
2
|
# Ensures one value is greater or lesser than another (set of) value(s).
|
3
|
+
# The special value of :now will automatically become Time.now (without needing a lambda).
|
3
4
|
# Always skips over nil values; use :presence to validate those.
|
4
5
|
# eg: validates :start_at, before: :finish_at
|
5
6
|
# validates :start_at, before: {value_of: :finish_at, if: ... }
|
6
|
-
# validates :finish_at, after: [:start_at, :
|
7
|
-
# validates :finish_at, after: {values_of: [:start_at, :
|
7
|
+
# validates :finish_at, after: [:start_at, :now]
|
8
|
+
# validates :finish_at, after: {values_of: [:start_at, :now], if: ... }
|
8
9
|
|
9
10
|
module ActiveModel::Validations
|
10
11
|
class BeforeValidator < ActiveModel::EachValidator
|
@@ -12,11 +13,12 @@ module ActiveModel::Validations
|
|
12
13
|
compare_to = Array.wrap(options[:value_of] || options[:values_of] || options[:in] || options[:with])
|
13
14
|
compare_to.each do |attr_name|
|
14
15
|
greater = attr_name.call(record) if attr_name.respond_to?(:call)
|
16
|
+
greater ||= Time.now if attr_name==:now && !record.respond_to?(:now)
|
15
17
|
greater ||= record.send attr_name
|
16
18
|
next unless value && greater
|
17
19
|
unless value < greater
|
18
|
-
attr2 = record.class.human_attribute_name
|
19
|
-
record.errors.add(attribute, :before, options.except(:before).merge!(attribute2: attr2))
|
20
|
+
attr2 = attr_name.respond_to?(:call) ? 'it is' : record.class.human_attribute_name(attr_name)
|
21
|
+
record.errors.add(attribute, :before, options.except(:before).merge!(attribute2: attr2, value: value))
|
20
22
|
end
|
21
23
|
end
|
22
24
|
end
|
@@ -26,11 +28,12 @@ module ActiveModel::Validations
|
|
26
28
|
compare_to = Array.wrap(options[:value_of] || options[:values_of] || options[:in] || options[:with])
|
27
29
|
compare_to.each do |attr_name|
|
28
30
|
lesser = attr_name.call(record) if attr_name.respond_to?(:call)
|
31
|
+
lesser ||= Time.now if attr_name==:now && !record.respond_to?(:now)
|
29
32
|
lesser ||= record.send attr_name
|
30
33
|
next unless value && lesser
|
31
34
|
unless value > lesser
|
32
|
-
attr2 = record.class.human_attribute_name
|
33
|
-
record.errors.add(attribute, :after, options.except(:after).merge!(attribute2: attr2))
|
35
|
+
attr2 = attr_name.respond_to?(:call) ? 'it is' : record.class.human_attribute_name(attr_name)
|
36
|
+
record.errors.add(attribute, :after, options.except(:after).merge!(attribute2: attr2, value: value))
|
34
37
|
end
|
35
38
|
end
|
36
39
|
end
|
@@ -8,7 +8,7 @@ module ActiveModel::Validations
|
|
8
8
|
class UrlValidator < ActiveModel::EachValidator
|
9
9
|
def validate_each(record, attribute, value)
|
10
10
|
allowed_schemes = Array.wrap(options[:scheme] || %w(http https))
|
11
|
-
|
11
|
+
|
12
12
|
if defined?(Addressable::URI)
|
13
13
|
u = Addressable::URI.parse(value) rescue nil
|
14
14
|
u2 = u && URI.parse(u.normalize.to_s) rescue nil
|
@@ -16,7 +16,7 @@ module ActiveModel::Validations
|
|
16
16
|
u2 = u = URI.parse(value) rescue nil
|
17
17
|
end
|
18
18
|
if !u || !u2 || u.relative? || allowed_schemes.exclude?(u.scheme)
|
19
|
-
record.errors.add(attribute, :invalid_url, options)
|
19
|
+
record.errors.add(attribute, :invalid_url, options.merge(value: value))
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -20,7 +20,7 @@ module ActiveModel::Validations
|
|
20
20
|
def validate_each(record, attribute, value)
|
21
21
|
if record.persisted? && record.send("#{attribute}_changed?")
|
22
22
|
if options[:immutable_nil] || !record.send("#{attribute}_was").nil?
|
23
|
-
record.errors.add(attribute, :unchangeable, options)
|
23
|
+
record.errors.add(attribute, :unchangeable, options.except(:immutable_nil).merge!(value: value))
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: can_has_validations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- thomas morgan
|
@@ -90,6 +90,7 @@ files:
|
|
90
90
|
- test/dummy/config/initializers/wrap_parameters.rb
|
91
91
|
- test/dummy/config/locales/en.yml
|
92
92
|
- test/dummy/config/routes.rb
|
93
|
+
- test/dummy/log/test.log
|
93
94
|
- test/dummy/public/404.html
|
94
95
|
- test/dummy/public/422.html
|
95
96
|
- test/dummy/public/500.html
|
@@ -142,6 +143,7 @@ test_files:
|
|
142
143
|
- test/dummy/config/locales/en.yml
|
143
144
|
- test/dummy/config/routes.rb
|
144
145
|
- test/dummy/config.ru
|
146
|
+
- test/dummy/log/test.log
|
145
147
|
- test/dummy/public/404.html
|
146
148
|
- test/dummy/public/422.html
|
147
149
|
- test/dummy/public/500.html
|