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.
@@ -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
- uri = URI("#{BASE_URL}#{path}")
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 = Net::HTTP.get_response(uri)
70
+ response = perform_request(uri)
71
+ return parsed_body(response) if response.is_a?(Net::HTTPSuccess)
21
72
 
22
- case status_for(response)
23
- when 200
24
- parsed_body(response)
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
- def status_for(response)
33
- status = {
34
- Net::HTTPOK => 200,
35
- Net::HTTPNotFound => 404
36
- }
78
+ private
37
79
 
38
- status[response.class]
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
- JSON.parse(response.body) if response.body
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
@@ -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
@@ -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}")