br_validators 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8ab3d772a8a5a9512686a875c429689adcb348af7eac07f7f795f2efa616d402
4
- data.tar.gz: 5c222dfc1339f2c451501fd010767ce82b0111243e4768b0762a896b03b2a363
3
+ metadata.gz: 46a5c5d1d504c919923fbc23bb01ee2f4c82eeccbf752f8130740baa97ae35e6
4
+ data.tar.gz: 8d7dc883a24f170123e0df911397e4981af249941ae48d04d0476ff1d97029c0
5
5
  SHA512:
6
- metadata.gz: a9663daabd0c2079d63aa4990c0e5454bb47024b7e7cf1545f2db7f0a76a3c69aaf5e3141d7a808b94457a79a65eef48a0ddf5a5e378b76ec0474beb2ea87bfd
7
- data.tar.gz: bcc9e9bce3dda58ff44c9039fb7107cdc217a0dddd997d4d935995eb524a7a0e0ad23c910203bfe540d94990a1b4cbc56b9f9c4fb84e9ea22cd0c1d7b46e6a55
6
+ metadata.gz: 66f54a26023c513533a5f1928a7875232d645f44161b0d6457da9cff3579aa666444d5ff09cad07058144c4113f41d89e75c05543433cf62a811fe7f387a1ceb
7
+ data.tar.gz: '08a8f1547c74bf7062abb1a7dda42c69e55e7a9f6578f6473871d19155b36e463644a4d03458aed3b972c8fbce1d90b1da74151ec3fb539c0a7c3cc8ab294bc5'
data/CHANGELOG.md CHANGED
@@ -3,6 +3,28 @@
3
3
  As mudanças de cada versão ficam aqui. O projeto segue o
