diff --git a/CHANGELOG.rdoc b/CHANGELOG.rdoc index d911531a633cb396b246e9dea91f5e3ed9fa8942..72259fef2215494c9caa5bc11916d46e222495ea 100644 --- a/CHANGELOG.rdoc +++ b/CHANGELOG.rdoc @@ -2,6 +2,18 @@ Per-release changes to Geocoder. +== 1.0.4 (2011 Sep 18) + +* Remove klass method from rake task, which could conflict with app methods (thanks github.com/mguterl). + +== 1.0.3 (2011 Sep 17) + +* Add support for Google Premier geocoding service (thanks github.com/steveh). +* Update Google API URL (thanks github.com/soorajb). +* Allow rescue from timeout with FreeGeoIP (thanks github.com/lukeledet). +* Fix: rake assets:precompile (Rails 3.1) not working in some situations. +* Fix: stop double-adjusting units when using kilometers (thanks github.com/hairyheron). + == 1.0.2 (2011 June 25) * Add support for MongoMapper (thanks github.com/spagalloco). diff --git a/README.rdoc b/README.rdoc index 2d8efa79cad17675ea637f4c2350b33e4da850ae..ce88545d3d50536d78b17a9c10bfd5538fca2b74 100644 --- a/README.rdoc +++ b/README.rdoc @@ -268,6 +268,7 @@ Languages:: ar, eu, bg, bn, ca, cs, da, de, el, en, en-AU, en-GB, es, eu, fa, fi Documentation:: http://code.google.com/apis/maps/documentation/geocoding/#JSON Terms of Service:: http://code.google.com/apis/maps/terms.html#section_10_12 Limitations:: "You must not use or display the Content without a corresponding Google map, unless you are explicitly permitted to do so in the Maps APIs Documentation, or through written permission from Google." "You must not pre-fetch, cache, or store any Content, except that you may store: (i) limited amounts of Content for the purpose of improving the performance of your Maps API Implementation..." +Notes:: To use Google Premier set <tt>Geocoder::Configuration.lookup = :google_premier</tt> and <tt>Geocoder::Configuration.api_key = [key, client, channel]</tt>. ==== Yahoo (<tt>:yahoo</tt>) diff --git a/Rakefile b/Rakefile index cf5eca52b84e50722e191e983e7a681fea07c9b3..70cea9efde1bb2471a68c1abf5a73be8fc8b4188 100644 --- a/Rakefile +++ b/Rakefile @@ -4,13 +4,19 @@ Bundler::GemHelper.install_tasks require 'rake/testtask' Rake::TestTask.new(:test) do |test| test.libs << 'lib' << 'test' - test.pattern = 'test/**/*_test.rb' + test.pattern = 'test/*_test.rb' test.verbose = true end -task :default => :test +Rake::TestTask.new(:integration) do |test| + test.libs << 'lib' << 'test' + test.pattern = 'test/integration/*_test.rb' + test.verbose = true +end + +task :default => [:test, :integration] -require 'rake/rdoctask' +require 'rdoc/task' Rake::RDocTask.new do |rdoc| rdoc.rdoc_dir = 'rdoc' rdoc.title = "Geocoder #{Geocoder::VERSION}" diff --git a/lib/geocoder.rb b/lib/geocoder.rb index 4e648617223cb923a8fc1dfe122262e449a13a22..5bce2283b9e2463c76edf7ba9e4e99e1bd830ff7 100644 --- a/lib/geocoder.rb +++ b/lib/geocoder.rb @@ -56,7 +56,7 @@ module Geocoder # All street address lookups, default first. # def street_lookups - [:google, :yahoo, :bing, :geocoder_ca, :yandex] + [:google, :google_premier, :yahoo, :bing, :geocoder_ca, :yandex] end ## @@ -91,12 +91,8 @@ module Geocoder # Retrieve a Lookup object from the store. # def get_lookup(name) - unless defined?(@lookups) - @lookups = {} - end - unless @lookups.include?(name) - @lookups[name] = spawn_lookup(name) - end + @lookups = {} unless defined?(@lookups) + @lookups[name] = spawn_lookup(name) unless @lookups.include?(name) @lookups[name] end @@ -108,9 +104,9 @@ module Geocoder name = name.to_s require "geocoder/lookups/#{name}" klass = name.split("_").map{ |i| i[0...1].upcase + i[1..-1] }.join - eval("Geocoder::Lookup::#{klass}.new") + Geocoder::Lookup.const_get(klass).new else - valids = valid_lookups.map{ |l| ":#{l}" }.join(", ") + valids = valid_lookups.map(&:inspect).join(", ") raise ConfigurationError, "Please specify a valid lookup for Geocoder " + "(#{name.inspect} is not one of: #{valids})." end @@ -120,7 +116,7 @@ module Geocoder # Does the given value look like an IP address? # # Does not check for actual validity, just the appearance of four - # dot-delimited 8-bit numbers. + # dot-delimited numbers. # def ip_address?(value) !!value.to_s.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/) diff --git a/lib/geocoder/configuration.rb b/lib/geocoder/configuration.rb index 3381fb183137bd2d39f7109623c694efa71f446d..44baabeebf4547d063ee0798ce643a2d1aebfa86 100644 --- a/lib/geocoder/configuration.rb +++ b/lib/geocoder/configuration.rb @@ -22,6 +22,7 @@ module Geocoder [:https_proxy, nil], # API key for geocoding service + # for Google Premier use a 3-element array: [key, client, channel] [:api_key, nil], # cache object (must respond to #[], #[]=, and #keys) @@ -38,20 +39,20 @@ module Geocoder end # define getters and setters for all configuration settings - self.options_and_defaults.each do |o,d| - eval("def self.#{o}; @@#{o}; end") - eval("def self.#{o}=(obj); @@#{o} = obj; end") - end + self.options_and_defaults.each do |option, default| + class_eval(<<-END, __FILE__, __LINE__ + 1) + + @@#{option} = default unless defined? @@#{option} + + def self.#{option} + @@#{option} + end - ## - # Set all values to default. - # - def self.set_defaults - self.options_and_defaults.each do |o,d| - self.send("#{o}=", d) - end + def self.#{option}=(obj) + @@#{option} = obj + end + + END end end end - -Geocoder::Configuration.set_defaults diff --git a/lib/geocoder/lookups/base.rb b/lib/geocoder/lookups/base.rb index 39490e81d92e684961801fd1d7fc32170b1f929b..e8905707bc1a31ca6043183f2b8ebb9734eafe59 100644 --- a/lib/geocoder/lookups/base.rb +++ b/lib/geocoder/lookups/base.rb @@ -87,7 +87,7 @@ module Geocoder # Class of the result objects # def result_class - eval("Geocoder::Result::#{self.class.to_s.split(":").last}") + Geocoder::Result.const_get(self.class.to_s.split(":").last) end ## @@ -141,8 +141,11 @@ module Geocoder def fetch_raw_data(query, reverse = false) timeout(Geocoder::Configuration.timeout) do url = query_url(query, reverse) + uri = URI.parse(url) unless cache and response = cache[url] - response = http_client.get_response(URI.parse(url)).body + client = http_client.new(uri.host, uri.port) + client.use_ssl = true if Geocoder::Configuration.use_https + response = client.get(uri.request_uri).body if cache cache[url] = response end diff --git a/lib/geocoder/lookups/bing.rb b/lib/geocoder/lookups/bing.rb index cba04c30814e7991acbf021a9aa35db28fc6d15f..2bec5a4f1ec09a6443692b8a1fc356fe42dbbdfe 100644 --- a/lib/geocoder/lookups/bing.rb +++ b/lib/geocoder/lookups/bing.rb @@ -12,7 +12,7 @@ module Geocoder::Lookup def results(query, reverse = false) return [] unless doc = fetch_data(query, reverse) - + if doc['statusDescription'] == "OK" return doc['resourceSets'].first['estimatedTotal'] > 0 ? doc['resourceSets'].first['resources'] : [] else diff --git a/lib/geocoder/lookups/freegeoip.rb b/lib/geocoder/lookups/freegeoip.rb index d9112bf8f3cf2559a8f7074d1f95aa589a47dcf1..63599a487cf768bf7d56033dcd108da17752793f 100644 --- a/lib/geocoder/lookups/freegeoip.rb +++ b/lib/geocoder/lookups/freegeoip.rb @@ -11,7 +11,8 @@ module Geocoder::Lookup return [reserved_result(query)] if loopback_address?(query) begin return (doc = fetch_data(query, reverse)) ? [doc] : [] - rescue StandardError # Freegeoip.net returns HTML on bad request + rescue StandardError => err # Freegeoip.net returns HTML on bad request + raise_error(err) return [] end end diff --git a/lib/geocoder/lookups/google.rb b/lib/geocoder/lookups/google.rb index 4d61dd6c5090747e4c9e9ab5dd82b5dcc604157f..9d0395503b2904654dcb69667742d43c61b944b7 100644 --- a/lib/geocoder/lookups/google.rb +++ b/lib/geocoder/lookups/google.rb @@ -31,7 +31,7 @@ module Geocoder::Lookup :language => Geocoder::Configuration.language, :key => Geocoder::Configuration.api_key } - "#{protocol}://maps.google.com/maps/api/geocode/json?" + hash_to_query(params) + "#{protocol}://maps.googleapis.com/maps/api/geocode/json?" + hash_to_query(params) end end end diff --git a/lib/geocoder/lookups/google_premier.rb b/lib/geocoder/lookups/google_premier.rb new file mode 100644 index 0000000000000000000000000000000000000000..6befdddf585167868fcdbb58a042f0ea8175ea6d --- /dev/null +++ b/lib/geocoder/lookups/google_premier.rb @@ -0,0 +1,38 @@ +require 'openssl' +require 'base64' +require 'geocoder/lookups/google' +require 'geocoder/results/google_premier' + +module Geocoder::Lookup + class GooglePremier < Google + + private # --------------------------------------------------------------- + + def query_url(query, reverse = false) + params = { + (reverse ? :latlng : :address) => query, + :sensor => 'false', + :language => Geocoder::Configuration.language, + :client => Geocoder::Configuration.api_key[1], + :channel => Geocoder::Configuration.api_key[2] + }.reject{ |key, value| value.nil? } + path = "/maps/api/geocode/json?#{hash_to_query(params)}" + "#{protocol}://maps.googleapis.com#{path}&signature=#{sign(path)}" + end + + def sign(string) + raw_private_key = url_safe_base64_decode(Geocoder::Configuration.api_key[0]) + digest = OpenSSL::Digest::Digest.new('sha1') + raw_signature = OpenSSL::HMAC.digest(digest, raw_private_key, string) + url_safe_base64_encode(raw_signature) + end + + def url_safe_base64_decode(base64_string) + Base64.decode64(base64_string.tr('-_', '+/')) + end + + def url_safe_base64_encode(raw) + Base64.encode64(raw).tr('+/', '-_').strip + end + end +end diff --git a/lib/geocoder/models/base.rb b/lib/geocoder/models/base.rb index 1e944264aced08e5633551a088ae8329cb6a7b38..836233162770542dc063784b4d448c8324792708 100644 --- a/lib/geocoder/models/base.rb +++ b/lib/geocoder/models/base.rb @@ -31,7 +31,7 @@ module Geocoder unless @geocoder_options @geocoder_options = {} require "geocoder/stores/#{geocoder_file_name}" - include eval("Geocoder::Store::" + geocoder_module_name) + include Geocoder::Store.const_get(geocoder_module_name) end @geocoder_options.merge! options end diff --git a/lib/geocoder/models/mongo_base.rb b/lib/geocoder/models/mongo_base.rb index 393e007fbd27793960224a222801838e674c1ab4..15bbbabe848b51c99247c2339dae34b764f45b1a 100644 --- a/lib/geocoder/models/mongo_base.rb +++ b/lib/geocoder/models/mongo_base.rb @@ -38,14 +38,14 @@ module Geocoder unless geocoder_initialized? @geocoder_options = {} require "geocoder/stores/#{geocoder_file_name}" - include eval("Geocoder::Store::" + geocoder_module_name) + include Geocoder::Store.const_get(geocoder_module_name) end @geocoder_options.merge! options end def geocoder_initialized? begin - included_modules.include? eval("Geocoder::Store::" + geocoder_module_name) + included_modules.include? Geocoder::Store.const_get(geocoder_module_name) rescue NameError false end diff --git a/lib/geocoder/railtie.rb b/lib/geocoder/railtie.rb index e39eb9d95755635d41da0f579475d0d9bad3c746..22ba8e83e6ba27eb51fe2dacfe3efbc16a41e6e8 100644 --- a/lib/geocoder/railtie.rb +++ b/lib/geocoder/railtie.rb @@ -18,7 +18,7 @@ module Geocoder class Railtie def self.insert - if defined?(::ActiveRecord) + if ENV['RAILS_GROUPS'].to_s != 'assets' and defined?(::ActiveRecord) ::ActiveRecord::Base.extend(Model::ActiveRecord) end end diff --git a/lib/geocoder/results/freegeoip.rb b/lib/geocoder/results/freegeoip.rb index 9aac491999d3e70b01b1e34c644766b6ceeda964..ee2cb6115449622058fa08aa86d435ba568b00b9 100644 --- a/lib/geocoder/results/freegeoip.rb +++ b/lib/geocoder/results/freegeoip.rb @@ -4,7 +4,8 @@ module Geocoder::Result class Freegeoip < Base def address(format = :full) - "#{city}#{', ' + state_code unless state_code == ''} #{postal_code}, #{country}".sub(/^[ ,]*/, "") + s = state_code.to_s == "" ? "" : ", #{state_code}" + "#{city}#{s} #{postal_code}, #{country}".sub(/^[ ,]*/, "") end def city diff --git a/lib/geocoder/results/geocoder_ca.rb b/lib/geocoder/results/geocoder_ca.rb index e0f4bdd8af89916f59207d23726d143b8592dd3c..4edb80a83e9911ba56d9752c570d142213275bfe 100644 --- a/lib/geocoder/results/geocoder_ca.rb +++ b/lib/geocoder/results/geocoder_ca.rb @@ -51,7 +51,7 @@ module Geocoder::Result end - private # ---------------------------------------------------------------- + private # ---------------------------------------------------------------- def canadian_province_abbreviations %w[ON QC NS NB MB BC PE SK AB NL] diff --git a/lib/geocoder/results/google.rb b/lib/geocoder/results/google.rb index cb45785fd45ee24e75fd0006d0bb3ec6831cdfe2..73e2289db58c0027b006f28d4520107e753e10b1 100644 --- a/lib/geocoder/results/google.rb +++ b/lib/geocoder/results/google.rb @@ -82,5 +82,9 @@ module Geocoder::Result def geometry @data['geometry'] end + + def precision + geometry['location_type'] if geometry + end end end diff --git a/lib/geocoder/results/google_premier.rb b/lib/geocoder/results/google_premier.rb new file mode 100644 index 0000000000000000000000000000000000000000..7237dc09047c55b81fab0bb033413e0d21a4e4ed --- /dev/null +++ b/lib/geocoder/results/google_premier.rb @@ -0,0 +1,6 @@ +require 'geocoder/results/google' + +module Geocoder::Result + class GooglePremier < Google + end +end \ No newline at end of file diff --git a/lib/geocoder/stores/active_record.rb b/lib/geocoder/stores/active_record.rb index 1f80be4cf53d71db9a0edd4eb7e70a335d3f5bb2..bbcce73b62ceebd255420420c964411289120b2f 100644 --- a/lib/geocoder/stores/active_record.rb +++ b/lib/geocoder/stores/active_record.rb @@ -86,7 +86,6 @@ module Geocoder::Store # * +:exclude+ - an object to exclude (used by the +nearbys+ method) # def near_scope_options(latitude, longitude, radius = 20, options = {}) - radius *= Geocoder::Calculations.km_in_mi if options[:units] == :km if connection.adapter_name.match /sqlite/i approx_near_scope_options(latitude, longitude, radius, options) else diff --git a/lib/geocoder/version.rb b/lib/geocoder/version.rb index e6372dd3ebb09eed9dccfb2158cdaabad5a103fa..f8b1aecb240934f1a5888ede69ef02492eaaa845 100644 --- a/lib/geocoder/version.rb +++ b/lib/geocoder/version.rb @@ -1,3 +1,3 @@ module Geocoder - VERSION = "1.0.2" + VERSION = "1.0.4" end diff --git a/lib/tasks/geocoder.rake b/lib/tasks/geocoder.rake index b621b0592ce28542c75784f63cfd3d6d7d1acd3f..f235e1b51b2cb047021042a5d4719f3e4233ab40 100644 --- a/lib/tasks/geocoder.rake +++ b/lib/tasks/geocoder.rake @@ -1,13 +1,10 @@ -def klass - class_name = ENV['CLASS'] || ENV['class'] - raise "Please specify a CLASS (model)" unless class_name - Object.const_get(class_name) -end - namespace :geocode do - desc "Geocode all objects without coordinates." task :all => :environment do + class_name = ENV['CLASS'] || ENV['class'] + raise "Please specify a CLASS (model)" unless class_name + klass = Object.const_get(class_name) + klass.not_geocoded.each do |obj| obj.geocode; obj.save end diff --git a/test/configuration_test.rb b/test/configuration_test.rb index 61593c6b5730f832ef8f24384fd365021fe46f92..4c4e668186218874e10611f24cd2f899f667ab79 100644 --- a/test/configuration_test.rb +++ b/test/configuration_test.rb @@ -9,4 +9,5 @@ class ConfigurationTest < Test::Unit::TestCase Geocoder.search "something dumb" end end + end diff --git a/test/custom_block_test.rb b/test/custom_block_test.rb index ab2ad9e005b80896370271a2553cac770c263d64..8fab62e819aa6ff05a1b706e185ab7aba92008fc 100644 --- a/test/custom_block_test.rb +++ b/test/custom_block_test.rb @@ -3,10 +3,6 @@ require 'test_helper' class CustomBlockTest < Test::Unit::TestCase - def setup - Geocoder::Configuration.set_defaults - end - def test_geocode_with_block_runs_block e = Event.new(*venue_params(:msg)) coords = [40.750354, -73.993371] diff --git a/test/error_handling_test.rb b/test/error_handling_test.rb index e60c7b394eb2752f9d0aec58d886652bd5ace483..42b3c3fd1fd98711d97f133c71b5aa79fcb52e23 100644 --- a/test/error_handling_test.rb +++ b/test/error_handling_test.rb @@ -3,10 +3,6 @@ require 'test_helper' class ErrorHandlingTest < Test::Unit::TestCase - def setup - Geocoder::Configuration.set_defaults - end - def test_does_not_choke_on_timeout # keep test output clean: suppress timeout warning orig = $VERBOSE; $VERBOSE = nil @@ -19,13 +15,23 @@ class ErrorHandlingTest < Test::Unit::TestCase def test_always_raise_timeout_error Geocoder::Configuration.always_raise = [TimeoutError] - assert_raise(TimeoutError) { Geocoder.search("timeout") } + all_lookups.each do |l| + lookup = Geocoder.send(:get_lookup, l) + assert_raises TimeoutError do + lookup.send(:results, "timeout") + end + end Geocoder::Configuration.always_raise = [] end def test_always_raise_socket_error Geocoder::Configuration.always_raise = [SocketError] - assert_raise(SocketError) { Geocoder.search("socket_error") } + all_lookups.each do |l| + lookup = Geocoder.send(:get_lookup, l) + assert_raises SocketError do + lookup.send(:results, "socket_error") + end + end Geocoder::Configuration.always_raise = [] end end diff --git a/test/fixtures/freegeoip_no_results.json b/test/fixtures/freegeoip_no_results.json new file mode 100644 index 0000000000000000000000000000000000000000..2ac0915dd0c91079a1b0d2eb3fd3c21194e0a77a --- /dev/null +++ b/test/fixtures/freegeoip_no_results.json @@ -0,0 +1 @@ +<html><title>404: Not Found</title><body>404: Not Found</body></html> diff --git a/test/geocoder_test.rb b/test/geocoder_test.rb index 2a0b02461f9e71268e47cc03814a7417ac1c7ae0..fe1682004ef4c537d7d6882e320c3c4b40d680a5 100644 --- a/test/geocoder_test.rb +++ b/test/geocoder_test.rb @@ -3,10 +3,6 @@ require 'test_helper' class GeocoderTest < Test::Unit::TestCase - def setup - Geocoder::Configuration.set_defaults - end - def test_distance_to_returns_float v = Venue.new(*venue_params(:msg)) v.latitude, v.longitude = [40.750354, -73.993371] diff --git a/test/https_test.rb b/test/https_test.rb index acba01e68a5f6428581c7b2bc650b5a5d3807273..58219d33cc8f013746583b0d20a699e93b534ad8 100644 --- a/test/https_test.rb +++ b/test/https_test.rb @@ -3,10 +3,6 @@ require 'test_helper' class HttpsTest < Test::Unit::TestCase - def setup - Geocoder::Configuration.set_defaults - end - def test_uses_https_for_secure_query Geocoder::Configuration.use_https = true g = Geocoder::Lookup::Google.new diff --git a/test/integration/smoke_test.rb b/test/integration/smoke_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..8d80e1e14730cd9ad53072ef2ff9c07c5f4cf373 --- /dev/null +++ b/test/integration/smoke_test.rb @@ -0,0 +1,24 @@ +$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[ .. .. lib])) +require 'pathname' +require 'rubygems' +require 'test/unit' +require 'geocoder' + +class SmokeTest < Test::Unit::TestCase + + def test_simple_zip_code_search + result = Geocoder.search "27701" + assert_equal "Durham", result.first.city + assert_equal "North Carolina", result.first.state + end + + def test_simple_zip_code_search_with_ssl + Geocoder::Configuration.use_https = true + result = Geocoder.search "27701" + assert_equal "Durham", result.first.city + assert_equal "North Carolina", result.first.state + ensure + Geocoder::Configuration.use_https = false + end + +end diff --git a/test/lookup_test.rb b/test/lookup_test.rb index b6f4a4ac75c9de05dac5b61c59a70ddc7cddddba..3c72d05b84294fce0a7ce0394ee9645d649edf81 100644 --- a/test/lookup_test.rb +++ b/test/lookup_test.rb @@ -4,9 +4,9 @@ require 'test_helper' class LookupTest < Test::Unit::TestCase def test_search_returns_empty_array_when_no_results - street_lookups.each do |l| - Geocoder::Configuration.lookup = l - assert_equal [], Geocoder.search("no results"), + all_lookups.each do |l| + lookup = Geocoder.send(:get_lookup, l) + assert_equal [], lookup.send(:results, "no results"), "Lookup #{l} does not return empty array when no results." end end diff --git a/test/method_aliases_test.rb b/test/method_aliases_test.rb index f44c3478487de0617ad043485d4cb20918218bd9..993e96769bb3a1bbf307f6abe9e25208fb115673 100644 --- a/test/method_aliases_test.rb +++ b/test/method_aliases_test.rb @@ -3,10 +3,6 @@ require 'test_helper' class MethodAliasesTest < Test::Unit::TestCase - def setup - Geocoder::Configuration.set_defaults - end - def test_distance_from_is_alias_for_distance_to v = Venue.new(*venue_params(:msg)) v.latitude, v.longitude = [40.750354, -73.993371] diff --git a/test/mongoid_test.rb b/test/mongoid_test.rb index c4fb8ae07251f61f3c52480838b308c5ed9e3e36..44b4ca9a0798538974177cfb79332657d9908e3b 100644 --- a/test/mongoid_test.rb +++ b/test/mongoid_test.rb @@ -7,10 +7,6 @@ require 'mongoid_test_helper' class MongoidTest < Test::Unit::TestCase - def setup - Geocoder::Configuration.set_defaults - end - def test_geocoded_check p = Place.new(*venue_params(:msg)) p.location = [40.750354, -73.993371] diff --git a/test/mongoid_test_helper.rb b/test/mongoid_test_helper.rb index 5486a12436ce680d54f25271223e742f54ab17c7..69eb2fd044c593898780e3e73fb2f8463905e207 100644 --- a/test/mongoid_test_helper.rb +++ b/test/mongoid_test_helper.rb @@ -4,9 +4,9 @@ require 'test/unit' $LOAD_PATH.unshift(File.dirname(__FILE__)) $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) -Mongoid.configure do |config| +Mongoid.configure do |config| config.logger = Logger.new($stderr, :debug) -end +end ## # Geocoded model. diff --git a/test/proxy_test.rb b/test/proxy_test.rb index fe4236050ff6c986e3c3e0ea49fde232bc569880..d701fdce39d2663d5732379676d6960e2268c796 100644 --- a/test/proxy_test.rb +++ b/test/proxy_test.rb @@ -3,10 +3,6 @@ require 'test_helper' class ProxyTest < Test::Unit::TestCase - def setup - Geocoder::Configuration.set_defaults - end - def test_uses_proxy_when_specified Geocoder::Configuration.http_proxy = 'localhost' lookup = Geocoder::Lookup::Google.new diff --git a/test/services_test.rb b/test/services_test.rb index 5eb7555c7dd313bc8021c335baa0008217decec3..b01b84abcbdb03c4c2f466f6b39859d687b26774 100644 --- a/test/services_test.rb +++ b/test/services_test.rb @@ -1,11 +1,7 @@ # encoding: utf-8 require 'test_helper' -class ServicesTest < Test::Unit::TestCase - - def setup - Geocoder::Configuration.set_defaults - end +class ServicesTest < Test::Unit::TestCase # --- Google --- @@ -26,6 +22,28 @@ class ServicesTest < Test::Unit::TestCase assert_equal nil, result.city end + def test_google_precision + result = Geocoder.search("Madison Square Garden, New York, NY").first + assert_equal "ROOFTOP", + result.precision + end + + + # --- Google Premier --- + + def test_google_premier_result_components + Geocoder::Configuration.lookup = :google_premier + result = Geocoder.search("Madison Square Garden, New York, NY").first + assert_equal "Manhattan", + result.address_components_of_type(:sublocality).first['long_name'] + end + + def test_google_premier_query_url + Geocoder::Configuration.api_key = ["deadbeef", "gme-test", "test-dev"] + assert_equal "http://maps.googleapis.com/maps/api/geocode/json?address=Madison+Square+Garden%2C+New+York%2C+NY&channel=test-dev&client=gme-test&language=en&sensor=false&signature=doJvJqX7YJzgV9rJ0DnVkTGZqTg=", + Geocoder::Lookup::GooglePremier.new.send(:query_url, "Madison Square Garden, New York, NY", false) + end + # --- Yahoo --- diff --git a/test/test_helper.rb b/test/test_helper.rb index f491504aaed96ec1748d11ce86f3640fa1a395cf..137f756fdbad489f0880c08e64f452d0bf2ef7cb 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -73,6 +73,9 @@ module Geocoder end end + class GooglePremier < Google + end + class Yahoo < Base private #----------------------------------------------------------------- def fetch_raw_data(query, reverse = false) @@ -122,7 +125,11 @@ module Geocoder def fetch_raw_data(query, reverse = false) raise TimeoutError if query == "timeout" raise SocketError if query == "socket_error" - read_fixture "freegeoip_74_200_247_59.json" + file = case query + when "no results"; :no_results + else "74_200_247_59" + end + read_fixture "freegeoip_#{file}.json" end end @@ -224,6 +231,12 @@ end class Test::Unit::TestCase + + def teardown + Geocoder.send(:remove_const, :Configuration) + load "geocoder/configuration.rb" + end + def venue_params(abbrev) { :msg => ["Madison Square Garden", "4 Penn Plaza, New York, NY"]