class Datafiniti::Api

Attributes

conn[RW]
data_type[R]
format[RW]
response[RW]
status[RW]
token[RW]

Public Class Methods

new(args={}) click to toggle source
# File lib/datafiniti/api.rb, line 15
def initialize(args={})
  query = args[:query].gsub(/\bhttp\:\/\/\b/, '*')
  @format = "json"
  @conn ||= Faraday.new("https://#{ENV['DATAFINITI_API_KEY']}:@api.datafiniti.co/v2/data")
  @response = solr_query(query)
end

Public Instance Methods

default_to_csv() click to toggle source
# File lib/datafiniti/api.rb, line 30
def default_to_csv
  @format = "csv"
end
default_to_json() click to toggle source
# File lib/datafiniti/api.rb, line 34
def default_to_json
  @format = "json"
end
download(force=false) click to toggle source
# File lib/datafiniti/api.rb, line 42
def download(force=false)
  query = SolrQuery.build(@query)
  force ? @dl_code = get("/v2/data/locations/download?view=location_#{@format}&q=#{query}") : @dl_code ||= get("/v2/data/locations/download?view=location_#{@format}&q=#{query}")
  return download_object
end
method_missing(name, *args, &block) click to toggle source
# File lib/datafiniti/api.rb, line 48
def method_missing(name, *args, &block)
  @response.to_h[name.to_s]
end
preview() click to toggle source
# File lib/datafiniti/api.rb, line 38
def preview
  @response
end
records() click to toggle source
# File lib/datafiniti/api.rb, line 26
def records
  @response.records
end
solr_query(query) click to toggle source
# File lib/datafiniti/api.rb, line 59
def solr_query(query)
  query = build_new_query(query, true)
  @response = get("/v2/data/#{data_type}/preview?view=#{data_type.singularize}_#{format}&q=#{query}")
  update_records
  return @response
end
where(query) click to toggle source
# File lib/datafiniti/api.rb, line 52
def where(query)
  query = build_new_query(query)
  @response = get("/v2/data/#{data_type}/preview?view=#{data_type.singularize}_#{format}&q=#{query}")
  update_records
  return @response
end

Private Instance Methods

build_new_query(query, solr=false) click to toggle source
# File lib/datafiniti/api.rb, line 79
def build_new_query(query, solr=false)
  @query = escape_for_solr(query)
  remove_instance_variable(:@dl_code) unless @dl_code.nil?
  # query = solr ?  query : SolrQuery.build(query)
  return @query
end
download_object() click to toggle source
# File lib/datafiniti/api.rb, line 125
def download_object
  if @dl_code.split(' ').size > 1
    raise RuntimeError, @dl_code
  else
    get("/v2/status/#{@dl_code}")
  end
end
escape_for_solr(string) click to toggle source
# File lib/datafiniti/api.rb, line 86
def escape_for_solr(string)
  return string
  .gsub("!"){"\\!"}
  .gsub("?"){"\\?"}
  .gsub("%"){"\\%"}
  .gsub("+"){"\\+"}
  .gsub("-"){"\\-"}
end
get(uri) click to toggle source
# File lib/datafiniti/api.rb, line 95
def get(uri)
  error_code = {
    401 => Datafiniti::Unauthorized,
    400 => Datafiniti::BadRequest,
    404 => Datafiniti::NotFound,
    405 => Datafiniti::MethodNotAllowed,
    415 => Datafiniti::UnsupportedMediaType,
    500 => Datafiniti::InternalServerError,
    502 => Datafiniti::APIUnavailable,
    503 => Datafiniti::APIUnavailable,
    504 => Datafiniti::APIUnavailable
  }
  api_response = @conn.get(uri)
  if api_response.status >= 400
    case api_response.status
    when 401 then raise Exception.new(Datafiniti::Unauthorized, api_response.status)
    when 400 then raise Exception.new(Datafiniti::BadRequest, api_response.status)
    when 404 then raise Exception.new(Datafiniti::NotFound, api_response.status)
    when 405 then raise Exception.new(Datafiniti::MethodNotAllowed, api_response.status)
    when 415 then raise Exception.new(Datafiniti::UnsupportedMediaType, api_response.status)
    when 500 then raise Exception.new(Datafiniti::InternalServerError, api_response.status)
    when 502 then raise Exception.new(Datafiniti::APIUnavailable, api_response.status)
    when 503 then raise Exception.new(Datafiniti::APIUnavailable, api_response.status)
    when 504 then raise Exception.new(Datafiniti::APIUnavailable api_response.status)
    end
  else
    return DataContainer.new(JSON.parse(api_response.body))
  end
end
update_records() click to toggle source
# File lib/datafiniti/api.rb, line 72
def update_records
  unless @response.is_a? String
    @records = @response.records rescue []
    @total = @response.total rescue 0
  end
end