geokit 1.2.6 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,9 @@
1
+ === 1.3.0 / 2009-04-11
2
+ * Added capability to define multiple API keys for different domains that may be pointing to the same application (thanks Glenn Powell)
3
+ * Added numeric accuracy accessor for Yahoo and Google geocoders (thanks Andrew Fecheyr Lippens)
4
+ * Implement #hash and #eql? on LatLng to allow for using it as a hash key (thanks Luke Melia and Ross Kaffenberger)
5
+ *
6
+
1
7
  === 1.2.6 / 2009-03-19
2
8
  * misc minor fixes
3
9
 
data/README.markdown CHANGED
@@ -74,6 +74,12 @@ If you're using this gem by itself, here are the configuration options:
74
74
  # See http://www.google.com/apis/maps/signup.html
75
75
  # and http://www.google.com/apis/maps/documentation/#Geocoding_Examples
76
76
  Geokit::Geocoders::google = 'REPLACE_WITH_YOUR_GOOGLE_KEY'
77
+
78
+ # You can also set multiple API KEYS for different domains that may be directed to this same application.
79
+ # The domain from which the current user is being directed will automatically be updated for Geokit via
80
+ # the GeocoderControl class, which gets it's begin filter mixed into the ActionController.
81
+ # You define these keys with a Hash as follows:
82
+ #Geokit::Geocoders::google = { 'rubyonrails.org' => 'RUBY_ON_RAILS_API_KEY', 'ruby-docs.org' => 'RUBY_DOCS_API_KEY' }
77
83
 
78
84
  # This is your username and password for geocoder.us.
79
85
  # To use the free service, the value can be set to nil or false. For
data/geokit.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{geokit}
5
- s.version = "1.2.6"
5
+ s.version = "1.3.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Andre Lewis and Bill Eisenhauer"]
9
- s.date = %q{2009-02-09}
9
+ s.date = %q{2009-4-11}
10
10
  s.description = %q{Geokit Gem}
11
11
  s.email = ["andre@earthcode.com / bill_eisenhauer@yahoo.com"]
12
12
  s.extra_rdoc_files = ["Manifest.txt", "README.markdown"]
data/lib/geokit.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Geokit
2
- VERSION = '1.2.6'
2
+ VERSION = '1.3.0'
3
3
  # These defaults are used in Geokit::Mappable.distance_to and in acts_as_mappable
4
4
  @@default_units = :miles
5
5
  @@default_formula = :sphere
@@ -72,16 +72,29 @@ module Geokit
72
72
  @@provider_order = [:google,:us]
73
73
  @@logger=Logger.new(STDOUT)
74
74
  @@logger.level=Logger::INFO
75
+ @@domain = nil
76
+
77
+ def self.domain
78
+ @@domain
79
+ end
80
+
81
+ def self.domain=(obj)
82
+ @@domain = obj
83
+ end
75
84
 
76
85
  [:yahoo, :google, :geocoder_us, :geocoder_ca, :geonames, :provider_order, :timeout,
77
- :proxy_addr, :proxy_port, :proxy_user, :proxy_pass,:logger].each do |sym|
86
+ :proxy_addr, :proxy_port, :proxy_user, :proxy_pass, :logger].each do |sym|
78
87
  class_eval <<-EOS, __FILE__, __LINE__
79
88
  def self.#{sym}
