geokit 1.6.5 → 1.6.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +9 -0
- data/.travis.yml +13 -0
- data/CHANGELOG.md +92 -0
- data/Gemfile +4 -0
- data/LICENSE +25 -0
- data/Manifest.txt +21 -0
- data/README.markdown +179 -176
- data/Rakefile +8 -1
- data/ext/mkrf_conf.rb +15 -0
- data/geokit.gemspec +33 -0
- data/lib/geokit/geocoders.rb +7 -774
- data/lib/geokit/inflectors.rb +38 -0
- data/lib/geokit/mappable.rb +61 -3
- data/lib/geokit/multi_geocoder.rb +61 -0
- data/lib/geokit/services/ca_geocoder.rb +55 -0
- data/lib/geokit/services/fcc.rb +57 -0
- data/lib/geokit/services/geo_plugin.rb +31 -0
- data/lib/geokit/services/geonames.rb +53 -0
- data/lib/geokit/services/google.rb +158 -0
- data/lib/geokit/services/google3.rb +202 -0
- data/lib/geokit/services/ip.rb +103 -0
- data/lib/geokit/services/openstreetmap.rb +119 -0
- data/lib/geokit/services/us_geocoder.rb +50 -0
- data/lib/geokit/services/yahoo.rb +75 -0
- data/lib/geokit/version.rb +3 -0
- data/test/helper.rb +92 -0
- data/test/test_base_geocoder.rb +1 -15
- data/test/test_bounds.rb +1 -2
- data/test/test_ca_geocoder.rb +1 -1
- data/test/test_geoloc.rb +35 -5
- data/test/test_geoplugin_geocoder.rb +1 -2
- data/test/test_google_geocoder.rb +39 -2
- data/test/test_google_geocoder3.rb +55 -3
- data/test/test_google_reverse_geocoder.rb +1 -1
- data/test/test_inflector.rb +5 -3
- data/test/test_ipgeocoder.rb +25 -1
- data/test/test_latlng.rb +1 -3
- data/test/test_multi_geocoder.rb +1 -1
- data/test/test_multi_ip_geocoder.rb +1 -1
- data/test/test_openstreetmap_geocoder.rb +161 -0
- data/test/test_polygon_contains.rb +101 -0
- data/test/test_us_geocoder.rb +1 -1
- data/test/test_yahoo_geocoder.rb +18 -1
- metadata +164 -83
@@ -0,0 +1,75 @@
|
|
1
|
+
module Geokit
|
2
|
+
module Geocoders
|
3
|
+
# Yahoo geocoder implementation. Requires the Geokit::Geocoders::YAHOO variable to
|
4
|
+
# contain a Yahoo API key. Conforms to the interface set by the Geocoder class.
|
5
|
+
class YahooGeocoder < Geocoder
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
# Template method which does the geocode lookup.
|
10
|
+
def self.do_geocode(address, options = {})
|
11
|
+
address_str = address.is_a?(GeoLoc) ? address.to_geocodeable_s : address
|
12
|
+
url="http://where.yahooapis.com/geocode?flags=J&appid=#{Geokit::Geocoders::yahoo}&q=#{Geokit::Inflector::url_escape(address_str)}"
|
13
|
+
res = self.call_geocoder_service(url)
|
14
|
+
return GeoLoc.new if !res.is_a?(Net::HTTPSuccess)
|
15
|
+
json = res.body
|
16
|
+
logger.debug "Yahoo geocoding. Address: #{address}. Result: #{json}"
|
17
|
+
return self.json2GeoLoc(json, address)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.json2GeoLoc(json, address)
|
21
|
+
results = MultiJson.load(json)
|
22
|
+
|
23
|
+
if results['ResultSet']['Error'] == 0 && results['ResultSet']['Results'] != nil && results['ResultSet']['Results'].first != nil
|
24
|
+
geoloc = nil
|
25
|
+
results['ResultSet']['Results'].each do |result|
|
26
|
+
extracted_geoloc = extract_geoloc(result)
|
27
|
+
if geoloc.nil?
|
28
|
+
geoloc = extracted_geoloc
|
29
|
+
else
|
30
|
+
geoloc.all.push(extracted_geoloc)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
return geoloc
|
34
|
+
else
|
35
|
+
logger.info "Yahoo was unable to geocode address: " + address
|
36
|
+
return GeoLoc.new
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.extract_geoloc(result_json)
|
41
|
+
geoloc = GeoLoc.new
|
42
|
+
|
43
|
+
# basic
|
44
|
+
geoloc.lat = result_json['latitude']
|
45
|
+
geoloc.lng = result_json['longitude']
|
46
|
+
geoloc.country_code = result_json['countrycode']
|
47
|
+
geoloc.provider = 'yahoo'
|
48
|
+
|
49
|
+
# extended
|
50
|
+
geoloc.street_address = result_json['line1'].to_s.empty? ? nil : result_json['line1']
|
51
|
+
geoloc.city = result_json['city']
|
52
|
+
geoloc.state = geoloc.is_us? ? result_json['statecode'] : result_json['state']
|
53
|
+
geoloc.zip = result_json['postal']
|
54
|
+
|
55
|
+
geoloc.precision = case result_json['quality']
|
56
|
+
when 9,10 then 'country'
|
57
|
+
when 19..30 then 'state'
|
58
|
+
when 39,40 then 'city'
|
59
|
+
when 49,50 then 'neighborhood'
|
60
|
+
when 59,60,64 then 'zip'
|
61
|
+
when 74,75 then 'zip+4'
|
62
|
+
when 70..72 then 'street'
|
63
|
+
when 80..87 then 'address'
|
64
|
+
when 62,63,90,99 then 'building'
|
65
|
+
else 'unknown'
|
66
|
+
end
|
67
|
+
|
68
|
+
geoloc.accuracy = %w{unknown country state state city zip zip+4 street address building}.index(geoloc.precision)
|
69
|
+
geoloc.success = true
|
70
|
+
|
71
|
+
return geoloc
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'rubygems'
|
5
|
+
require 'bundler'
|
6
|
+
Bundler.setup
|
7
|
+
rescue LoadError => e
|
8
|
+
puts "Error loading bundler (#{e.message}): \"gem install bundler\" for bundler support."
|
9
|
+
end
|
10
|
+
|
11
|
+
if ENV['COVERAGE']
|
12
|
+
COVERAGE_THRESHOLD = 84
|
13
|
+
require 'simplecov'
|
14
|
+
require 'simplecov-rcov'
|
15
|
+
require 'coveralls'
|
16
|
+
Coveralls.wear!
|
17
|
+
|
18
|
+
SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
|
19
|
+
SimpleCov.start do
|
20
|
+
add_filter '/test/'
|
21
|
+
add_group 'lib', 'lib'
|
22
|
+
end
|
23
|
+
SimpleCov.at_exit do
|
24
|
+
SimpleCov.result.format!
|
25
|
+
percent = SimpleCov.result.covered_percent
|
26
|
+
unless percent >= COVERAGE_THRESHOLD
|
27
|
+
puts "Coverage must be above #{COVERAGE_THRESHOLD}%. It is #{"%.2f" % percent}%"
|
28
|
+
Kernel.exit(1)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
require 'test/unit'
|
34
|
+
require 'mocha/setup'
|
35
|
+
require 'net/http'
|
36
|
+
|
37
|
+
require File.join(File.dirname(__FILE__), "../lib/geokit.rb")
|
38
|
+
|
39
|
+
class MockSuccess < Net::HTTPSuccess #:nodoc: all
|
40
|
+
def initialize
|
41
|
+
@header = {}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class MockFailure < Net::HTTPServiceUnavailable #:nodoc: all
|
46
|
+
def initialize
|
47
|
+
@header = {}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Base class for testing geocoders.
|
52
|
+
class BaseGeocoderTest < Test::Unit::TestCase #:nodoc: all
|
53
|
+
|
54
|
+
class Geokit::Geocoders::TestGeocoder < Geokit::Geocoders::Geocoder
|
55
|
+
def self.do_get(url)
|
56
|
+
sleep(2)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Defines common test fixtures.
|
61
|
+
def setup
|
62
|
+
@address = 'San Francisco, CA'
|
63
|
+
@full_address = '100 Spear St, San Francisco, CA, 94105-1522, US'
|
64
|
+
@full_address_short_zip = '100 Spear St, San Francisco, CA, 94105, US'
|
65
|
+
|
66
|
+
@latlng = Geokit::LatLng.new(37.7742, -122.417068)
|
67
|
+
@success = Geokit::GeoLoc.new({:city=>"SAN FRANCISCO", :state=>"CA", :country_code=>"US", :lat=>@latlng.lat, :lng=>@latlng.lng})
|
68
|
+
@success.success = true
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_timeout_call_web_service
|
72
|
+
url = "http://www.anything.com"
|
73
|
+
Geokit::Geocoders::request_timeout = 1
|
74
|
+
assert_nil Geokit::Geocoders::TestGeocoder.call_geocoder_service(url)
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_successful_call_web_service
|
78
|
+
url = "http://www.anything.com"
|
79
|
+
Geokit::Geocoders::Geocoder.expects(:do_get).with(url).returns("SUCCESS")
|
80
|
+
assert_equal "SUCCESS", Geokit::Geocoders::Geocoder.call_geocoder_service(url)
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_find_geocoder_methods
|
84
|
+
public_methods = Geokit::Geocoders::Geocoder.public_methods.map { |m| m.to_s }
|
85
|
+
assert public_methods.include?("yahoo_geocoder")
|
86
|
+
assert public_methods.include?("google_geocoder")
|
87
|
+
assert public_methods.include?("ca_geocoder")
|
88
|
+
assert public_methods.include?("us_geocoder")
|
89
|
+
assert public_methods.include?("multi_geocoder")
|
90
|
+
assert public_methods.include?("ip_geocoder")
|
91
|
+
end
|
92
|
+
end
|
data/test/test_base_geocoder.rb
CHANGED
@@ -1,18 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
require 'net/http'
|
3
|
-
require 'rubygems'
|
4
|
-
require 'mocha'
|
5
|
-
require 'lib/geokit'
|
6
|
-
|
7
|
-
class MockSuccess < Net::HTTPSuccess #:nodoc: all
|
8
|
-
def initialize
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class MockFailure < Net::HTTPServiceUnavailable #:nodoc: all
|
13
|
-
def initialize
|
14
|
-
end
|
15
|
-
end
|
1
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
16
2
|
|
17
3
|
# Base class for testing geocoders.
|
18
4
|
class BaseGeocoderTest < Test::Unit::TestCase #:nodoc: all
|
data/test/test_bounds.rb
CHANGED
data/test/test_ca_geocoder.rb
CHANGED
data/test/test_geoloc.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
require '
|
2
|
-
require 'lib/geokit'
|
1
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
3
2
|
|
4
3
|
class GeoLocTest < Test::Unit::TestCase #:nodoc: all
|
5
4
|
|
@@ -64,9 +63,40 @@ class GeoLocTest < Test::Unit::TestCase #:nodoc: all
|
|
64
63
|
@loc.state = 'CA'
|
65
64
|
@loc.zip = '94105'
|
66
65
|
@loc.country_code = 'US'
|
67
|
-
|
68
|
-
|
69
|
-
|
66
|
+
|
67
|
+
yaml = YAML::parse(@loc.to_yaml)
|
68
|
+
case yaml.class.to_s
|
69
|
+
when 'YAML::Syck::Map', 'Syck::Map'
|
70
|
+
tag = yaml.type_id
|
71
|
+
children = yaml.value.sort_by{|k, v| k.value}.flatten.map(&:value)
|
72
|
+
when 'Psych::Nodes::Mapping'
|
73
|
+
tag = yaml.tag
|
74
|
+
children = yaml.children.map(&:value)
|
75
|
+
when 'Psych::Nodes::Document'
|
76
|
+
tag = yaml.root.tag
|
77
|
+
children = yaml.root.children.map(&:value)
|
78
|
+
end
|
79
|
+
assert_match /.*object:Geokit::GeoLoc$/, tag
|
80
|
+
assert_equal [
|
81
|
+
'city', 'San Francisco',
|
82
|
+
'country_code', 'US',
|
83
|
+
'full_address', '',
|
84
|
+
'lat', '',
|
85
|
+
'lng', '',
|
86
|
+
'precision', 'unknown',
|
87
|
+
'province', '',
|
88
|
+
'state', 'CA',
|
89
|
+
'street_address', '',
|
90
|
+
'street_name', '',
|
91
|
+
'street_number', '',
|
92
|
+
'sub_premise', '',
|
93
|
+
'success', 'false',
|
94
|
+
'zip', '94105'
|
95
|
+
], children
|
70
96
|
end
|
71
97
|
|
98
|
+
def test_neighborhood
|
99
|
+
@loc.neighborhood = "SoMa"
|
100
|
+
assert_equal @loc.neighborhood, 'SoMa'
|
101
|
+
end
|
72
102
|
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
# encoding: UTF-8
|
2
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
2
3
|
|
3
4
|
Geokit::Geocoders::google = 'Google'
|
4
5
|
|
@@ -31,6 +32,25 @@ class GoogleGeocoderTest < BaseGeocoderTest #:nodoc: all
|
|
31
32
|
GOOGLE_TOO_MANY=<<-EOF.strip
|
32
33
|
<?xml version="1.0" encoding="UTF-8"?><kml xmlns="http://earth.google.com/kml/2.0"><Response><name>100 spear st, san francisco, ca</name><Status><code>620</code><request>geocode</request></Status></Response></kml>
|
33
34
|
EOF
|
35
|
+
|
36
|
+
GOOGLE_UTF8_RESULT=<<-EOF
|
37
|
+
<?xml version="1.0" encoding="UTF-8" ?>
|
38
|
+
<kml xmlns="http://earth.google.com/kml/2.0"><Response>
|
39
|
+
<name>Mosjøen, Norway</name>
|
40
|
+
<Status>
|
41
|
+
<code>200</code>
|
42
|
+
<request>geocode</request>
|
43
|
+
</Status>
|
44
|
+
<Placemark id="p1">
|
45
|
+
<address>Mosjøen, Norway</address>
|
46
|
+
<AddressDetails Accuracy="4" xmlns="urn:oasis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>NO</CountryNameCode><CountryName>Norge</CountryName><AdministrativeArea><AdministrativeAreaName>Nordland</AdministrativeAreaName><SubAdministrativeArea><SubAdministrativeAreaName>Vefsn</SubAdministrativeAreaName><Locality><LocalityName>Mosjøen</LocalityName></Locality></SubAdministrativeArea></AdministrativeArea></Country></AddressDetails>
|
47
|
+
<ExtendedData>
|
48
|
+
<LatLonBox north="65.8551869" south="65.8186481" east="13.2574307" west="13.1293713" />
|
49
|
+
</ExtendedData>
|
50
|
+
<Point><coordinates>13.1934010,65.8369240,0</coordinates></Point>
|
51
|
+
</Placemark>
|
52
|
+
</Response></kml>
|
53
|
+
EOF
|
34
54
|
|
35
55
|
def setup
|
36
56
|
super
|
@@ -39,6 +59,8 @@ class GoogleGeocoderTest < BaseGeocoderTest #:nodoc: all
|
|
39
59
|
|
40
60
|
@google_full_loc = Geokit::GeoLoc.new(@google_full_hash)
|
41
61
|
@google_city_loc = Geokit::GeoLoc.new(@google_city_hash)
|
62
|
+
|
63
|
+
@address_with_special_characters = "Mosjøen, Norway"
|
42
64
|
end
|
43
65
|
|
44
66
|
def test_google_full_address
|
@@ -205,7 +227,7 @@ class GoogleGeocoderTest < BaseGeocoderTest #:nodoc: all
|
|
205
227
|
response = MockSuccess.new
|
206
228
|
response.expects(:body).returns(GOOGLE_BOUNDS_BIASED_RESULT)
|
207
229
|
|
208
|
-
url = "http://maps.google.com/maps/geo?q=Winnetka&output=xml&ll=34.
|
230
|
+
url = "http://maps.google.com/maps/geo?q=Winnetka&output=xml&ll=34.197693,-118.547160&spn=0.247048,0.294914&key=Google&oe=utf-8"
|
209
231
|
Geokit::Geocoders::GoogleGeocoder.expects(:call_geocoder_service).with(url).returns(response)
|
210
232
|
|
211
233
|
bounds = Geokit::Bounds.normalize([34.074081, -118.694401], [34.321129, -118.399487])
|
@@ -224,4 +246,19 @@ class GoogleGeocoderTest < BaseGeocoderTest #:nodoc: all
|
|
224
246
|
res=Geokit::Geocoders::GoogleGeocoder.geocode(@address)
|
225
247
|
end
|
226
248
|
end
|
249
|
+
|
250
|
+
def test_utf8_encoding
|
251
|
+
response = MockSuccess.new
|
252
|
+
body = GOOGLE_UTF8_RESULT
|
253
|
+
body = body.force_encoding('ASCII-8BIT') if body.respond_to? :force_encoding
|
254
|
+
response.expects(:body).returns(body)
|
255
|
+
url = "http://maps.google.com/maps/geo?q=#{Geokit::Inflector.url_escape(@address_with_special_characters)}&output=xml&key=Google&oe=utf-8"
|
256
|
+
Geokit::Geocoders::GoogleGeocoder.expects(:call_geocoder_service).with(url).returns(response)
|
257
|
+
res=Geokit::Geocoders::GoogleGeocoder.geocode(@address_with_special_characters)
|
258
|
+
assert_equal "Nordland", res.state
|
259
|
+
assert_equal "Mosjøen", res.city
|
260
|
+
assert_equal "65.836924,13.193401", res.ll
|
261
|
+
assert !res.is_us?
|
262
|
+
assert_equal "google", res.provider
|
263
|
+
end
|
227
264
|
end
|
@@ -1,6 +1,10 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), '
|
1
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
2
2
|
|
3
3
|
Geokit::Geocoders::google = 'Google'
|
4
|
+
Geokit::Geocoders::google_client_id = nil
|
5
|
+
Geokit::Geocoders::google_cryptographic_key = nil
|
6
|
+
Geokit::Geocoders::google_channel = nil
|
7
|
+
|
4
8
|
|
5
9
|
class GoogleGeocoder3Test < BaseGeocoderTest #:nodoc: all
|
6
10
|
|
@@ -372,6 +376,12 @@ class GoogleGeocoder3Test < BaseGeocoderTest #:nodoc: all
|
|
372
376
|
"status": "OVER_QUERY_LIMIT"
|
373
377
|
}
|
374
378
|
/
|
379
|
+
GOOGLE3_INVALID_REQUEST=%q/
|
380
|
+
{
|
381
|
+
"results" : [],
|
382
|
+
"status" : "INVALID_REQUEST"
|
383
|
+
}
|
384
|
+
/
|
375
385
|
def setup
|
376
386
|
super
|
377
387
|
@full_address = '100 Spear St Apt. 5, San Francisco, CA, 94105-1522, US'
|
@@ -383,6 +393,29 @@ class GoogleGeocoder3Test < BaseGeocoderTest #:nodoc: all
|
|
383
393
|
@google_city_loc = Geokit::GeoLoc.new(@google_city_hash)
|
384
394
|
end
|
385
395
|
|
396
|
+
|
397
|
+
# Example from:
|
398
|
+
# https://developers.google.com/maps/documentation/business/webservices#signature_examples
|
399
|
+
def test_google3_signature
|
400
|
+
cryptographic_key = 'vNIXE0xscrmjlyV-12Nj_BvUPaw='
|
401
|
+
query_string = '/maps/api/geocode/json?address=New+York&sensor=false&client=clientID'
|
402
|
+
signature = Geokit::Geocoders::GoogleGeocoder3.send(:sign_gmap_bus_api_url, query_string, cryptographic_key)
|
403
|
+
assert_equal 'KrU1TzVQM7Ur0i8i7K3huiw3MsA=', signature
|
404
|
+
end
|
405
|
+
|
406
|
+
|
407
|
+
# Example from:
|
408
|
+
# https://developers.google.com/maps/documentation/business/webservices#signature_examples
|
409
|
+
def test_google3_signature_and_url
|
410
|
+
Geokit::Geocoders::google_client_id = 'clientID'
|
411
|
+
Geokit::Geocoders::google_cryptographic_key = 'vNIXE0xscrmjlyV-12Nj_BvUPaw='
|
412
|
+
url = Geokit::Geocoders::GoogleGeocoder3.send(:submit_url, '/maps/api/geocode/json?address=New+York&sensor=false')
|
413
|
+
Geokit::Geocoders::google_client_id = nil
|
414
|
+
Geokit::Geocoders::google_cryptographic_key = nil
|
415
|
+
assert_equal 'http://maps.googleapis.com/maps/api/geocode/json?address=New+York&sensor=false&client=clientID&signature=KrU1TzVQM7Ur0i8i7K3huiw3MsA=', url
|
416
|
+
end
|
417
|
+
|
418
|
+
|
386
419
|
def test_google3_full_address
|
387
420
|
response = MockSuccess.new
|
388
421
|
response.expects(:body).returns(GOOGLE3_FULL)
|
@@ -418,7 +451,6 @@ class GoogleGeocoder3Test < BaseGeocoderTest #:nodoc: all
|
|
418
451
|
Geokit::Geocoders::GoogleGeocoder3.expects(:call_geocoder_service).with(url).returns(response)
|
419
452
|
res=Geokit::Geocoders::GoogleGeocoder3.geocode(@google_full_loc)
|
420
453
|
|
421
|
-
puts res.to_hash.inspect
|
422
454
|
assert_equal 9, res.accuracy
|
423
455
|
end
|
424
456
|
|
@@ -469,9 +501,19 @@ puts res.to_hash.inspect
|
|
469
501
|
res = Geokit::Geocoders::GoogleGeocoder3.geocode(@google_full_loc)
|
470
502
|
|
471
503
|
assert_instance_of Geokit::Bounds, res.suggested_bounds
|
472
|
-
assert_equal Geokit::Bounds.new(Geokit::LatLng.new(37.7908019197085, -122.
|
504
|
+
assert_equal Geokit::Bounds.new(Geokit::LatLng.new(37.7908019197085, -122.3953489802915), Geokit::LatLng.new(37.7934998802915, -122.3926510197085)), res.suggested_bounds
|
473
505
|
end
|
474
506
|
|
507
|
+
def test_google3_suggested_bounds_url
|
508
|
+
bounds = Geokit::Bounds.new(
|
509
|
+
Geokit::LatLng.new(33.7036917, -118.6681759),
|
510
|
+
Geokit::LatLng.new(34.3373061, -118.1552891)
|
511
|
+
)
|
512
|
+
url = "http://maps.google.com/maps/api/geocode/json?sensor=false&address=Winnetka&bounds=33.7036917%2C-118.6681759%7C34.3373061%2C-118.1552891"
|
513
|
+
Geokit::Geocoders::GoogleGeocoder3.expects(:call_geocoder_service).with(url)
|
514
|
+
Geokit::Geocoders::GoogleGeocoder3.geocode('Winnetka', :bias => bounds)
|
515
|
+
end
|
516
|
+
|
475
517
|
def test_service_unavailable
|
476
518
|
response = MockFailure.new
|
477
519
|
url = "http://maps.google.com/maps/api/geocode/json?sensor=false&address=#{Geokit::Inflector::url_escape(@address)}"
|
@@ -554,4 +596,14 @@ puts res.to_hash.inspect
|
|
554
596
|
res=Geokit::Geocoders::GoogleGeocoder3.geocode(@address)
|
555
597
|
end
|
556
598
|
end
|
599
|
+
|
600
|
+
def test_invalid_request
|
601
|
+
response = MockSuccess.new
|
602
|
+
response.expects(:body).returns(GOOGLE3_INVALID_REQUEST)
|
603
|
+
url = "http://maps.google.com/maps/api/geocode/json?sensor=false&address=#{Geokit::Inflector.url_escape("3961 V\u00EDa Marisol")}"
|
604
|
+
Geokit::Geocoders::GoogleGeocoder3.expects(:call_geocoder_service).with(url).returns(response)
|
605
|
+
assert_raise Geokit::Geocoders::GeocodeError do
|
606
|
+
Geokit::Geocoders::GoogleGeocoder3.geocode("3961 V\u00EDa Marisol")
|
607
|
+
end
|
608
|
+
end
|
557
609
|
end
|
data/test/test_inflector.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'test/unit'
|
4
|
-
require 'lib/geokit'
|
2
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
5
3
|
|
6
4
|
class InflectorTest < Test::Unit::TestCase #:nodoc: all
|
7
5
|
|
@@ -21,4 +19,8 @@ class InflectorTest < Test::Unit::TestCase #:nodoc: all
|
|
21
19
|
assert_equal 'Borås (Abc)', Geokit::Inflector.titleize('borås (abc)')
|
22
20
|
end
|
23
21
|
|
22
|
+
def test_url_escape
|
23
|
+
assert_equal '%E4%B8%8A%E6%B5%B7%E5%B8%82%E5%BE%90%E6%B1%87%E5%8C%BA%E6%BC%95%E6%BA%AA%E5%8C%97%E8%B7%AF1111%E5%8F%B7', GeoKit::Inflector.url_escape('上海市徐汇区漕溪北路1111号')
|
24
|
+
assert_equal '%C3%BC%C3%B6%C3%A4', Geokit::Inflector.url_escape('üöä')
|
25
|
+
end
|
24
26
|
end
|