geokit 1.10.0 → 1.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|