|
|
|
@ -12,6 +12,7 @@ class CPIFetcher
|
|
|
|
|
)
|
|
|
|
|
private_constant :DEFAULT_CPI_SERIES_URL
|
|
|
|
|
attr_reader :url, :bls_token
|
|
|
|
|
private :url, :bls_token
|
|
|
|
|
|
|
|
|
|
def initialize
|
|
|
|
|
@url = URI(ENV['CPI_SERIES_URL'] || DEFAULT_CPI_SERIES_URL)
|
|
|
|
@ -20,28 +21,27 @@ class CPIFetcher
|
|
|
|
|
|
|
|
|
|
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']
|
|
|
|
|
last_cpi_value(resp['Results']['series'].first['data'])
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
private def last_cpi_value(data)
|
|
|
|
|
data
|
|
|
|
|
.sort { |a, b| a['year'] <=> b['year'] }
|
|
|
|
|
.then { |d| d.last['value'] }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def fetch_raw_response
|
|
|
|
|
http = Net::HTTP.new(url.hostname, url.port)
|
|
|
|
|
http.use_ssl = true
|
|
|
|
|
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
|
|
|
|
res = http.request(build_request)
|
|
|
|
|
JSON.parse(res.body)
|
|
|
|
|
private def fetch_raw_response
|
|
|
|
|
Net::HTTP.new(url.hostname, url.port)
|
|
|
|
|
.tap { |h| h.use_ssl = true }
|
|
|
|
|
.tap { |h| h.verify_mode = OpenSSL::SSL::VERIFY_PEER }
|
|
|
|
|
.then { |h| JSON.parse(h.request(build_request).body) }
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def build_request
|
|
|
|
|
req = Net::HTTP::Get.new(url)
|
|
|
|
|
req['Authorization'] = "token #{bls_token}"
|
|
|
|
|
req
|
|
|
|
|
private def build_request
|
|
|
|
|
Net::HTTP::Get.new(url)
|
|
|
|
|
.tap { |r| r['Authorization'] = "token #{bls_token}" }
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|