class DigitChecksum::BaseDocument
Constants
- CLASS_METHODS
- CLASS_METHODS_DELEGATES
Attributes
number[RW]
Public Class Methods
new(number)
click to toggle source
# File lib/digit_checksum/base_document.rb, line 33 def initialize(number) @number = stripped(number) end
Public Instance Methods
append_verify_digits!()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 97 def append_verify_digits! digits = calculate_verify_digits if (!valid_length? && digits != current_verify_digits) @number = normalize verify_digits_positions.each_with_index.flat_map {|position, index| # position + index @number.insert(position, digits.shift) } end @number = stripped(@number) end
calculate_verify_digits()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 71 def calculate_verify_digits number = without_verify_digits(@number) digits = [] digits_positions = verify_digits_positions.dup return [] unless number.size == root_digits_count get_verify_digits_weights.each_with_index do |data, index| position, weights = *data current_number = normalized(number, weights.size) verify_digit = calculate_verify_digit(current_number, weights) # just update ref to calculate next digit number.insert((digits_positions.shift + index), verify_digit) digits << verify_digit end digits end
current_verify_digits()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 67 def current_verify_digits remove_verify_digits(@number.dup) end
empty?()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 49 def empty? @number.nil? || @number.empty? end
full_size()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 57 def full_size (root_digits_count + verify_digits_count) end
invalid?()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 45 def invalid? !valid? end
normalize()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 112 def normalize normalized(@number) end
Also aliased as: as_array
pretty()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 116 def pretty numbers = @number.to_s.scan(get_format_regexp).flatten numbers.empty? ? '' : (get_pretty_format_mask % numbers) end
Also aliased as: formatted
remove_verify_digits!()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 93 def remove_verify_digits! remove_verify_digits(@number) end
root_digits_count()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 133 def root_digits_count self.class.root_digits_count end
size()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 61 def size normalize.length end
Also aliased as: length
strip()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 121 def strip stripped(@number) end
Also aliased as: clear
to_s()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 125 def to_s @number end
valid?()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 37 def valid? # if document is empty or dont match the exact size, it's invalid return false if (empty? || !valid_length?) # match current verify digits with calculate through modulo operation current_verify_digits == calculate_verify_digits end
valid_length?()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 53 def valid_length? size == full_size end
verify_digits_count()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 129 def verify_digits_count get_verify_digits_weights.size end
verify_digits_positions()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 137 def verify_digits_positions begin get_verify_digits_positions # when value its not set rescue NameError => e default_verify_digits_position end end
Private Instance Methods
calc_verify_digit(quotient_rest)
click to toggle source
# File lib/digit_checksum/base_document.rb, line 207 def calc_verify_digit(quotient_rest) rest = (get_division_modulo - quotient_rest).to_i # if rest has two digits(checkdigit must be a single digit), force 0 return 0 if rest >= 10 rest end
calculate_digits_data(number, weights)
click to toggle source
# File lib/digit_checksum/base_document.rb, line 187 def calculate_digits_data(number, weights) sum = reduce_digits_weights(number, weights) quotient = (sum / get_division_modulo) rest = calculate_rest(sum, quotient) { sum: sum, quotient: quotient, rest: rest } end
calculate_rest(sum, quotient)
click to toggle source
# File lib/digit_checksum/base_document.rb, line 203 def calculate_rest(sum, quotient) (sum % get_division_modulo) end
calculate_verify_digit(number, weights)
click to toggle source
# File lib/digit_checksum/base_document.rb, line 181 def calculate_verify_digit(number, weights) data = calculate_digits_data(number, weights) calc_verify_digit(data[:rest]) end
default_verify_digits_position()
click to toggle source
# File lib/digit_checksum/base_document.rb, line 177 def default_verify_digits_position verify_digits_count.times.map {|i| root_digits_count + i } end
normalized(number, length = nil)
click to toggle source
# File lib/digit_checksum/base_document.rb, line 155 def normalized(number, length = nil) number = stripped(number).split(//).map(&:to_i) length.nil? ? number : number[0, length] end
reduce_digits_weights(number, weights)
click to toggle source
# File lib/digit_checksum/base_document.rb, line 195 def reduce_digits_weights(number, weights) number = normalized(number) number.each_with_index.map {|n,i| n.to_i * weights[i].to_i }.reduce(:+).to_f end
remove_verify_digits(number)
click to toggle source
# File lib/digit_checksum/base_document.rb, line 161 def remove_verify_digits(number) return [] unless number.size == full_size verify_digits_positions.each_with_index.flat_map {|position, index| number.slice!(position - index, 1) }.map(&:to_i) end
stripped(number)
click to toggle source
# File lib/digit_checksum/base_document.rb, line 151 def stripped(number) number.to_s.gsub(get_clear_number_regexp, '') end
without_verify_digits(number)
click to toggle source
# File lib/digit_checksum/base_document.rb, line 169 def without_verify_digits(number) number = normalized(number) return number unless number.size == full_size remove_verify_digits(number) and number end