class CreditCardValidator

Constants

PROVIDERS

NOTE: en.wikipedia.org/wiki/Payment_card_value#Issuer_identification_value_.28IIN.29

Public Instance Methods

validate_each(record, attribute, value) click to toggle source
Calls superclass method BaseValidator#validate_each
# File lib/lite/validators/credit_card_validator.rb, line 78
def validate_each(record, attribute, value)
  assert_valid_provider!
  super
end

Private Instance Methods

assert_valid_provider!() click to toggle source
# File lib/lite/validators/credit_card_validator.rb, line 85
def assert_valid_provider!
  assert_valid_option!(:provider, PROVIDERS.keys.push(:all))
end
checksum(value) click to toggle source
# File lib/lite/validators/credit_card_validator.rb, line 89
def checksum(value)
  values = digits(value).reverse.map.with_index { |n, i| i.even? ? n * 2 : n }
  total = values.reverse.inject(0) { |a, b| a + digits(b).sum }
  checksum = 10 - (total % 10)
  checksum == 10 ? 0 : checksum
end
digits(value) click to toggle source
# File lib/lite/validators/credit_card_validator.rb, line 96
def digits(value)
  value.to_s.chars.map(&:to_i)
end
encompasses?(subject, value) click to toggle source
# File lib/lite/validators/credit_card_validator.rb, line 100
def encompasses?(subject, value)
  case subject
  when Array then subject.include?(value)
  when Range then subject.cover?(value)
  else subject == value
  end
end
prefix(subject, value) click to toggle source
# File lib/lite/validators/credit_card_validator.rb, line 108
def prefix(subject, value)
  nums = case subject
         when Array, Range then subject.first
         else subject
         end

  value.to_s[0..(nums.to_s.size - 1)].to_i
end
provider() click to toggle source
# File lib/lite/validators/credit_card_validator.rb, line 117
def provider
  options[:provider] || :all
end
valid_attr?() click to toggle source
# File lib/lite/validators/credit_card_validator.rb, line 121
def valid_attr?
  valid_size?(value) && valid_prefix?(value) && valid_checksum?
end
valid_checksum?() click to toggle source
# File lib/lite/validators/credit_card_validator.rb, line 125
def valid_checksum?
  nums = digits(value)
  nums.pop == checksum(nums.join)
end
valid_prefix?(value) click to toggle source
# File lib/lite/validators/credit_card_validator.rb, line 130
def valid_prefix?(value)
  prefixes = PROVIDERS.dig(provider, :prefixes) || PROVIDERS.flat_map { |_, h| h[:prefixes] }

  prefixes.any? do |subject|
    iin = prefix(subject, value)
    encompasses?(subject, iin)
  end
end
valid_size?(value) click to toggle source
# File lib/lite/validators/credit_card_validator.rb, line 139
def valid_size?(value)
  sizes = PROVIDERS.dig(provider, :sizes) || (12..19)
  encompasses?(sizes, value.to_s.size)
end