class IsinValidator

Constants

REGEXP

rubocop:disable Layout/LineLength

Private Instance Methods

valid_attr?() click to toggle source

rubocop:enable Layout/LineLength

# File lib/lite/validators/isin_validator.rb, line 11
def valid_attr?
  valid_regexp? && valid_checksum?
end
valid_checksum?() click to toggle source

rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity

# File lib/lite/validators/isin_validator.rb, line 16
def valid_checksum?
  characters = value.chars
  digits = characters.map { |chr| /[A-Z]/.match?(chr) ? (chr.ord - 55) : chr.to_i }
  even_values = digits.values_at(*digits.each_index.select(&:even?))
  odd_values = digits.values_at(*digits.each_index.select(&:odd?))

  longest, shortest = if even_values.last == characters.map(&:to_i)
                        [even_values, odd_values]
                      else
                        [odd_values, even_values]
                      end

  longest = longest.map { |int| int * 2 }
  values = longest.concat(shortest).to_s.scan(/./).map(&:to_i)
  total = values.sum

  (10 - (total % 10)) % 10
end