frankfurter/lib/provider/adapters/banrep.rb

50 lines
1.5 KiB
Ruby
Raw Permalink Normal View History

2026-05-21 01:38:14 -06:00
# frozen_string_literal: true
require "json"
require "net/http"
require "provider/adapters/adapter"
class Provider
module Adapters
# Banco de la República Colombia. Publishes the daily TRM (Tasa
# Representativa del Mercado) — the representative market exchange rate
# for the US dollar against the Colombian peso — via the Socrata Open
# Data API on datos.gov.co.
class BANREP < Adapter
BASE_URL = "https://www.datos.gov.co/resource/32sa-8pi3.json"
def fetch(after: nil, upto: nil)
uri = URI(BASE_URL)
uri.query = URI.encode_www_form(
"$where" => "vigenciadesde>='#{after}T00:00:00.000' AND vigenciadesde<='#{upto || Date.today}T00:00:00.000'",
"$limit" => 50_000,
"$order" => "vigenciadesde ASC",
)
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true, open_timeout: 15, read_timeout: 30) do |http|
http.request(Net::HTTP::Get.new(uri))
end
parse(response.body)
end
def parse(json)
records = json.is_a?(String) ? JSON.parse(json) : json
return [] unless records.is_a?(Array)
records.filter_map do |record|
date_str = record["vigenciadesde"]
value_str = record["valor"]
next if date_str.nil? || value_str.nil?
date = Date.parse(date_str)
rate_value = Float(value_str)
next if rate_value.zero?
{ date:, base: "USD", quote: "COP", rate: rate_value }
end
end
end
end
end