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