class Blurb::Request
Public Class Methods
new(url:, request_type:, payload: nil, headers:, url_params: nil)
click to toggle source
# File lib/blurb/request.rb, line 11 def initialize(url:, request_type:, payload: nil, headers:, url_params: nil) @url = setup_url(url, url_params) @payload = convert_payload(payload) @headers = headers @request_type = request_type end
Public Instance Methods
make_request()
click to toggle source
# File lib/blurb/request.rb, line 38 def make_request begin resp = RestClient::Request.execute(request_config()) log("response", resp) rescue RestClient::TooManyRequests => err raise RequestThrottled.new(JSON.parse(err.response.body)) rescue RestClient::TemporaryRedirect => err return RestClient.get(err.response.headers[:location]) # If this happens, then we are downloading a report from the api, so we can simply download the location rescue RestClient::NotAcceptable => err if @url.include?("report") raise InvalidReportRequest.new(JSON.parse(err.response.body)) else raise err end rescue RestClient::ExceptionWithResponse => err if err.response.present? raise FailedRequest.new(JSON.parse(err.response.body)) else raise err end end resp = convert_response(resp) return resp end
request_config()
click to toggle source
# File lib/blurb/request.rb, line 18 def request_config request_config = { method: @request_type, url: @url, headers: @headers } case @request_type when :get request_config[:max_redirects] = 0 when :post, :put request_config[:payload] = @payload if @payload end log("request type", @request_type) log("request url", @url) log("headers", @headers) log("payload", @payload) if @payload return request_config end
Private Instance Methods
camelcase_key(k)
click to toggle source
# File lib/blurb/request.rb, line 93 def camelcase_key(k) return k if k.to_s == k.to_s.upcase k.to_s.camelize(:lower) end
camelcase_keys(value)
click to toggle source
# File lib/blurb/request.rb, line 81 def camelcase_keys(value) case value when Array value.map { |v| camelcase_keys(v) } when Hash Hash[value.map { |k, v| [camelcase_key(k), camelcase_keys(v)] }] else value = value.strftime('%Y%m%d') if [Date, Time, ActiveSupport::TimeWithZone].include?(value.class) value end end
convert_payload(payload)
click to toggle source
# File lib/blurb/request.rb, line 69 def convert_payload(payload) return if payload.nil? payload = camelcase_keys(payload) return payload.to_json end
convert_response(resp)
click to toggle source
# File lib/blurb/request.rb, line 75 def convert_response(resp) resp = JSON.parse(resp) resp = underscore_keys(resp) return resp end
log(header, message)
click to toggle source
# File lib/blurb/request.rb, line 113 def log(header, message) if ENV["BLURB_LOGGING"] puts "\n" puts header.upcase puts message puts "\n" end end
setup_url(url, url_params)
click to toggle source
# File lib/blurb/request.rb, line 64 def setup_url(url, url_params) url += "?#{URI.encode_www_form(camelcase_keys(url_params))}" if url_params return url end
underscore_key(k)
click to toggle source
# File lib/blurb/request.rb, line 109 def underscore_key(k) k.to_s.underscore.to_sym end
underscore_keys(value)
click to toggle source
# File lib/blurb/request.rb, line 98 def underscore_keys(value) case value when Array value.map { |v| underscore_keys(v) } when Hash Hash[value.map { |k, v| [underscore_key(k), underscore_keys(v)] }] else value end end