module Credy::CreditCard

Public Instance Methods

generate(options = {}) click to toggle source

Generate a credit card number

# File lib/credy.rb, line 15
def generate(options = {})
  rule   = find_rule(options) || return
  number = generate_from_rule(rule)

  {
    number:  number,
    type:    rule[:type],
    country: rule[:country]
  }
end
infos(number) click to toggle source

Returns information about a number

# File lib/credy.rb, line 27
def infos(number)
  rules = Rules.all.select do |rule|
    valid = true

    # Check number of digits
    lengths = rule[:length].is_a?(Array) ? rule[:length] : [rule[:length]]
    valid = false unless lengths.include? number.length

    # Check prefix
    valid = false unless !(number =~ Regexp.new("^#{rule[:prefix]}")).nil?
    valid
  end

  if rules
    rules[0]
  else
    nil
  end
end
validate(number) click to toggle source

Validates a number

# File lib/credy.rb, line 48
def validate(number)
  criterii = {}
  criterii[:luhn] = Check.luhn number
  criterii[:type] = !!infos(number)

  valid = criterii.all? { |_, v| v == true }

  {
    valid: valid,
    details: criterii
  }
end

Private Instance Methods

complete_number(number) click to toggle source
# File lib/credy.rb, line 67
def complete_number(number)
  # Generates the last digit according to luhn algorithm
  digits = (0..9).map(&:to_s)
  begin
    full = number + digits.delete(digits.sample)
  end while !Check.luhn(full)

  full
end
find_rule(options = {}) click to toggle source
# File lib/credy.rb, line 63
def find_rule(options = {})
  Rules.filter(options).sample
end
generate_from_rule(rule) click to toggle source
# File lib/credy.rb, line 77
def generate_from_rule(rule)
  length = Array(rule[:length]).sample
  number = rule[:prefix]

  # Generates n-1 digits
  (length - number.length - 1).times do
    number += rand(10).to_s
  end

  # Append last digit
  complete_number(number)
end