module CreditCardInspector

Constants

VERSION

Public Class Methods

card_type(card_number) click to toggle source
# File lib/credit_card_inspector.rb, line 5
def self.card_type(card_number)
  
  card_number = sanitise_card_number(card_number)
  
  card_validation_rules.each do |card_type, rule|
    return card_type if card_number.match rule
  end
  
  return 'Unknown'
end
sanitise_card_number(card_number) click to toggle source
# File lib/credit_card_inspector.rb, line 27
def self.sanitise_card_number(card_number)
  card_number.to_s.gsub /[^0-9]/, ''
end
valid?(card_number) click to toggle source
# File lib/credit_card_inspector.rb, line 16
def self.valid?(card_number)
  digits = sanitise_card_number(card_number).chars.collect(&:to_i).reverse
  
  total = digits.each_slice(2).map do |x, y|
    y ||= 0
    [x, (y * 2).divmod(10)]
  end.flatten.inject(:+)
  
  total % 10 == 0
end

Private Class Methods

card_validation_rules() click to toggle source
# File lib/credit_card_inspector.rb, line 33
def self.card_validation_rules
  {
    'AMEX' => /^(34|37)\d{13}$/,
    'Discover' => /^6011\d{12}$/,
    'MasterCard' => /^5[1-5]\d{14}$/,
    'VISA' => /^4\d{12}(\d{3})?$/
  }
end