O Gerador De CPF O Gerador De CPF

Gerar CPF em Ruby: Função com Testes RSpec

Em projetos Rails e scripts Ruby, gerar CPF programaticamente é indispensável para popular factories, seeds e specs com dados realistas. As funções abaixo implementam o algoritmo de módulo 11 e produzem CPFs sintaticamente válidos, perfeitos para testes automatizados.

Código

def gerar_cpf
  digits = Array.new(9) { rand(0..9) }

  # Primeiro dígito verificador
  soma = 0
  9.times { |i| soma += digits[i] * (10 - i) }
  resto = soma % 11
  digits << (resto < 2 ? 0 : 11 - resto)

  # Segundo dígito verificador
  soma = 0
  10.times { |i| soma += digits[i] * (11 - i) }
  resto = soma % 11
  digits << (resto < 2 ? 0 : 11 - resto)

  digits.join
end

def validar_cpf(cpf)
  cpf = cpf.gsub(/[^\d]/, '')

  return false unless cpf.length == 11

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

  digits = cpf.chars.map(&:to_i)

  # Verifica primeiro dígito
  soma = 0
  9.times { |i| soma += digits[i] * (10 - i) }
  resto = soma % 11
  esperado = resto < 2 ? 0 : 11 - resto
  return false unless digits[9] == esperado

  # Verifica segundo dígito
  soma = 0
  10.times { |i| soma += digits[i] * (11 - i) }
  resto = soma % 11
  esperado = resto < 2 ? 0 : 11 - resto
  return false unless digits[10] == esperado

  true
end

Análise do código

A função gerar_cpf começa criando um array com nove dígitos aleatórios usando rand(0..9), que retorna um inteiro entre 0 e 9 inclusive. O método Array.new(9) { rand(0..9) } é idiomático em Ruby e cria o array já preenchido em uma única expressão.

O cálculo dos dígitos verificadores segue o algoritmo módulo 11. Para o primeiro dígito, cada um dos nove dígitos base é multiplicado por pesos decrescentes de 10 a 2, a soma é dividida por 11 e o resto determina o dígito: se menor que 2, o dígito é 0; caso contrário, subtrai-se de 11. O segundo dígito repete o processo com os dez dígitos já calculados e pesos de 11 a 2. Ambos os dígitos são adicionados ao array com o operador <<.

A função validar_cpf remove caracteres não numéricos com gsub, verifica o comprimento de 11 dígitos, rejeita sequências com todos os dígitos iguais usando chars.uniq.length == 1 e recalcula os dois dígitos verificadores para comparar com os informados. Ao final, digits.join concatena todos os 11 dígitos em uma string, produzindo o CPF completo.

Uso

cpf = gerar_cpf
puts "CPF gerado: #{cpf}"
puts "Válido: #{validar_cpf(cpf)}"

Testes

require 'rspec'

RSpec.describe 'gerar_cpf' do
  it 'retorna uma string com 11 dígitos' do
    cpf = gerar_cpf
    expect(cpf).to match(/\A\d{11}\z/)
    expect(cpf.length).to eq(11)
  end

  it 'gera CPFs que passam na validação' do
    100.times do
      cpf = gerar_cpf
      expect(validar_cpf(cpf)).to be(true), "CPF inválido gerado: #{cpf}"
    end
  end

  it 'gera CPFs diferentes em chamadas consecutivas' do
    cpfs = Array.new(3) { gerar_cpf }
    expect(cpfs.uniq.length).to be > 1
  end
end

Execute os testes com rspec no diretório do projeto. O segundo teste gera 100 CPFs e valida cada um, garantindo que o algoritmo de geração está correto de forma consistente.

Para validar CPFs existentes em Ruby, consulte o guia completo de validação em Ruby. Para gerar CPFs rapidamente sem código, use o gerador online.