80
- if defined?(#{sym.to_s.upcase})
89
+ value = if defined?(#{sym.to_s.upcase})
81
90
  #{sym.to_s.upcase}
82
91
  else
83
92
  @@#{sym}
84
93
  end
94
+ if value.is_a?(Hash)
95
+ value = (self.domain.nil? ? nil : value[self.domain]) || value.values.first
96
+ end
97
+ value
85
98
  end
86
99
 
87
100
  def self.#{sym}=(obj)
@@ -298,6 +311,8 @@ module Geokit
298
311
  res.zip=doc.elements['//Zip'].text if doc.elements['//Zip'] && doc.elements['//Zip'].text != nil
299
312
  res.street_address=doc.elements['//Address'].text if doc.elements['//Address'] && doc.elements['//Address'].text != nil
300
313
  res.precision=doc.elements['//Result'].attributes['precision'] if doc.elements['//Result']
314
+ # set the accuracy as google does (added by Andruby)
315
+ res.accuracy=%w{unknown country state state city zip zip+4 street address building}.index(res.precision)
301
316
  res.success=true
302
317
  return res
303
318
  else
@@ -441,8 +456,8 @@ module Geokit
441
456
  # Translate accuracy into Yahoo-style token address, street, zip, zip+4, city, state, country
442
457
  # For Google, 1=low accuracy, 8=high accuracy
443
458
  address_details=doc.elements['.//*[local-name() = "AddressDetails"]']
444
- accuracy = address_details ? address_details.attributes['Accuracy'].to_i : 0
445
- res.precision=%w{unknown country state state city zip zip+4 street address building}[accuracy]
459
+ res.accuracy = address_details ? address_details.attributes['Accuracy'].to_i : 0
460
+ res.precision=%w{unknown country state state city zip zip+4 street address building}[res.accuracy]
446
461
  res.success=true
447
462
 
448
463
  return res
@@ -251,6 +251,14 @@ module Geokit
251
251
  other.is_a?(LatLng) ? self.lat == other.lat && self.lng == other.lng : false
252
252
  end
253
253
 
254
+ def hash
255
+ lat.hash + lng.hash
256
+ end
257
+
258
+ def eql?(other)
259
+ self == other
260
+ end
261
+
254
262
  # A *class* method to take anything which can be inferred as a point and generate
255
263
  # a LatLng from it. You should use this anything you're not sure what the input is,
256
264
  # and want to deal with it as a LatLng if at all possible. Can take:
@@ -317,6 +325,9 @@ module Geokit
317
325
  attr_accessor :success, :provider, :precision
318
326
  # Street number and street name are extracted from the street address attribute.
319
327
  attr_reader :street_number, :street_name
328
+ # accuracy is set for Yahoo and Google geocoders, it is a numeric value of the
329
+ # precision. see http://code.google.com/apis/maps/documentation/geocoding/#GeocodingAccuracy
330
+ attr_accessor :accuracy
320
331
 
321
332
  # Constructor expects a hash of symbols to correspond with attributes.
322
333
  def initialize(h={})
@@ -50,6 +50,15 @@ class GoogleGeocoderTest < BaseGeocoderTest #:nodoc: all
50
50
  assert_equal "100 Spear St, San Francisco, CA 94105, USA", res.full_address #slightly different from yahoo
51
51
  assert_equal "google", res.provider
52
52
  end
53
+
54
+ def test_google_full_address_accuracy
55
+ response = MockSuccess.new
56
+ response.expects(:body).returns(GOOGLE_FULL)
57
+ url = "http://maps.google.com/maps/geo?q=#{Geokit::Inflector.url_escape(@full_address_short_zip)}&output=xml&key=Google&oe=utf-8"
58
+ Geokit::Geocoders::GoogleGeocoder.expects(:call_geocoder_service).with(url).returns(response)
59
+ res=Geokit::Geocoders::GoogleGeocoder.geocode(@google_full_loc)
60
+ assert_equal 8, res.accuracy
61
+ end
53
62
 
54
63
  def test_google_city
55
64
  response = MockSuccess.new
@@ -66,6 +75,15 @@ class GoogleGeocoderTest < BaseGeocoderTest #:nodoc: all
66
75
  assert_equal "google", res.provider
67
76
  end
68
77
 
78
+ def test_google_city_accuracy
79
+ response = MockSuccess.new
80
+ response.expects(:body).returns(GOOGLE_CITY)
81
+ url = "http://maps.google.com/maps/geo?q=#{Geokit::Inflector.url_escape(@address)}&output=xml&key=Google&oe=utf-8"
82
+ Geokit::Geocoders::GoogleGeocoder.expects(:call_geocoder_service).with(url).returns(response)
83
+ res=Geokit::Geocoders::GoogleGeocoder.geocode(@address)
84
+ assert_equal 4, res.accuracy
85
+ end
86
+
69
87
  def test_google_city_with_geo_loc
70
88
  response = MockSuccess.new
71
89
  response.expects(:body).returns(GOOGLE_CITY)
data/test/test_latlng.rb CHANGED
@@ -128,5 +128,21 @@ class LatLngTest < Test::Unit::TestCase #:nodoc: all
128
128
  res=Geokit::LatLng.normalize([lat,lng])
129
129
  assert_equal res,Geokit::LatLng.new(lat,lng)
130
130
  end
131
-
131
+
132
+ def test_hash
133
+ lat=37.7690
134
+ lng=-122.443
135
+ first = Geokit::LatLng.new(lat,lng)
136
+ second = Geokit::LatLng.new(lat,lng)
137
+ assert_equal first.hash, second.hash
138
+ end
139
+
140
+ def test_eql?
141
+ lat=37.7690
142
+ lng=-122.443
143
+ first = Geokit::LatLng.new(lat,lng)
144
+ second = Geokit::LatLng.new(lat,lng)
145
+ assert first.eql?(second)
146
+ assert second.eql?(first)
147
+ end
132
148
  end
@@ -32,6 +32,15 @@ class YahooGeocoderTest < BaseGeocoderTest #:nodoc: all
32
32
  do_full_address_assertions(Geokit::Geocoders::YahooGeocoder.geocode(@address))
33
33
  end
34
34
 
35
+ def test_yahoo_full_address_accuracy
36
+ response = MockSuccess.new
37
+ response.expects(:body).returns(YAHOO_FULL)
38
+ url = "http://api.local.yahoo.com/MapsService/V1/geocode?appid=Yahoo&location=#{Geokit::Inflector.url_escape(@address)}"
39
+ Geokit::Geocoders::YahooGeocoder.expects(:call_geocoder_service).with(url).returns(response)
40
+ res = Geokit::Geocoders::YahooGeocoder.geocode(@address)
41
+ assert_equal 8, res.accuracy
42
+ end
43
+
35
44
  def test_yahoo_full_address_with_geo_loc
36
45
  response = MockSuccess.new
37
46
  response.expects(:body).returns(YAHOO_FULL)
@@ -48,6 +57,15 @@ class YahooGeocoderTest < BaseGeocoderTest #:nodoc: all
48
57
  do_city_assertions(Geokit::Geocoders::YahooGeocoder.geocode(@address))
49
58
  end
50
59
 
60
+ def test_yahoo_city_accuracy
61
+ response = MockSuccess.new
62
+ response.expects(:body).returns(YAHOO_CITY)
63
+ url = "http://api.local.yahoo.com/MapsService/V1/geocode?appid=Yahoo&location=#{Geokit::Inflector.url_escape(@address)}"
64
+ Geokit::Geocoders::YahooGeocoder.expects(:call_geocoder_service).with(url).returns(response)
65
+ res = Geokit::Geocoders::YahooGeocoder.geocode(@address)
66
+ assert_equal 4, res.accuracy
67
+ end
68
+
51
69
  def test_yahoo_city_with_geo_loc
52
70
  response = MockSuccess.new
53
71
  response.expects(:body).returns(YAHOO_CITY)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geokit
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.6
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andre Lewis
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-03-19 00:00:00 -07:00
12
+ date: 2009-04-11 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency