brasilapi 0.7.0 → 0.9.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/.rubocop.yml +4 -5
- data/.yardopts +5 -0
- data/CHANGELOG.md +97 -0
- data/Gemfile +5 -2
- data/Gemfile.lock +67 -56
- data/README.md +357 -121
- data/Rakefile +18 -1
- data/lib/brasil_api/address.rb +38 -0
- data/lib/brasil_api/b3.rb +49 -0
- data/lib/brasil_api/bank.rb +31 -0
- data/lib/brasil_api/base.rb +214 -20
- data/lib/brasil_api/business_days.rb +44 -0
- data/lib/brasil_api/cambio.rb +47 -0
- data/lib/brasil_api/cid10.rb +46 -0
- data/lib/brasil_api/company.rb +20 -0
- data/lib/brasil_api/configuration.rb +52 -0
- data/lib/brasil_api/cpf.rb +36 -0
- data/lib/brasil_api/cptec.rb +84 -0
- data/lib/brasil_api/cvm.rb +76 -2
- data/lib/brasil_api/ddd.rb +67 -0
- data/lib/brasil_api/error.rb +51 -0
- data/lib/brasil_api/fipe.rb +111 -6
- data/lib/brasil_api/geolocation.rb +35 -0
- data/lib/brasil_api/holiday.rb +25 -2
- data/lib/brasil_api/hospital.rb +157 -0
- data/lib/brasil_api/ibge.rb +164 -0
- data/lib/brasil_api/ibpt.rb +106 -0
- data/lib/brasil_api/igpm.rb +66 -0
- data/lib/brasil_api/isbn.rb +25 -0
- data/lib/brasil_api/ncm.rb +43 -0
- data/lib/brasil_api/pix.rb +19 -0
- data/lib/brasil_api/registrobr.rb +20 -0
- data/lib/brasil_api/solar.rb +33 -0
- data/lib/brasil_api/status.rb +30 -0
- data/lib/brasil_api/taxas.rb +31 -0
- data/lib/brasil_api/tuss.rb +121 -0
- data/lib/brasil_api/version.rb +7 -1
- data/lib/brasil_api.rb +25 -5
- metadata +24 -7
- data/brasilapi.gemspec +0 -42
data/lib/brasil_api/base.rb
CHANGED
|
@@ -2,44 +2,238 @@
|
|
|
2
2
|
|
|
3
3
|
require "json"
|
|
4
4
|
require "net/http"
|
|
5
|
+
require "uri"
|
|
5
6
|
|
|
7
|
+
# Cliente Ruby da {https://brasilapi.com.br BrasilAPI}.
|
|
8
|
+
#
|
|
9
|
+
# @example Bancos participantes do STR
|
|
10
|
+
# BrasilAPI::Bank.all
|
|
11
|
+
# @see https://brasilapi.com.br/docs
|
|
6
12
|
module BrasilAPI
|
|
13
|
+
# Cliente HTTP compartilhado pelas famílias de endpoint.
|
|
14
|
+
#
|
|
15
|
+
# @see https://brasilapi.com.br/docs
|
|
7
16
|
class Base
|
|
17
|
+
# Origem das requisições, sem barra no final.
|
|
8
18
|
BASE_URL = "https://brasilapi.com.br/api"
|
|
19
|
+
|
|
9
20
|
class << self
|
|
21
|
+
# Executa um GET e devolve o JSON interpretado.
|
|
22
|
+
#
|
|
23
|
+
# Chaves +nil+ em +params+ não entram na query.
|
|
24
|
+
#
|
|
25
|
+
# @param path [String] caminho a partir de +/api+, começando com +/+
|
|
26
|
+
# @param params [Hash{Symbol,String=>Object}] query string
|
|
27
|
+
# @return [Hash, Array, nil] corpo JSON, ou +nil+ quando o corpo vem vazio
|
|
28
|
+
# @raise [BrasilAPI::BadRequest] quando a BrasilAPI responde 400
|
|
29
|
+
# @raise [BrasilAPI::NotFound] quando a BrasilAPI responde 404
|
|
30
|
+
# @raise [BrasilAPI::ServerError] quando a BrasilAPI responde 5xx
|
|
31
|
+
# @raise [BrasilAPI::Timeout] quando a requisição estoura o tempo limite
|
|
32
|
+
# @raise [BrasilAPI::Error] em outras respostas de erro
|
|
33
|
+
# @example
|
|
34
|
+
# BrasilAPI::Base.get("/banks/v1")
|
|
10
35
|
def get(path, params = {})
|
|
11
|
-
|
|
12
|
-
uri.query = URI.encode_www_form(params) if params.any?
|
|
13
|
-
|
|
14
|
-
request_data(uri)
|
|
36
|
+
request_data(build_uri(path, params))
|
|
15
37
|
end
|
|
16
38
|
|
|
17
39
|
protected
|
|
18
40
|
|
|
41
|
+
# Formata uma data para +YYYY-MM-DD+.
|
|
42
|
+
#
|
|
43
|
+
# @api private
|
|
44
|
+
# @param value [Date, Time, DateTime, String] data ou texto já formatado
|
|
45
|
+
# @return [String]
|
|
46
|
+
def format_date(value)
|
|
47
|
+
return value.strftime("%Y-%m-%d") if value.respond_to?(:strftime)
|
|
48
|
+
|
|
49
|
+
value
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Traduz chaves da gem para os nomes de query da BrasilAPI.
|
|
53
|
+
#
|
|
54
|
+
# @api private
|
|
55
|
+
# @param filters [Hash{Symbol=>Object}] filtros recebidos pelo método público
|
|
56
|
+
# @param mapping [Hash{Symbol=>Symbol}] chave da gem para chave da API
|
|
57
|
+
# @return [Hash{Symbol=>Object}]
|
|
58
|
+
def translate(filters, mapping)
|
|
59
|
+
filters.to_h { |key, value| [mapping.fetch(key), value] }
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Interpreta a resposta ou converte a falha em erro da gem.
|
|
63
|
+
#
|
|
64
|
+
# @api private
|
|
65
|
+
# @param uri [URI] URL completa
|
|
66
|
+
# @return [Hash, Array, nil]
|
|
67
|
+
# @raise [BrasilAPI::Error]
|
|
68
|
+
# @raise [BrasilAPI::Timeout]
|
|
19
69
|
def request_data(uri)
|
|
20
|
-
response =
|
|
70
|
+
response = perform_request(uri)
|
|
71
|
+
return parsed_body(response) if response.is_a?(Net::HTTPSuccess)
|
|
21
72
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
when 404
|
|
26
|
-
raise BrasilAPI::NotFound
|
|
27
|
-
else
|
|
28
|
-
raise BrasilAPI::Error
|
|
29
|
-
end
|
|
73
|
+
raise_api_error(response)
|
|
74
|
+
rescue Net::OpenTimeout, Net::ReadTimeout => e
|
|
75
|
+
raise BrasilAPI::Timeout, e.message
|
|
30
76
|
end
|
|
31
77
|
|
|
32
|
-
|
|
33
|
-
status = {
|
|
34
|
-
Net::HTTPOK => 200,
|
|
35
|
-
Net::HTTPNotFound => 404
|
|
36
|
-
}
|
|
78
|
+
private
|
|
37
79
|
|
|
38
|
-
|
|
80
|
+
# Monta a URL, omitindo parâmetros +nil+.
|
|
81
|
+
#
|
|
82
|
+
# @api private
|
|
83
|
+
# @param path [String]
|
|
84
|
+
# @param params [Hash]
|
|
85
|
+
# @return [URI]
|
|
86
|
+
def build_uri(path, params)
|
|
87
|
+
uri = URI.parse("#{BASE_URL}#{encode_path(path)}")
|
|
88
|
+
query = params.compact
|
|
89
|
+
uri.query = URI.encode_www_form(query) unless query.empty?
|
|
90
|
+
uri
|
|
39
91
|
end
|
|
40
92
|
|
|
93
|
+
# Escapa cada segmento do caminho.
|
|
94
|
+
#
|
|
95
|
+
# @api private
|
|
96
|
+
# @param path [String]
|
|
97
|
+
# @return [String]
|
|
98
|
+
def encode_path(path)
|
|
99
|
+
path.split("/", -1).map { |segment| encode_segment(segment) }.join("/")
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Codifica um segmento do caminho.
|
|
103
|
+
#
|
|
104
|
+
# Cada segmento é escapado sozinho para que "?", "#" e espaços permaneçam no path.
|
|
105
|
+
# +URI.encode_uri_component+ mantém espaços como +%20+, igual aos cassettes gravados.
|
|
106
|
+
#
|
|
107
|
+
# @api private
|
|
108
|
+
# @param segment [String]
|
|
109
|
+
# @return [String]
|
|
110
|
+
def encode_segment(segment)
|
|
111
|
+
URI.encode_uri_component(segment)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Abre a conexão e envia o GET.
|
|
115
|
+
#
|
|
116
|
+
# @api private
|
|
117
|
+
# @param uri [URI]
|
|
118
|
+
# @return [Net::HTTPResponse]
|
|
119
|
+
def perform_request(uri)
|
|
120
|
+
Net::HTTP.start(
|
|
121
|
+
uri.hostname,
|
|
122
|
+
uri.port,
|
|
123
|
+
use_ssl: uri.scheme == "https",
|
|
124
|
+
open_timeout: BrasilAPI.config.timeout,
|
|
125
|
+
read_timeout: BrasilAPI.config.timeout
|
|
126
|
+
) do |http|
|
|
127
|
+
http.request(Net::HTTP::Get.new(uri))
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Interpreta o corpo de uma resposta de sucesso.
|
|
132
|
+
#
|
|
133
|
+
# @api private
|
|
134
|
+
# @param response [Net::HTTPResponse]
|
|
135
|
+
# @return [Hash, Array, nil]
|
|
41
136
|
def parsed_body(response)
|
|
42
|
-
|
|
137
|
+
body = utf8_body(response)
|
|
138
|
+
return if body.nil? || body.empty?
|
|
139
|
+
|
|
140
|
+
JSON.parse(body)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# Converte uma resposta de erro na exceção correspondente.
|
|
144
|
+
#
|
|
145
|
+
# @api private
|
|
146
|
+
# @param response [Net::HTTPResponse]
|
|
147
|
+
# @return [void]
|
|
148
|
+
# @raise [BrasilAPI::Error]
|
|
149
|
+
def raise_api_error(response)
|
|
150
|
+
parsed = parse_error_body(response)
|
|
151
|
+
raise error_class_for(response).new(
|
|
152
|
+
error_message(parsed, response),
|
|
153
|
+
status: response.code.to_i,
|
|
154
|
+
body: error_body(parsed, response),
|
|
155
|
+
type: error_type(parsed)
|
|
156
|
+
)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Interpreta o corpo de erro, ou +nil+ quando não é JSON.
|
|
160
|
+
#
|
|
161
|
+
# @api private
|
|
162
|
+
# @param response [Net::HTTPResponse]
|
|
163
|
+
# @return [Hash, Array, nil]
|
|
164
|
+
def parse_error_body(response)
|
|
165
|
+
body = utf8_body(response)
|
|
166
|
+
return if body.nil? || body.empty?
|
|
167
|
+
|
|
168
|
+
JSON.parse(body)
|
|
169
|
+
rescue JSON::ParserError
|
|
170
|
+
nil
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# Lê o corpo forçando UTF-8.
|
|
174
|
+
#
|
|
175
|
+
# @api private
|
|
176
|
+
# @param response [Net::HTTPResponse]
|
|
177
|
+
# @return [String, nil]
|
|
178
|
+
def utf8_body(response)
|
|
179
|
+
body = response.body
|
|
180
|
+
return if body.nil?
|
|
181
|
+
|
|
182
|
+
body.dup.force_encoding(Encoding::UTF_8)
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# Escolhe a mensagem exposta pela exceção.
|
|
186
|
+
#
|
|
187
|
+
# @api private
|
|
188
|
+
# @param parsed [Hash, Array, nil]
|
|
189
|
+
# @param response [Net::HTTPResponse]
|
|
190
|
+
# @return [String]
|
|
191
|
+
def error_message(parsed, response)
|
|
192
|
+
return parsed["message"] if parsed.is_a?(Hash) && parsed["message"]
|
|
193
|
+
|
|
194
|
+
body = utf8_body(response)
|
|
195
|
+
return body if body && !body.empty?
|
|
196
|
+
|
|
197
|
+
"HTTP #{response.code}"
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# Escolhe o corpo exposto pela exceção.
|
|
201
|
+
#
|
|
202
|
+
# @api private
|
|
203
|
+
# @param parsed [Hash, Array, nil]
|
|
204
|
+
# @param response [Net::HTTPResponse]
|
|
205
|
+
# @return [Hash, Array, String, nil]
|
|
206
|
+
def error_body(parsed, response)
|
|
207
|
+
return parsed unless parsed.nil?
|
|
208
|
+
|
|
209
|
+
utf8_body(response)
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
# Lê o campo +type+ quando o corpo é um objeto.
|
|
213
|
+
#
|
|
214
|
+
# @api private
|
|
215
|
+
# @param parsed [Hash, Array, nil]
|
|
216
|
+
# @return [String, nil]
|
|
217
|
+
def error_type(parsed)
|
|
218
|
+
parsed["type"] if parsed.is_a?(Hash)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
# Associa o código HTTP à classe de erro.
|
|
222
|
+
#
|
|
223
|
+
# @api private
|
|
224
|
+
# @param response [Net::HTTPResponse]
|
|
225
|
+
# @return [Class]
|
|
226
|
+
def error_class_for(response)
|
|
227
|
+
case response.code.to_i
|
|
228
|
+
when 400
|
|
229
|
+
BrasilAPI::BadRequest
|
|
230
|
+
when 404
|
|
231
|
+
BrasilAPI::NotFound
|
|
232
|
+
when 500..599
|
|
233
|
+
BrasilAPI::ServerError
|
|
234
|
+
else
|
|
235
|
+
BrasilAPI::Error
|
|
236
|
+
end
|
|
43
237
|
end
|
|
44
238
|
end
|
|
45
239
|
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Cliente Ruby da {https://brasilapi.com.br BrasilAPI}.
|
|
4
|
+
#
|
|
5
|
+
# @example Bancos participantes do STR
|
|
6
|
+
# BrasilAPI::Bank.all
|
|
7
|
+
# @see https://brasilapi.com.br/docs
|
|
8
|
+
module BrasilAPI
|
|
9
|
+
# Dias úteis entre duas datas.
|
|
10
|
+
#
|
|
11
|
+
# @see https://brasilapi.com.br/docs#tag/DIAS-UTEIS
|
|
12
|
+
class BusinessDays < Base
|
|
13
|
+
class << self
|
|
14
|
+
# Conta os dias úteis de um intervalo, inclusive as extremidades.
|
|
15
|
+
#
|
|
16
|
+
# +include_national_holidays+ vira +incluirFeriadosNacionais+.
|
|
17
|
+
# +nil+ omite o parâmetro (a API exclui feriados nacionais).
|
|
18
|
+
# +false+ é enviado e faz o intervalo tratar feriados como dias úteis.
|
|
19
|
+
#
|
|
20
|
+
# @param start_date [Date, Time, DateTime, String] data inicial
|
|
21
|
+
# @param end_date [Date, Time, DateTime, String] data final
|
|
22
|
+
# @param include_national_holidays [Boolean, nil] trata feriados como dias úteis quando +false+
|
|
23
|
+
# @return [Hash] quantidade de dias úteis e a lista de datas
|
|
24
|
+
# @raise [BrasilAPI::BadRequest] quando o intervalo é inválido
|
|
25
|
+
# @raise [BrasilAPI::NotFound] quando a BrasilAPI responde 404
|
|
26
|
+
# @raise [BrasilAPI::ServerError] quando a BrasilAPI responde 5xx
|
|
27
|
+
# @raise [BrasilAPI::Timeout] quando a requisição estoura o tempo limite
|
|
28
|
+
# @raise [BrasilAPI::Error] em outras respostas de erro
|
|
29
|
+
# @example Primeira quinzena de janeiro de 2024, sem o feriado do dia 1º
|
|
30
|
+
# BrasilAPI::BusinessDays.between("2024-01-01", "2024-01-10")
|
|
31
|
+
# @see https://brasilapi.com.br/docs#tag/DIAS-UTEIS
|
|
32
|
+
def between(start_date, end_date, include_national_holidays: nil)
|
|
33
|
+
get(
|
|
34
|
+
"/diasuteis/v1",
|
|
35
|
+
{
|
|
36
|
+
dataInicial: format_date(start_date),
|
|
37
|
+
dataFinal: format_date(end_date),
|
|
38
|
+
incluirFeriadosNacionais: include_national_holidays
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Cliente Ruby da {https://brasilapi.com.br BrasilAPI}.
|
|
4
|
+
#
|
|
5
|
+
# @example Bancos participantes do STR
|
|
6
|
+
# BrasilAPI::Bank.all
|
|
7
|
+
# @see https://brasilapi.com.br/docs
|
|
8
|
+
module BrasilAPI
|
|
9
|
+
# Cotações de moedas em relação ao real.
|
|
10
|
+
#
|
|
11
|
+
# @see https://brasilapi.com.br/docs#tag/CAMBIO
|
|
12
|
+
class Cambio < Base
|
|
13
|
+
class << self
|
|
14
|
+
# Lista as moedas com cotação disponível.
|
|
15
|
+
#
|
|
16
|
+
# @return [Array<Hash>] símbolo e nome de cada moeda
|
|
17
|
+
# @raise [BrasilAPI::BadRequest] quando a BrasilAPI responde 400
|
|
18
|
+
# @raise [BrasilAPI::NotFound] quando a BrasilAPI responde 404
|
|
19
|
+
# @raise [BrasilAPI::ServerError] quando a BrasilAPI responde 5xx
|
|
20
|
+
# @raise [BrasilAPI::Timeout] quando a requisição estoura o tempo limite
|
|
21
|
+
# @raise [BrasilAPI::Error] em outras respostas de erro
|
|
22
|
+
# @example
|
|
23
|
+
# BrasilAPI::Cambio.currencies
|
|
24
|
+
# @see https://brasilapi.com.br/docs#tag/CAMBIO
|
|
25
|
+
def currencies
|
|
26
|
+
get("/cambio/v1/moedas")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Consulta a cotação PTAX de uma moeda em uma data.
|
|
30
|
+
#
|
|
31
|
+
# @param currency [String] código ISO, por exemplo +"USD"+
|
|
32
|
+
# @param date [Date, Time, DateTime, String] data da cotação
|
|
33
|
+
# @return [Hash] compra, venda e data da cotação
|
|
34
|
+
# @raise [BrasilAPI::BadRequest] quando a moeda ou a data é inválida
|
|
35
|
+
# @raise [BrasilAPI::NotFound] quando não há cotação na data
|
|
36
|
+
# @raise [BrasilAPI::ServerError] quando a BrasilAPI responde 5xx
|
|
37
|
+
# @raise [BrasilAPI::Timeout] quando a requisição estoura o tempo limite
|
|
38
|
+
# @raise [BrasilAPI::Error] em outras respostas de erro
|
|
39
|
+
# @example Dólar em 15 de janeiro de 2024
|
|
40
|
+
# BrasilAPI::Cambio.quote("USD", "2024-01-15")
|
|
41
|
+
# @see https://brasilapi.com.br/docs#tag/CAMBIO
|
|
42
|
+
def quote(currency, date)
|
|
43
|
+
get("/cambio/v1/cotacao/#{currency}/#{format_date(date)}")
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Cliente Ruby da {https://brasilapi.com.br BrasilAPI}.
|
|
4
|
+
#
|
|
5
|
+
# @example Bancos participantes do STR
|
|
6
|
+
# BrasilAPI::Bank.all
|
|
7
|
+
# @see https://brasilapi.com.br/docs
|
|
8
|
+
module BrasilAPI
|
|
9
|
+
# Classificação Internacional de Doenças, 10ª revisão.
|
|
10
|
+
#
|
|
11
|
+
# @see https://brasilapi.com.br/docs#tag/CID10
|
|
12
|
+
class CID10 < Base
|
|
13
|
+
class << self
|
|
14
|
+
# Lista os capítulos, grupos e categorias do CID-10.
|
|
15
|
+
#
|
|
16
|
+
# @return [Array<Hash>] código e descrição de cada item
|
|
17
|
+
# @raise [BrasilAPI::BadRequest] quando a BrasilAPI responde 400
|
|
18
|
+
# @raise [BrasilAPI::NotFound] quando a BrasilAPI responde 404
|
|
19
|
+
# @raise [BrasilAPI::ServerError] quando a BrasilAPI responde 5xx
|
|
20
|
+
# @raise [BrasilAPI::Timeout] quando a requisição estoura o tempo limite
|
|
21
|
+
# @raise [BrasilAPI::Error] em outras respostas de erro
|
|
22
|
+
# @example
|
|
23
|
+
# BrasilAPI::CID10.all
|
|
24
|
+
# @see https://brasilapi.com.br/docs#tag/CID10
|
|
25
|
+
def all
|
|
26
|
+
get("/oms/cid10/v1")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Busca uma categoria do CID-10 pelo código.
|
|
30
|
+
#
|
|
31
|
+
# @param code [String] código CID, por exemplo +"A00"+
|
|
32
|
+
# @return [Hash] descrição da categoria
|
|
33
|
+
# @raise [BrasilAPI::BadRequest] quando a BrasilAPI responde 400
|
|
34
|
+
# @raise [BrasilAPI::NotFound] quando o código não existe
|
|
35
|
+
# @raise [BrasilAPI::ServerError] quando a BrasilAPI responde 5xx
|
|
36
|
+
# @raise [BrasilAPI::Timeout] quando a requisição estoura o tempo limite
|
|
37
|
+
# @raise [BrasilAPI::Error] em outras respostas de erro
|
|
38
|
+
# @example Cólera
|
|
39
|
+
# BrasilAPI::CID10.find_by_code("A00")
|
|
40
|
+
# @see https://brasilapi.com.br/docs#tag/CID10
|
|
41
|
+
def find_by_code(code)
|
|
42
|
+
get("/oms/cid10/v1/#{code}")
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
data/lib/brasil_api/company.rb
CHANGED
|
@@ -1,8 +1,28 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# Cliente Ruby da {https://brasilapi.com.br BrasilAPI}.
|
|
4
|
+
#
|
|
5
|
+
# @example Bancos participantes do STR
|
|
6
|
+
# BrasilAPI::Bank.all
|
|
7
|
+
# @see https://brasilapi.com.br/docs
|
|
3
8
|
module BrasilAPI
|
|
9
|
+
# Cadastro de pessoa jurídica na Receita Federal.
|
|
10
|
+
#
|
|
11
|
+
# @see https://brasilapi.com.br/docs#tag/CNPJ
|
|
4
12
|
class Company < Base
|
|
5
13
|
class << self
|
|
14
|
+
# Busca uma empresa pelo CNPJ.
|
|
15
|
+
#
|
|
16
|
+
# @param documentation [String] CNPJ, com ou sem máscara
|
|
17
|
+
# @return [Hash] razão social, situação cadastral e endereço
|
|
18
|
+
# @raise [BrasilAPI::BadRequest] quando o CNPJ é inválido
|
|
19
|
+
# @raise [BrasilAPI::NotFound] quando o CNPJ não existe
|
|
20
|
+
# @raise [BrasilAPI::ServerError] quando a BrasilAPI responde 5xx
|
|
21
|
+
# @raise [BrasilAPI::Timeout] quando a requisição estoura o tempo limite
|
|
22
|
+
# @raise [BrasilAPI::Error] em outras respostas de erro
|
|
23
|
+
# @example
|
|
24
|
+
# BrasilAPI::Company.find_by_cnpj("19131243000197")
|
|
25
|
+
# @see https://brasilapi.com.br/docs#tag/CNPJ
|
|
6
26
|
def find_by_cnpj(documentation)
|
|
7
27
|
get("/cnpj/v1/#{documentation}")
|
|
8
28
|
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Cliente Ruby da {https://brasilapi.com.br BrasilAPI}.
|
|
4
|
+
#
|
|
5
|
+
# @example Bancos participantes do STR
|
|
6
|
+
# BrasilAPI::Bank.all
|
|
7
|
+
# @see https://brasilapi.com.br/docs
|
|
8
|
+
module BrasilAPI
|
|
9
|
+
# Tempo limite das requisições HTTP.
|
|
10
|
+
class Configuration
|
|
11
|
+
# Tempo limite padrão, em segundos.
|
|
12
|
+
DEFAULT_TIMEOUT = 10
|
|
13
|
+
|
|
14
|
+
# Tempo limite de abertura e de leitura, em segundos.
|
|
15
|
+
#
|
|
16
|
+
# @return [Numeric]
|
|
17
|
+
attr_accessor :timeout
|
|
18
|
+
|
|
19
|
+
# Aplica {DEFAULT_TIMEOUT}.
|
|
20
|
+
def initialize
|
|
21
|
+
@timeout = DEFAULT_TIMEOUT
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
class << self
|
|
26
|
+
# Altera a configuração do cliente.
|
|
27
|
+
#
|
|
28
|
+
# @yieldparam config [BrasilAPI::Configuration] configuração atual
|
|
29
|
+
# @return [void]
|
|
30
|
+
# @example Trinta segundos de timeout
|
|
31
|
+
# BrasilAPI.configure { |config| config.timeout = 30 }
|
|
32
|
+
def configure
|
|
33
|
+
yield config
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Configuração usada pelas requisições.
|
|
37
|
+
#
|
|
38
|
+
# @return [BrasilAPI::Configuration]
|
|
39
|
+
def config
|
|
40
|
+
@config ||= Configuration.new
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Volta o tempo limite para o padrão.
|
|
44
|
+
#
|
|
45
|
+
# @return [BrasilAPI::Configuration]
|
|
46
|
+
# @example
|
|
47
|
+
# BrasilAPI.reset_config!
|
|
48
|
+
def reset_config!
|
|
49
|
+
@config = Configuration.new
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Cliente Ruby da {https://brasilapi.com.br BrasilAPI}.
|
|
4
|
+
#
|
|
5
|
+
# @example Bancos participantes do STR
|
|
6
|
+
# BrasilAPI::Bank.all
|
|
7
|
+
# @see https://brasilapi.com.br/docs
|
|
8
|
+
module BrasilAPI
|
|
9
|
+
# Validação de CPF.
|
|
10
|
+
#
|
|
11
|
+
# A resposta não traz nome nem dados pessoais: apenas se o número é válido
|
|
12
|
+
# e a região fiscal associada.
|
|
13
|
+
#
|
|
14
|
+
# @see https://brasilapi.com.br/docs#tag/CPF
|
|
15
|
+
class CPF < Base
|
|
16
|
+
class << self
|
|
17
|
+
# Verifica se um CPF tem dígitos válidos.
|
|
18
|
+
#
|
|
19
|
+
# A BrasilAPI descarta pontuação antes de validar.
|
|
20
|
+
#
|
|
21
|
+
# @param cpf [String] CPF, com ou sem máscara
|
|
22
|
+
# @return [Hash] +isValid+, região fiscal (+rf+) e UFs (+ufs+)
|
|
23
|
+
# @raise [BrasilAPI::BadRequest] quando o valor não tem 11 dígitos
|
|
24
|
+
# @raise [BrasilAPI::NotFound] quando a BrasilAPI responde 404
|
|
25
|
+
# @raise [BrasilAPI::ServerError] quando a BrasilAPI responde 5xx
|
|
26
|
+
# @raise [BrasilAPI::Timeout] quando a requisição estoura o tempo limite
|
|
27
|
+
# @raise [BrasilAPI::Error] em outras respostas de erro
|
|
28
|
+
# @example CPF com máscara
|
|
29
|
+
# BrasilAPI::CPF.find("000.000.000-00")
|
|
30
|
+
# @see https://brasilapi.com.br/docs#tag/CPF
|
|
31
|
+
def find(cpf)
|
|
32
|
+
get("/cpf/v1/#{cpf}")
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
data/lib/brasil_api/cptec.rb
CHANGED
|
@@ -1,24 +1,93 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
# Cliente Ruby da {https://brasilapi.com.br BrasilAPI}.
|
|
4
|
+
#
|
|
5
|
+
# @example Bancos participantes do STR
|
|
6
|
+
# BrasilAPI::Bank.all
|
|
7
|
+
# @see https://brasilapi.com.br/docs
|
|
3
8
|
module BrasilAPI
|
|
9
|
+
# Previsão do tempo e de ondas do CPTEC/INPE.
|
|
10
|
+
#
|
|
11
|
+
# @see https://brasilapi.com.br/docs#tag/CPTEC
|
|
4
12
|
class CPTEC < Base
|
|
5
13
|
class << self
|
|
14
|
+
# Lista as cidades atendidas pelo CPTEC.
|
|
15
|
+
#
|
|
16
|
+
# @return [Array<Hash>] nome e código de cada cidade
|
|
17
|
+
# @raise [BrasilAPI::BadRequest] quando a BrasilAPI responde 400
|
|
18
|
+
# @raise [BrasilAPI::NotFound] quando a BrasilAPI responde 404
|
|
19
|
+
# @raise [BrasilAPI::ServerError] quando a BrasilAPI responde 5xx
|
|
20
|
+
# @raise [BrasilAPI::Timeout] quando a requisição estoura o tempo limite
|
|
21
|
+
# @raise [BrasilAPI::Error] em outras respostas de erro
|
|
22
|
+
# @example
|
|
23
|
+
# BrasilAPI::CPTEC.all
|
|
24
|
+
# @see https://brasilapi.com.br/docs#tag/CPTEC
|
|
6
25
|
def all
|
|
7
26
|
get("/cptec/v1/cidade")
|
|
8
27
|
end
|
|
9
28
|
|
|
29
|
+
# Procura cidades pelo nome.
|
|
30
|
+
#
|
|
31
|
+
# @param city_name [String] parte do nome da cidade
|
|
32
|
+
# @return [Array<Hash>] cidades encontradas e seus códigos
|
|
33
|
+
# @raise [BrasilAPI::BadRequest] quando a BrasilAPI responde 400
|
|
34
|
+
# @raise [BrasilAPI::NotFound] quando nenhuma cidade corresponde
|
|
35
|
+
# @raise [BrasilAPI::ServerError] quando a BrasilAPI responde 5xx
|
|
36
|
+
# @raise [BrasilAPI::Timeout] quando a requisição estoura o tempo limite
|
|
37
|
+
# @raise [BrasilAPI::Error] em outras respostas de erro
|
|
38
|
+
# @example
|
|
39
|
+
# BrasilAPI::CPTEC.search_location("Teresina")
|
|
40
|
+
# @see https://brasilapi.com.br/docs#tag/CPTEC
|
|
10
41
|
def search_location(city_name)
|
|
11
42
|
get("/cptec/v1/cidade/#{city_name}")
|
|
12
43
|
end
|
|
13
44
|
|
|
45
|
+
# Previsão do tempo nas capitais.
|
|
46
|
+
#
|
|
47
|
+
# @return [Array<Hash>] condição atual de cada capital
|
|
48
|
+
# @raise [BrasilAPI::BadRequest] quando a BrasilAPI responde 400
|
|
49
|
+
# @raise [BrasilAPI::NotFound] quando a BrasilAPI responde 404
|
|
50
|
+
# @raise [BrasilAPI::ServerError] quando a fonte do CPTEC está indisponível
|
|
51
|
+
# @raise [BrasilAPI::Timeout] quando a requisição estoura o tempo limite
|
|
52
|
+
# @raise [BrasilAPI::Error] em outras respostas de erro
|
|
53
|
+
# @example
|
|
54
|
+
# BrasilAPI::CPTEC.capital_weather
|
|
55
|
+
# @see https://brasilapi.com.br/docs#tag/CPTEC
|
|
14
56
|
def capital_weather
|
|
15
57
|
get("/cptec/v1/clima/capital")
|
|
16
58
|
end
|
|
17
59
|
|
|
60
|
+
# Condição meteorológica de um aeroporto.
|
|
61
|
+
#
|
|
62
|
+
# @param code [String] código ICAO, por exemplo +"SBGR"+
|
|
63
|
+
# @return [Hash] condição do aeroporto
|
|
64
|
+
# @raise [BrasilAPI::BadRequest] quando a BrasilAPI responde 400
|
|
65
|
+
# @raise [BrasilAPI::NotFound] quando o código ICAO não existe
|
|
66
|
+
# @raise [BrasilAPI::ServerError] quando a fonte do CPTEC está indisponível
|
|
67
|
+
# @raise [BrasilAPI::Timeout] quando a requisição estoura o tempo limite
|
|
68
|
+
# @raise [BrasilAPI::Error] em outras respostas de erro
|
|
69
|
+
# @example Aeroporto de Guarulhos
|
|
70
|
+
# BrasilAPI::CPTEC.airport_weather("SBGR")
|
|
71
|
+
# @see https://brasilapi.com.br/docs#tag/CPTEC
|
|
18
72
|
def airport_weather(code)
|
|
19
73
|
get("/cptec/v1/clima/aeroporto/#{code}")
|
|
20
74
|
end
|
|
21
75
|
|
|
76
|
+
# Previsão do tempo de uma cidade do CPTEC.
|
|
77
|
+
#
|
|
78
|
+
# Sem +days+, a previsão é de um dia. A BrasilAPI aceita até 6 dias.
|
|
79
|
+
#
|
|
80
|
+
# @param city_code [String, Integer] código da cidade no CPTEC
|
|
81
|
+
# @param days [Integer, nil] quantidade de dias, de 1 a 6
|
|
82
|
+
# @return [Hash] previsão da cidade
|
|
83
|
+
# @raise [BrasilAPI::BadRequest] quando a BrasilAPI responde 400
|
|
84
|
+
# @raise [BrasilAPI::NotFound] quando a cidade não existe
|
|
85
|
+
# @raise [BrasilAPI::ServerError] quando a BrasilAPI responde 5xx
|
|
86
|
+
# @raise [BrasilAPI::Timeout] quando a requisição estoura o tempo limite
|
|
87
|
+
# @raise [BrasilAPI::Error] em outras respostas de erro
|
|
88
|
+
# @example Previsão de três dias
|
|
89
|
+
# BrasilAPI::CPTEC.city_weather(244, 3)
|
|
90
|
+
# @see https://brasilapi.com.br/docs#tag/CPTEC
|
|
22
91
|
def city_weather(city_code, days = nil)
|
|
23
92
|
if days
|
|
24
93
|
get("/cptec/v1/clima/previsao/#{city_code}/#{days}")
|
|
@@ -27,6 +96,21 @@ module BrasilAPI
|
|
|
27
96
|
end
|
|
28
97
|
end
|
|
29
98
|
|
|
99
|
+
# Previsão de ondas no litoral de uma cidade.
|
|
100
|
+
#
|
|
101
|
+
# Sem +days+, a previsão é de um dia. A BrasilAPI aceita até 6 dias.
|
|
102
|
+
#
|
|
103
|
+
# @param city_code [String, Integer] código da cidade no CPTEC
|
|
104
|
+
# @param days [Integer, nil] quantidade de dias, de 1 a 6
|
|
105
|
+
# @return [Hash] previsão de ondas
|
|
106
|
+
# @raise [BrasilAPI::BadRequest] quando a BrasilAPI responde 400
|
|
107
|
+
# @raise [BrasilAPI::NotFound] quando a cidade não tem previsão de ondas
|
|
108
|
+
# @raise [BrasilAPI::ServerError] quando a BrasilAPI responde 5xx
|
|
109
|
+
# @raise [BrasilAPI::Timeout] quando a requisição estoura o tempo limite
|
|
110
|
+
# @raise [BrasilAPI::Error] em outras respostas de erro
|
|
111
|
+
# @example
|
|
112
|
+
# BrasilAPI::CPTEC.ocean_forecast(241, 2)
|
|
113
|
+
# @see https://brasilapi.com.br/docs#tag/CPTEC
|
|
30
114
|
def ocean_forecast(city_code, days = nil)
|
|
31
115
|
if days
|
|
32
116
|
get("/cptec/v1/ondas/#{city_code}/#{days}")
|