lib/geocoder/lookups/pointpin.rb
require 'geocoder/lookups/base' require 'geocoder/results/pointpin' module Geocoder::Lookup class Pointpin < Base def name "Pointpin" end def required_api_key_parts ["key"] end def query_url(query) "#{protocol}://geo.pointp.in/#{configuration.api_key}/json/#{query.sanitized_text}" end private # ---------------------------------------------------------------- def cache_key(query) "#{protocol}://geo.pointp.in/json/#{query.sanitized_text}" end def results(query) # don't look up a loopback or private address, just return the stored result return [] if query.internal_ip_address? doc = fetch_data(query) if doc and doc.is_a?(Hash) if !data_contains_error?(doc) return [doc] elsif doc['error'] case doc['error'] when "Invalid IP address" raise_error(Geocoder::InvalidRequest) || Geocoder.log(:warn, "Invalid Pointpin request.") when "Invalid API key" raise_error(Geocoder::InvalidApiKey) || Geocoder.log(:warn, "Invalid Pointpin API key.") when "Address not found" Geocoder.log(:warn, "Address not found.") end else raise_error(Geocoder::Error) || Geocoder.log(:warn, "Pointpin server error") end end return [] end def data_contains_error?(parsed_data) parsed_data.keys.include?('error') end # TODO: replace this hash with what's actually returned by Pointpin def reserved_result(ip) { "ip" => ip, "city" => "", "region_code" => "", "region_name" => "", "metrocode" => "", "zipcode" => "", "latitude" => "0", "longitude" => "0", "country_name" => "Reserved", "country_code" => "RD" } end end end