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