Sha256: 98d10efa09d789589723c927875797a5f62455becf5eaada666b3864b0e2fbe8

Contents?: true

Size: 1.53 KB

Versions: 3

Compression:

Stored size: 1.53 KB

Contents

# == CreditCardValidations Factory
# Generates card number that passes validation
#
# #random
#   CreditCardValidations::Factory.random
# #or particular brand
#   CreditCardValidations::Factory.random(:maestro) # "6010430241237266856"
#
#
#
module CreditCardValidations
  class Factory
    class << self
      def random(brand = nil)
        if brand.nil?
          brand = Detector.brands.keys.sample
        else
          raise RuntimeError.new("Unsupported brand") if Detector.brands[brand].nil?
        end
        generate(Detector.brands[brand][:rules].sample)

      end

      def generate(rule)
        number(rule[:prefixes].sample, rule[:length].sample, rule.fetch(:options, {})[:skip_luhn])
      end

      def number(prefix, length, skip_luhn = false)
        number = prefix.dup
        1.upto(length - (prefix.length + 1)) do
          number << "#{rand(9)}"
        end
        #if skip luhn
        if skip_luhn
          number += "#{rand(9)}"
        else
          number += last_digit(number).to_s
        end
        number
      end

      #extracted from darkcoding-credit-card

      def last_digit(number)
        # Calculate sum
        sum, pos = 0, 0
        length = number.length + 1

        reversed_number = number.reverse
        while pos < length do
          odd = reversed_number[pos].to_i * 2
          odd -= 9 if odd > 9

          sum += odd

          sum += reversed_number[pos + 1].to_i if pos != (length - 2)

          pos += 2
        end

        (((sum / 10).floor + 1) * 10 - sum) % 10
      end

    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
credit_card_validations-2.0.2 lib/credit_card_validations/factory.rb
credit_card_validations-2.0.1 lib/credit_card_validations/factory.rb
credit_card_validations-2.0.0 lib/credit_card_validations/factory.rb