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 +4 -4
- data/CHANGELOG.md +22 -0
- data/README.md +42 -5
- data/lib/br_validators/active_model.rb +5 -0
- data/lib/br_validators/consulta.rb +2 -1
- data/lib/br_validators/documentos.rb +34 -0
- data/lib/br_validators/version.rb +1 -1
- data/lib/br_validators.rb +3 -28
- data/sig/br_validators.rbs +130 -0
- data/sig/manifest.yaml +3 -0
- metadata +5 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 46a5c5d1d504c919923fbc23bb01ee2f4c82eeccbf752f8130740baa97ae35e6
|
|
4
|
+
data.tar.gz: 8d7dc883a24f170123e0df911397e4981af249941ae48d04d0476ff1d97029c0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
|
3
|
+
[](https://rubygems.org/gems/br_validators)
|
|
4
|
+
[](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.
|
|
158
|
-
|
|
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
|
-
|
|
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
|
data/lib/br_validators.rb
CHANGED
|
@@ -1,33 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
require_relative "br_validators/
|
|
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
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.
|
|
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:
|