Sha256: 194fcd61c5f3004a8b4e472d2994ff5ae606d14772d6930f83e28ec12eba8d8b

Contents?: true

Size: 821 Bytes

Versions: 3

Compression:

Stored size: 821 Bytes

Contents

# Checks if the value of an attribute is a valid IMEI number.
#
# @example Validate that a device IMEI number is valid.
#   class Device << ActiveRecord::Base
#     attr_accessor :imei
#     validates :imei, imei: true
#   end
class ImeiValidator < BaseValidator
  private

  # 356843052637512 or 35-6843052-637512 or 35.6843052.637512
  IMEI_FORMAT = /\A[\d\.\:\-\s]+\z/i

  def validate_format(imei_number)
    (imei_number =~ IMEI_FORMAT).present?
  end

  def validate_luhn_checksum(numbers)
    sum = 0
    i = 0

    numbers.each_char do |ch|
      n = ch.to_i
      n *= 2 if i.odd?
      n = 1 + (n - 10) if n >= 10

      sum += n
      i += 1
    end

    (sum % 10).zero?
  end

  def valid?(imei, _)
    validate_format(imei.to_s) && \
      validate_luhn_checksum(imei.to_s.gsub(/\D/, '').reverse)
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
missing_validators-2.3.0 lib/missing_validators/validators/imei_validator.rb
missing_validators-2.2.0 lib/missing_validators/validators/imei_validator.rb
missing_validators-2.1.0 lib/missing_validators/validators/imei_validator.rb