active_validation 4.0.0 → 4.0.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.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/lib/active_validation.rb +5 -4
  3. data/lib/active_validation/railtie.rb +3 -3
  4. data/lib/active_validation/validators/alpha_numeric_validator.rb +5 -5
  5. data/lib/active_validation/validators/alpha_validator.rb +5 -5
  6. data/lib/active_validation/validators/base64_validator.rb +5 -5
  7. data/lib/active_validation/validators/boolean_validator.rb +5 -6
  8. data/lib/active_validation/validators/coordinate_validator.rb +11 -10
  9. data/lib/active_validation/validators/credit_card_validator.rb +31 -25
  10. data/lib/active_validation/validators/currency_validator.rb +5 -5
  11. data/lib/active_validation/validators/cusip_validator.rb +6 -5
  12. data/lib/active_validation/validators/email_validator.rb +6 -5
  13. data/lib/active_validation/validators/equality_validator.rb +10 -7
  14. data/lib/active_validation/validators/hex_validator.rb +5 -5
  15. data/lib/active_validation/validators/imei_validator.rb +6 -5
  16. data/lib/active_validation/validators/ip_validator.rb +5 -5
  17. data/lib/active_validation/validators/isbn_validator.rb +8 -8
  18. data/lib/active_validation/validators/isin_validator.rb +6 -5
  19. data/lib/active_validation/validators/mac_address_validator.rb +14 -11
  20. data/lib/active_validation/validators/name_validator.rb +5 -5
  21. data/lib/active_validation/validators/password_validator.rb +5 -5
  22. data/lib/active_validation/validators/phone_validator.rb +5 -5
  23. data/lib/active_validation/validators/sedol_validator.rb +9 -7
  24. data/lib/active_validation/validators/slug_validator.rb +5 -5
  25. data/lib/active_validation/validators/ssn_validator.rb +5 -5
  26. data/lib/active_validation/validators/tracking_number_validator.rb +34 -30
  27. data/lib/active_validation/validators/type_validator.rb +3 -4
  28. data/lib/active_validation/validators/url_validator.rb +2 -2
  29. data/lib/active_validation/validators/username_validator.rb +5 -5
  30. data/lib/active_validation/validators/uuid_validator.rb +5 -5
  31. data/lib/active_validation/version.rb +1 -1
  32. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b83dbcd9c5139b1142d10c326acc7288074e7491
4
- data.tar.gz: 284f00a5ce2cd119744ff459e8edfc284b39fa51
3
+ metadata.gz: d932970843f5d25f14117bd66f2f2ec3903324bb
4
+ data.tar.gz: 0c8572a51416a466cc3cb4f313952e4f75447de0
5
5
  SHA512:
6
- metadata.gz: 701b05b9a643a5fcb12a2968fa0e6d7516388a53ac75a1742f6135970d423c8c96d0b9701e889fcd71a90a6dda11af08f5716413e411747af6d8258cc7a7f83f
7
- data.tar.gz: 1023027eed93960a34233a1e2f93df842677132dd7e24c6c4390e1e9f08518d535ad2f8d9676f7d52d9172a5671d7834fb9354830268a9d553dfe87eecd46b38
6
+ metadata.gz: '08d6ca92e810dbaebea9fa97bc861dcce0028d803e94bd76846ab080be3128787dad3a6ebd97b1dc804ff5564cfb019a10ebd4e52acb83e142045738658444ad'
7
+ data.tar.gz: c708bc6a229f45bf94a1fe7497d7b311259184a1e04f13321d8011f02f8019fa2bcfd7d2fe11d47c3710f1d228315a972fdbbf8cf61b79319ce43ea3c320e7f2
@@ -6,10 +6,11 @@ require 'active_support'
6
6
  require "active_validation/#{file_name}"
7
7
  end
8
8
 
9
- %w(
9
+ ACTIVE_VALIDATION_VALIDATORS ||= %w(
10
10
  alpha alpha_numeric base64 boolean coordinate credit_card currency cusip email equality hex imei
11
11
  ip isbn isin mac_address name password phone sedol slug ssn tracking_number type url username uuid
12
12
  )
13
- .each do |file_name|
14
- require "active_validation/validators/#{file_name}_validator"
15
- end
13
+
14
+ ACTIVE_VALIDATION_VALIDATORS.each do |file_name|
15
+ require "active_validation/validators/#{file_name}_validator"
16
+ end
@@ -9,11 +9,11 @@ if defined?(Rails)
9
9
  end
10
10
  end
11
11
 
12
- protected
13
-
14
- def path(locale)
12
+ def self.path(locale)
15
13
  File.expand_path("../../config/locales/#{locale}.yml", __FILE__)
16
14
  end
17
15
 
16
+ private_class_method :path
17
+
18
18
  end
19
19
  end
@@ -1,10 +1,9 @@
1
1
  class AlphaNumericValidator < ActiveModel::EachValidator
2
2
 
3
3
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s, options)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.alpha_numeric'))
7
- end
4
+ return if valid?(value.to_s, options)
5
+ record.errors[attribute] <<
6
+ (options[:message] || I18n.t('active_validation.errors.messages.alpha_numeric'))
8
7
  end
9
8
 
10
9
  private
