O Gerador De CPF O Gerador De CPF

Função para Validar CPF em Ruby

Função Ruby para validar CPF usando o algoritmo de módulo 11. Pode ser usada em aplicações Rails, Sinatra, scripts ou qualquer projeto Ruby.

Código

def validar_cpf(cpf)
  # Remove caracteres não numéricos
  cpf = cpf.gsub(/\D/, '')

  # Verifica se tem 11 dígitos
  return false unless cpf.length == 11

  # Rejeita CPFs com todos os dígitos iguais
  return false if cpf.chars.uniq.length == 1

  # Calcula o primeiro dígito verificador
  soma = (0..8).sum { |i| cpf[i].to_i * (10 - i) }
  resto = soma % 11
  digito1 = resto < 2 ? 0 : 11 - resto

  # Calcula o segundo dígito verificador
  soma = (0..9).sum { |i| cpf[i].to_i * (11 - i) }
  resto = soma % 11
  digito2 = resto < 2 ? 0 : 11 - resto

  # Verifica se os dígitos calculados conferem
  cpf[9].to_i == digito1 && cpf[10].to_i == digito2
end

Análise do código

gsub(/\D/, '') remove tudo que não é dígito, aceitando entrada com ou sem pontuação.

cpf.chars.uniq.length == 1 rejeita CPFs com todos os dígitos iguais usando os métodos idiomáticos de Ruby para arrays.

O cálculo usa Enumerable#sum com bloco: (0..8).sum { |i| cpf[i].to_i * (10 - i) } para o primeiro dígito (pesos 10 a 2) e (0..9).sum { |i| cpf[i].to_i * (11 - i) } para o segundo (pesos 11 a 2). Cada resultado passa por % 11 com o operador ternário para a regra do complemento.

Uso

validar_cpf("529.982.247-25") # => true
validar_cpf("111.111.111-11") # => false
validar_cpf("52998224725")    # => true

Testes

Testes com RSpec:

RSpec.describe 'validar_cpf' do
  it 'aceita CPF válido com pontuação' do
    expect(validar_cpf("529.982.247-25")).to be true
  end

  it 'aceita CPF válido sem pontuação' do
    expect(validar_cpf("52998224725")).to be true
  end

  it 'rejeita CPF com dígitos repetidos' do
    expect(validar_cpf("111.111.111-11")).to be false
  end

  it 'rejeita CPF com dígito verificador incorreto' do
    expect(validar_cpf("529.982.247-26")).to be false
  end

  it 'rejeita CPF com tamanho incorreto' do
    expect(validar_cpf("123.456.789")).to be false
  end
end

Precisa de CPFs para alimentar seus specs? Use o gerador de CPF válido online.