
🚀 Suporte total ao novo formato alfanumérico de CNPJ.
Utilitário em Ruby para gerar CNPJs válidos (Cadastro Nacional da Pessoa Jurídica).
Recursos
- ✅ CNPJ alfanumérico: Gera CNPJ de 14 caracteres com conjuntos opcionais numérico, alfabético ou alfanumérico (padrão)
- ✅ Prefixo opcional: Informe de 0 a 12 caracteres alfanuméricos para fixar o início do CNPJ (ex.: base) e gerar o restante com dígitos verificadores válidos
- ✅ Formatação: Opção de retornar a string no formato padrão (
00.000.000/0000-00) - ✅ Gerador reutilizável: Classe
CnpjGen::CnpjGeneratorcom opções padrão e sobrescritas por chamada - ✅ Sobrescritas por palavra-chave: Passe
format:,prefix:etype:emcnpj_gen,CnpjGenerator#generatee nos construtores - ✅ Dependências mínimas: Apenas
cnpj-dvelacus-utils - ✅ Tratamento de erros: Uso incorreto da API vs erros de domínio, com marcador
CnpjGen::Errorpara captura em toda a biblioteca
Instalação
Instale a gem diretamente:
gem install cnpj-gen
Ou adicione ao seu Gemfile e execute bundle install:
gem 'cnpj-gen'
Require
require 'cnpj-gen'
Início rápido
require 'cnpj-gen'
CnpjGen.cnpj_gen # => ex.: "AB123CDE000155" (14 caracteres alfanuméricos)
CnpjGen.cnpj_gen(format: true) # => ex.: "AB.123.CDE/0001-55"
CnpjGen.cnpj_gen(prefix: '45623767') # => ex.: "45623767ABCD96"
CnpjGen.cnpj_gen( # => ex.: "45.623.767/ABCD-96"
prefix: '45623767',
format: true
)
CnpjGen.cnpj_gen(type: 'numeric') # => ex.: "65453043000178" (apenas dígitos)
CnpjGen.cnpj_gen(type: 'alphabetic') # => ex.: "ABCDEFGHIJKL80" (apenas letras, exceto dígitos verificadores)
As opções também podem ser passadas como Hash:
CnpjGen.cnpj_gen({ format: true, type: 'numeric' })
Utilização
Os pontos principais são o helper de módulo CnpjGen.cnpj_gen, a classe CnpjGen::CnpjGenerator e a classe de opções CnpjGen::CnpjGeneratorOptions.
Opções do gerador
Todas as opções são opcionais:
| Opção | Tipo | Padrão | Descrição |
|---|---|---|---|
format |
Boolean |
false |
Se truthy, retorna o CNPJ gerado no formato padrão (00.000.000/0000-00). Valores não booleanos são convertidos (false, '' e 0 viram false; demais valores viram truthy). |
prefix |
String |
'' |
String inicial parcial (0–12 caracteres alfanuméricos). Apenas alfanuméricos são mantidos e convertidos para maiúsculas; os caracteres faltantes são gerados aleatoriamente e os dígitos verificadores são calculados. |
type |
String |
'alphanumeric' |
Conjunto de caracteres da parte gerada aleatoriamente (o prefix é mantido após sanitização). Deve ser um de 'numeric', 'alphabetic' ou 'alphanumeric'. Os dígitos verificadores são sempre numéricos. |
Regras do prefixo: a base (primeiros 8 caracteres) e a filial (caracteres 9–12) não podem ser todos zeros; 12 dígitos repetidos (ex.: 777777777777) também não são permitidos.
nil é aceito como argumento nomeado em cnpj_gen, CnpjGenerator.new, CnpjGenerator#generate e CnpjGeneratorOptions.new/#set — significa apenas "sem sobrescrita para esta opção". Não é aceito pelos setters de propriedade de CnpjGeneratorOptions (options.format = valor, options.prefix = valor, options.type = valor): chamar um setter com nil diretamente lança CnpjGen::TypeMismatchError. Para redefinir uma propriedade ao seu valor padrão via setter, passe a constante literal, ex.: options.format = CnpjGen::CnpjGeneratorOptions::DEFAULT_FORMAT.
CnpjGen.cnpj_gen (helper)
Gera uma string de CNPJ válida. Sem opções, retorna um CNPJ alfanumérico de 14 caracteres. É um atalho para CnpjGen::CnpjGenerator.new(...).generate.
options(opcional): instância deCnpjGen::CnpjGeneratorOptions,Hashde chaves de opção ounil. Veja Opções do gerador.format,prefix,type(argumentos nomeados): Usados apenas quandooptionsé omitido (nil). Passaroptionse qualquer um desses argumentos nomeados não-nilao mesmo tempo geraInvalidArgumentCombinationError— as duas formas de passar opções nunca são mescladas entre si.
CnpjGen::CnpjGenerator (classe)
Para padrões reutilizáveis ou sobrescritas por chamada, use a classe:
require 'cnpj-gen'
generator = CnpjGen::CnpjGenerator.new(type: 'numeric', format: true)
generator.generate # => ex.: "73.008.535/0005-06"
generator.generate(prefix: '12345678') # sobrescrita apenas nesta chamada
generator. # opções padrão atuais (CnpjGen::CnpjGeneratorOptions)
initialize(options = nil, **keywords): Opções padrão opcionais. Quandooptionsé fornecido isoladamente (instância deCnpjGen::CnpjGeneratorOptionsouHash), ele determina as opções padrão; uma instância deCnpjGen::CnpjGeneratorOptionsé armazenada por referência (mutações posteriores afetam futuras chamadas degenerateque não passarem opções por chamada), enquanto umHashcria uma nova instância. Quandooptionsé omitido (nil), as opções padrão são construídas exclusivamente a partir dos argumentos nomeados (format:,prefix:,type:). Passaroptionsjunto com qualquer argumento nomeado nãonilgeraInvalidArgumentCombinationError, em vez de ignorar os argumentos nomeados silenciosamente.generate(options = nil, **keywords): Retorna um CNPJ válido.optionse os argumentos nomeados nunca são mesclados: umoptionsfornecido isoladamente sobrescreve totalmente os padrões da instância nesta chamada; caso contrário, qualquer argumento nomeado fornecido sobrescreve os padrões da instância nesta chamada. Quando nenhum dos dois é fornecido, os padrões da instância são usados como estão. Os padrões da instância nunca são alterados por uma sobrescrita pontual. Passaroptionsjunto com qualquer argumento nomeado nãonilgeraInvalidArgumentCombinationError.options: Reader que retorna as opções padrão usadas quando não há opções por chamada (mesma instância usada internamente; mutá-la afeta futuras chamadas degenerate).
Opções padrão na instância; sobrescritas por chamada:
require 'cnpj-gen'
generator = CnpjGen::CnpjGenerator.new(format: true)
generator.generate # CNPJ formatado
generator.generate(format: false) # somente nesta chamada: sem formato
generator.generate # volta ao padrão da instância
CnpjGen::CnpjGeneratorOptions (classe)
Armazena opções (format, prefix, type) com validação e suporte a mesclagem:
require 'cnpj-gen'
= CnpjGen::CnpjGeneratorOptions.new(
prefix: 'AB123XYZ',
type: 'numeric',
format: true
)
.prefix # => "AB123XYZ"
.type # => "numeric"
.format # => true
.set(format: false) # mescla e retorna self
.all # => { format: false, prefix: "AB123XYZ", type: "numeric" }
# Redefinir uma propriedade ao seu valor padrão exige a constante literal —
# um `nil` direto no setter lança TypeMismatchError:
.format = CnpjGen::CnpjGeneratorOptions::DEFAULT_FORMAT
initialize(*options, **keywords): Cada argumento posicionaloptions(umHashou outra instância deCnpjGen::CnpjGeneratorOptions) é combinado da esquerda para a direita — os últimos prevalecem — e então os argumentos nomeados (format:,prefix:,type:) são aplicados por cima com a maior precedência. Em cada etapa, um valornilpara uma dada chave é ignorado em favor do que já foi resolvido. Qualquer opção ainda não resolvida recebe seu valorDEFAULT_*.format,prefix,type: Acessores com setters;prefixé validado (base/filial inelegíveis, dígitos repetidos). Os setters nunca aceitamnil— passe a constanteDEFAULT_*correspondente (ex.:CnpjGeneratorOptions::DEFAULT_PREFIX) para redefinir uma propriedade explicitamente.set(*options, **keywords): Atualiza várias opções de uma vez, usando a mesma resolução deinitialize(combinação seguida de argumentos nomeados, ignorandonil). Qualquer opção não resolvida após a combinação mantém seu valor atual na instância (uma atualização parcial, não uma reinicialização). Retornaself.all: Cópia superficial emHashdas opções atuais (:format,:prefix,:type).
API
Exportações
Após require 'cnpj-gen':
CnpjGen.cnpj_gen:(options = nil, **keywords) -> String— helper de conveniência.CnpjGen::CnpjGenerator: Classe para gerar CNPJ com opções padrão e sobrescritas por chamada.CnpjGen::CnpjGeneratorOptions: Classe que armazena opções com validação e mesclagem.CnpjGen::CNPJ_LENGTH:14(constante).CnpjGen::CNPJ_PREFIX_MAX_LENGTH:12(constante).CnpjGen::CNPJ_TYPE_VALUES:%w[alphabetic alphanumeric numeric]— valores permitidos paratype.CnpjGen::VERSION: string da versão da gem.- Erros:
CnpjGen::Error,CnpjGen::DomainError,CnpjGen::InvalidArgumentCombinationError,CnpjGen::TypeMismatchError,CnpjGen::ValidationError.
Tratamento de erros
Os erros se dividem em duas categorias:
| Categoria | Significado |
|---|---|
| Uso incorreto da API | O chamador usou a biblioteca de forma incorreta (tipo errado para uma opção, ou combinação inválida de argumentos). |
| Erro de domínio | A chamada estava estruturalmente correta, mas um valor viola uma regra de negócio (prefix inválido, ou type fora do conjunto permitido). |
Todo erro customizado inclui o módulo marcador CnpjGen::Error. Falhas de domínio (ValidationError) herdam de CnpjGen::DomainError (RangeError).
Importante: passar ao mesmo tempo uma instância/Hash de options e qualquer argumento nomeado não-nil levanta InvalidArgumentCombinationError.
Resumo
| Classe | Herda de | Categoria | Condição de disparo |
|---|---|---|---|
CnpjGen::InvalidArgumentCombinationError |
ArgumentError (+ include Error) |
Uso incorreto da API | Instância/Hash de options e qualquer argumento nomeado não-nil passados ao mesmo tempo |
CnpjGen::TypeMismatchError |
TypeError (+ include Error) |
Uso incorreto da API | Uma opção do gerador tem o tipo de dado incorreto |
CnpjGen::ValidationError |
CnpjGen::DomainError |
Erro de domínio | prefix inelegível, ou type fora dos valores permitidos |
CnpjGen::Error (módulo marcador)
- Herança: módulo marcador misturado em todo erro da biblioteca via
include(não é uma classe). - Categoria: N/A (apenas alvo de
rescue) — não é um modo de falha por si só. - Quando é levantado: Nunca diretamente; incluído por todo erro customizado que a biblioteca levanta.
- Exemplo: N/A
- Como resgatar:
rescue CnpjGen::Error
# tudo o que esta biblioteca levanta
CnpjGen::DomainError
- Herança:
CnpjGen::DomainError < RangeError(incluiCnpjGen::Error) - Categoria: Erro de domínio — ancestral de todas as falhas de domínio.
- Quando é levantado: Não é levantado diretamente; prefira uma subclasse folha.
- Exemplo: Prefira
raise CnpjGen::ValidationErrora levantarDomainErrordiretamente. - Como resgatar:
rescue CnpjGen::DomainError
# ValidationError e outras subclasses de DomainError
CnpjGen::TypeMismatchError
- Herança:
CnpjGen::TypeMismatchError < TypeError(incluiCnpjGen::Error) - Categoria: Uso incorreto da API — o chamador passou um valor do tipo errado.
- Quando é levantado: Levantado quando uma opção do gerador (
format,prefixoutype) tem o tipo de runtime incorreto. - Exemplo:
CnpjGen.cnpj_gen(prefix: 123) # levanta CnpjGen::TypeMismatchError
- Como resgatar:
rescue CnpjGen::TypeMismatchError
# violação de contrato de tipo desta biblioteca
rescue TypeError
# erros nativos de tipo, incluindo TypeMismatchError desta biblioteca
CnpjGen::InvalidArgumentCombinationError
- Herança:
CnpjGen::InvalidArgumentCombinationError < ArgumentError(incluiCnpjGen::Error) - Categoria: Uso incorreto da API — o chamador misturou padrões de argumentos mutuamente exclusivos.
- Quando é levantado: Levantado quando
CnpjGenerator.new,#generateoucnpj_genrecebe ao mesmo tempo um argumentooptions(instância ouHash) e qualquer argumento nomeado não-nil. - Exemplo:
begin
CnpjGen::CnpjGenerator.new({ format: true }, prefix: 'AB')
rescue CnpjGen::InvalidArgumentCombinationError => e
puts e.
# Pass either an options instance/Hash to `options`, or keyword arguments (format:, prefix:, type:), not both.
end
- Como resgatar:
rescue CnpjGen::InvalidArgumentCombinationError
# combinação inválida de argumentos desta biblioteca
rescue ArgumentError
# erros nativos de argumento, incluindo InvalidArgumentCombinationError desta biblioteca
CnpjGen::ValidationError
- Herança:
CnpjGen::ValidationError < CnpjGen::DomainError < RangeError(incluiCnpjGen::Error) - Categoria: Erro de domínio — um valor falha uma regra de domínio que não é numérica nem de tamanho.
- Quando é levantado: Levantado quando
prefixé inelegível (base/filial zerada, ou 12 dígitos repetidos), ou quandotypenão é um de'alphabetic','alphanumeric'ou'numeric'. - Exemplo:
CnpjGen.cnpj_gen(prefix: '000000000001') # levanta CnpjGen::ValidationError
CnpjGen.cnpj_gen(type: 'invalid') # levanta CnpjGen::ValidationError
- Como resgatar:
rescue CnpjGen::ValidationError
# esta falha exata de validação de domínio
rescue CnpjGen::DomainError
# falhas de domínio com raiz em RangeError desta biblioteca
Granularidade de rescue
# 1) Classe nativa — captura uso incorreto de tipo desta biblioteca (e outros TypeErrors).
rescue TypeError
# CnpjGen::TypeMismatchError e qualquer outro TypeError (da biblioteca ou não)
# 2) CnpjGen::DomainError — captura violações de regra de negócio sob DomainError.
rescue CnpjGen::DomainError
# CnpjGen::ValidationError e outras subclasses de DomainError
# 3) CnpjGen::Error — captura tudo o que a biblioteca levanta.
rescue CnpjGen::Error
# todo erro customizado que inclui CnpjGen::Error
# 4) Classe folha específica — captura apenas aquele modo de falha.
rescue CnpjGen::ValidationError
# apenas CnpjGen::ValidationError
Atributos relevantes:
TypeMismatchError:option_name,actual_input,actual_type,expected_typeValidationError:option_name,actual_input,reason(falhas de prefixo),expected_values(falhas de type)
Os setters de propriedade nunca aceitam nil diretamente — passe a constante DEFAULT_* correspondente para redefinir:
= CnpjGen::CnpjGeneratorOptions.new
begin
.prefix = nil
rescue CnpjGen::TypeMismatchError => e
puts e.
# CNPJ generator option "prefix" must be of type string. Got nil.
end
.prefix = CnpjGen::CnpjGeneratorOptions::DEFAULT_PREFIX # redefinição explícita
Falhas de cálculo de dígitos verificadores pelo cnpj-dv são tratadas internamente com nova tentativa de geração usando as mesmas opções resolvidas; em operação normal não são propagadas ao chamador.
Outros recursos disponíveis
CnpjGen::CnpjGeneratorOptions::CNPJ_LENGTH:14.CnpjGen::CnpjGeneratorOptions::CNPJ_PREFIX_MAX_LENGTH:12.CnpjGen::CnpjGeneratorOptions::DEFAULT_FORMAT,DEFAULT_PREFIX,DEFAULT_TYPE: Constantes de padrão no nível da classe.
Contribuição e suporte
Contribuições são bem-vindas! Consulte as Diretrizes de contribuição. Se este projeto for útil para você, considere:
- ⭐ Dar uma estrela no repositório
- 🤝 Contribuir com o código
- 💡 Sugerir novos recursos
- 🐛 Reportar bugs
Licença
Este projeto está licenciado sob a MIT License — consulte o arquivo LICENSE.
Changelog
Veja o CHANGELOG para histórico de versões e alterações.
Feito com ❤️ por Lacus Solutions