@@ -27,7 +26,8 @@ class AlphaNumericValidator < ActiveModel::EachValidator
27
26
  end
28
27
 
29
28
  def valid?(value, options)
30
- valid_length?(value) && valid_format?(value, options)
29
+ valid_length?(value) &&
30
+ valid_format?(value, options)
31
31
  end
32
32
 
33
33
  end
@@ -1,10 +1,9 @@
1
1
  class AlphaValidator < ActiveModel::EachValidator
2
2
 
3
3
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s, options)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.alpha'))
7
- end
4
+ return if valid?(value.to_s, options)
5
+ record.errors[attribute] <<
6
+ (options[:message] || I18n.t('active_validation.errors.messages.alpha'))
8
7
  end
9
8
 
10
9
  private
@@ -27,7 +26,8 @@ class AlphaValidator < ActiveModel::EachValidator
27
26
  end
28
27
 
29
28
  def valid?(value, options)
30
- valid_length?(value) && valid_format?(value, options)
29
+ valid_length?(value) &&
30
+ valid_format?(value, options)
31
31
  end
32
32
 
33
33
  end
@@ -1,10 +1,9 @@
1
1
  class Base64Validator < ActiveModel::EachValidator
2
2
 
3
3
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.base64'))
7
- end
4
+ return if valid?(value.to_s)
5
+ record.errors[attribute] <<
6
+ (options[:message] || I18n.t('active_validation.errors.messages.base64'))
8
7
  end
9
8
 
10
9
  private
@@ -18,7 +17,8 @@ class Base64Validator < ActiveModel::EachValidator
18
17
  end
19
18
 
20
19
  def valid?(value)
21
- valid_length?(value) && valid_format?(value)
20
+ valid_length?(value) &&
21
+ valid_format?(value)
22
22
  end
23
23
 
24
24
  end
@@ -1,12 +1,11 @@
1
1
  class BooleanValidator < ActiveModel::EachValidator
2
- FALSE_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE'].freeze
3
- TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE'].freeze
2
+ FALSE_VALUES ||= [false, 0, '0', 'f', 'F', 'false', 'FALSE'].freeze
3
+ TRUE_VALUES ||= [true, 1, '1', 't', 'T', 'true', 'TRUE'].freeze
4
4
 
5
5
  def validate_each(record, attribute, value)
6
- unless TRUE_VALUES.include?(value) || FALSE_VALUES.include?(value)
7
- record.errors[attribute] <<
8
- (options[:message] || I18n.t('active_validation.errors.messages.boolean'))
9
- end
6
+ return if TRUE_VALUES.include?(value) || FALSE_VALUES.include?(value)
7
+ record.errors[attribute] <<
8
+ (options[:message] || I18n.t('active_validation.errors.messages.boolean'))
10
9
  end
11
10
 
12
11
  end
@@ -1,5 +1,7 @@
1
1
  class CoordinateValidator < ActiveModel::EachValidator
2
2
 
3
+ BOUNDARIES ||= [:coordinate, :latitude, :longitude].freeze
4
+
3
5
  # rubocop:disable Metrics/LineLength
4
6
  def validate_each(record, attribute, value)
5
7
  boundary = options[:boundary] || :coordinate
@@ -8,19 +10,16 @@ class CoordinateValidator < ActiveModel::EachValidator
8
10
  "Unknown boundary: #{boundary.inspect}. Valid boundaries are: #{BOUNDARIES.map(&:inspect).join(', ')}"
9
11
  end
10
12
 
11
- unless valid?(value, options)
12
- record.errors[attribute] <<
13
- (options[:message] || I18n.t("active_validation.errors.messages.coordinate.#{boundary}"))
14
- end
13
+ return if valid?(value, options)
14
+ record.errors[attribute] <<
15
+ (options[:message] || I18n.t("active_validation.errors.messages.coordinate.#{boundary}"))
15
16
  end
16
17
  # rubocop:enable Metrics/LineLength
17
18
 
18
19
  private
19
20
 
20
- BOUNDARIES = [:coordinate, :latitude, :longitude].freeze
21
-
22
21
  def valid_latitude?(value)
23
- value >= -90 && value <= 90
22
+ value >= -90.0 && value <= 90.0
24
23
  end
25
24
 
26
25
  def valid_length?(value)
@@ -28,7 +27,7 @@ class CoordinateValidator < ActiveModel::EachValidator
28
27
  end
29
28
 
30
29
  def valid_longitude?(value)
31
- value >= -180 && value <= 180
30
+ value >= -180.0 && value <= 180.0
32
31
  end
33
32
 
34
33
  def valid_boundary?(value, options)
@@ -38,12 +37,14 @@ class CoordinateValidator < ActiveModel::EachValidator
38
37
  when :longitude
39
38
  valid_longitude?(value)
40
39
  else
41
- valid_latitude?(value.first) && valid_longitude?(value.last)
40
+ valid_latitude?(value.first) &&
41
+ valid_longitude?(value.last)
42
42
  end
43
43
  end
44
44
 
45
45
  def valid?(value, options)
46
- valid_length?(value) && valid_boundary?(value, options)
46
+ valid_length?(value) &&
47
+ valid_boundary?(value, options)
47
48
  end
48
49
 