4
4
  [versionamento semântico](https://semver.org/lang/pt-BR/).
5
5
 
6
+ ## [0.3.0] - 2026-10-31
7
+
8
+ ### Novo
9
+
10
+ - `require "br_validators/documentos"` carrega só os documentos, sem os validadores do
11
+ Rails. Serve para o app que já tem um `CpfValidator` (ou outro com o mesmo nome): o da
12
+ gem, no nível de cima, fazia o Rails ignorar o arquivo do app sem avisar. No Gemfile:
13
+ `gem "br_validators", require: "br_validators/documentos"`.
14
+ - Assinaturas de tipo (RBS) em `sig/`, incluídas no pacote.
15
+ - Link da documentação (rubydoc.info) nos dados da gem no RubyGems.
16
+
17
+ ### Mudado
18
+
19
+ - `require "br_validators/consulta"` carrega só os documentos de que precisa, sem os
20
+ validadores do Rails.
21
+
22
+ ### Outros
23
+
24
+ - Página de teste com visual novo: botões para escolher o documento, motivo quando o
25
+ número é inválido (tamanho ou regra) e o trecho de código Ruby equivalente. A API
26
+ devolve `caracteres`, o tamanho sem a máscara.
27
+
6
28
  ## [0.2.1] - 2026-10-26
7
29
 
8
30
  ### Corrigido
data/README.md CHANGED
@@ -1,6 +1,18 @@
1
1
  # br_validators
2
2
 
3
- Gem Ruby para validar e formatar documentos brasileiros, sem dependências.
3
+ [![Gem](https://img.shields.io/gem/v/br_validators)](https://rubygems.org/gems/br_validators)
4
+ [![CI](https://github.com/PedroPedrassolli/br_validators/actions/workflows/ci.yml/badge.svg)](https://github.com/PedroPedrassolli/br_validators/actions/workflows/ci.yml)
5
+
6
+ Gem Ruby para validar e formatar documentos brasileiros, sem dependências. Dá para
7
+ testar cada documento no navegador em https://br-validators.vercel.app.
8
+
9
+ ```ruby
10
+ require "br_validators"
11
+
12
+ BrValidators::CPF.valid?("123.456.789-09") # => true
13
+ BrValidators::CNPJ.format("12abc34501de35") # => "12.ABC.345/01DE-35"
14
+ BrValidators::Telefone.type("(11) 98765-4321") # => :celular
15
+ ```
4
16
 
5
17
  ## Instalação
6
18
 
@@ -148,24 +160,48 @@ sobrescreva as chaves `errors.messages.<documento>_invalid` (`cpf_invalid`, `cep
148
160
  Os validadores ficam no nível de cima (`CpfValidator`, `TelefoneValidator`,
149
161
  `TituloEleitorValidator`...), porque é assim que o Rails encontra `cpf: true`.
150
162
 
163
+ Se o seu app já tem um validador com o mesmo nome (um `app/validators/cpf_validator.rb`,
164
+ por exemplo), o Rails passa a ignorar o arquivo do app sem avisar, porque a classe já
165
+ existe. Para ficar com o seu, carregue só os documentos:
166
+
167
+ ```ruby
168
+ # Gemfile
169
+ gem "br_validators", require: "br_validators/documentos"
170
+ ```
171
+
172
+ Os módulos (`BrValidators::CPF`...) continuam disponíveis; só os validadores do Rails
173
+ ficam de fora.
174
+
151
175
  Já existem boas gems para CPF e CNPJ. A ideia aqui é juntar num lugar só os documentos
152
176
  que costumam aparecer em sistemas brasileiros (inclusive CNS, Pix, boleto, placa, NF-e e
153
177
  processo judicial), com mensagens de erro em português e inglês.
154
178
 
179
+ ## Tipos (RBS)
180
+
181
+ A gem vem com assinaturas de tipo em `sig/`, para quem usa Steep, o Ruby LSP ou outra
182
+ ferramenta que lê RBS. A documentação de cada módulo fica em
183
+ [rubydoc.info](https://rubydoc.info/gems/br_validators).
184
+
155
185
  ## Página de teste
156
186
 
157
- Dá para testar cada validador no navegador em https://br-validators.vercel.app. A página
158
- (`public/`) é HTML e JavaScript puro e chama uma função Ruby da Vercel
187
+ Dá para testar cada validador no navegador em https://br-validators.vercel.app. O link
188
+ pode abrir direto num documento: `?documento=placa`, `?documento=boleto`... A página
189
+ mostra o resultado, explica por que um número é inválido e monta o trecho de código
190
+ Ruby que faz o mesmo.
191
+
192
+ A página (`public/`) é HTML e JavaScript puro e chama uma função Ruby da Vercel
159
193
  (`api/validar.rb`) que usa a própria gem, então as regras ficam num lugar só:
160
194
 
161
195
  ```
162
196
  GET /api/validar?documento=cnpj&valor=12.ABC.345/01DE-35
163
- {"documento":"cnpj","valido":true,"formatado":"12.ABC.345/01DE-35","tipo":null,"detalhe":null}
197
+ {"documento":"cnpj","valido":true,"formatado":"12.ABC.345/01DE-35","tipo":null,"detalhe":null,"caracteres":14}
164
198
 
165
199
  GET /api/validar?documento=titulo_eleitor&valor=1023%208501%200671
166
- {"documento":"titulo_eleitor","valido":true,"formatado":"1023 8501 0671","tipo":null,"detalhe":"PR"}
200
+ {"documento":"titulo_eleitor","valido":true,"formatado":"1023 8501 0671","tipo":null,"detalhe":"PR","caracteres":12}
167
201
  ```
168
202
 
203
+ `caracteres` é o tamanho sem pontos, traços e espaços (para a chave Pix, `null`).
204
+
169
205
  ## Desenvolvimento
170
206
 
171
207
  Precisa de Ruby 3.3 ou mais novo.
@@ -174,6 +210,7 @@ Precisa de Ruby 3.3 ou mais novo.
174
210
  bundle install
175
211
  bundle exec rake test # testes (a cobertura mínima é 100% das linhas)
176
212
  bundle exec rubocop # estilo
213
+ bundle exec rbs -r uri -I sig validate # assinaturas de tipo
177
214
  node --test "test/js/*.test.mjs" # testes da página de teste
178
215
  ```
179
216
 
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_model"
4
+ require_relative "documentos"
4
5
 
5
6
  # Validação nos models do Rails (ou de qualquer classe com ActiveModel):
6
7
  #
@@ -10,6 +11,10 @@ require "active_model"
10
11
  #
11
12
  # O Rails procura a classe pelo nome da opção ("cpf: true" vira CpfValidator),
12
13
  # por isso os validadores ficam no nível de cima, fora do módulo BrValidators.
14
+ # Efeito colateral: se o app já tem um validador com o mesmo nome (por exemplo,
15
+ # app/validators/cpf_validator.rb), o Rails ignora o arquivo do app sem avisar,
16
+ # porque a classe já existe. Para ficar com o do app, o Gemfile carrega só os
17
+ # documentos: gem "br_validators", require: "br_validators/documentos".
13
18
  # As mensagens de erro estão em lib/br_validators/locale (pt-BR e en).
14
19
  I18n.load_path += Dir[File.expand_path("locale/*.yml", __dir__)]
15
20
 
@@ -3,7 +3,8 @@
3
3
  require "json"
4
4
  require "net/http"
5
5
  require "openssl"
6
- require_relative "../br_validators"
6
+ # Só os documentos (para validar antes de consultar), sem os validadores do Rails.
7
+ require_relative "documentos"
7
8
 
8
9
  module BrValidators
9
10
  # Consultas online pela BrasilAPI (https://brasilapi.com.br), um serviço gratuito,
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "version"
4
+ require_relative "texto"
5
+ require_relative "cpf"
6
+ require_relative "cnpj"
7
+ require_relative "cns"
8
+ require_relative "pix"
9
+ require_relative "boleto"
10
+ require_relative "cep"
11
+ require_relative "telefone"
12
+ require_relative "placa"
13
+ require_relative "renavam"
14
+ require_relative "titulo_eleitor"
15
+ require_relative "processo_cnj"
16
+ require_relative "chave_acesso"
17
+
18
+ # Validação e formatação de documentos brasileiros.
19
+ #
20
+ # Cada documento tem um módulo próprio (BrValidators::CPF, BrValidators::CNPJ...)
21
+ # com os mesmos três métodos:
22
+ # valid?(valor) -> true ou false
23
+ # format(valor) -> o documento com a máscara, ou nil se for inválido
24
+ # strip(valor) -> o documento sem a máscara
25
+ # A chave Pix é a exceção: tem valid? e type, mas não format nem strip, porque
26
+ # precisa estar exatamente como o Banco Central guarda.
27
+ # Alguns têm métodos a mais: type (Pix, Boleto, Telefone, Placa), uf (TituloEleitor),
28
+ # segmento (ProcessoCNJ), modelo (ChaveAcesso), ddd (Telefone), mercosul e antiga (Placa).
29
+ #
30
+ # Este arquivo carrega só os documentos, sem os validadores do Rails. Serve para o
31
+ # app que já tem um CpfValidator (ou outro com o mesmo nome) e quer continuar com o
32
+ # dele: no Gemfile, gem "br_validators", require: "br_validators/documentos".
33
+ module BrValidators
34
+ end
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Versão da gem, lida também pelo gemspec.
4
4
  module BrValidators
5
- VERSION = "0.2.1"
5
+ VERSION = "0.3.0"
6
6
  end
data/lib/br_validators.rb CHANGED
@@ -1,33 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "br_validators/version"
4
- require_relative "br_validators/texto"
5
- require_relative "br_validators/cpf"
6
- require_relative "br_validators/cnpj"
7
- require_relative "br_validators/cns"
8
- require_relative "br_validators/pix"
9
- require_relative "br_validators/boleto"
10
- require_relative "br_validators/cep"
11
- require_relative "br_validators/telefone"
12
- require_relative "br_validators/placa"
13
- require_relative "br_validators/renavam"
14
- require_relative "br_validators/titulo_eleitor"
15
- require_relative "br_validators/processo_cnj"
16
- require_relative "br_validators/chave_acesso"
17
-
18
- # Validação e formatação de documentos brasileiros.
19
- #
20
- # Cada documento tem um módulo próprio (BrValidators::CPF, BrValidators::CNPJ...)
21
- # com os mesmos três métodos:
22
- # valid?(valor) -> true ou false
23
- # format(valor) -> o documento com a máscara, ou nil se for inválido
24
- # strip(valor) -> o documento sem a máscara
25
- # A chave Pix é a exceção: tem valid? e type, mas não format nem strip, porque
26
- # precisa estar exatamente como o Banco Central guarda.
27
- # Alguns têm métodos a mais: type (Pix, Boleto, Telefone, Placa), uf (TituloEleitor),
28
- # segmento (ProcessoCNJ), modelo (ChaveAcesso), ddd (Telefone), mercosul e antiga (Placa).
29
- module BrValidators
30
- end
3
+ # Os documentos (BrValidators::CPF, BrValidators::CNPJ...). A explicação de cada
4
+ # método está em br_validators/documentos.rb.
5
+ require_relative "br_validators/documentos"
31
6
 
32
7
  # Validação nos models (validates :cpf, cpf: true): só entra quando o projeto tem
33
8
  # o ActiveModel (todo app Rails tem), para a gem continuar sem dependências.
@@ -0,0 +1,130 @@
1
+ # Assinaturas de tipo (RBS) da parte pública da gem, para quem usa Steep, o
2
+ # Ruby LSP ou outra ferramenta que lê tipos. Os validadores do ActiveModel
3
+ # (CpfValidator...) ficam de fora: quem chama é o Rails, não o seu código.
4
+ #
5
+ # Confira com: bundle exec rbs -r uri -I sig validate
6
+ module BrValidators
7
+ VERSION: String
8
+
9
+ # Converte qualquer valor em texto UTF-8 (uso interno dos módulos).
10
+ def self.texto: (untyped valor) -> String
11
+
12
+ module CPF
13
+ def self.valid?: (untyped value) -> bool
14
+ def self.format: (untyped value) -> String?
15
+ def self.strip: (untyped value) -> String
16
+ end
17
+
18
+ module CNPJ
19
+ def self.valid?: (untyped value) -> bool
20
+ def self.format: (untyped value) -> String?
21
+ def self.strip: (untyped value) -> String
22
+ end
23
+
24
+ module CNS
25
+ def self.valid?: (untyped value) -> bool
26
+ def self.format: (untyped value) -> String?
27
+ def self.strip: (untyped value) -> String
28
+ end
29
+
30
+ module TituloEleitor
31
+ def self.valid?: (untyped value) -> bool
32
+ def self.format: (untyped value) -> String?
33
+ def self.strip: (untyped value) -> String
34
+ def self.uf: (untyped value) -> String?
35
+ end
36
+
37
+ module Pix
38
+ type tipo = :cpf | :cnpj | :phone | :email | :evp
39
+
40
+ def self.valid?: (untyped value) -> bool
41
+ def self.type: (untyped value) -> tipo?
42
+ end
43
+
44
+ module Boleto
45
+ type tipo = :cobranca | :arrecadacao
46
+
47
+ def self.valid?: (untyped value) -> bool
48
+ def self.format: (untyped value) -> String?
49
+ def self.strip: (untyped value) -> String
50
+ def self.type: (untyped value) -> tipo?
51
+ end
52
+
53
+ module CEP
54
+ def self.valid?: (untyped value) -> bool
55
+ def self.format: (untyped value) -> String?
56
+ def self.strip: (untyped value) -> String
57
+ end
58
+
59
+ module Telefone
60
+ type tipo = :celular | :fixo
61
+
62
+ DDDS: Array[String]
63
+
64
+ def self.valid?: (untyped value) -> bool
65
+ def self.format: (untyped value) -> String?
66
+ def self.strip: (untyped value) -> String
67
+ def self.type: (untyped value) -> tipo?
68
+ def self.ddd: (untyped value) -> String?
69
+ end
70
+
71
+ module Placa
72
+ type tipo = :antiga | :mercosul
73
+
74
+ def self.valid?: (untyped value) -> bool
75
+ def self.format: (untyped value) -> String?
76
+ def self.strip: (untyped value) -> String
77
+ def self.type: (untyped value) -> tipo?
78
+ def self.mercosul: (untyped value) -> String?
79
+ def self.antiga: (untyped value) -> String?
80
+ end
81
+
82
+ module RENAVAM
83
+ def self.valid?: (untyped value) -> bool
84
+ def self.format: (untyped value) -> String?
85
+ def self.strip: (untyped value) -> String
86
+ end
87
+
88
+ module ChaveAcesso
89
+ def self.valid?: (untyped value) -> bool
90
+ def self.format: (untyped value) -> String?
91
+ def self.strip: (untyped value) -> String
92
+ def self.modelo: (untyped value) -> String?
93
+ end
94
+
95
+ module ProcessoCNJ
96
+ SEGMENTOS: Hash[String, String]
97
+
98
+ def self.valid?: (untyped value) -> bool
99
+ def self.format: (untyped value) -> String?
100
+ def self.strip: (untyped value) -> String
101
+ def self.segmento: (untyped value) -> String?
102
+ end
103
+
104
+ # Opcional: require "br_validators/consulta".
105
+ module Consulta
106
+ # Qualquer objeto com get(uri) que devolva [status, corpo] serve de cliente.
107
+ interface _Cliente
108
+ def get: (URI::Generic uri) -> [Integer, String]
109
+ end
110
+
111
+ BASE: String
112
+ TIMEOUT: Integer
113
+
114
+ class Erro < StandardError
115
+ end
116
+
117
+ attr_writer self.cliente: _Cliente
118
+ def self.cliente: () -> _Cliente
119
+
120
+ # O JSON da BrasilAPI como Hash, ou nil quando o dado é inválido ou não existe.
121
+ def self.cep: (untyped valor) -> Hash[String, untyped]?
122
+ def self.cnpj: (untyped valor) -> Hash[String, untyped]?
123
+ def self.banco: (untyped codigo) -> Hash[String, untyped]?
124
+ def self.ddd: (untyped valor) -> Hash[String, untyped]?
125
+
126
+ module HTTP
127
+ def self.get: (URI::Generic uri) -> [Integer, String]
128
+ end
129
+ end
130
+ end
data/sig/manifest.yaml ADDED
@@ -0,0 +1,3 @@
1
+ # Bibliotecas padrão do Ruby que as assinaturas usam (o rbs collection lê daqui).
2
+ dependencies:
3
+ - name: uri
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: br_validators
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pedro Pedrassolli
@@ -31,6 +31,7 @@ files:
31
31
  - lib/br_validators/cns.rb
32
32
  - lib/br_validators/consulta.rb
33
33
  - lib/br_validators/cpf.rb
34
+ - lib/br_validators/documentos.rb
34
35
  - lib/br_validators/locale/en.yml
35
36
  - lib/br_validators/locale/pt-BR.yml
36
37
  - lib/br_validators/pix.rb
@@ -53,6 +54,8 @@ files:
53
54
  - lib/br_validators/validators/telefone_validator.rb
54
55
  - lib/br_validators/validators/titulo_eleitor_validator.rb
55
56
  - lib/br_validators/version.rb
57
+ - sig/br_validators.rbs
58
+ - sig/manifest.yaml
56
59
  homepage: https://github.com/PedroPedrassolli/br_validators
57
60
  licenses:
58
61
  - MIT
@@ -60,6 +63,7 @@ metadata:
60
63
  source_code_uri: https://github.com/PedroPedrassolli/br_validators
61
64
  changelog_uri: https://github.com/PedroPedrassolli/br_validators/blob/main/CHANGELOG.md
62
65
  bug_tracker_uri: https://github.com/PedroPedrassolli/br_validators/issues
66
+ documentation_uri: https://rubydoc.info/gems/br_validators
63
67
  rubygems_mfa_required: 'true'
64
68
  rdoc_options: []
65
69
  require_paths: