active_validation 2.2.2 → 2.3.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/active_validation.gemspec +1 -1
- data/lib/active_validation/validators/alpha_numeric_validator.rb +2 -2
- data/lib/active_validation/validators/alpha_validator.rb +2 -2
- data/lib/active_validation/validators/base64_validator.rb +1 -1
- data/lib/active_validation/validators/boolean_validator.rb +3 -3
- data/lib/active_validation/validators/coordinate_validator.rb +5 -5
- data/lib/active_validation/validators/credit_card_validator.rb +23 -58
- data/lib/active_validation/validators/currency_validator.rb +1 -1
- data/lib/active_validation/validators/cusip_validator.rb +3 -3
- data/lib/active_validation/validators/email_validator.rb +3 -3
- data/lib/active_validation/validators/equality_validator.rb +3 -3
- data/lib/active_validation/validators/hex_validator.rb +1 -1
- data/lib/active_validation/validators/imei_validator.rb +4 -4
- data/lib/active_validation/validators/ip_validator.rb +1 -1
- data/lib/active_validation/validators/isbn_validator.rb +5 -5
- data/lib/active_validation/validators/isin_validator.rb +2 -2
- data/lib/active_validation/validators/mac_address_validator.rb +4 -7
- data/lib/active_validation/validators/name_validator.rb +1 -1
- data/lib/active_validation/validators/password_validator.rb +1 -1
- data/lib/active_validation/validators/phone_validator.rb +1 -1
- data/lib/active_validation/validators/sedol_validator.rb +4 -6
- data/lib/active_validation/validators/slug_validator.rb +1 -1
- data/lib/active_validation/validators/ssn_validator.rb +1 -1
- data/lib/active_validation/validators/tracking_number_validator.rb +11 -11
- data/lib/active_validation/validators/url_validator.rb +8 -8
- data/lib/active_validation/validators/username_validator.rb +1 -1
- data/lib/active_validation/validators/uuid_validator.rb +2 -2
- data/lib/active_validation/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad382cdab288f4c64ab7197a45cd470d31f6c7d6
|
4
|
+
data.tar.gz: d34760c5275f365fff05f108eacbdb6d6ec3b89a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d4de98fb656e899a85e0dc074cdd24f8f3a53ea6285464816a61a3b597d7609c58d48e2893ef2391b1dddd834f6e00cb303224bceaa58e82a995b15d8d7ce34b
|
7
|
+
data.tar.gz: 3eb5cafa8ad190ada20854ec1143a5d7bee81698abeb5cf4f211b532ef242c0c2a7c267a3a4a23ab0fb601e329c5c6b3273492b4f72c862760be83bdafde2bc4
|
data/active_validation.gemspec
CHANGED
@@ -27,5 +27,5 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_development_dependency "coveralls"
|
28
28
|
spec.add_development_dependency "rake"
|
29
29
|
spec.add_development_dependency "rspec"
|
30
|
-
spec.add_development_dependency "shoulda
|
30
|
+
spec.add_development_dependency "shoulda"
|
31
31
|
end
|
@@ -2,7 +2,7 @@ class AlphaNumericValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s, options)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.alpha_numeric'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -11,7 +11,7 @@ class AlphaNumericValidator < ActiveModel::EachValidator
|
|
11
11
|
def valid_format?(value, options)
|
12
12
|
strict = options.fetch(:strict, false)
|
13
13
|
|
14
|
-
value =~ case options
|
14
|
+
value =~ case options.fetch(:case, :any)
|
15
15
|
when :lower
|
16
16
|
strict ? /^[a-z0-9]+$/ : /^[a-z0-9 ]+$/
|
17
17
|
when :upper
|
@@ -2,7 +2,7 @@ class AlphaValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s, options)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.alpha'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -11,7 +11,7 @@ class AlphaValidator < ActiveModel::EachValidator
|
|
11
11
|
def valid_format?(value, options)
|
12
12
|
strict = options.fetch(:strict, false)
|
13
13
|
|
14
|
-
value =~ case options
|
14
|
+
value =~ case options.fetch(:case, :any)
|
15
15
|
when :lower
|
16
16
|
strict ? /^[a-z]+$/ : /^[a-z ]+$/
|
17
17
|
when :upper
|
@@ -2,7 +2,7 @@ class Base64Validator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.base64'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -2,13 +2,13 @@ class BooleanValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless TRUE_VALUES.include?(value) || FALSE_VALUES.include?(value)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.boolean'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
9
|
private
|
10
10
|
|
11
|
-
FALSE_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE']
|
12
|
-
TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE']
|
11
|
+
FALSE_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE'].freeze
|
12
|
+
TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE'].freeze
|
13
13
|
|
14
14
|
end
|
@@ -1,20 +1,20 @@
|
|
1
1
|
class CoordinateValidator < ActiveModel::EachValidator
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
|
-
boundary = options.fetch(:boundary, :coordinate)
|
4
|
+
boundary = options.fetch(:boundary, :coordinate).to_sym
|
5
5
|
unless BOUNDARIES.include?(boundary)
|
6
6
|
raise ArgumentError,
|
7
|
-
"Unknown boundary: #{boundary.inspect}. Valid boundaries are: #{BOUNDARIES.map(&:inspect).join(', ')}"
|
7
|
+
"Unknown boundary: #{boundary.inspect}. Valid boundaries are: #{BOUNDARIES.map(&:inspect).join(', '.freeze)}"
|
8
8
|
end
|
9
9
|
|
10
10
|
unless valid?(value, options)
|
11
|
-
record.errors[attribute] << (options
|
11
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t("active_validation.errors.messages.coordinate.#{boundary}"))
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
private
|
16
16
|
|
17
|
-
BOUNDARIES = [:coordinate, :latitude, :longitude]
|
17
|
+
BOUNDARIES = [:coordinate, :latitude, :longitude].freeze
|
18
18
|
|
19
19
|
def valid_length?(value)
|
20
20
|
value.present?
|
@@ -29,7 +29,7 @@ class CoordinateValidator < ActiveModel::EachValidator
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def valid_boundary?(value, options)
|
32
|
-
case options.fetch(:boundary, :coordinate)
|
32
|
+
case options.fetch(:boundary, :coordinate).to_sym
|
33
33
|
when :latitude
|
34
34
|
valid_latitude?(value)
|
35
35
|
when :longitude
|
@@ -2,7 +2,7 @@ class CreditCardValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s, options)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.credit_card'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -19,7 +19,7 @@ class CreditCardValidator < ActiveModel::EachValidator
|
|
19
19
|
solo: [16, 18, 19],
|
20
20
|
unionpay: [16, 17, 18, 19],
|
21
21
|
visa: [16]
|
22
|
-
}
|
22
|
+
}.freeze
|
23
23
|
|
24
24
|
DEFAULT_PREFIXES = {
|
25
25
|
american_express: ['34', '37'],
|
@@ -47,7 +47,7 @@ class CreditCardValidator < ActiveModel::EachValidator
|
|
47
47
|
'622920', '622921', '622922', '622923', '622924', '622925'
|
48
48
|
],
|
49
49
|
visa: ['4']
|
50
|
-
}
|
50
|
+
}.freeze
|
51
51
|
|
52
52
|
def valid_format?(value, options)
|
53
53
|
value =~ (options.fetch(:strict, false) ? /^[0-9]+$/ : /^[0-9 -.]+$/)
|
@@ -56,74 +56,39 @@ class CreditCardValidator < ActiveModel::EachValidator
|
|
56
56
|
def valid_length?(value, options)
|
57
57
|
return(false) unless value.present?
|
58
58
|
|
59
|
-
|
60
|
-
value_size
|
59
|
+
current_card = options.fetch(:card, :all).to_sym
|
60
|
+
value_size = value.size
|
61
61
|
|
62
|
-
case
|
63
|
-
when :
|
64
|
-
DEFAULT_LENGTHS
|
65
|
-
when :
|
66
|
-
DEFAULT_LENGTHS
|
67
|
-
when :discover
|
68
|
-
DEFAULT_LENGTHS[:discover].include?(value_size)
|
69
|
-
when :jcb
|
70
|
-
DEFAULT_LENGTHS[:jcb].include?(value_size)
|
71
|
-
when :laser
|
72
|
-
DEFAULT_LENGTHS[:laser].include?(value_size)
|
73
|
-
when :maestro
|
74
|
-
DEFAULT_LENGTHS[:maestro].include?(value_size)
|
75
|
-
when :mastercard
|
76
|
-
DEFAULT_LENGTHS[:mastercard].include?(value_size)
|
77
|
-
when :solo
|
78
|
-
DEFAULT_LENGTHS[:solo].include?(value_size)
|
79
|
-
when :unionpay
|
80
|
-
DEFAULT_LENGTHS[:unionpay].include?(value_size)
|
81
|
-
when :visa
|
82
|
-
DEFAULT_LENGTHS[:visa].include?(value_size)
|
83
|
-
else
|
62
|
+
case current_card
|
63
|
+
when :amex
|
64
|
+
DEFAULT_LENGTHS.fetch(:american_express).include?(value_size)
|
65
|
+
when :all
|
66
|
+
value_size_range = DEFAULT_LENGTHS.values.flatten.uniq.sort
|
84
67
|
value_size.between?(value_size_range.first, value_size_range.last)
|
68
|
+
else
|
69
|
+
DEFAULT_LENGTHS.fetch(current_card).include?(value_size)
|
85
70
|
end
|
86
71
|
end
|
87
72
|
|
88
73
|
def valid_prefix?(value, options)
|
89
|
-
|
74
|
+
current_card = options.fetch(:card, :all).to_sym
|
90
75
|
|
91
|
-
case
|
92
|
-
when :
|
93
|
-
DEFAULT_PREFIXES
|
94
|
-
when :
|
95
|
-
DEFAULT_PREFIXES[:diners_club].any? { |prefix| value.start_with?(prefix) }
|
96
|
-
when :discover
|
97
|
-
DEFAULT_PREFIXES[:discover].any? { |prefix| value.start_with?(prefix) }
|
98
|
-
when :jcb
|
99
|
-
DEFAULT_PREFIXES[:jcb].any? { |prefix| value.start_with?(prefix) }
|
100
|
-
when :laser
|
101
|
-
DEFAULT_PREFIXES[:laser].any? { |prefix| value.start_with?(prefix) }
|
102
|
-
when :maestro
|
103
|
-
DEFAULT_PREFIXES[:maestro].any? { |prefix| value.start_with?(prefix) }
|
104
|
-
when :mastercard
|
105
|
-
DEFAULT_PREFIXES[:mastercard].any? { |prefix| value.start_with?(prefix) }
|
106
|
-
when :solo
|
107
|
-
DEFAULT_PREFIXES[:solo].any? { |prefix| value.start_with?(prefix) }
|
108
|
-
when :unionpay
|
109
|
-
DEFAULT_PREFIXES[:unionpay].any? { |prefix| value.start_with?(prefix) }
|
110
|
-
when :visa
|
111
|
-
DEFAULT_PREFIXES[:visa].any? { |prefix| value.start_with?(prefix) }
|
112
|
-
else
|
76
|
+
case current_card
|
77
|
+
when :amex
|
78
|
+
DEFAULT_PREFIXES.fetch(:american_express).any? { |p| value.start_with?(p) }
|
79
|
+
when :all
|
113
80
|
result = false
|
114
|
-
DEFAULT_LENGTHS.each do |key, values|
|
115
|
-
if values.include?(
|
116
|
-
result = DEFAULT_PREFIXES[key].any? { |prefix| value.start_with?(prefix) }
|
117
|
-
break if result
|
118
|
-
end
|
119
|
-
break if result
|
81
|
+
DEFAULT_LENGTHS.lazy.each do |key, values|
|
82
|
+
break if result = DEFAULT_PREFIXES.fetch(key).any? { |p| value.start_with?(p) } if values.include?(value.size)
|
120
83
|
end
|
121
|
-
|
84
|
+
result
|
85
|
+
else
|
86
|
+
DEFAULT_PREFIXES.fetch(current_card).any? { |p| value.start_with?(p) }
|
122
87
|
end
|
123
88
|
end
|
124
89
|
|
125
90
|
def valid?(value, options)
|
126
|
-
striped_value = value.gsub(/\D/, '')
|
91
|
+
striped_value = value.gsub(/\D/, ''.freeze)
|
127
92
|
|
128
93
|
valid_format?(value, options) &&
|
129
94
|
valid_length?(striped_value, options) &&
|
@@ -2,7 +2,7 @@ class CurrencyValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s, options)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.currency'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -2,18 +2,18 @@ class CusipValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.cusip'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
9
|
private
|
10
10
|
|
11
11
|
def valid_checksum?(value)
|
12
|
-
digits = value.chars.map { |
|
12
|
+
digits = value.chars.map { |c| c.match(/[A-Z]/) ? (c.ord - 55) : c.to_i }
|
13
13
|
even_values = digits.values_at(* digits.each_index.select { |i| i.even? })
|
14
14
|
odd_values = digits.values_at(* digits.each_index.select { |i| i.odd? })
|
15
15
|
values = odd_values.map { |i| i * 2 }.zip(even_values).flatten
|
16
|
-
values = values.inject(0) { |
|
16
|
+
values = values.inject(0) { |s, i| s += (i / 10) + i % 10 }
|
17
17
|
|
18
18
|
((10 - values) % 10) % 10
|
19
19
|
end
|
@@ -2,14 +2,14 @@ class EmailValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s, options)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.email'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
9
|
private
|
10
10
|
|
11
11
|
def valid_domain?(value, options)
|
12
|
-
options.empty? || options.any? { |
|
12
|
+
options.empty? || options.any? { |d| value.downcase.end_with?(".#{d.downcase}") }
|
13
13
|
end
|
14
14
|
|
15
15
|
def valid_format?(value)
|
@@ -23,7 +23,7 @@ class EmailValidator < ActiveModel::EachValidator
|
|
23
23
|
def valid?(value, options)
|
24
24
|
valid_length?(value) &&
|
25
25
|
valid_format?(value) &&
|
26
|
-
valid_domain?(value, [*(options
|
26
|
+
valid_domain?(value, [*(options.fetch(:domain, nil))])
|
27
27
|
end
|
28
28
|
|
29
29
|
end
|
@@ -11,12 +11,12 @@ class EqualityValidator < ActiveModel::EachValidator
|
|
11
11
|
operators = OPERATORS.keys
|
12
12
|
unless operators.include?(operator)
|
13
13
|
raise ArgumentError,
|
14
|
-
"Unknown operator: #{operator.inspect}. Valid operators are: #{operators.map(&:inspect).join(', ')}"
|
14
|
+
"Unknown operator: #{operator.inspect}. Valid operators are: #{operators.map(&:inspect).join(', '.freeze)}"
|
15
15
|
end
|
16
16
|
operator = OPERATORS.fetch(operator)
|
17
17
|
|
18
18
|
unless value.send(operator.to_sym, record.send(to.to_sym))
|
19
|
-
record.errors[attribute] << (options
|
19
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.equality'.freeze, attr: to, operator: operator))
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
@@ -29,6 +29,6 @@ class EqualityValidator < ActiveModel::EachValidator
|
|
29
29
|
greater_than_or_equal_to: :>=,
|
30
30
|
equal_to: :==,
|
31
31
|
not_equal_to: :!=
|
32
|
-
}
|
32
|
+
}.freeze
|
33
33
|
|
34
34
|
end
|
@@ -2,7 +2,7 @@ class HexValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.hex'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -2,7 +2,7 @@ class ImeiValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.imei'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -17,11 +17,11 @@ class ImeiValidator < ActiveModel::EachValidator
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def valid_luhn?(value)
|
20
|
-
number = value.gsub(/\D/, '').reverse
|
20
|
+
number = value.gsub(/\D/, ''.freeze).reverse
|
21
21
|
|
22
22
|
total = 0
|
23
|
-
number.chars.each_with_index do |
|
24
|
-
result =
|
23
|
+
number.chars.lazy.each_with_index do |c, i|
|
24
|
+
result = c.to_i
|
25
25
|
result *= 2 if i.odd?
|
26
26
|
result = (1 + (result - 10)) if (result >= 10)
|
27
27
|
total += result
|
@@ -2,7 +2,7 @@ class IpValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.ip'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -2,18 +2,18 @@ class IsbnValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.isbn'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
9
|
private
|
10
10
|
|
11
11
|
def valid_format?(value)
|
12
|
-
value = '' if value.blank?
|
13
|
-
value = value.gsub(/-| /, '').downcase.chars
|
12
|
+
value = ''.freeze if value.blank?
|
13
|
+
value = value.gsub(/-| /, ''.freeze).downcase.chars
|
14
14
|
|
15
|
-
[10, 13].include?(value.size) &&
|
16
|
-
value.all? { |
|
15
|
+
[10, 13].freeze.include?(value.size) &&
|
16
|
+
value.all? { |c| ['0', '1', '2' , '3', '4', '5', '6', '7', '8', '9', '0', 'x'].freeze.include?(c) }
|
17
17
|
end
|
18
18
|
|
19
19
|
def valid_length?(value)
|
@@ -2,7 +2,7 @@ class IsinValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.isin'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -10,7 +10,7 @@ class IsinValidator < ActiveModel::EachValidator
|
|
10
10
|
|
11
11
|
def valid_checksum?(value)
|
12
12
|
characters = value.chars
|
13
|
-
digits = characters.map { |
|
13
|
+
digits = characters.map { |c| c.match(/[A-Z]/) ? (c.ord - 55) : c.to_i }
|
14
14
|
even_values = digits.values_at(* digits.each_index.select { |i| i.even? })
|
15
15
|
odd_values = digits.values_at(* digits.each_index.select { |i| i.odd? })
|
16
16
|
|
@@ -2,7 +2,7 @@ class MacAddressValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.mac_address'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -15,15 +15,12 @@ class MacAddressValidator < ActiveModel::EachValidator
|
|
15
15
|
/^([\h]{6}):[\h]{6}?$/i,
|
16
16
|
/^([\h]{4}[-|\.|\s]){2}[\h]{4}?$/i,
|
17
17
|
/^[\h]{12}?$/i
|
18
|
-
]
|
18
|
+
].freeze
|
19
19
|
|
20
20
|
def valid_format?(value)
|
21
21
|
result = false
|
22
|
-
DEFAULT_FORMATS.each
|
23
|
-
|
24
|
-
break if result
|
25
|
-
end
|
26
|
-
return(result)
|
22
|
+
DEFAULT_FORMATS.lazy.each { |p| break if result = (value =~ p) }
|
23
|
+
result
|
27
24
|
end
|
28
25
|
|
29
26
|
def valid_length?(value)
|
@@ -2,7 +2,7 @@ class NameValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.name'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -2,7 +2,7 @@ class PasswordValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s, options)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.password'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -2,7 +2,7 @@ class PhoneValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.phone'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -2,20 +2,18 @@ class SedolValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.sedol'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
9
|
private
|
10
10
|
|
11
11
|
def valid_checksum?(value)
|
12
|
-
digits = value.chars.map { |
|
13
|
-
weights = [1, 3, 1, 7, 3, 9, 1]
|
12
|
+
digits = value.chars.map { |d| d.match(/[A-Z]/) ? (d.ord - 55) : d.to_i }
|
13
|
+
weights = [1, 3, 1, 7, 3, 9, 1].freeze
|
14
14
|
|
15
15
|
total = 0
|
16
|
-
digits.each_with_index
|
17
|
-
total += (weights[i] * digit)
|
18
|
-
end
|
16
|
+
digits.lazy.each_with_index { |d, i| total += (weights[i] * d) }
|
19
17
|
|
20
18
|
(10 - total % 10) % 10
|
21
19
|
end
|
@@ -2,7 +2,7 @@ class SlugValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.slug'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -2,7 +2,7 @@ class SsnValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.ssn'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -2,7 +2,7 @@ class TrackingNumberValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s, options)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.tracking_number'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -27,7 +27,7 @@ class TrackingNumberValidator < ActiveModel::EachValidator
|
|
27
27
|
usps20: /^([0-9]{2,2})([0-9]{9,9})([0-9]{8,8})([0-9])$/,
|
28
28
|
usps91: /^(?:420\d{5})?(9[1-5](?:[0-9]{19}|[0-9]{23}))([0-9])$/
|
29
29
|
}
|
30
|
-
}
|
30
|
+
}.freeze
|
31
31
|
|
32
32
|
# DHL
|
33
33
|
DEFAULT_CARRIERS_AND_SERVICES.fetch(:dhl).each do |service, pattern|
|
@@ -50,7 +50,7 @@ class TrackingNumberValidator < ActiveModel::EachValidator
|
|
50
50
|
sequence, check_digit = formula
|
51
51
|
|
52
52
|
total = 0
|
53
|
-
sequence.chars.zip([3, 1, 7, 3, 1, 7, 3, 1, 7, 3, 1]).each do |(char1, char2)|
|
53
|
+
sequence.chars.zip([3, 1, 7, 3, 1, 7, 3, 1, 7, 3, 1].freeze).lazy.each do |(char1, char2)|
|
54
54
|
total += (char1.to_i * char2)
|
55
55
|
end
|
56
56
|
|
@@ -59,14 +59,14 @@ class TrackingNumberValidator < ActiveModel::EachValidator
|
|
59
59
|
|
60
60
|
DEFAULT_CARRIERS_AND_SERVICES.fetch(:fedex).only(:ground, :ground18, :ground96).each_with_index do |(service, pattern), i|
|
61
61
|
define_method("valid_fedex_#{service}_checksum?") do |value|
|
62
|
-
return(false) unless value.size == [15, 18, 22].at(i)
|
62
|
+
return(false) unless value.size == [15, 18, 22].freeze.at(i)
|
63
63
|
|
64
64
|
formula = value.scan(pattern).flatten.compact
|
65
65
|
return(false) if formula.empty?
|
66
66
|
sequence, check_digit = formula
|
67
67
|
|
68
68
|
total = 0
|
69
|
-
sequence.chars.reverse.each_with_index do |character, i|
|
69
|
+
sequence.chars.reverse.lazy.each_with_index do |character, i|
|
70
70
|
result = character.to_i
|
71
71
|
result *= 3 if i.even?
|
72
72
|
total += result
|
@@ -88,7 +88,7 @@ class TrackingNumberValidator < ActiveModel::EachValidator
|
|
88
88
|
sequence, check_digit = formula
|
89
89
|
|
90
90
|
total = 0
|
91
|
-
sequence.chars.reverse.each_with_index do |character, i|
|
91
|
+
sequence.chars.reverse.lazy.each_with_index do |character, i|
|
92
92
|
result = character.to_i
|
93
93
|
result *= 3 if i.even?
|
94
94
|
total += result
|
@@ -103,14 +103,14 @@ class TrackingNumberValidator < ActiveModel::EachValidator
|
|
103
103
|
DEFAULT_CARRIERS_AND_SERVICES.only(:ontrac, :ups).each_with_index do |(carrier, services), i|
|
104
104
|
services.each do |service, pattern|
|
105
105
|
define_method("valid_#{carrier}_#{service}_checksum?") do |value|
|
106
|
-
return(false) unless value.size == [15, 18].at(i)
|
106
|
+
return(false) unless value.size == [15, 18].freeze.at(i)
|
107
107
|
|
108
108
|
formula = value.scan(pattern).flatten.compact
|
109
109
|
return(false) if formula.empty?
|
110
110
|
sequence, check_digit = formula
|
111
111
|
|
112
112
|
total = 0
|
113
|
-
sequence.chars.each_with_index do |character, i|
|
113
|
+
sequence.chars.lazy.each_with_index do |character, i|
|
114
114
|
result = character[/[0-9]/] ? character.to_i : ((character[0].ord - 3) % 10)
|
115
115
|
result *= 2 if i.odd?
|
116
116
|
total += result
|
@@ -135,7 +135,7 @@ class TrackingNumberValidator < ActiveModel::EachValidator
|
|
135
135
|
check_digit = characters.pop.to_i
|
136
136
|
|
137
137
|
total = 0
|
138
|
-
characters.zip([8, 6, 4, 2, 3, 5, 9, 7]).each do |pair|
|
138
|
+
characters.zip([8, 6, 4, 2, 3, 5, 9, 7].freeze).lazy.each do |pair|
|
139
139
|
total += (pair[0].to_i * pair[1].to_i)
|
140
140
|
end
|
141
141
|
|
@@ -163,7 +163,7 @@ class TrackingNumberValidator < ActiveModel::EachValidator
|
|
163
163
|
check_digit = sequence.last.to_i
|
164
164
|
|
165
165
|
total = 0
|
166
|
-
characters.reverse.each_with_index do |character, i|
|
166
|
+
characters.reverse.lazy.each_with_index do |character, i|
|
167
167
|
result = character.to_i
|
168
168
|
result *= 3 if i.even?
|
169
169
|
total += result
|
@@ -186,7 +186,7 @@ class TrackingNumberValidator < ActiveModel::EachValidator
|
|
186
186
|
check_digit = sequence.last.to_i
|
187
187
|
|
188
188
|
total = 0
|
189
|
-
characters.reverse.each_with_index do |character, i|
|
189
|
+
characters.reverse.lazy.each_with_index do |character, i|
|
190
190
|
result = character.to_i
|
191
191
|
result *= 3 if i.even?
|
192
192
|
total += result
|
@@ -5,16 +5,16 @@ class UrlValidator < ActiveModel::EachValidator
|
|
5
5
|
uri = URI.parse(value.to_s)
|
6
6
|
raise URI::InvalidURIError unless valid?(uri, options)
|
7
7
|
rescue URI::InvalidURIError
|
8
|
-
record.errors[attribute] << (options
|
8
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.url'.freeze))
|
9
9
|
end
|
10
10
|
|
11
11
|
private
|
12
12
|
|
13
|
-
DEFAULT_SCHEMES = [:http, :https]
|
13
|
+
DEFAULT_SCHEMES = [:http, :https].freeze
|
14
14
|
|
15
15
|
def valid_domain?(value, options)
|
16
16
|
value_downcased = value.host.to_s.downcase
|
17
|
-
options.empty? || options.any? { |
|
17
|
+
options.empty? || options.any? { |d| value_downcased.end_with?(".#{d.downcase}".freeze) }
|
18
18
|
end
|
19
19
|
|
20
20
|
def valid_length?(value)
|
@@ -23,11 +23,11 @@ class UrlValidator < ActiveModel::EachValidator
|
|
23
23
|
|
24
24
|
def valid_scheme?(value, options)
|
25
25
|
value_downcased = value.scheme.to_s.downcase
|
26
|
-
options.empty? || options.any? { |
|
26
|
+
options.empty? || options.any? { |s| value_downcased == s.to_s.downcase }
|
27
27
|
end
|
28
28
|
|
29
29
|
def valid_root?(value)
|
30
|
-
['/', ''].include?(value.path) && value.query.blank? && value.fragment.blank?
|
30
|
+
['/', ''].freeze.include?(value.path) && value.query.blank? && value.fragment.blank?
|
31
31
|
end
|
32
32
|
|
33
33
|
def valid_uri?(value)
|
@@ -37,9 +37,9 @@ class UrlValidator < ActiveModel::EachValidator
|
|
37
37
|
def valid?(value, options)
|
38
38
|
valid_length?(value) &&
|
39
39
|
valid_uri?(value) &&
|
40
|
-
valid_domain?(value, [*(options
|
41
|
-
valid_scheme?(value, [*(options
|
42
|
-
(options
|
40
|
+
valid_domain?(value, [*(options.fetch(:domain, nil))]) &&
|
41
|
+
valid_scheme?(value, [*(options.fetch(:scheme, UrlValidator::DEFAULT_SCHEMES))]) &&
|
42
|
+
(options.fetch(:root, false) ? valid_root?(value) : true)
|
43
43
|
end
|
44
44
|
|
45
45
|
end
|
@@ -2,7 +2,7 @@ class UsernameValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.username'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -2,14 +2,14 @@ class UuidValidator < ActiveModel::EachValidator
|
|
2
2
|
|
3
3
|
def validate_each(record, attribute, value)
|
4
4
|
unless valid?(value.to_s, options)
|
5
|
-
record.errors[attribute] << (options
|
5
|
+
record.errors[attribute] << (options.fetch(:message, false) || I18n.t('active_validation.errors.messages.uuid'.freeze))
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
9
|
private
|
10
10
|
|
11
11
|
def valid_format?(value, options)
|
12
|
-
value =~ case options
|
12
|
+
value =~ case options.fetch(:version, 0)
|
13
13
|
when 3
|
14
14
|
/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i
|
15
15
|
when 4
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_validation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juan Gomez
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -109,7 +109,7 @@ dependencies:
|
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
|
-
name: shoulda
|
112
|
+
name: shoulda
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - ">="
|