#!/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