From 8f5df18b45773861f69ebecb16658124e19fc088 Mon Sep 17 00:00:00 2001 From: Alex Reisner <alex@alexreisner.com> Date: Tue, 1 Mar 2011 23:57:18 -0500 Subject: [PATCH] Make Result class more abstract. Prepare to add support for Yahoo in addition to Google. --- lib/geocoder.rb | 1 - lib/geocoder/lookups/base.rb | 2 +- lib/geocoder/lookups/google.rb | 29 ++----------------- lib/geocoder/results/base.rb | 28 ++++++++++++++++++ lib/geocoder/{result.rb => results/google.rb} | 18 +++++++----- 5 files changed, 42 insertions(+), 36 deletions(-) create mode 100644 lib/geocoder/results/base.rb rename lib/geocoder/{result.rb => results/google.rb} (74%) diff --git a/lib/geocoder.rb b/lib/geocoder.rb index 7a2303a2..d64d4d88 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 65d0f4db..724ca5c1 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 3889bf1e..5b621adb 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 00000000..4c492aea --- /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 e63f2263..01d7b69a 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 -- GitLab