diff --git a/lib/geocoder.rb b/lib/geocoder.rb index 7a2303a2623a0e2e10b721e215c2a8acfe4e9099..d64d4d880086c4a9ae4726047583a2a9726d122f 100644 --- a/lib/geocoder.rb +++ b/lib/geocoder.rb @@ -1,6 +1,5 @@ require "geocoder/configuration" require "geocoder/calculations" -require "geocoder/result" require "geocoder/active_record" require "geocoder/railtie" diff --git a/lib/geocoder/lookups/base.rb b/lib/geocoder/lookups/base.rb index 65d0f4dbc0332fdb20c435a7339c8f90f9cbeb3a..724ca5c1558e4a405b45bce68d5d686436e34ebd 100644 --- a/lib/geocoder/lookups/base.rb +++ b/lib/geocoder/lookups/base.rb @@ -43,7 +43,7 @@ module Geocoder # Class of the result objects # def result_class - fail + eval("Geocoder::Result::#{self.class.to_s.split(":").last}") end ## diff --git a/lib/geocoder/lookups/google.rb b/lib/geocoder/lookups/google.rb index 3889bf1e503524db7784dc13c74a0bd2a1485c66..5b621adbb92e8fd77c06b8caad3c2d0f04cecb95 100644 --- a/lib/geocoder/lookups/google.rb +++ b/lib/geocoder/lookups/google.rb @@ -1,42 +1,19 @@ require 'geocoder/lookups/base' +require "geocoder/results/google" module Geocoder::Lookup class Google < Base - def coordinates(address) - if (results = search(address)).size > 0 - place = results.first.geometry['location'] - ['lat', 'lng'].map{ |i| place[i] } - end - end - - def address(latitude, longitude) - if (results = search(latitude, longitude)).size > 0 - results.first.formatted_address - end - end - - def search(*args) - return [] if args[0].blank? - doc = parsed_response(args.join(","), args.size == 2) - [].tap do |results| - if doc - doc['results'].each{ |r| results << Geocoder::Result.new(r) } - end - end - end - - private # --------------------------------------------------------------- ## # Returns a parsed Google geocoder search result (hash). # Returns nil if non-200 HTTP response, timeout, or other error. # - def parsed_response(query, reverse = false) + def results(query, reverse = false) doc = fetch_data(query, reverse) case doc['status']; when "OK" - doc + doc['results'] when "OVER_QUERY_LIMIT" warn "Google Geocoding API error: over query limit." when "REQUEST_DENIED" diff --git a/lib/geocoder/results/base.rb b/lib/geocoder/results/base.rb new file mode 100644 index 0000000000000000000000000000000000000000..4c492aeafe13c00d4b21a7ee62f4eb42301bc6bd --- /dev/null +++ b/lib/geocoder/results/base.rb @@ -0,0 +1,28 @@ +module Geocoder + module Result + class Base + attr_accessor :data + + ## + # Takes a hash of result data from a parsed Google result document. + # + def initialize(data) + @data = data + end + + ## + # A two-element array: [lat, lon]. + # + def coordinates + fail + end + + ## + # A string in the given format. + # + def address(format = :full) + fail + end + end + end +end diff --git a/lib/geocoder/result.rb b/lib/geocoder/results/google.rb similarity index 74% rename from lib/geocoder/result.rb rename to lib/geocoder/results/google.rb index e63f2263dda3a3706ad622f6926497a6744dc076..01d7b69a56a684589cc05ec8184a9188244de03c 100644 --- a/lib/geocoder/result.rb +++ b/lib/geocoder/results/google.rb @@ -1,12 +1,14 @@ -module Geocoder - class Result - attr_accessor :data +require 'geocoder/results/base' - ## - # Takes a hash of result data from a parsed Google result document. - # - def initialize(data) - @data = data +module Geocoder::Result + class Google < Base + + def coordinates + ['lat', 'lng'].map{ |i| geometry['location'][i] } + end + + def address(format = :full) + formatted_address end def types