class Luhn::Base

Attributes

number_to_validate[R]

Public Class Methods

new(number_to_validate) click to toggle source
# File lib/luhn/base.rb, line 5
def initialize(number_to_validate)
  @number_to_validate = number_to_validate
  number_meets_requirements?
end
valid?(number) click to toggle source
# File lib/luhn/base.rb, line 10
def self.valid?(number)
  new(number).validate
end

Public Instance Methods

check_digit() click to toggle source
# File lib/luhn/base.rb, line 18
def check_digit
  checksum.to_s[-1].to_i
end
checksum() click to toggle source
# File lib/luhn/base.rb, line 22
def checksum
  @checksum ||= double_digit_on_even_position.inject(:+)
end
double_digit_on_even_position() click to toggle source
# File lib/luhn/base.rb, line 26
def double_digit_on_even_position
  total = []
  # Offset of 1, so you can call even? instead of odd? on a number_position
  digits_of_number_to_validate.to_enum.with_index(1).each do |digit, number_position|
    if number_position.even? && product_of_digit_exceeds_nine(digit)
      digits_of_product = split_to_number_array multiply(digit)
      total << digits_of_product.inject(:+)
    elsif number_position.even? && !product_of_digit_exceeds_nine(digit)
      total << multiply(digit)
    else
      total << digit
    end
  end
  total
end
validate() click to toggle source
# File lib/luhn/base.rb, line 14
def validate
  checksum % 10 == 0
end

Private Instance Methods

digits_of_number_to_validate() click to toggle source
# File lib/luhn/base.rb, line 50
def digits_of_number_to_validate
  # Reverse number_to_validate to start
  # the itteration from right to left
  split_to_number_array(number_to_validate).reverse
end
multiply(digit) click to toggle source
# File lib/luhn/base.rb, line 64
def multiply(digit)
  digit * 2
end
number_meets_requirements?() click to toggle source
# File lib/luhn/base.rb, line 44
def number_meets_requirements?
  raise_fixnum_error    unless number_to_validate.class == Fixnum
  raise_zero_error      if number_to_validate.zero?
  raise_negative_error  if number_to_validate < 0
end
product_of_digit_exceeds_nine(digit) click to toggle source
# File lib/luhn/base.rb, line 60
def product_of_digit_exceeds_nine(digit)
  multiply(digit) > 9
end
raise_fixnum_error() click to toggle source
# File lib/luhn/base.rb, line 68
def raise_fixnum_error
  raise(Luhn::RequirementError, 'Number must be of Fixnum')
end
raise_negative_error() click to toggle source
# File lib/luhn/base.rb, line 76
def raise_negative_error
  raise(Luhn::RequirementError, 'Number is not allowed to be negative')
end
raise_zero_error() click to toggle source
# File lib/luhn/base.rb, line 72
def raise_zero_error
  raise(Luhn::RequirementError, 'Number is not allowed to be 0 (zero)')
end
split_to_number_array(numbers) click to toggle source
# File lib/luhn/base.rb, line 56
def split_to_number_array(numbers)
  numbers.to_s.split(//).map(&:to_i)
end