Class: DigitChecksum::BaseDocument

Inherits:
Object
  • Object
show all
Extended by:
Helpers
Defined in:
lib/digit_checksum.rb,
lib/digit_checksum/delegators.rb,
lib/digit_checksum/base_document.rb

Constant Summary collapse

CLASS_METHODS_DELEGATES =
[
  :valid?,
  :invalid?,
  :pretty,
  :strip,
  :normalize,
  :as_array,
  :formatted,
  :clear,
  :remove_verify_digits!,
  :append_verify_digits!,
  :calculate_verify_digits,
  :valid_length?
]
CLASS_METHODS =
[
  :verify_digits_positions,
  :digits_ignore_positions,
  :verify_digits_weights,
  :clear_number_regexp,
  :root_digits_count,
  :pretty_format_mask,
  :generator_numbers,
  :division_modulo,
  :document_length,
  :format_regexp
]

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Helpers

generate, generate_root_numbers, root_number, root_number_to_s

Constructor Details

#initialize(number) ⇒ BaseDocument

Returns a new instance of BaseDocument.



33
34
35
# File 'lib/digit_checksum/base_document.rb', line 33

def initialize(number)
  @number = stripped(number)
end

Instance Attribute Details

#numberObject

Returns the value of attribute number.



31
32
33
# File 'lib/digit_checksum/base_document.rb', line 31

def number
  @number
end

Instance Method Details

#append_verify_digits!Object



97
98
99
100
101
102
103
104
105
106
107
108
109
110
# 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_digitsObject



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# 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_digitsObject



67
68
69
# File 'lib/digit_checksum/base_document.rb', line 67

def current_verify_digits
  remove_verify_digits(@number.dup)
end

#empty?Boolean

Returns:

  • (Boolean)


49
50
51
# File 'lib/digit_checksum/base_document.rb', line 49

def empty?
  @number.nil? || @number.empty?
end

#full_sizeObject



57
58
59
# File 'lib/digit_checksum/base_document.rb', line 57

def full_size
  (root_digits_count + verify_digits_count)
end

#invalid?Boolean

Returns:

  • (Boolean)


45
46
47
# File 'lib/digit_checksum/base_document.rb', line 45

def invalid?
  !valid?
end

#normalizeObject Also known as: as_array



112
113
114
# File 'lib/digit_checksum/base_document.rb', line 112

def normalize
  normalized(@number)
end

#prettyObject Also known as: formatted



116
117
118
119
# 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

#remove_verify_digits!Object



93
94
95
# File 'lib/digit_checksum/base_document.rb', line 93

def remove_verify_digits!
  remove_verify_digits(@number)
end

#root_digits_countObject



133
134
135
# File 'lib/digit_checksum/base_document.rb', line 133

def root_digits_count
  self.class.root_digits_count
end

#sizeObject Also known as: length



61
62
63
# File 'lib/digit_checksum/base_document.rb', line 61

def size
  normalize.length
end

#stripObject Also known as: clear



121
122
123
# File 'lib/digit_checksum/base_document.rb', line 121

def strip
  stripped(@number)
end

#to_sObject



125
126
127
# File 'lib/digit_checksum/base_document.rb', line 125

def to_s
  @number
end

#valid?Boolean

Returns:

  • (Boolean)


37
38
39
40
41
42
43
# 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?Boolean

Returns:

  • (Boolean)


53
54
55
# File 'lib/digit_checksum/base_document.rb', line 53

def valid_length?
  size == full_size
end

#verify_digits_countObject



129
130
131
# File 'lib/digit_checksum/base_document.rb', line 129

def verify_digits_count
  get_verify_digits_weights.size
end

#verify_digits_positionsObject



137
138
139
140
141
142
143
144
# 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