You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
923 B

#!/usr/bin/env ruby
require 'uri'
require 'net/http'
require 'json'
class CPIFetcher
DEFAULT_CPI_SERIES_URL = 'http://api.bls.gov/publicAPI/v2/timeseries/data/CUUSA210SA0'.freeze
attr_reader :url, :bls_token
def initialize
@url = URI(ENV['CPI_SERIES_URL'] || DEFAULT_CPI_SERIES_URL)
@bls_token = ENV.fetch('BLS_TOKEN')
end
def cpi
resp = fetch_raw_response
return nil unless resp['Results']['series']
data = resp['Results']['series'].first['data']
data.sort! { |a, b| a['year'] <=> b['year'] }
data.last['value']
end
private
def fetch_raw_response
res = Net::HTTP.start(url.hostname, url.port) do |http|
http.request(build_request)
end
JSON.parse(res.body)
end
def build_request
req = Net::HTTP::Get.new(url)
req['Authorization'] = "token #{bls_token}"
req
end
end
if $PROGRAM_NAME == __FILE__
puts CPIFetcher.new.cpi
exit 0
end