From fc818cc9738c8772be0edd900ceb5bb9fbc1f68f Mon Sep 17 00:00:00 2001
From: Alex Reisner <alex@alexreisner.com>
Date: Sat, 5 Mar 2011 15:15:30 -0500
Subject: [PATCH] Add attributes to Geocoder::Result objects.

city, country, country_code, postal_code
---
 lib/geocoder/results/base.rb      |  8 ++++++++
 lib/geocoder/results/freegeoip.rb | 18 +++++++++++++++++-
 lib/geocoder/results/google.rb    | 16 ++++++++++++++++
 lib/geocoder/results/yahoo.rb     | 16 ++++++++++++++++
 test/geocoder_test.rb             |  4 ++++
 5 files changed, 61 insertions(+), 1 deletion(-)

diff --git a/lib/geocoder/results/base.rb b/lib/geocoder/results/base.rb
index 85966828..10844002 100644
--- a/lib/geocoder/results/base.rb
+++ b/lib/geocoder/results/base.rb
@@ -31,6 +31,14 @@ module Geocoder
       def longitude
         coordinates[1]
       end
+
+      def country
+        fail
+      end
+
+      def country_code
+        fail
+      end
     end
   end
 end
diff --git a/lib/geocoder/results/freegeoip.rb b/lib/geocoder/results/freegeoip.rb
index aebdd20e..c1e6e0ab 100644
--- a/lib/geocoder/results/freegeoip.rb
+++ b/lib/geocoder/results/freegeoip.rb
@@ -4,7 +4,23 @@ module Geocoder::Result
   class Freegeoip < Base
 
     def address(format = :full)
-      "#{city}#{', ' + region_code unless region_code == ''} #{zipcode}, #{country_name}"
+      "#{city}#{', ' + region_code unless region_code == ''} #{postal_code}, #{country}"
+    end
+
+    def city
+      @data['city']
+    end
+
+    def country
+      @data['country_name']
+    end
+
+    def country_code
+      @data['country_code']
+    end
+
+    def postal_code
+      @data['zipcode']
     end
 
     def self.response_attributes
diff --git a/lib/geocoder/results/google.rb b/lib/geocoder/results/google.rb
index 01d7b69a..5e7f44ae 100644
--- a/lib/geocoder/results/google.rb
+++ b/lib/geocoder/results/google.rb
@@ -11,6 +11,22 @@ module Geocoder::Result
       formatted_address
     end
 
+    def city
+      address_components_of_type(:locality).first['long_name']
+    end
+
+    def country
+      address_components_of_type(:country).first['long_name']
+    end
+
+    def country_code
+      address_components_of_type(:country).first['short_name']
+    end
+
+    def postal_code
+      address_components_of_type(:postal_code).first['long_name']
+    end
+
     def types
       @data['types']
     end
diff --git a/lib/geocoder/results/yahoo.rb b/lib/geocoder/results/yahoo.rb
index 7af45d55..1c6ae430 100644
--- a/lib/geocoder/results/yahoo.rb
+++ b/lib/geocoder/results/yahoo.rb
@@ -7,6 +7,22 @@ module Geocoder::Result
       (1..4).to_a.map{ |i| @data["line#{i}"] }.reject{ |i| i.nil? or i == "" }.join(", ")
     end
 
+    def city
+      @data['city']
+    end
+
+    def country
+      @data['country']
+    end
+
+    def country_code
+      @data['countrycode']
+    end
+
+    def postal_code
+      @data['postal']
+    end
+
     def self.response_attributes
       %w[quality offsetlat offsetlon radius boundingbox name
         line1 line2 line3 line4 cross house street xstreet unittype unit postal
diff --git a/test/geocoder_test.rb b/test/geocoder_test.rb
index 65dcdecf..1a7dc97c 100644
--- a/test/geocoder_test.rb
+++ b/test/geocoder_test.rb
@@ -134,6 +134,10 @@ class GeocoderTest < Test::Unit::TestCase
     assert result.coordinates.is_a?(Array)
     assert result.latitude.is_a?(Float)
     assert result.longitude.is_a?(Float)
+    assert result.city.is_a?(String)
+    assert result.postal_code.is_a?(String)
+    assert result.country.is_a?(String)
+    assert result.country_code.is_a?(String)
     assert_not_nil result.address
   end
 end
-- 
GitLab