49
50
  end
@@ -1,22 +1,20 @@
1
1
  class CreditCardValidator < ActiveModel::EachValidator
2
2
 
3
- def validate_each(record, attribute, value)
4
- unless valid?(value.to_s, options)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.credit_card'))
7
- end
8
- end
9
-
10
- private
11
-
12
- DEFAULT_LENGTHS = {
13
- american_express: [15], diners_club: [14, 16], discover: [16], jcb: [16],
14
- laser: [16, 17, 18, 19], maestro: [12, 13, 14, 15, 16, 17, 18, 19],
15
- mastercard: [16], solo: [16, 18, 19], unionpay: [16, 17, 18, 19], visa: [16]
3
+ LENGTHS ||= {
4
+ american_express: [15],
5
+ diners_club: [14, 16],
6
+ discover: [16],
7
+ jcb: [16],
8
+ laser: [16, 17, 18, 19],
9
+ maestro: [12, 13, 14, 15, 16, 17, 18, 19],
10
+ mastercard: [16],
11
+ solo: [16, 18, 19],
12
+ unionpay: [16, 17, 18, 19],
13
+ visa: [16]
16
14
  }.freeze
17
15
 
18
16
  # rubocop:disable Style/IndentArray
19
- DEFAULT_PREFIXES = {
17
+ PREFIXES ||= {
20
18
  american_express: %w(34 37),
21
19
  diners_club: %w(300 301 302 303 304 305 36 54 55),
22
20
  discover: %w(
@@ -37,6 +35,14 @@ class CreditCardValidator < ActiveModel::EachValidator
37
35
  }.freeze
38
36
  # rubocop:enable Style/IndentArray
39
37
 
38
+ def validate_each(record, attribute, value)
39
+ return if valid?(value.to_s, options)
40
+ record.errors[attribute] <<
41
+ (options[:message] || I18n.t('active_validation.errors.messages.credit_card'))
42
+ end
43
+
44
+ private
45
+
40
46
  def valid_format?(value, options)
41
47
  value =~ (options[:strict] ? /^[0-9]+$/ : /^[0-9 -.]+$/)
42
48
  end
@@ -44,37 +50,37 @@ class CreditCardValidator < ActiveModel::EachValidator
44
50
  def valid_length?(value, options)
45
51
  return(false) unless value.present?
46
52
 
47
- current_card = options[:card] || :all
53
+ card = options[:card] || :all
48
54
  value_size = value.size
49
55
 
50
- case current_card
56
+ case card
51
57
  when :amex
52
- DEFAULT_LENGTHS[:american_express].include?(value_size)
58
+ LENGTHS[:american_express].include?(value_size)
53
59
  when :all
54
- value_size_range = DEFAULT_LENGTHS.values.flatten.uniq.sort
60
+ value_size_range = LENGTHS.values.flatten.uniq.sort
55
61
  value_size.between?(value_size_range.first, value_size_range.last)
56
62
  else
57
- DEFAULT_LENGTHS[current_card].include?(value_size)
63
+ LENGTHS[card].include?(value_size)
58
64
  end
59
65
  end
60
66
 
61
67
  def valid_prefix?(value, options)
62
- current_card = options[:card] || :all
68
+ card = options[:card] || :all
63
69
 
64
- case current_card
70
+ case card
65
71
  when :amex
66
- DEFAULT_PREFIXES[:american_express].any? { |pat| value.start_with?(pat) }
72
+ PREFIXES[:american_express].any? { |pat| value.start_with?(pat) }
67
73
  when :all
68
74
  result = false
69
- DEFAULT_LENGTHS.each do |key, values|
75
+ LENGTHS.each do |key, values|
70
76
  if values.include?(value.size)
71
- result = DEFAULT_PREFIXES[key].any? { |pat| value.start_with?(pat) }
77
+ result = PREFIXES[key].any? { |pat| value.start_with?(pat) }
72
78
  break if result
73
79
  end
74
80
  end
75
81
  result
76
82
  else
77
- DEFAULT_PREFIXES[current_card].any? { |pat| value.start_with?(pat) }
83
+ PREFIXES[card].any? { |pat| value.start_with?(pat) }
78
84
  end
79
85
  end
80
86
 
@@ -1,10 +1,9 @@
1
1
  class CurrencyValidator < ActiveModel::EachValidator
2
2
 
3
3
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s, options)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.currency'))
7
- end
4
+ return if valid?(value.to_s, options)
5
+ record.errors[attribute] <<
6
+ (options[:message] || I18n.t('active_validation.errors.messages.currency'))
8
7
  end
9
8
 
10
9
  private
@@ -18,7 +17,8 @@ class CurrencyValidator < ActiveModel::EachValidator
18
17
  end
19
18
 
20
19
  def valid?(value, options)
21
- valid_length?(value) && valid_format?(value, options)
20
+ valid_length?(value) &&
21
+ valid_format?(value, options)
22
22
  end
23
23
 
24
24
  end
@@ -1,10 +1,9 @@
1
1
  class CusipValidator < ActiveModel::EachValidator
2
2
 
3
3
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.cusip'))
7
- end
4
+ return if valid?(value.to_s)
5
+ record.errors[attribute] <<
6
+ (options[:message] || I18n.t('active_validation.errors.messages.cusip'))
8
7
  end
9
8
 
10
9
  private
@@ -30,7 +29,9 @@ class CusipValidator < ActiveModel::EachValidator
30
29
  end
31
30
 
32
31
  def valid?(value)
33
- valid_length?(value) && valid_format?(value) && valid_checksum?(value)
32
+ valid_length?(value) &&
33
+ valid_format?(value) &&
34
+ valid_checksum?(value)
34
35
  end
35
36
 
36
37
  end
@@ -1,10 +1,9 @@
1
1
  class EmailValidator < ActiveModel::EachValidator
2
2
 
3
3
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s, options)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.email'))
7
- end
4
+ return if valid?(value.to_s, options)
5
+ record.errors[attribute] <<
6
+ (options[:message] || I18n.t('active_validation.errors.messages.email'))
8
7
  end
9
8
 
10
9
  private
@@ -24,7 +23,9 @@ class EmailValidator < ActiveModel::EachValidator
24
23
  def valid?(value, options)
25
24
  options = [*(options[:domain])]
26
25
 
27
- valid_length?(value) && valid_format?(value) && valid_domain?(value, options)
26
+ valid_length?(value) &&
27
+ valid_format?(value) &&
28
+ valid_domain?(value, options)
28
29
  end
29
30
 
30
31
  end
@@ -1,8 +1,12 @@
1
1
  class EqualityValidator < ActiveModel::EachValidator
2
2
 
3
- OPERATORS = {
4
- less_than: :<, less_than_or_equal_to: :<=, greater_than: :>, greater_than_or_equal_to: :>=,
5
- equal_to: :==, not_equal_to: :!=
3
+ OPERATORS ||= {
4
+ less_than: :<,
5
+ less_than_or_equal_to: :<=,
6
+ greater_than: :>,
7
+ greater_than_or_equal_to: :>=,
8
+ equal_to: :==,
9
+ not_equal_to: :!=
6
10
  }.freeze
7
11
 
8
12
  # rubocop:disable Metrics/LineLength
@@ -21,10 +25,9 @@ class EqualityValidator < ActiveModel::EachValidator
21
25
  end
22
26
 
23
27
  operator = OPERATORS[operator]
24
- unless value.send(operator, record.send(to))
25
- record.errors[attribute] <<
26
- (options[:message] || I18n.t('active_validation.errors.messages.equality', attr: to, operator: operator))
27
- end
28
+ return if value.send(operator, record.send(to))
29
+ record.errors[attribute] <<
30
+ (options[:message] || I18n.t('active_validation.errors.messages.equality', attr: to, operator: operator))
28
31
  end
29
32
  # rubocop:enable Metrics/LineLength
30
33
 
@@ -1,10 +1,9 @@
1
1
  class HexValidator < ActiveModel::EachValidator
2
2
 
3
3
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.hex'))
7
- end
4
+ return if valid?(value.to_s)
5
+ record.errors[attribute] <<
6
+ (options[:message] || I18n.t('active_validation.errors.messages.hex'))
8
7
  end
9
8
 
10
9
  private
@@ -18,7 +17,8 @@ class HexValidator < ActiveModel::EachValidator
18
17
  end
19
18
 
20
19
  def valid?(value)
21
- valid_length?(value) && valid_format?(value)
20
+ valid_length?(value) &&
21
+ valid_format?(value)
22
22
  end
23
23
 
24
24
  end
@@ -1,10 +1,9 @@
1
1
  class ImeiValidator < ActiveModel::EachValidator
2
2
 
3
3
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.imei'))
7
- end
4
+ return if valid?(value.to_s)
5
+ record.errors[attribute] <<
6
+ (options[:message] || I18n.t('active_validation.errors.messages.imei'))
8
7
  end
9
8
 
10
9
  private
@@ -32,7 +31,9 @@ class ImeiValidator < ActiveModel::EachValidator
32
31
  end
33
32
 
34
33
  def valid?(value)
35
- valid_length?(value) && valid_format?(value) && valid_luhn?(value)
34
+ valid_length?(value) &&
35
+ valid_format?(value) &&
36
+ valid_luhn?(value)
36
37
  end
37
38
 
38
39
  end
@@ -1,10 +1,9 @@
1
1
  class IpValidator < ActiveModel::EachValidator
2
2
 
3
3
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.ip'))
7
- end
4
+ return if valid?(value.to_s)
5
+ record.errors[attribute] <<
6
+ (options[:message] || I18n.t('active_validation.errors.messages.ip'))
8
7
  end
9
8
 
10
9
  private
@@ -20,7 +19,8 @@ class IpValidator < ActiveModel::EachValidator
20
19
  end
21
20
 
22
21
  def valid?(value)
23
- valid_length?(value) && valid_format?(value)
22
+ valid_length?(value) &&
23
+ valid_format?(value)
24
24
  end
25
25
 
26
26
  end
@@ -1,21 +1,20 @@
1
1
  class IsbnValidator < ActiveModel::EachValidator
2
2
 
3
+ CHARACTERS ||= %w(0 1 2 3 4 5 6 7 8 9 0 x).freeze
4
+
3
5
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.isbn'))
7
- end
6
+ return if valid?(value.to_s)
7
+ record.errors[attribute] <<
8
+ (options[:message] || I18n.t('active_validation.errors.messages.isbn'))
8
9
  end
9
10
 
10
11
  private
11
12
 
12
- CHARS_VALUES = %w(0 1 2 3 4 5 6 7 8 9 0 x).freeze
13
-
14
13
  def valid_format?(value)
15
14
  return(false) if value.empty?
16
15
  value = value.gsub(/-| /, '').downcase.chars
17
16
 
18
- [10, 13].include?(value.size) && value.all? { |chr| CHARS_VALUES.include?(chr) }
17
+ [10, 13].include?(value.size) && value.all? { |chr| CHARACTERS.include?(chr) }
19
18
  end
20
19
 
21
20
  def valid_length?(value)
@@ -23,7 +22,8 @@ class IsbnValidator < ActiveModel::EachValidator
23
22
  end
24
23
 
25
24
  def valid?(value)
26
- valid_length?(value) && valid_format?(value)
25
+ valid_length?(value) &&
26
+ valid_format?(value)
27
27
  end
28
28
 
29
29
  end
@@ -1,10 +1,9 @@
1
1
  class IsinValidator < ActiveModel::EachValidator
2
2
 
3
3
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.isin'))
7
- end
4
+ return if valid?(value.to_s)
5
+ record.errors[attribute] <<
6
+ (options[:message] || I18n.t('active_validation.errors.messages.isin'))
8
7
  end
9
8
 
10
9
  private
@@ -39,7 +38,9 @@ class IsinValidator < ActiveModel::EachValidator
39
38
  end
40
39
 
41
40
  def valid?(value)
42
- valid_length?(value) && valid_format?(value) && valid_checksum?(value)
41
+ valid_length?(value) &&
42
+ valid_format?(value) &&
43
+ valid_checksum?(value)
43
44
  end
44
45
 
45
46
  end
@@ -1,20 +1,22 @@
1
1
  class MacAddressValidator < ActiveModel::EachValidator
2
2
 
3
+ DEFAULT_FORMATS ||= [
4
+ /^([\h]{2}:){5}[\h]{2}?$/i,
5
+ /^([\h]{2}[-|\.|\s]){5}[\h]{2}?$/i,
6
+ /^([\h]{6})[-|\.][\h]{6}?$/i,
7
+ /^([\h]{6}):[\h]{6}?$/i,
8
+ /^([\h]{4}[-|\.|\s]){2}[\h]{4}?$/i,
9
+ /^[\h]{12}?$/i
10
+ ].freeze
11
+
3
12
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.mac_address'))
7
- end
13
+ return if valid?(value.to_s)
14
+ record.errors[attribute] <<
15
+ (options[:message] || I18n.t('active_validation.errors.messages.mac_address'))
8
16
  end
9
17
 
10
18
  private
11
19
 
12
- DEFAULT_FORMATS = [
13
- /^([\h]{2}:){5}[\h]{2}?$/i, /^([\h]{2}[-|\.|\s]){5}[\h]{2}?$/i,
14
- /^([\h]{6})[-|\.][\h]{6}?$/i, /^([\h]{6}):[\h]{6}?$/i,
15
- /^([\h]{4}[-|\.|\s]){2}[\h]{4}?$/i, /^[\h]{12}?$/i
16
- ].freeze
17
-
18
20
  def valid_format?(value)
19
21
  result = false
20
22
  DEFAULT_FORMATS.each do |pat|
@@ -29,7 +31,8 @@ class MacAddressValidator < ActiveModel::EachValidator
29
31
  end
30
32
 
31
33
  def valid?(value)
32
- valid_length?(value) && valid_format?(value)
34
+ valid_length?(value) &&
35
+ valid_format?(value)
33
36
  end
34
37
 
35
38
  end
@@ -1,10 +1,9 @@
1
1
  class NameValidator < ActiveModel::EachValidator
2
2
 
3
3
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.name'))
7
- end
4
+ return if valid?(value.to_s)
5
+ record.errors[attribute] <<
6
+ (options[:message] || I18n.t('active_validation.errors.messages.name'))
8
7
  end
9
8
 
10
9
  private
@@ -18,7 +17,8 @@ class NameValidator < ActiveModel::EachValidator
18
17
  end
19
18
 
20
19
  def valid?(value)
21
- valid_length?(value) && valid_format?(value)
20
+ valid_length?(value) &&
21
+ valid_format?(value)
22
22
  end
23
23
 
24
24
  end
@@ -1,10 +1,9 @@
1
1
  class PasswordValidator < ActiveModel::EachValidator
2
2
 
3
3
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s, options)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.password'))
7
- end
4
+ return if valid?(value.to_s, options)
5
+ record.errors[attribute] <<
6
+ (options[:message] || I18n.t('active_validation.errors.messages.password'))
8
7
  end
9
8
 
10
9
  private
@@ -22,7 +21,8 @@ class PasswordValidator < ActiveModel::EachValidator
22
21
  end
23
22
 
24
23
  def valid?(value, options)
25
- valid_length?(value) && valid_format?(value, options)
24
+ valid_length?(value) &&
25
+ valid_format?(value, options)
26
26
  end
27
27
 
28
28
  end
@@ -1,10 +1,9 @@
1
1
  class PhoneValidator < ActiveModel::EachValidator
2
2
 
3
3
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.phone'))
7
- end
4
+ return if valid?(value.to_s)
5
+ record.errors[attribute] <<
6
+ (options[:message] || I18n.t('active_validation.errors.messages.phone'))
8
7
  end
9
8
 
10
9
  private
@@ -18,7 +17,8 @@ class PhoneValidator < ActiveModel::EachValidator
18
17
  end
19
18
 
20
19
  def valid?(value)
21
- valid_length?(value) && valid_format?(value)
20
+ valid_length?(value) &&
21
+ valid_format?(value)
22
22
  end
23
23
 
24
24
  end
@@ -1,20 +1,20 @@
1
1
  class SedolValidator < ActiveModel::EachValidator
2
2
 
3
+ WEIGHTS ||= [1, 3, 1, 7, 3, 9, 1].freeze
4
+
3
5
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.sedol'))
7
- end
6
+ return if valid?(value.to_s)
7
+ record.errors[attribute] <<
8
+ (options[:message] || I18n.t('active_validation.errors.messages.sedol'))
8
9
  end
9
10
 
10
11
  private
11
12
 
12
13
  def valid_checksum?(value)
13
14
  digits = value.chars.map { |dgt| dgt =~ /[A-Z]/ ? (dgt.ord - 55) : dgt.to_i }
14
- weights = [1, 3, 1, 7, 3, 9, 1]
15
15
 
16
16
  total = 0
17
- digits.each_with_index { |dgt, idx| total += (weights[idx] * dgt) }
17
+ digits.each_with_index { |dgt, idx| total += (WEIGHTS[idx] * dgt) }
18
18
 
19
19
  (10 - total % 10) % 10
20
20
  end
@@ -28,7 +28,9 @@ class SedolValidator < ActiveModel::EachValidator
28
28
  end
29
29
 
30
30
  def valid?(value)
31
- valid_length?(value) && valid_format?(value) && valid_checksum?(value)
31
+ valid_length?(value) &&
32
+ valid_format?(value) &&
33
+ valid_checksum?(value)
32
34
  end
33
35
 
34
36
  end
@@ -1,10 +1,9 @@
1
1
  class SlugValidator < ActiveModel::EachValidator
2
2
 
3
3
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.slug'))
7
- end
4
+ return if valid?(value.to_s)
5
+ record.errors[attribute] <<
6
+ (options[:message] || I18n.t('active_validation.errors.messages.slug'))
8
7
  end
9
8
 
10
9
  private
@@ -18,7 +17,8 @@ class SlugValidator < ActiveModel::EachValidator
18
17
  end
19
18
 
20
19
  def valid?(value)
21
- valid_length?(value) && valid_format?(value)
20
+ valid_length?(value) &&
21
+ valid_format?(value)
22
22
  end
23
23
 
24
24
  end
@@ -1,10 +1,9 @@
1
1
  class SsnValidator < ActiveModel::EachValidator
2
2
 
3
3
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.ssn'))
7
- end
4
+ return if valid?(value.to_s)
5
+ record.errors[attribute] <<
6
+ (options[:message] || I18n.t('active_validation.errors.messages.ssn'))
8
7
  end
9
8
 
10
9
  private
@@ -18,7 +17,8 @@ class SsnValidator < ActiveModel::EachValidator
18
17
  end
19
18
 
20
19
  def valid?(value)
21
- valid_length?(value) && valid_format?(value)
20
+ valid_length?(value) &&
21
+ valid_format?(value)
22
22
  end
23
23
 
24
24
  end
@@ -1,18 +1,13 @@
1
1
  class TrackingNumberValidator < ActiveModel::EachValidator
2
2
 
3
- def validate_each(record, attribute, value)
4
- unless valid?(value.to_s, options)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.tracking_number'))
7
- end
8
- end
9
-
10
- private
11
-
12
- DEFAULT_CARRIERS_AND_SERVICES = {
13
- dhl: { express: /^([0-9]{9,9})([0-9])$/, express_air: /^([0-9]{10,10})([0-9])$/ },
3
+ CARRIERS_AND_SERVICES ||= {
4
+ dhl: {
5
+ express: /^([0-9]{9,9})([0-9])$/,
6
+ express_air: /^([0-9]{10,10})([0-9])$/
7
+ },
14
8
  fedex: {
15
- express: /^([0-9]{11,11})([0-9])$/, ground: /^([0-9]{14,14})([0-9])$/,
9
+ express: /^([0-9]{11,11})([0-9])$/,
10
+ ground: /^([0-9]{14,14})([0-9])$/,
16
11
  ground18: /^[0-9]{2,2}([0-9]{15,15})([0-9])$/,
17
12
  ground96: /^96[0-9]{5,5}([0-9]{14,14})([0-9])$/,
18
13
  smart_post: /^((?:92)?[0-9]{5}[0-9]{14})([0-9])$/
@@ -26,10 +21,18 @@ class TrackingNumberValidator < ActiveModel::EachValidator
26
21
  }
27
22
  }.freeze
28
23
 
24
+ def validate_each(record, attribute, value)
25
+ return if valid?(value.to_s, options)
26
+ record.errors[attribute] <<
27
+ (options[:message] || I18n.t('active_validation.errors.messages.tracking_number'))
28
+ end
29
+
30
+ private
31
+
29
32
  # DHL
30
- DEFAULT_CARRIERS_AND_SERVICES[:dhl].each do |service, pattern|
31
- define_method("valid_dhl_#{service}_checksum?") do |value|
32
- formula = value.scan(pattern).flatten.compact
33
+ CARRIERS_AND_SERVICES[:dhl].each do |srv, pat|
34
+ define_method("valid_dhl_#{srv}_checksum?") do |val|
35
+ formula = val.scan(pat).flatten.compact
33
36
  return(false) if formula.empty?
34
37
  sequence, check_digit = formula.map(&:to_i)
35
38
 
@@ -41,7 +44,7 @@ class TrackingNumberValidator < ActiveModel::EachValidator
41
44
  def valid_fedex_express_checksum?(value)
42
45
  return(false) unless value.size == 12
43
46
 
44
- pattern = DEFAULT_CARRIERS_AND_SERVICES[:fedex][:express]
47
+ pattern = CARRIERS_AND_SERVICES[:fedex][:express]
45
48
  formula = value.scan(pattern).flatten.compact
46
49
  return(false) if formula.empty?
47
50
  sequence, check_digit = formula
@@ -54,7 +57,7 @@ class TrackingNumberValidator < ActiveModel::EachValidator
54
57
  (total % 11 % 10) == check_digit.to_i
55
58
  end
56
59
 
57
- DEFAULT_CARRIERS_AND_SERVICES[:fedex]
60
+ CARRIERS_AND_SERVICES[:fedex]
58
61
  .select { |key, _| [:ground, :ground18, :ground96].include?(key) }
59
62
  .each_with_index do |(srv, pat), idx|
60
63
  define_method("valid_fedex_#{srv}_checksum?") do |val|
@@ -81,14 +84,14 @@ class TrackingNumberValidator < ActiveModel::EachValidator
81
84
  value = "92#{value}" unless value =~ /^92/
82
85
  return(false) unless value.size == 22
83
86
 
84
- pattern = DEFAULT_CARRIERS_AND_SERVICES[:fedex][:smart_post]
87
+ pattern = CARRIERS_AND_SERVICES[:fedex][:smart_post]
85
88
  formula = value.scan(pattern).flatten.compact
86
89
  return(false) if formula.empty?
87
90
  sequence, check_digit = formula
88
91
 
89
92
  total = 0
90
- sequence.chars.reverse.each_with_index do |character, idx|
91
- result = character.to_i
93
+ sequence.chars.reverse.each_with_index do |chr, idx|
94
+ result = chr.to_i
92
95
  result *= 3 if idx.even?
93
96
  total += result
94
97
  end
@@ -99,14 +102,14 @@ class TrackingNumberValidator < ActiveModel::EachValidator
99
102
  end
100
103
 
101
104
  # Ontrac & UPS
102
- DEFAULT_CARRIERS_AND_SERVICES
105
+ CARRIERS_AND_SERVICES
103
106
  .select { |key, _| [:ontrac, :ups].include?(key) }
104
107
  .each_with_index do |(cars, sers), idx|
105
108
  sers.each do |ser, pat|
106
- define_method("valid_#{cars}_#{ser}_checksum?") do |value|
107
- return(false) unless value.size == [15, 18].at(idx)
109
+ define_method("valid_#{cars}_#{ser}_checksum?") do |val|
110
+ return(false) unless val.size == [15, 18].at(idx)
108
111
 
109
- formula = value.scan(pat).flatten.compact
112
+ formula = val.scan(pat).flatten.compact
110
113
  return(false) if formula.empty?
111
114
  sequence, check_digit = formula
112
115
 
@@ -128,7 +131,7 @@ class TrackingNumberValidator < ActiveModel::EachValidator
128
131
  def valid_usps_usps13_checksum?(value)
129
132
  return(false) unless value.size == 13
130
133
 
131
- pattern = DEFAULT_CARRIERS_AND_SERVICES[:usps][:usps13]
134
+ pattern = CARRIERS_AND_SERVICES[:usps][:usps13]
132
135
  sequence = value.scan(pattern).flatten.compact
133
136
  return(false) if sequence.empty?
134
137
 
@@ -154,7 +157,7 @@ class TrackingNumberValidator < ActiveModel::EachValidator
154
157
  def valid_usps_usps20_checksum?(value)
155
158
  return(false) unless value.size == 20
156
159
 
157
- pattern = DEFAULT_CARRIERS_AND_SERVICES[:usps][:usps20]
160
+ pattern = CARRIERS_AND_SERVICES[:usps][:usps20]
158
161
  sequence = value.scan(pattern).flatten.compact
159
162
  return(false) if sequence.empty?
160
163
 
@@ -177,7 +180,7 @@ class TrackingNumberValidator < ActiveModel::EachValidator
177
180
  value = "91#{value}" unless value =~ /^(420\d{5})?9[1-5]/
178
181
  return(false) unless value.size == 22
179
182
 
180
- pattern = DEFAULT_CARRIERS_AND_SERVICES[:usps][:usps91]
183
+ pattern = CARRIERS_AND_SERVICES[:usps][:usps91]
181
184
  sequence = value.scan(pattern).flatten.compact
182
185
  return(false) if sequence.empty?
183
186
 
@@ -203,7 +206,7 @@ class TrackingNumberValidator < ActiveModel::EachValidator
203
206
  result = false
204
207
 
205
208
  if carrier.nil? && service.nil?
206
- DEFAULT_CARRIERS_AND_SERVICES.each do |car, ser|
209
+ CARRIERS_AND_SERVICES.each do |car, ser|
207
210
  ser.each_key do |car_ser|
208
211
  result = send("valid_#{car}_#{car_ser}_checksum?", value)
209
212
  break if result
@@ -211,7 +214,7 @@ class TrackingNumberValidator < ActiveModel::EachValidator
211
214
  break if result
212
215
  end
213
216
  elsif service.nil?
214
- DEFAULT_CARRIERS_AND_SERVICES[carrier].each_key do |car_ser|
217
+ CARRIERS_AND_SERVICES[carrier].each_key do |car_ser|
215
218
  result = send("valid_#{carrier}_#{car_ser}_checksum?", value)
216
219
  break if result
217
220
  end
@@ -227,7 +230,8 @@ class TrackingNumberValidator < ActiveModel::EachValidator
227
230
  end
228
231
 
229
232
  def valid?(value, options)
230
- valid_length?(value) && valid_checksum?(value, options)
233
+ valid_length?(value) &&
234
+ valid_checksum?(value, options)
231
235
  end
232
236
 
233
237
  end
@@ -5,10 +5,9 @@ end
5
5
  class TypeValidator < ActiveModel::EachValidator
6
6
 
7
7
  def validate_each(record, attribute, value)
8
- unless valid?(value, options)
9
- record.errors[attribute] <<
10
- (options[:message] || I18n.t('active_validation.errors.messages.type'))
11
- end
8
+ return if valid?(value, options)
9
+ record.errors[attribute] <<
10
+ (options[:message] || I18n.t('active_validation.errors.messages.type'))
12
11
  end
13
12
 
14
13
  private
@@ -1,6 +1,8 @@
1
1
  require 'uri'
2
2
  class UrlValidator < ActiveModel::EachValidator
3
3
 
4
+ DEFAULT_SCHEMES ||= [:http, :https].freeze
5
+
4
6
  def validate_each(record, attribute, value)
5
7
  uri = URI.parse(value.to_s)
6
8
  raise URI::InvalidURIError unless valid?(uri, options)
@@ -11,8 +13,6 @@ class UrlValidator < ActiveModel::EachValidator
11
13
 
12
14
  private
13
15
 
14
- DEFAULT_SCHEMES = [:http, :https].freeze
15
-
16
16
  def valid_domain?(value, options)
17
17
  value_downcased = value.host.to_s.downcase
18
18
  options.empty? || options.any? { |dom| value_downcased.end_with?(".#{dom.downcase}") }
@@ -1,10 +1,9 @@
1
1
  class UsernameValidator < ActiveModel::EachValidator
2
2
 
3
3
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.username'))
7
- end
4
+ return if valid?(value.to_s)
5
+ record.errors[attribute] <<
6
+ (options[:message] || I18n.t('active_validation.errors.messages.username'))
8
7
  end
9
8
 
10
9
  private
@@ -18,7 +17,8 @@ class UsernameValidator < ActiveModel::EachValidator
18
17
  end
19
18
 
20
19
  def valid?(value)
21
- valid_length?(value) && valid_format?(value)
20
+ valid_length?(value) &&
21
+ valid_format?(value)
22
22
  end
23
23
 
24
24
  end
@@ -1,10 +1,9 @@
1
1
  class UuidValidator < ActiveModel::EachValidator
2
2
 
3
3
  def validate_each(record, attribute, value)
4
- unless valid?(value.to_s, options)
5
- record.errors[attribute] <<
6
- (options[:message] || I18n.t('active_validation.errors.messages.uuid'))
7
- end
4
+ return if valid?(value.to_s, options)
5
+ record.errors[attribute] <<
6
+ (options[:message] || I18n.t('active_validation.errors.messages.uuid'))
8
7
  end
9
8
 
10
9
  private
@@ -27,7 +26,8 @@ class UuidValidator < ActiveModel::EachValidator
27
26
  end
28
27
 
29
28
  def valid?(value, options)
30
- valid_length?(value) && valid_format?(value, options)
29
+ valid_length?(value) &&
30
+ valid_format?(value, options)
31
31
  end
32
32
 
33
33
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveValidation
2
- VERSION = '4.0.0'.freeze
2
+ VERSION = '4.0.1'.freeze
3
3
  end
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: 4.0.0
4
+ version: 4.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juan Gomez
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-10 00:00:00.000000000 Z
11
+ date: 2016-10-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -227,7 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
227
227
  version: '0'
228
228
  requirements: []
229
229
  rubyforge_project:
230
- rubygems_version: 2.6.4
230
+ rubygems_version: 2.6.6
231
231
  signing_key:
232
232
  specification_version: 4
233
233
  summary: Gem for commonly used validators.