active_validation 2.2.2 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
- - ">="
|