class BraDocumentValidation::CPFValidator

Constants

FORMATTED_CPF_PATTERN
NOT_NUMBER_PATTERN
RAW_CPF_PATTERN

Public Instance Methods

validate_each(record, attribute, value) click to toggle source
# File lib/bra_document_validation/cpf_validator.rb, line 9
def validate_each(record, attribute, value)
  return record.errors.add(attribute, error_message(:invalid_format)) unless document_format.match?(value.to_s)
  full_number = only_numbers_for(value.to_s)
  record.errors.add(attribute, error_message(:invalid_verification_digit)) if black_listed?(full_number) || !digit_verified?(full_number)
end

Private Instance Methods

black_listed?(number) click to toggle source
# File lib/bra_document_validation/cpf_validator.rb, line 31
def black_listed?(number)
  number.chars.uniq.size == 1
end
digit_verified?(number) click to toggle source
# File lib/bra_document_validation/cpf_validator.rb, line 17
def digit_verified?(number)
  person_number = number_without_verifying_digits_for(number)

  number == BraDocuments::CPFGenerator.generate(person_number: person_number)
end
document_format() click to toggle source
# File lib/bra_document_validation/cpf_validator.rb, line 35
def document_format
  options[:formatted] ? FORMATTED_CPF_PATTERN : RAW_CPF_PATTERN
end
error_message(default_message) click to toggle source
# File lib/bra_document_validation/cpf_validator.rb, line 39
def error_message(default_message)
  options.fetch(:message, default_message)
end
number_without_verifying_digits_for(number) click to toggle source
# File lib/bra_document_validation/cpf_validator.rb, line 23
def number_without_verifying_digits_for(number)
  number.chars.shift(BraDocuments::CPFGenerator::PERSON_NUMBER_SIZE).join
end
only_numbers_for(value) click to toggle source
# File lib/bra_document_validation/cpf_validator.rb, line 27
def only_numbers_for(value)
  value.gsub(NOT_NUMBER_PATTERN, '')
end