geokit 1.10.0 → 1.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.hound.yml +2 -0
- data/.rubocop.yml +358 -0
- data/.travis.yml +4 -4
- data/CHANGELOG.md +16 -0
- data/Gemfile +3 -3
- data/README.markdown +19 -4
- data/Rakefile +11 -16
- data/fixtures/keys.yml +9 -0
- data/fixtures/vcr_cassettes/google_postal_town.yml +117 -0
- data/fixtures/vcr_cassettes/mapbox_forward_geocode.yml +30 -30
- data/fixtures/vcr_cassettes/mapbox_forward_geocode_city_only.yml +25 -25
- data/fixtures/vcr_cassettes/mapbox_forward_geocode_state_only.yml +71 -0
- data/fixtures/vcr_cassettes/mapbox_reverse_geocode.yml +25 -25
- data/fixtures/vcr_cassettes/test_component_filtering_off.yml +390 -0
- data/fixtures/vcr_cassettes/test_component_filtering_on.yml +164 -0
- data/fixtures/vcr_cassettes/test_component_filtering_on_without_filter.yml +404 -0
- data/geokit.gemspec +24 -23
- data/lib/geokit.rb +7 -7
- data/lib/geokit/core_ext.rb +1 -1
- data/lib/geokit/geo_loc.rb +25 -19
- data/lib/geokit/geocoders.rb +21 -30
- data/lib/geokit/geocoders/bing.rb +5 -4
- data/lib/geokit/geocoders/ca_geocoder.rb +10 -11
- data/lib/geokit/geocoders/fcc.rb +9 -9
- data/lib/geokit/geocoders/free_geo_ip.rb +8 -8
- data/lib/geokit/geocoders/geo_plugin.rb +7 -7
- data/lib/geokit/geocoders/geobytes.rb +10 -10
- data/lib/geokit/geocoders/geocodio.rb +14 -14
- data/lib/geokit/geocoders/geonames.rb +12 -12
- data/lib/geokit/geocoders/google.rb +89 -61
- data/lib/geokit/geocoders/ip.rb +9 -14
- data/lib/geokit/geocoders/mapbox.rb +30 -30
- data/lib/geokit/geocoders/mapquest.rb +12 -12
- data/lib/geokit/geocoders/maxmind.rb +1 -1
- data/lib/geokit/geocoders/opencage.rb +19 -19
- data/lib/geokit/geocoders/openstreetmap.rb +21 -19
- data/lib/geokit/geocoders/ripe.rb +7 -7
- data/lib/geokit/geocoders/us_geocoder.rb +5 -5
- data/lib/geokit/geocoders/yahoo.rb +46 -46
- data/lib/geokit/geocoders/yandex.rb +18 -17
- data/lib/geokit/inflectors.rb +5 -5
- data/lib/geokit/lat_lng.rb +5 -4
- data/lib/geokit/multi_geocoder.rb +4 -2
- data/lib/geokit/net_adapter/net_http.rb +3 -2
- data/lib/geokit/net_adapter/typhoeus.rb +2 -1
- data/lib/geokit/version.rb +1 -1
- data/test/coverage_loader.rb +25 -0
- data/test/helper.rb +18 -87
- data/test/test_base_geocoder.rb +44 -11
- data/test/test_bing_geocoder.rb +40 -48
- data/test/test_bounds.rb +1 -1
- data/test/test_ca_geocoder.rb +15 -15
- data/test/test_fcc_geocoder.rb +8 -9
- data/test/test_free_geo_ip_geocoder.rb +8 -10
- data/test/test_geo_plugin_geocoder.rb +21 -22
- data/test/test_geobytes_geocoder.rb +9 -11
- data/test/test_geocodio_geocoder.rb +12 -14
- data/test/test_geoloc.rb +48 -49
- data/test/test_geonames_geocoder.rb +19 -23
- data/test/test_google_geocoder.rb +197 -189
- data/test/test_inflector.rb +7 -7
- data/test/test_ipgeocoder.rb +32 -31
- data/test/test_latlng.rb +28 -28
- data/test/test_map_quest.rb +23 -27
- data/test/test_mapbox_geocoder.rb +38 -28
- data/test/test_mappable.rb +2 -2
- data/test/test_maxmind_geocoder.rb +16 -16
- data/test/test_multi_geocoder.rb +5 -5
- data/test/test_multi_ip_geocoder.rb +3 -3
- data/test/test_net_adapter.rb +4 -4
- data/test/test_opencage_geocoder.rb +58 -67
- data/test/test_openstreetmap_geocoder.rb +67 -65
- data/test/test_polygon.rb +4 -22
- data/test/test_ripe_geocoder.rb +21 -26
- data/test/test_us_geocoder.rb +21 -21
- data/test/test_useragent.rb +46 -0
- data/test/test_yahoo_geocoder.rb +35 -47
- data/test/test_yandex_geocoder.rb +29 -27
- data/test/vcr_loader.rb +18 -0
- metadata +20 -6
@@ -8,7 +8,7 @@ module Geokit
|
|
8
8
|
private
|
9
9
|
|
10
10
|
# Template method which does the geocode lookup.
|
11
|
-
def self.do_geocode(address)
|
11
|
+
def self.do_geocode(address, _=nil)
|
12
12
|
process :json, submit_url(address)
|
13
13
|
end
|
14
14
|
|
@@ -22,18 +22,18 @@ module Geokit
|
|
22
22
|
def self.parse_json(result)
|
23
23
|
loc = new_loc
|
24
24
|
|
25
|
-
coll = result[
|
26
|
-
return loc unless coll[
|
25
|
+
coll = result['response']['GeoObjectCollection']
|
26
|
+
return loc unless coll['metaDataProperty']['GeocoderResponseMetaData']['found'].to_i > 0
|
27
27
|
|
28
|
-
l = coll[
|
28
|
+
l = coll['featureMember'][0]['GeoObject']
|
29
29
|
|
30
30
|
loc.success = true
|
31
|
-
ll = l[
|
31
|
+
ll = l['Point']['pos'].split(' ')
|
32
32
|
loc.lng = ll.first
|
33
33
|
loc.lat = ll.last
|
34
34
|
|
35
|
-
country = l[
|
36
|
-
locality = country[
|
35
|
+
country = l['metaDataProperty']['GeocoderMetaData']['AddressDetails']['Country']
|
36
|
+
locality = country['Locality'] || country['AdministrativeArea']['Locality'] || country['AdministrativeArea']['SubAdministrativeArea']['Locality'] rescue nil
|
37
37
|
set_address_components(loc, l, country, locality)
|
38
38
|
set_precision(loc, l, locality)
|
39
39
|
|
@@ -41,19 +41,20 @@ module Geokit
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def self.set_address_components(loc, l, country, locality)
|
44
|
-
loc.country_code = country[
|
45
|
-
loc.full_address = country[
|
46
|
-
loc.street_address = l[
|
47
|
-
loc.street_number = locality[
|
48
|
-
loc.street_name = locality[
|
49
|
-
loc.city = locality[
|
50
|
-
loc.state_name = country[
|
51
|
-
loc.
|
44
|
+
loc.country_code = country['CountryNameCode']
|
45
|
+
loc.full_address = country['AddressLine']
|
46
|
+
loc.street_address = l['name']
|
47
|
+
loc.street_number = locality['Thoroughfare']['Premise']['PremiseNumber'] rescue nil
|
48
|
+
loc.street_name = locality['Thoroughfare']['ThoroughfareName'] rescue nil
|
49
|
+
loc.city = locality['LocalityName'] rescue nil
|
50
|
+
loc.state_name = country['AdministrativeArea']['AdministrativeAreaName'] rescue nil
|
51
|
+
loc.district = country['AdministrativeArea']['SubAdministrativeArea']['SubAdministrativeAreaName'] rescue nil
|
52
|
+
loc.state ||= country['Locality']['LocalityName'] rescue nil
|
52
53
|
end
|
53
54
|
|
54
55
|
def self.set_precision(loc, l, locality)
|
55
|
-
loc.precision = l[
|
56
|
-
loc.precision =
|
56
|
+
loc.precision = l['metaDataProperty']['GeocoderMetaData']['precision'].sub(/exact/, 'building').sub(/number|near/, 'address').sub(/other/, 'city')
|
57
|
+
loc.precision = 'country' unless locality
|
57
58
|
end
|
58
59
|
end
|
59
60
|
end
|
data/lib/geokit/inflectors.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'cgi'
|
2
2
|
|
3
3
|
module Geokit
|
4
4
|
module Inflector
|
@@ -9,15 +9,15 @@ module Geokit
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def underscore(camel_cased_word)
|
12
|
-
camel_cased_word.to_s.gsub(/::/,
|
12
|
+
camel_cased_word.to_s.gsub(/::/, '/').
|
13
13
|
gsub(/([A-Z]+)([A-Z][a-z])/u, '\1_\2').
|
14
14
|
gsub(/([a-z\d])([A-Z])/u, '\1_\2').
|
15
|
-
tr(
|
15
|
+
tr('-', '_').
|
16
16
|
downcase
|
17
17
|
end
|
18
18
|
|
19
19
|
def humanize(lower_case_and_underscored_word)
|
20
|
-
lower_case_and_underscored_word.to_s.gsub(/_id$/,
|
20
|
+
lower_case_and_underscored_word.to_s.gsub(/_id$/, '').gsub(/_/, ' ').capitalize
|
21
21
|
end
|
22
22
|
|
23
23
|
def url_escape(s)
|
@@ -25,7 +25,7 @@ module Geokit
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def camelize(str)
|
28
|
-
str.split(
|
28
|
+
str.split('_').map(&:capitalize).join
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
data/lib/geokit/lat_lng.rb
CHANGED
@@ -23,7 +23,7 @@ module Geokit
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def self.from_json(json)
|
26
|
-
new(json[
|
26
|
+
new(json['lat'], json['lng'])
|
27
27
|
end
|
28
28
|
|
29
29
|
# Latitude attribute setter; stored as a float.
|
@@ -102,7 +102,7 @@ module Geokit
|
|
102
102
|
when Array
|
103
103
|
thing.size == 2 or
|
104
104
|
raise(ArgumentError,
|
105
|
-
|
105
|
+
'Must initialize with an Array with both latitude and longitude')
|
106
106
|
Geokit::LatLng.new(thing[0], thing[1])
|
107
107
|
when LatLng # will also be true for GeoLocs
|
108
108
|
thing
|
@@ -112,14 +112,15 @@ module Geokit
|
|
112
112
|
else
|
113
113
|
raise(ArgumentError,
|
114
114
|
"#{thing} (#{thing.class}) cannot be normalized to a LatLng. " \
|
115
|
-
|
115
|
+
'We tried interpreting it as an array, string, etc., but no dice.')
|
116
116
|
end
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
120
|
def self.from_string(thing)
|
121
121
|
thing.strip!
|
122
|
-
|
122
|
+
match = thing.match(/(\-?\d+\.?\d*)[, ] ?(\-?\d+\.?\d*)$/)
|
123
|
+
if match
|
123
124
|
Geokit::LatLng.new(match[1], match[2])
|
124
125
|
else
|
125
126
|
res = Geokit::Geocoders::MultiGeocoder.geocode(thing)
|
@@ -46,7 +46,9 @@ module Geokit
|
|
46
46
|
# the configuration until one of the geocoders work, only this time it's
|
47
47
|
# going to try to reverse geocode a geographical point.
|
48
48
|
def self.do_reverse_geocode(latlng, *args)
|
49
|
-
|
49
|
+
provider_order = provider_order_for(latlng, args)
|
50
|
+
|
51
|
+
provider_order.each do |provider|
|
50
52
|
klass = geocoder(provider)
|
51
53
|
begin
|
52
54
|
res = klass.send :reverse_geocode, latlng
|
@@ -69,7 +71,7 @@ module Geokit
|
|
69
71
|
if args.last.is_a?(Hash) && args.last.key?(:provider_order)
|
70
72
|
args.last.delete(:provider_order)
|
71
73
|
else
|
72
|
-
if /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/.match(address)
|
74
|
+
if address.is_a?(String) && /^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/.match(address)
|
73
75
|
Geokit::Geocoders.ip_provider_order
|
74
76
|
else
|
75
77
|
Geokit::Geocoders.provider_order
|
@@ -3,7 +3,8 @@ module Geokit
|
|
3
3
|
class NetHttp
|
4
4
|
def self.do_get(url)
|
5
5
|
uri = URI(url)
|
6
|
-
|
6
|
+
Geokit::Geocoders.useragent ? headers = {'User-Agent' => Geokit::Geocoders.useragent} : headers = {}
|
7
|
+
req = Net::HTTP::Get.new(uri.request_uri, headers)
|
7
8
|
req.basic_auth(uri.user, uri.password) if uri.userinfo
|
8
9
|
net_http_args = [uri.host, uri.port]
|
9
10
|
if (proxy_uri_string = Geokit::Geocoders.proxy)
|
@@ -14,7 +15,7 @@ module Geokit
|
|
14
15
|
proxy_uri.password]
|
15
16
|
end
|
16
17
|
http = Net::HTTP.new(*net_http_args)
|
17
|
-
if uri.scheme ==
|
18
|
+
if uri.scheme == 'https'
|
18
19
|
http.use_ssl = true
|
19
20
|
http.verify_mode = Geokit::Geocoders.ssl_verify_mode
|
20
21
|
end
|
@@ -2,7 +2,8 @@ module Geokit
|
|
2
2
|
module NetAdapter
|
3
3
|
class Typhoeus
|
4
4
|
def self.do_get(url)
|
5
|
-
::
|
5
|
+
headers = Geokit::Geocoders.useragent ? {'User-Agent' => Geokit::Geocoders.useragent} : {}
|
6
|
+
::Typhoeus.get(url.to_s, :headers => headers)
|
6
7
|
end
|
7
8
|
|
8
9
|
def self.success?(response)
|
data/lib/geokit/version.rb
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
unless ENV['COVERAGE'] == 'off'
|
2
|
+
COVERAGE_THRESHOLD = 96
|
3
|
+
require 'simplecov'
|
4
|
+
require 'simplecov-rcov'
|
5
|
+
require 'coveralls'
|
6
|
+
Coveralls.wear!
|
7
|
+
|
8
|
+
SimpleCov.formatters = [
|
9
|
+
SimpleCov::Formatter::RcovFormatter,
|
10
|
+
Coveralls::SimpleCov::Formatter
|
11
|
+
]
|
12
|
+
SimpleCov.start do
|
13
|
+
add_filter '/test/'
|
14
|
+
add_group 'lib', 'lib'
|
15
|
+
end
|
16
|
+
SimpleCov.at_exit do
|
17
|
+
SimpleCov.result.format!
|
18
|
+
percent = SimpleCov.result.covered_percent
|
19
|
+
puts "Coverage is #{'%.2f' % percent}%"
|
20
|
+
unless percent >= COVERAGE_THRESHOLD
|
21
|
+
puts "Coverage must be above #{COVERAGE_THRESHOLD}%"
|
22
|
+
Kernel.exit(1)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/test/helper.rb
CHANGED
@@ -1,45 +1,22 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
begin
|
4
|
-
require
|
5
|
-
require
|
4
|
+
require 'rubygems'
|
5
|
+
require 'bundler'
|
6
6
|
Bundler.setup
|
7
7
|
rescue LoadError => e
|
8
8
|
puts "Error loading bundler (#{e.message}): \"gem install bundler\" for bundler support."
|
9
9
|
end
|
10
10
|
|
11
|
-
require
|
11
|
+
require 'geoip'
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
Coveralls.wear!
|
13
|
+
require 'coverage_loader'
|
14
|
+
require 'vcr_loader'
|
15
|
+
require 'test/unit'
|
16
|
+
require 'mocha/setup'
|
17
|
+
require 'net/http'
|
19
18
|
|
20
|
-
|
21
|
-
SimpleCov::Formatter::RcovFormatter,
|
22
|
-
Coveralls::SimpleCov::Formatter
|
23
|
-
]
|
24
|
-
SimpleCov.start do
|
25
|
-
add_filter "/test/"
|
26
|
-
add_group "lib", "lib"
|
27
|
-
end
|
28
|
-
SimpleCov.at_exit do
|
29
|
-
SimpleCov.result.format!
|
30
|
-
percent = SimpleCov.result.covered_percent
|
31
|
-
unless percent >= COVERAGE_THRESHOLD
|
32
|
-
puts "Coverage must be above #{COVERAGE_THRESHOLD}%. It is #{'%.2f' % percent}%"
|
33
|
-
Kernel.exit(1)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
require "test/unit"
|
39
|
-
require "mocha/setup"
|
40
|
-
require "net/http"
|
41
|
-
|
42
|
-
require File.join(File.dirname(__FILE__), "../lib/geokit.rb")
|
19
|
+
require File.join(File.dirname(__FILE__), '../lib/geokit.rb')
|
43
20
|
|
44
21
|
class MockSuccess < Net::HTTPSuccess #:nodoc: all
|
45
22
|
def initialize
|
@@ -58,11 +35,12 @@ class MockFailure < Net::HTTPServiceUnavailable #:nodoc: all
|
|
58
35
|
end
|
59
36
|
|
60
37
|
class TestHelper
|
61
|
-
def self.last_url(url)
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
38
|
+
def self.last_url(url = nil)
|
39
|
+
if url
|
40
|
+
@@url = url
|
41
|
+
else
|
42
|
+
@@url
|
43
|
+
end
|
66
44
|
end
|
67
45
|
end
|
68
46
|
|
@@ -78,7 +56,7 @@ Geokit::Geocoders::Geocoder.class_eval do
|
|
78
56
|
end
|
79
57
|
end
|
80
58
|
|
81
|
-
def assert_array_in_delta(expected_array, actual_array, delta = 0.001, message =
|
59
|
+
def assert_array_in_delta(expected_array, actual_array, delta = 0.001, message = '')
|
82
60
|
full_message = build_message(message, "<?> and\n<?> expected to be within\n<?> of each other.\n", expected_array, actual_array, delta)
|
83
61
|
assert_block(full_message) do
|
84
62
|
expected_array.zip(actual_array).all? do |expected_item, actual_item|
|
@@ -87,53 +65,6 @@ def assert_array_in_delta(expected_array, actual_array, delta = 0.001, message =
|
|
87
65
|
end
|
88
66
|
end
|
89
67
|
|
90
|
-
|
91
|
-
|
92
|
-
VCR.configure do |c|
|
93
|
-
c.before_record do |i|
|
94
|
-
i.response.body.force_encoding("UTF-8")
|
95
|
-
end
|
96
|
-
c.cassette_library_dir = "fixtures/vcr_cassettes"
|
97
|
-
c.hook_into :webmock # or :fakeweb
|
98
|
-
# Yahoo BOSS Ignore changing params
|
99
|
-
c.default_cassette_options = {
|
100
|
-
match_requests_on: [:method,
|
101
|
-
VCR.request_matchers.uri_without_params(
|
102
|
-
:oauth_nonce, :oauth_timestamp, :oauth_signature
|
103
|
-
),
|
104
|
-
],
|
105
|
-
}
|
106
|
-
end
|
107
|
-
|
108
|
-
# Base class for testing geocoders.
|
109
|
-
class BaseGeocoderTest < Test::Unit::TestCase #:nodoc: all
|
110
|
-
class Geokit::Geocoders::TestGeocoder < Geokit::Geocoders::Geocoder
|
111
|
-
def self.do_get(url)
|
112
|
-
sleep(2)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
# Defines common test fixtures.
|
117
|
-
def setup
|
118
|
-
Geokit::Geocoders.request_timeout = 10
|
119
|
-
@address = "San Francisco, CA"
|
120
|
-
@full_address = "100 Spear St, San Francisco, CA, 94105-1522, US"
|
121
|
-
@full_address_short_zip = "100 Spear St, San Francisco, CA, 94105, US"
|
122
|
-
|
123
|
-
@latlng = Geokit::LatLng.new(37.7742, -122.417068)
|
124
|
-
@success = Geokit::GeoLoc.new({city: "SAN FRANCISCO", state: "CA", country_code: "US", lat: @latlng.lat, lng: @latlng.lng})
|
125
|
-
@success.success = true
|
126
|
-
end
|
127
|
-
|
128
|
-
def test_timeout_call_web_service
|
129
|
-
url = "http://www.anything.com"
|
130
|
-
Geokit::Geocoders.request_timeout = 1
|
131
|
-
assert_nil Geokit::Geocoders::TestGeocoder.call_geocoder_service(url)
|
132
|
-
end
|
133
|
-
|
134
|
-
def test_successful_call_web_service
|
135
|
-
url = "http://www.anything.com"
|
136
|
-
Geokit::Geocoders::Geocoder.expects(:do_get).with(url).returns("SUCCESS")
|
137
|
-
assert_equal "SUCCESS", Geokit::Geocoders::Geocoder.call_geocoder_service(url)
|
138
|
-
end
|
68
|
+
def assert_ll(lat_lng, lat, lng)
|
69
|
+
assert_equal lat_lng, Geokit::LatLng.new(lat, lng)
|
139
70
|
end
|
data/test/test_base_geocoder.rb
CHANGED
@@ -1,33 +1,66 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),
|
1
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
2
2
|
|
3
3
|
# Base class for testing geocoders.
|
4
4
|
class BaseGeocoderTest < Test::Unit::TestCase #:nodoc: all
|
5
5
|
class Geokit::Geocoders::TestGeocoder < Geokit::Geocoders::Geocoder
|
6
|
-
def self.do_get(
|
7
|
-
sleep(2)
|
6
|
+
def self.do_get(_url)
|
8
7
|
end
|
9
8
|
end
|
10
9
|
|
11
10
|
# Defines common test fixtures.
|
12
11
|
def setup
|
13
|
-
@address =
|
14
|
-
@full_address =
|
15
|
-
@full_address_short_zip =
|
12
|
+
@address = 'San Francisco, CA'
|
13
|
+
@full_address = '100 Spear St, San Francisco, CA, 94105-1522, US'
|
14
|
+
@full_address_short_zip = '100 Spear St, San Francisco, CA, 94105, US'
|
16
15
|
|
17
16
|
@latlng = Geokit::LatLng.new(37.7742, -122.417068)
|
18
|
-
@success = Geokit::GeoLoc.new({city:
|
17
|
+
@success = Geokit::GeoLoc.new({city: 'SAN FRANCISCO', state: 'CA', country_code: 'US', lat: @latlng.lat, lng: @latlng.lng})
|
19
18
|
@success.success = true
|
19
|
+
|
20
|
+
@keys = YAML.load(File.read('fixtures/keys.yml'))
|
20
21
|
end
|
21
22
|
|
22
23
|
def test_timeout_call_web_service
|
23
|
-
url =
|
24
|
+
url = 'http://www.anything.com'
|
24
25
|
Geokit::Geocoders.request_timeout = 1
|
25
26
|
assert_nil Geokit::Geocoders::TestGeocoder.call_geocoder_service(url)
|
26
27
|
end
|
27
28
|
|
28
29
|
def test_successful_call_web_service
|
29
|
-
url =
|
30
|
-
Geokit::Geocoders::Geocoder.expects(:do_get).with(url).returns(
|
31
|
-
assert_equal
|
30
|
+
url = 'http://www.anything.com'
|
31
|
+
Geokit::Geocoders::Geocoder.expects(:do_get).with(url).returns('SUCCESS')
|
32
|
+
assert_equal 'SUCCESS', Geokit::Geocoders::Geocoder.call_geocoder_service(url)
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def geocode(address, *args)
|
38
|
+
options = args.pop if args.last.is_a?(Hash)
|
39
|
+
vcr_name = args.first
|
40
|
+
args = [address]
|
41
|
+
args << options if options && !options.empty?
|
42
|
+
return geocoder_class.geocode(*args) unless vcr_name
|
43
|
+
VCR.use_cassette(vcr_name) do
|
44
|
+
geocoder_class.geocode(*args)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def reverse_geocode(lat_lng, *args)
|
49
|
+
options = args.pop if args.last.is_a?(Hash)
|
50
|
+
vcr_name = args.first
|
51
|
+
args = [lat_lng]
|
52
|
+
args << options if options && !options.empty?
|
53
|
+
return geocoder_class.reverse_geocode(*args) unless vcr_name
|
54
|
+
VCR.use_cassette(vcr_name) do
|
55
|
+
geocoder_class.reverse_geocode(*args)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def geocoder_class
|
60
|
+
@geocoder_class ||= Geokit::Geocoders.const_get(self.class.name.gsub('Test', ''))
|
61
|
+
end
|
62
|
+
|
63
|
+
def escape(string)
|
64
|
+
Geokit::Inflector.url_escape(string)
|
32
65
|
end
|
33
66
|
end
|
data/test/test_bing_geocoder.rb
CHANGED
@@ -1,82 +1,74 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__),
|
2
|
-
|
3
|
-
Geokit::Geocoders::BingGeocoder.key = "AuWcmtBIoPeOubm9BtcN44hTmWw_wNoJ5NEO2L0RaKrGAUE_nlwciKAqwapdq7k7"
|
1
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
4
2
|
|
5
3
|
class BingGeocoderTest < BaseGeocoderTest #:nodoc: all
|
6
4
|
def setup
|
5
|
+
geocoder_class.key = 'AuWcmtBIoPeOubm9BtcN44hTmWw_wNoJ5NEO2L0RaKrGAUE_nlwciKAqwapdq7k7'
|
7
6
|
super
|
7
|
+
@base_url = 'https://dev.virtualearth.net/REST/v1/Locations'
|
8
8
|
end
|
9
9
|
|
10
10
|
def assert_url(expected_url)
|
11
|
-
assert_equal expected_url, TestHelper.
|
11
|
+
assert_equal expected_url, TestHelper.last_url.gsub(/&oauth_[a-z_]+=[a-zA-Z0-9\-. %]+/, '')
|
12
12
|
end
|
13
13
|
|
14
14
|
# the testing methods themselves
|
15
15
|
def test_bing_full_address
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
assert_equal
|
21
|
-
assert_equal "San Francisco", res.city
|
16
|
+
key = geocoder_class.key
|
17
|
+
url = "#{@base_url}/#{URI.escape(@full_address)}?key=#{key}&o=xml"
|
18
|
+
res = geocode(@full_address, :bing_full)
|
19
|
+
assert_equal 'CA', res.state
|
20
|
+
assert_equal 'San Francisco', res.city
|
22
21
|
assert_array_in_delta [37.792332, -122.393791], res.to_a
|
23
|
-
assert res.country ==
|
24
|
-
assert_equal
|
25
|
-
assert_equal
|
22
|
+
assert res.country == 'United States'
|
23
|
+
assert_equal '100 Spear St, San Francisco, CA 94105', res.full_address
|
24
|
+
assert_equal 'bing', res.provider
|
26
25
|
assert_url url
|
27
|
-
end
|
28
26
|
end
|
29
27
|
|
30
28
|
def test_bing_full_address_au
|
31
|
-
address =
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
assert_equal
|
37
|
-
assert_equal "Adelaide", res.city
|
29
|
+
address = '440 King William Street, Adelaide, Australia'
|
30
|
+
key = geocoder_class.key
|
31
|
+
url = "#{@base_url}/#{URI.escape(address)}?key=#{key}&o=xml"
|
32
|
+
res = geocode(address, :bing_full_au)
|
33
|
+
assert_equal 'SA', res.state
|
34
|
+
assert_equal 'Adelaide', res.city
|
38
35
|
assert_array_in_delta [-34.934582, 138.600784], res.to_a
|
39
|
-
assert res.country ==
|
40
|
-
assert_equal
|
41
|
-
assert_equal
|
42
|
-
assert_equal
|
36
|
+
assert res.country == 'Australia'
|
37
|
+
assert_equal '402-440 King William St, Adelaide, SA 5000', res.full_address
|
38
|
+
assert_equal 'Australia', res.country
|
39
|
+
assert_equal 'bing', res.provider
|
43
40
|
assert_url url
|
44
|
-
end
|
45
41
|
end
|
46
42
|
|
47
43
|
def test_bing_full_address_de
|
48
|
-
address =
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
assert_equal
|
54
|
-
assert_equal "Berlin", res.city
|
44
|
+
address = 'Platz der Republik 1, 11011 Berlin, Germany'
|
45
|
+
key = geocoder_class.key
|
46
|
+
url = "#{@base_url}/#{URI.escape(address)}?key=#{key}&o=xml"
|
47
|
+
res = geocode(address, :bing_full_de)
|
48
|
+
assert_equal 'BE', res.state
|
49
|
+
assert_equal 'Berlin', res.city
|
55
50
|
assert_array_in_delta [52.518596, 13.375502], res.to_a
|
56
|
-
assert res.country ==
|
57
|
-
assert_equal
|
58
|
-
assert_equal
|
59
|
-
assert_equal
|
51
|
+
assert res.country == 'Germany'
|
52
|
+
assert_equal 'Platz der Republik 1, 10557 Berlin', res.full_address
|
53
|
+
assert_equal 'bing', res.provider
|
54
|
+
assert_equal 'address', res.precision
|
60
55
|
assert_equal 8, res.accuracy
|
61
56
|
assert_url url
|
62
|
-
end
|
63
57
|
end
|
64
58
|
|
65
59
|
def test_bing_country
|
66
|
-
address =
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
res = Geokit::Geocoders::BingGeocoder.geocode(address)
|
60
|
+
address = 'Australia'
|
61
|
+
key = geocoder_class.key
|
62
|
+
url = "#{@base_url}/#{URI.escape(address)}?key=#{key}&o=xml"
|
63
|
+
res = geocode(address, :bing_au)
|
71
64
|
assert_equal nil, res.state
|
72
65
|
assert_equal nil, res.city
|
73
66
|
assert_array_in_delta [-25.585, 134.504], res.to_a
|
74
|
-
assert res.country ==
|
75
|
-
assert_equal
|
76
|
-
assert_equal
|
77
|
-
assert_equal
|
67
|
+
assert res.country == 'Australia'
|
68
|
+
assert_equal 'Australia', res.full_address
|
69
|
+
assert_equal 'bing', res.provider
|
70
|
+
assert_equal 'country', res.precision
|
78
71
|
assert_equal 8, res.accuracy
|
79
72
|
assert_url url
|
80
|
-
end
|
81
73
|
end
|
82
74
|
end
|