class Factual::API
Constants
- API_V3_HOST
- DRIVER_VERSION_TAG
- PARAM_ALIASES
- VERSION
Public Class Methods
new(access_token, debug_mode = false, host = nil, timeout = nil)
click to toggle source
# File lib/factual/api.rb, line 8 def initialize(access_token, debug_mode = false, host = nil, timeout = nil) @access_token = access_token @debug_mode = debug_mode @timeout = timeout @host = host || API_V3_HOST @headers = {} end
Public Instance Methods
apply_header(key, value)
click to toggle source
# File lib/factual/api.rb, line 16 def apply_header(key, value) @headers[key] = value if value end
diffs(view_id, params = {})
click to toggle source
# File lib/factual/api.rb, line 53 def diffs(view_id, params = {}) start_date = (params[:start] || params["start"] || 0).to_i * 1000 end_date = (params[:end] || params["end"] || Time.now).to_i * 1000 path = "/t/#{view_id}/diffs?start=#{start_date}&end=#{end_date}" url = "http://#{@host}#{path}" resp = make_request(url) resp.body.split("\n").collect do |rowJson| row = JSON.parse(rowJson) end end
full_path(action, path, params)
click to toggle source
# File lib/factual/api.rb, line 66 def full_path(action, path, params) fp = "/#{path}" fp += "/#{action}" unless action == :read qs = query_string(params) fp += "?#{qs}" unless qs.empty? fp end
get(query, other_params = {})
click to toggle source
# File lib/factual/api.rb, line 20 def get(query, other_params = {}) merged_params = query.params.merge(other_params) handle_request(query.action || :read, query.path, merged_params) end
post(request)
click to toggle source
# File lib/factual/api.rb, line 25 def post(request) handle_request(nil, request.path, request.body, :post) end
raw_get(path, query)
click to toggle source
# File lib/factual/api.rb, line 33 def raw_get(path, query) path = '/' + path unless path =~ /^\// url = "http://#{@host}#{path}" qs = query_string(query) url += "?#{qs}" unless qs.empty? resp = make_request(url) payload = JSON.parse(resp.body) handle_payload(payload) end
raw_post(path, body)
click to toggle source
# File lib/factual/api.rb, line 45 def raw_post(path, body) path = '/' + path unless path =~ /^\// url = "http://#{@host}#{path}" resp = make_request(url, query_string(body), :post) payload = JSON.parse(resp.body) handle_payload(payload) end
schema(query)
click to toggle source
# File lib/factual/api.rb, line 29 def schema(query) handle_request(:schema, query.path, query.params)["view"] end
Private Instance Methods
debug(url, method, headers, body, res, elapsed_time)
click to toggle source
# File lib/factual/api.rb, line 138 def debug(url, method, headers, body, res, elapsed_time) res_headers = res.to_hash.inject({}) do |h, kv| k, v = kv h[k] = v.join(',') h end puts "--- Driver version: #{DRIVER_VERSION_TAG}" puts "--- request debug ---" puts "req url: #{url}" puts "req method: #{method.to_s.upcase}" puts "req headers: #{JSON.pretty_generate(headers)}" puts "req body: #{body}" if body puts "---------------------" puts "--- response debug ---" puts "resp status code: #{res.code}" puts "resp status message: #{res.message}" puts "resp headers: #{JSON.pretty_generate(res_headers)}" puts "resp body: #{res.body}" puts "---------------------" puts "Elapsed time: #{elapsed_time} msecs" puts end
handle_payload(payload)
click to toggle source
# File lib/factual/api.rb, line 99 def handle_payload(payload) raise StandardError.new(payload.to_json) unless payload["status"] == "ok" payload["response"] || payload["status"] end
handle_request(action, path, params, method=:get)
click to toggle source
# File lib/factual/api.rb, line 78 def handle_request(action, path, params, method=:get) if (method == :get) url = "http://#{@host}" + full_path(action, path, params) req = make_request(url) else url = "http://#{@host}#{path}" req = make_request(url, params, :post) end payload = JSON.parse(req.body) if (path == '/multi') payload.inject({}) do |res, item| name, p = item res[name] = handle_payload(p) res end else handle_payload(payload) end end
make_request(url, body=nil, method=:get)
click to toggle source
# File lib/factual/api.rb, line 104 def make_request(url, body=nil, method=:get) start_time = Time.now headers = { "X-Factual-Lib" => DRIVER_VERSION_TAG } headers.merge!(@headers) res = if (method == :get) Timeout::timeout(@timeout){ @access_token.get(url, headers) } elsif (method == :post) Timeout::timeout(@timeout){ @access_token.post(url, body, headers) } else raise StandardError.new("Unknown http method") end elapsed_time = (Time.now - start_time) * 1000 debug(url, method, headers, body, res, elapsed_time) if @debug_mode if res.code == '301' && res['location'] res = make_request(res['location']) end res end
query_string(params)
click to toggle source
# File lib/factual/api.rb, line 128 def query_string(params) query_array = params.keys.inject([]) do |array, key| param_alias = PARAM_ALIASES[key.to_sym] || key.to_sym value = params[key].class == Hash ? params[key].to_json : params[key].to_s array << "#{param_alias}=#{CGI.escape(value)}" end query_array.join("&") end