geokit 1.8.5 → 1.9.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 +7 -0
- data/.travis.yml +0 -1
- data/CHANGELOG.md +7 -0
- data/README.markdown +31 -14
- data/fixtures/vcr_cassettes/geonames_geocode.yml +1 -1
- data/fixtures/vcr_cassettes/geonames_geocode_premium.yml +42 -0
- data/fixtures/vcr_cassettes/google_country_code_biased_result_orly.yml +160 -0
- data/fixtures/vcr_cassettes/google_country_code_biased_result_toledo.yml +111 -0
- data/fixtures/vcr_cassettes/google_result_toledo_default_bias.yml +275 -0
- data/fixtures/vcr_cassettes/google_sublocality.yml +126 -0
- data/fixtures/vcr_cassettes/mapbox_forward_geocode.yml +59 -0
- data/fixtures/vcr_cassettes/mapbox_reverse_geocode.yml +63 -0
- data/fixtures/vcr_cassettes/opencage_city.yml +51 -0
- data/fixtures/vcr_cassettes/opencage_full.yml +65 -0
- data/fixtures/vcr_cassettes/opencage_language_response_es.yml +66 -0
- data/fixtures/vcr_cassettes/opencage_reverse_madrid.yml +51 -0
- data/fixtures/vcr_cassettes/opencage_reverse_prilep.yml +53 -0
- data/geokit.gemspec +5 -3
- data/lib/geokit/bounds.rb +40 -31
- data/lib/geokit/core_ext.rb +1 -1
- data/lib/geokit/geo_loc.rb +63 -41
- data/lib/geokit/geocoders.rb +13 -13
- data/lib/geokit/geocoders/bing.rb +9 -9
- data/lib/geokit/geocoders/ca_geocoder.rb +29 -29
- data/lib/geokit/geocoders/fcc.rb +4 -4
- data/lib/geokit/geocoders/free_geo_ip.rb +6 -7
- data/lib/geokit/geocoders/geo_plugin.rb +5 -6
- data/lib/geokit/geocoders/geocodio.rb +2 -2
- data/lib/geokit/geocoders/geonames.rb +18 -12
- data/lib/geokit/geocoders/google.rb +31 -30
- data/lib/geokit/geocoders/ip.rb +3 -4
- data/lib/geokit/geocoders/mapbox.rb +94 -0
- data/lib/geokit/geocoders/mapquest.rb +5 -5
- data/lib/geokit/geocoders/opencage.rb +93 -0
- data/lib/geokit/geocoders/openstreetmap.rb +9 -6
- data/lib/geokit/geocoders/ripe.rb +3 -3
- data/lib/geokit/geocoders/us_geocoder.rb +10 -9
- data/lib/geokit/geocoders/yahoo.rb +33 -34
- data/lib/geokit/geocoders/yandex.rb +17 -17
- data/lib/geokit/inflectors.rb +4 -10
- data/lib/geokit/lat_lng.rb +50 -26
- data/lib/geokit/mappable.rb +83 -83
- data/lib/geokit/multi_geocoder.rb +25 -20
- data/lib/geokit/net_adapter/net_http.rb +7 -4
- data/lib/geokit/polygon.rb +36 -4
- data/lib/geokit/version.rb +1 -1
- data/test/helper.rb +15 -13
- data/test/test_base_geocoder.rb +6 -7
- data/test/test_bing_geocoder.rb +20 -21
- data/test/test_bounds.rb +26 -28
- data/test/test_ca_geocoder.rb +9 -10
- data/test/test_fcc_geocoder.rb +1 -1
- data/test/test_free_geo_ip_geocoder.rb +1 -1
- data/test/test_geo_plugin_geocoder.rb +9 -9
- data/test/test_geoloc.rb +7 -6
- data/test/test_geonames_geocoder.rb +28 -6
- data/test/test_google_geocoder.rb +210 -176
- data/test/test_inflector.rb +0 -1
- data/test/test_ipgeocoder.rb +17 -18
- data/test/test_latlng.rb +105 -85
- data/test/test_map_quest.rb +18 -21
- data/test/test_mapbox_geocoder.rb +31 -0
- data/test/test_mappable.rb +46 -0
- data/test/test_maxmind_geocoder.rb +1 -3
- data/test/test_multi_geocoder.rb +8 -9
- data/test/test_multi_ip_geocoder.rb +3 -5
- data/test/test_net_adapter.rb +4 -4
- data/test/test_opencage_geocoder.rb +108 -0
- data/test/test_openstreetmap_geocoder.rb +62 -44
- data/test/{test_polygon_contains.rb → test_polygon.rb} +30 -20
- data/test/test_ripe_geocoder.rb +2 -0
- data/test/test_us_geocoder.rb +7 -8
- data/test/test_yahoo_geocoder.rb +20 -21
- data/test/test_yandex_geocoder.rb +34 -35
- metadata +79 -56
- data/fixtures/vcr_cassettes/google_country_code_biased_result.yml +0 -401
@@ -2,10 +2,8 @@
|
|
2
2
|
require File.join(File.dirname(__FILE__), 'helper')
|
3
3
|
|
4
4
|
class PolygonTest < Test::Unit::TestCase #:nodoc: all
|
5
|
-
|
6
5
|
def setup
|
7
|
-
|
8
|
-
#Create a simple square-ish polygon for easy testing
|
6
|
+
# Create a simple square-ish polygon for easy testing
|
9
7
|
@p1 = Geokit::LatLng.new(45.3142533036254, -93.47527313511819)
|
10
8
|
@p2 = Geokit::LatLng.new(45.31232182518015, -93.34893036168069)
|
11
9
|
@p3 = Geokit::LatLng.new(45.23694281999268, -93.35167694371194)
|
@@ -18,7 +16,7 @@ class PolygonTest < Test::Unit::TestCase #:nodoc: all
|
|
18
16
|
@point_inside = Geokit::LatLng.new(45.27428243796789, -93.41648483416066)
|
19
17
|
@point_outside = Geokit::LatLng.new(45.45411010558687, -93.78151703160256)
|
20
18
|
|
21
|
-
#Create a more complex polygon with overlapping lines. Looks like a star of david
|
19
|
+
# Create a more complex polygon with overlapping lines. Looks like a star of david
|
22
20
|
@c1 = Geokit::LatLng.new(45.48661334374487, -93.74665833078325)
|
23
21
|
@c2 = Geokit::LatLng.new(45.53521281284293, -93.32611083984375)
|
24
22
|
@c3 = Geokit::LatLng.new(45.28648197278281, -93.3673095703125)
|
@@ -34,12 +32,12 @@ class PolygonTest < Test::Unit::TestCase #:nodoc: all
|
|
34
32
|
@complex_points = [@c1, @c2, @c3, @c4, @c5, @c6, @c7, @c8, @c9, @c10, @c11]
|
35
33
|
@complex_polygon = Geokit::Polygon.new(@complex_points)
|
36
34
|
|
37
|
-
#Test three points that should be "inside" this complex shape
|
35
|
+
# Test three points that should be "inside" this complex shape
|
38
36
|
@complex_inside_one = Geokit::LatLng.new(45.52438983143154, -93.59818268101662)
|
39
37
|
@complex_inside_two = Geokit::LatLng.new(45.50321887154943, -93.37845611851662)
|
40
38
|
@complex_inside_three = Geokit::LatLng.new(45.28334174918666, -93.59543609898537)
|
41
39
|
|
42
|
-
#Test three points that should be "outside" this complex shape
|
40
|
+
# Test three points that should be "outside" this complex shape
|
43
41
|
@complex_outside_one = Geokit::LatLng.new(45.45314676076135, -93.563850405626)
|
44
42
|
@complex_outside_two = Geokit::LatLng.new(45.30435378077673, -93.6859130859375)
|
45
43
|
@complex_outside_three = Geokit::LatLng.new(45.538820010517036, -93.486946108751)
|
@@ -52,34 +50,33 @@ class PolygonTest < Test::Unit::TestCase #:nodoc: all
|
|
52
50
|
|
53
51
|
@open_points = [@op1, @op2, @op3, @op4]
|
54
52
|
@open_polygon = Geokit::Polygon.new(@open_points)
|
55
|
-
|
56
53
|
end
|
57
54
|
|
58
55
|
def test_point_inside_poly
|
59
|
-
#puts "\n\nTesting point inside poly... {@polygon.contains?(@point_inside)}\n\n"
|
56
|
+
# puts "\n\nTesting point inside poly... {@polygon.contains?(@point_inside)}\n\n"
|
60
57
|
assert @polygon.contains?(@point_inside)
|
61
58
|
end
|
62
59
|
|
63
60
|
def test_point_outside_poly
|
64
|
-
#puts "\n\nTesting point outside poly... {@polygon.contains?(@point_outside)}\n\n"
|
61
|
+
# puts "\n\nTesting point outside poly... {@polygon.contains?(@point_outside)}\n\n"
|
65
62
|
assert !@polygon.contains?(@point_outside)
|
66
63
|
end
|
67
64
|
|
68
65
|
def test_points_inside_complex_poly
|
69
|
-
#puts "\n\nTesting points INSIDE complex poly..."
|
70
|
-
#puts "\tone: {@complex_polygon.contains?(@complex_inside_one)}"
|
71
|
-
#puts "\ttwo: {@complex_polygon.contains?(@complex_inside_two)}"
|
72
|
-
#puts "\tthree: {@complex_polygon.contains?(@complex_inside_three)}\n\n"
|
66
|
+
# puts "\n\nTesting points INSIDE complex poly..."
|
67
|
+
# puts "\tone: {@complex_polygon.contains?(@complex_inside_one)}"
|
68
|
+
# puts "\ttwo: {@complex_polygon.contains?(@complex_inside_two)}"
|
69
|
+
# puts "\tthree: {@complex_polygon.contains?(@complex_inside_three)}\n\n"
|
73
70
|
assert @complex_polygon.contains?(@complex_inside_one)
|
74
71
|
assert @complex_polygon.contains?(@complex_inside_two)
|
75
72
|
assert @complex_polygon.contains?(@complex_inside_three)
|
76
73
|
end
|
77
74
|
|
78
75
|
def test_points_outside_complex_poly
|
79
|
-
#puts "\n\nTesting points OUTSIDE complex poly..."
|
80
|
-
#puts "\tone: {@complex_polygon.contains?(@complex_outside_one)}"
|
81
|
-
#puts "\ttwo: {@complex_polygon.contains?(@complex_outside_two)}"
|
82
|
-
#puts "\tthree: {@complex_polygon.contains?(@complex_outside_three)}\n\n"
|
76
|
+
# puts "\n\nTesting points OUTSIDE complex poly..."
|
77
|
+
# puts "\tone: {@complex_polygon.contains?(@complex_outside_one)}"
|
78
|
+
# puts "\ttwo: {@complex_polygon.contains?(@complex_outside_two)}"
|
79
|
+
# puts "\tthree: {@complex_polygon.contains?(@complex_outside_three)}\n\n"
|
83
80
|
assert !@complex_polygon.contains?(@complex_outside_one)
|
84
81
|
assert !@complex_polygon.contains?(@complex_outside_two)
|
85
82
|
assert !@complex_polygon.contains?(@complex_outside_three)
|
@@ -89,13 +86,26 @@ class PolygonTest < Test::Unit::TestCase #:nodoc: all
|
|
89
86
|
# A polygon can only exist of the last point is equal to the first
|
90
87
|
# Otherwise, it would just be a line of points.
|
91
88
|
|
92
|
-
#puts "\n\nTesting intialize function to close an open polygon..."
|
93
|
-
#puts "\t Does poly_x[0] (#{@open_polygon.poly_x[0]}) == poly_x[-1] (#{@open_polygon.poly_x[-1]}) ?"
|
94
|
-
#puts "\t Does poly_y[0] (#{@open_polygon.poly_y[0]}) == poly_y[-1] (#{@open_polygon.poly_y[-1]}) ?"
|
89
|
+
# puts "\n\nTesting intialize function to close an open polygon..."
|
90
|
+
# puts "\t Does poly_x[0] (#{@open_polygon.poly_x[0]}) == poly_x[-1] (#{@open_polygon.poly_x[-1]}) ?"
|
91
|
+
# puts "\t Does poly_y[0] (#{@open_polygon.poly_y[0]}) == poly_y[-1] (#{@open_polygon.poly_y[-1]}) ?"
|
95
92
|
|
96
93
|
assert @open_polygon.points[0].lng == @open_polygon.points[-1].lng
|
97
94
|
assert @open_polygon.points[0].lat == @open_polygon.points[-1].lat
|
95
|
+
end
|
98
96
|
|
97
|
+
def test_centroid_for_simple_poly
|
98
|
+
@polygon_centroid = Geokit::LatLng.new(45.27463866133501, -93.41400121829719)
|
99
|
+
assert_equal(@polygon.centroid, @polygon_centroid)
|
99
100
|
end
|
100
101
|
|
102
|
+
def test_centroid_for_complex_poly
|
103
|
+
@complex_polygon_centroid = Geokit::LatLng.new(45.43622702936517, -93.5352210389731)
|
104
|
+
assert_equal(@complex_polygon.centroid, @complex_polygon_centroid)
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_centroid_for_open_poly
|
108
|
+
@open_polygon_centroid = Geokit::LatLng.new(44.95912726688109, -92.7068888186181)
|
109
|
+
assert_equal(@open_polygon.centroid, @open_polygon_centroid)
|
110
|
+
end
|
101
111
|
end
|
data/test/test_ripe_geocoder.rb
CHANGED
@@ -25,6 +25,7 @@ class RipeGeocoderTest < BaseGeocoderTest #:nodoc: all
|
|
25
25
|
assert_url url
|
26
26
|
assert_equal res.city, 'Mountain View'
|
27
27
|
assert_equal res.state, 'CA'
|
28
|
+
assert_equal res.state_code, 'CA'
|
28
29
|
assert_equal res.country_code, 'US'
|
29
30
|
end
|
30
31
|
end
|
@@ -36,6 +37,7 @@ class RipeGeocoderTest < BaseGeocoderTest #:nodoc: all
|
|
36
37
|
assert_url url
|
37
38
|
assert_equal res.city, 'Adelaide'
|
38
39
|
assert_equal res.state, nil
|
40
|
+
assert_equal res.state_code, nil
|
39
41
|
assert_equal res.country_code, 'AU'
|
40
42
|
end
|
41
43
|
end
|
data/test/test_us_geocoder.rb
CHANGED
@@ -3,12 +3,11 @@ require File.join(File.dirname(__FILE__), 'helper')
|
|
3
3
|
Geokit::Geocoders::UsGeocoder.key = nil
|
4
4
|
|
5
5
|
class UsGeocoderTest < BaseGeocoderTest #:nodoc: all
|
6
|
-
|
7
|
-
GEOCODER_US_FULL='37.792528,-122.393981,100 Spear St,San Francisco,CA,94105'
|
6
|
+
GEOCODER_US_FULL = '37.792528,-122.393981,100 Spear St,San Francisco,CA,94105'
|
8
7
|
|
9
8
|
def setup
|
10
9
|
super
|
11
|
-
@us_full_hash = {:
|
10
|
+
@us_full_hash = {city: 'San Francisco', state: 'CA'}
|
12
11
|
@us_full_loc = Geokit::GeoLoc.new(@us_full_hash)
|
13
12
|
end
|
14
13
|
|
@@ -40,17 +39,17 @@ class UsGeocoderTest < BaseGeocoderTest #:nodoc: all
|
|
40
39
|
response.expects(:body).returns(GEOCODER_US_FULL)
|
41
40
|
url = "http://geocoder.us/service/csv/geocode?address=#{Geokit::Inflector.url_escape(@address)}"
|
42
41
|
Geokit::Geocoders::UsGeocoder.expects(:call_geocoder_service).with(url).returns(response)
|
43
|
-
res=Geokit::Geocoders::UsGeocoder.geocode(@address)
|
42
|
+
res = Geokit::Geocoders::UsGeocoder.geocode(@address)
|
44
43
|
assert_equal 1, res.all.size
|
45
44
|
end
|
46
45
|
|
47
46
|
private
|
48
47
|
|
49
48
|
def verify(location)
|
50
|
-
assert_equal
|
51
|
-
assert_equal
|
52
|
-
assert_equal
|
49
|
+
assert_equal 'CA', location.state
|
50
|
+
assert_equal 'San Francisco', location.city
|
51
|
+
assert_equal '37.792528,-122.393981', location.ll
|
53
52
|
assert location.is_us?
|
54
|
-
assert_equal
|
53
|
+
assert_equal '100 Spear St, San Francisco, CA, 94105, US', location.full_address # slightly different from yahoo
|
55
54
|
end
|
56
55
|
end
|
data/test/test_yahoo_geocoder.rb
CHANGED
@@ -6,8 +6,8 @@ Geokit::Geocoders::YahooGeocoder.secret = 'SECRET'
|
|
6
6
|
class YahooGeocoderTest < BaseGeocoderTest #:nodoc: all
|
7
7
|
def setup
|
8
8
|
super
|
9
|
-
@yahoo_full_hash = {:
|
10
|
-
@yahoo_city_hash = {:
|
9
|
+
@yahoo_full_hash = {street_address: '100 Spear St', city: 'San Francisco', state: 'CA', zip: '94105-1522', country_code: 'US'}
|
10
|
+
@yahoo_city_hash = {city: 'San Francisco', state: 'CA'}
|
11
11
|
@yahoo_full_loc = Geokit::GeoLoc.new(@yahoo_full_hash)
|
12
12
|
@yahoo_city_loc = Geokit::GeoLoc.new(@yahoo_city_hash)
|
13
13
|
end
|
@@ -19,7 +19,7 @@ class YahooGeocoderTest < BaseGeocoderTest #:nodoc: all
|
|
19
19
|
# the testing methods themselves
|
20
20
|
def test_yahoo_full_address
|
21
21
|
VCR.use_cassette('yahoo_full') do
|
22
|
-
|
22
|
+
url = "https://yboss.yahooapis.com/geo/placefinder?flags=J&q=#{Geokit::Inflector.url_escape(@full_address)}"
|
23
23
|
do_full_address_assertions(Geokit::Geocoders::YahooGeocoder.geocode(@full_address))
|
24
24
|
assert_yahoo_url url
|
25
25
|
end
|
@@ -27,7 +27,7 @@ class YahooGeocoderTest < BaseGeocoderTest #:nodoc: all
|
|
27
27
|
|
28
28
|
def test_yahoo_full_address_accuracy
|
29
29
|
VCR.use_cassette('yahoo_full') do
|
30
|
-
|
30
|
+
url = "https://yboss.yahooapis.com/geo/placefinder?flags=J&q=#{Geokit::Inflector.url_escape(@full_address)}"
|
31
31
|
res = Geokit::Geocoders::YahooGeocoder.geocode(@full_address)
|
32
32
|
assert_yahoo_url url
|
33
33
|
assert_equal 8, res.accuracy
|
@@ -36,7 +36,7 @@ class YahooGeocoderTest < BaseGeocoderTest #:nodoc: all
|
|
36
36
|
|
37
37
|
def test_yahoo_full_address_with_geo_loc
|
38
38
|
VCR.use_cassette('yahoo_full') do
|
39
|
-
|
39
|
+
url = "https://yboss.yahooapis.com/geo/placefinder?flags=J&q=#{Geokit::Inflector.url_escape(@full_address)}"
|
40
40
|
do_full_address_assertions(Geokit::Geocoders::YahooGeocoder.geocode(@yahoo_full_loc))
|
41
41
|
assert_yahoo_url url
|
42
42
|
end
|
@@ -44,7 +44,7 @@ class YahooGeocoderTest < BaseGeocoderTest #:nodoc: all
|
|
44
44
|
|
45
45
|
def test_yahoo_city
|
46
46
|
VCR.use_cassette('yahoo_city') do
|
47
|
-
|
47
|
+
url = "https://yboss.yahooapis.com/geo/placefinder?flags=J&q=#{Geokit::Inflector.url_escape(@address)}"
|
48
48
|
do_city_assertions(Geokit::Geocoders::YahooGeocoder.geocode(@address))
|
49
49
|
assert_yahoo_url url
|
50
50
|
end
|
@@ -52,7 +52,7 @@ class YahooGeocoderTest < BaseGeocoderTest #:nodoc: all
|
|
52
52
|
|
53
53
|
def test_yahoo_city_accuracy
|
54
54
|
VCR.use_cassette('yahoo_city') do
|
55
|
-
|
55
|
+
url = "https://yboss.yahooapis.com/geo/placefinder?flags=J&q=#{Geokit::Inflector.url_escape(@address)}"
|
56
56
|
res = Geokit::Geocoders::YahooGeocoder.geocode(@address)
|
57
57
|
assert_yahoo_url url
|
58
58
|
assert_equal 4, res.accuracy
|
@@ -61,22 +61,22 @@ class YahooGeocoderTest < BaseGeocoderTest #:nodoc: all
|
|
61
61
|
|
62
62
|
def test_yahoo_city_with_geo_loc
|
63
63
|
VCR.use_cassette('yahoo_city') do
|
64
|
-
|
64
|
+
url = "https://yboss.yahooapis.com/geo/placefinder?flags=J&q=#{Geokit::Inflector.url_escape(@address)}"
|
65
65
|
do_city_assertions(Geokit::Geocoders::YahooGeocoder.geocode(@yahoo_city_loc))
|
66
66
|
assert_yahoo_url url
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
70
|
def test_no_results
|
71
|
-
no_results_address =
|
72
|
-
no_results_full_hash = {:
|
71
|
+
no_results_address = 'ZZ, ZZ, ZZ'
|
72
|
+
no_results_full_hash = {street_address: 'ZZ', city: 'ZZ', state: 'ZZ'}
|
73
73
|
no_results_full_loc = Geokit::GeoLoc.new(no_results_full_hash)
|
74
74
|
|
75
75
|
VCR.use_cassette('yahoo_no_results') do
|
76
|
-
|
76
|
+
url = "https://yboss.yahooapis.com/geo/placefinder?flags=J&q=#{Geokit::Inflector.url_escape(no_results_address)}"
|
77
77
|
result = Geokit::Geocoders::YahooGeocoder.geocode(no_results_address)
|
78
78
|
assert_yahoo_url url
|
79
|
-
assert_equal
|
79
|
+
assert_equal ',', result.ll
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
@@ -90,22 +90,21 @@ class YahooGeocoderTest < BaseGeocoderTest #:nodoc: all
|
|
90
90
|
|
91
91
|
# next two methods do the assertions for both address-level and city-level lookups
|
92
92
|
def do_full_address_assertions(res)
|
93
|
-
|
94
|
-
assert_equal
|
95
|
-
assert_equal "San Francisco", res.city
|
93
|
+
assert_equal 'CA', res.state
|
94
|
+
assert_equal 'San Francisco', res.city
|
96
95
|
assert_array_in_delta [37.792332, -122.393791], res.to_a
|
97
96
|
assert res.is_us?
|
98
|
-
assert_equal
|
99
|
-
assert_equal
|
97
|
+
assert_equal '100 Spear St, San Francisco, CA, 94105-1578, US', res.full_address
|
98
|
+
assert_equal 'yahoo', res.provider
|
100
99
|
end
|
101
100
|
|
102
101
|
def do_city_assertions(res)
|
103
|
-
assert_equal
|
104
|
-
assert_equal
|
102
|
+
assert_equal 'CA', res.state
|
103
|
+
assert_equal 'San Francisco', res.city
|
105
104
|
assert_array_in_delta [37.77713, -122.41964], res.to_a
|
106
105
|
assert res.is_us?
|
107
|
-
assert_equal
|
106
|
+
assert_equal 'San Francisco, CA, US', res.full_address
|
108
107
|
assert_nil res.street_address
|
109
|
-
assert_equal
|
108
|
+
assert_equal 'yahoo', res.provider
|
110
109
|
end
|
111
110
|
end
|
@@ -2,90 +2,89 @@
|
|
2
2
|
require File.join(File.dirname(__FILE__), 'helper')
|
3
3
|
|
4
4
|
class YandexGeocoderTest < BaseGeocoderTest #:nodoc: all
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
YANDEX_FULL = <<-EOF.strip
|
6
|
+
{"response":{"GeoObjectCollection":{"metaDataProperty":{"GeocoderResponseMetaData":{"request":"Москва, улица Новый Арбат, дом 24","found":"1","results":"10"}},"featureMember":[{"GeoObject":{"metaDataProperty":{"GeocoderMetaData":{"kind":"house","text":"Россия, Москва, улица Новый Арбат, 24","precision":"exact","AddressDetails":{"Country":{"AddressLine":"Москва, улица Новый Арбат, 24","CountryNameCode":"RU","CountryName":"Россия","Locality":{"LocalityName":"Москва","Thoroughfare":{"ThoroughfareName":"улица Новый Арбат","Premise":{"PremiseNumber":"24"}}}}}}},"description":"Москва, Россия","name":"улица Новый Арбат, 24","boundedBy":{"Envelope":{"lowerCorner":"37.585565 55.751928","upperCorner":"37.589662 55.754238"}},"Point":{"pos":"37.587614 55.753083"}}}]}}}
|
7
|
+
EOF
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YANDEX_REGION = <<-EOF.strip
|
10
|
+
{"response":{"GeoObjectCollection":{"metaDataProperty":{"GeocoderResponseMetaData":{"request":"Ростов-на-Дону, ул. Станиславского, д.21","found":"1","results":"10"}},"featureMember":[{"GeoObject":{"metaDataProperty":{"GeocoderMetaData":{"kind":"house","text":"Россия, Ростовская область, город Ростов-на-Дону, улица Станиславского, 21","precision":"exact","AddressDetails":{"Country":{"AddressLine":"Ростовская область, город Ростов-на-Дону, улица Станиславского, 21","CountryNameCode":"RU","CountryName":"Россия","AdministrativeArea":{"AdministrativeAreaName":"Ростовская область","Locality":{"LocalityName":"город Ростов-на-Дону","Thoroughfare":{"ThoroughfareName":"улица Станиславского","Premise":{"PremiseNumber":"21"}}}}}}}},"description":"город Ростов-на-Дону, Ростовская область, Россия","name":"улица Станиславского, 21","boundedBy":{"Envelope":{"lowerCorner":"39.701349 47.214507","upperCorner":"39.705446 47.217298"}},"Point":{"pos":"39.703398 47.215903"}}}]}}}
|
11
|
+
EOF
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YANDEX_CITY = <<-EOF.strip
|
14
|
+
{"response":{"GeoObjectCollection":{"metaDataProperty":{"GeocoderResponseMetaData":{"request":"город Москва","found":"1","results":"10"}},"featureMember":[{"GeoObject":{"metaDataProperty":{"GeocoderMetaData":{"kind":"locality","text":"Россия, Москва","precision":"other","AddressDetails":{"Country":{"AddressLine":"Москва","CountryNameCode":"RU","CountryName":"Россия","Locality":{"LocalityName":"Москва"}}}}},"description":"Россия","name":"Москва","boundedBy":{"Envelope":{"lowerCorner":"37.182743 55.490667","upperCorner":"37.964969 56.01074"}},"Point":{"pos":"37.617761 55.755773"}}}]}}}
|
15
|
+
EOF
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
YANDEX_NO_RESULTS = <<-EOF.strip
|
18
|
+
{"response":{"GeoObjectCollection":{"metaDataProperty":{"GeocoderResponseMetaData":{"request":"ZZ, ZZ, ZZ","found":"0","results":"10"}},"featureMember":[]}}}
|
19
|
+
EOF
|
20
20
|
|
21
21
|
def setup
|
22
22
|
super
|
23
|
-
@full_address =
|
24
|
-
@address =
|
23
|
+
@full_address = 'Москва, улица Новый Арбат, дом 24'
|
24
|
+
@address = 'город Москва'
|
25
25
|
end
|
26
26
|
|
27
27
|
# the testing methods themselves
|
28
28
|
def test_yandex_full_address
|
29
29
|
response = MockSuccess.new
|
30
30
|
response.expects(:body).returns(YANDEX_FULL)
|
31
|
-
url = "http://geocode-maps.yandex.ru/1.x/?geocode=#{Geokit::Inflector
|
31
|
+
url = "http://geocode-maps.yandex.ru/1.x/?geocode=#{Geokit::Inflector.url_escape(@full_address)}&format=json"
|
32
32
|
Geokit::Geocoders::YandexGeocoder.expects(:call_geocoder_service).with(url).returns(response)
|
33
33
|
res = Geokit::Geocoders::YandexGeocoder.geocode(@full_address)
|
34
34
|
|
35
|
-
assert_equal
|
36
|
-
assert_equal
|
37
|
-
assert_equal
|
35
|
+
assert_equal 'yandex', res.provider
|
36
|
+
assert_equal 'улица Новый Арбат, 24', res.street_address
|
37
|
+
assert_equal 'Москва', res.city
|
38
38
|
assert_equal 55.753083, res.lat
|
39
39
|
assert_equal 37.587614, res.lng
|
40
|
-
assert_equal
|
40
|
+
assert_equal 'RU', res.country_code
|
41
41
|
assert res.success
|
42
42
|
end
|
43
43
|
|
44
44
|
def test_yandex_full_address_with_region
|
45
|
-
region_address =
|
45
|
+
region_address = 'Ростов-на-Дону, ул. Станиславского, д.21'
|
46
46
|
response = MockSuccess.new
|
47
47
|
response.expects(:body).returns(YANDEX_REGION)
|
48
|
-
url = "http://geocode-maps.yandex.ru/1.x/?geocode=#{Geokit::Inflector
|
48
|
+
url = "http://geocode-maps.yandex.ru/1.x/?geocode=#{Geokit::Inflector.url_escape(region_address)}&format=json"
|
49
49
|
Geokit::Geocoders::YandexGeocoder.expects(:call_geocoder_service).with(url).returns(response)
|
50
50
|
res = Geokit::Geocoders::YandexGeocoder.geocode(region_address)
|
51
51
|
|
52
|
-
assert_equal
|
53
|
-
assert_equal
|
54
|
-
assert_equal
|
55
|
-
assert_equal
|
52
|
+
assert_equal 'yandex', res.provider
|
53
|
+
assert_equal 'улица Станиславского, 21', res.street_address
|
54
|
+
assert_equal 'город Ростов на Дону', res.city
|
55
|
+
assert_equal 'Ростовская область', res.state
|
56
56
|
assert_equal 47.215903, res.lat
|
57
57
|
assert_equal 39.703398, res.lng
|
58
|
-
assert_equal
|
58
|
+
assert_equal 'RU', res.country_code
|
59
59
|
assert res.success
|
60
60
|
end
|
61
61
|
|
62
62
|
def test_yandex_city
|
63
63
|
response = MockSuccess.new
|
64
64
|
response.expects(:body).returns(YANDEX_CITY)
|
65
|
-
url = "http://geocode-maps.yandex.ru/1.x/?geocode=#{Geokit::Inflector
|
65
|
+
url = "http://geocode-maps.yandex.ru/1.x/?geocode=#{Geokit::Inflector.url_escape(@address)}&format=json"
|
66
66
|
Geokit::Geocoders::YandexGeocoder.expects(:call_geocoder_service).with(url).returns(response)
|
67
67
|
res = Geokit::Geocoders::YandexGeocoder.geocode(@address)
|
68
68
|
|
69
|
-
assert_equal
|
70
|
-
assert_equal
|
71
|
-
assert_equal
|
69
|
+
assert_equal 'yandex', res.provider
|
70
|
+
assert_equal 'city', res.precision
|
71
|
+
assert_equal 'Москва', res.city
|
72
72
|
assert_equal 55.755773, res.lat
|
73
73
|
assert_equal 37.617761, res.lng
|
74
|
-
assert_equal
|
74
|
+
assert_equal 'RU', res.country_code
|
75
75
|
assert res.success
|
76
76
|
end
|
77
77
|
|
78
|
-
|
79
78
|
def test_no_results
|
80
|
-
no_results_address =
|
79
|
+
no_results_address = 'ZZ, ZZ, ZZ'
|
81
80
|
# no_results_full_hash = {:street_address=>"ZZ", :city=>"ZZ", :state=>"ZZ"}
|
82
81
|
# no_results_full_loc = Geokit::GeoLoc.new(no_results_full_hash)
|
83
82
|
|
84
83
|
response = MockSuccess.new
|
85
84
|
response.expects(:body).returns(YANDEX_NO_RESULTS)
|
86
|
-
url = "http://geocode-maps.yandex.ru/1.x/?geocode=#{Geokit::Inflector
|
85
|
+
url = "http://geocode-maps.yandex.ru/1.x/?geocode=#{Geokit::Inflector.url_escape(no_results_address)}&format=json"
|
87
86
|
Geokit::Geocoders::YandexGeocoder.expects(:call_geocoder_service).with(url).returns(response)
|
88
87
|
result = Geokit::Geocoders::YandexGeocoder.geocode(no_results_address)
|
89
|
-
assert_equal
|
88
|
+
assert_equal ',', result.ll
|
90
89
|
end
|
91
90
|
end
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geokit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.9.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Michael Noack
|
@@ -12,166 +11,174 @@ authors:
|
|
12
11
|
autorequire:
|
13
12
|
bindir: bin
|
14
13
|
cert_chain: []
|
15
|
-
date: 2014-
|
14
|
+
date: 2014-10-01 00:00:00.000000000 Z
|
16
15
|
dependencies:
|
17
16
|
- !ruby/object:Gem::Dependency
|
18
17
|
name: multi_json
|
19
18
|
requirement: !ruby/object:Gem::Requirement
|
20
|
-
none: false
|
21
19
|
requirements:
|
22
|
-
- -
|
20
|
+
- - ">="
|
23
21
|
- !ruby/object:Gem::Version
|
24
22
|
version: 1.3.2
|
25
23
|
type: :runtime
|
26
24
|
prerelease: false
|
27
25
|
version_requirements: !ruby/object:Gem::Requirement
|
28
|
-
none: false
|
29
26
|
requirements:
|
30
|
-
- -
|
27
|
+
- - ">="
|
31
28
|
- !ruby/object:Gem::Version
|
32
29
|
version: 1.3.2
|
33
30
|
- !ruby/object:Gem::Dependency
|
34
31
|
name: bundler
|
35
32
|
requirement: !ruby/object:Gem::Requirement
|
36
|
-
none: false
|
37
33
|
requirements:
|
38
|
-
- -
|
34
|
+
- - ">"
|
39
35
|
- !ruby/object:Gem::Version
|
40
36
|
version: '1.0'
|
41
37
|
type: :development
|
42
38
|
prerelease: false
|
43
39
|
version_requirements: !ruby/object:Gem::Requirement
|
44
|
-
none: false
|
45
40
|
requirements:
|
46
|
-
- -
|
41
|
+
- - ">"
|
47
42
|
- !ruby/object:Gem::Version
|
48
43
|
version: '1.0'
|
49
44
|
- !ruby/object:Gem::Dependency
|
50
45
|
name: simplecov
|
51
46
|
requirement: !ruby/object:Gem::Requirement
|
52
|
-
none: false
|
53
47
|
requirements:
|
54
|
-
- -
|
48
|
+
- - ">="
|
55
49
|
- !ruby/object:Gem::Version
|
56
50
|
version: '0'
|
57
51
|
type: :development
|
58
52
|
prerelease: false
|
59
53
|
version_requirements: !ruby/object:Gem::Requirement
|
60
|
-
none: false
|
61
54
|
requirements:
|
62
|
-
- -
|
55
|
+
- - ">="
|
63
56
|
- !ruby/object:Gem::Version
|
64
57
|
version: '0'
|
65
58
|
- !ruby/object:Gem::Dependency
|
66
59
|
name: simplecov-rcov
|
67
60
|
requirement: !ruby/object:Gem::Requirement
|
68
|
-
none: false
|
69
61
|
requirements:
|
70
|
-
- -
|
62
|
+
- - ">="
|
71
63
|
- !ruby/object:Gem::Version
|
72
64
|
version: '0'
|
73
65
|
type: :development
|
74
66
|
prerelease: false
|
75
67
|
version_requirements: !ruby/object:Gem::Requirement
|
76
|
-
none: false
|
77
68
|
requirements:
|
78
|
-
- -
|
69
|
+
- - ">="
|
79
70
|
- !ruby/object:Gem::Version
|
80
71
|
version: '0'
|
81
72
|
- !ruby/object:Gem::Dependency
|
82
73
|
name: rake
|
83
74
|
requirement: !ruby/object:Gem::Requirement
|
84
|
-
none: false
|
85
75
|
requirements:
|
86
|
-
- -
|
76
|
+
- - ">="
|
87
77
|
- !ruby/object:Gem::Version
|
88
78
|
version: '0'
|
89
79
|
type: :development
|
90
80
|
prerelease: false
|
91
81
|
version_requirements: !ruby/object:Gem::Requirement
|
92
|
-
none: false
|
93
82
|
requirements:
|
94
|
-
- -
|
83
|
+
- - ">="
|
95
84
|
- !ruby/object:Gem::Version
|
96
85
|
version: '0'
|
97
86
|
- !ruby/object:Gem::Dependency
|
98
87
|
name: mocha
|
99
88
|
requirement: !ruby/object:Gem::Requirement
|
100
|
-
none: false
|
101
89
|
requirements:
|
102
|
-
- -
|
90
|
+
- - ">="
|
103
91
|
- !ruby/object:Gem::Version
|
104
92
|
version: '0'
|
105
93
|
type: :development
|
106
94
|
prerelease: false
|
107
95
|
version_requirements: !ruby/object:Gem::Requirement
|
108
|
-
none: false
|
109
96
|
requirements:
|
110
|
-
- -
|
97
|
+
- - ">="
|
111
98
|
- !ruby/object:Gem::Version
|
112
99
|
version: '0'
|
113
100
|
- !ruby/object:Gem::Dependency
|
114
101
|
name: coveralls
|
115
102
|
requirement: !ruby/object:Gem::Requirement
|
116
|
-
none: false
|
117
103
|
requirements:
|
118
|
-
- -
|
104
|
+
- - ">="
|
119
105
|
- !ruby/object:Gem::Version
|
120
106
|
version: '0'
|
121
107
|
type: :development
|
122
108
|
prerelease: false
|
123
109
|
version_requirements: !ruby/object:Gem::Requirement
|
124
|
-
none: false
|
125
110
|
requirements:
|
126
|
-
- -
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
114
|
+
- !ruby/object:Gem::Dependency
|
115
|
+
name: rubocop
|
116
|
+
requirement: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
121
|
+
type: :development
|
122
|
+
prerelease: false
|
123
|
+
version_requirements: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
128
|
+
- !ruby/object:Gem::Dependency
|
129
|
+
name: pre-commit
|
130
|
+
requirement: !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '0'
|
135
|
+
type: :development
|
136
|
+
prerelease: false
|
137
|
+
version_requirements: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - ">="
|
127
140
|
- !ruby/object:Gem::Version
|
128
141
|
version: '0'
|
129
142
|
- !ruby/object:Gem::Dependency
|
130
143
|
name: vcr
|
131
144
|
requirement: !ruby/object:Gem::Requirement
|
132
|
-
none: false
|
133
145
|
requirements:
|
134
|
-
- -
|
146
|
+
- - ">="
|
135
147
|
- !ruby/object:Gem::Version
|
136
148
|
version: '0'
|
137
149
|
type: :development
|
138
150
|
prerelease: false
|
139
151
|
version_requirements: !ruby/object:Gem::Requirement
|
140
|
-
none: false
|
141
152
|
requirements:
|
142
|
-
- -
|
153
|
+
- - ">="
|
143
154
|
- !ruby/object:Gem::Version
|
144
155
|
version: '0'
|
145
156
|
- !ruby/object:Gem::Dependency
|
146
157
|
name: webmock
|
147
158
|
requirement: !ruby/object:Gem::Requirement
|
148
|
-
none: false
|
149
159
|
requirements:
|
150
|
-
- -
|
160
|
+
- - ">="
|
151
161
|
- !ruby/object:Gem::Version
|
152
162
|
version: '0'
|
153
163
|
type: :development
|
154
164
|
prerelease: false
|
155
165
|
version_requirements: !ruby/object:Gem::Requirement
|
156
|
-
none: false
|
157
166
|
requirements:
|
158
|
-
- -
|
167
|
+
- - ">="
|
159
168
|
- !ruby/object:Gem::Version
|
160
169
|
version: '0'
|
161
170
|
- !ruby/object:Gem::Dependency
|
162
171
|
name: typhoeus
|
163
172
|
requirement: !ruby/object:Gem::Requirement
|
164
|
-
none: false
|
165
173
|
requirements:
|
166
|
-
- -
|
174
|
+
- - ">="
|
167
175
|
- !ruby/object:Gem::Version
|
168
176
|
version: '0'
|
169
177
|
type: :development
|
170
178
|
prerelease: false
|
171
179
|
version_requirements: !ruby/object:Gem::Requirement
|
172
|
-
none: false
|
173
180
|
requirements:
|
174
|
-
- -
|
181
|
+
- - ">="
|
175
182
|
- !ruby/object:Gem::Version
|
176
183
|
version: '0'
|
177
184
|
description: Geokit provides geocoding and distance calculation in an easy-to-use
|
@@ -183,8 +190,8 @@ extensions: []
|
|
183
190
|
extra_rdoc_files:
|
184
191
|
- README.markdown
|
185
192
|
files:
|
186
|
-
- .gitignore
|
187
|
-
- .travis.yml
|
193
|
+
- ".gitignore"
|
194
|
+
- ".travis.yml"
|
188
195
|
- CHANGELOG.md
|
189
196
|
- Gemfile
|
190
197
|
- MIT-LICENSE
|
@@ -199,16 +206,27 @@ files:
|
|
199
206
|
- fixtures/vcr_cassettes/geo_plugin_geocode.yml
|
200
207
|
- fixtures/vcr_cassettes/geocodio_geocode.yml
|
201
208
|
- fixtures/vcr_cassettes/geonames_geocode.yml
|
209
|
+
- fixtures/vcr_cassettes/geonames_geocode_premium.yml
|
202
210
|
- fixtures/vcr_cassettes/google_city.yml
|
203
|
-
- fixtures/vcr_cassettes/
|
211
|
+
- fixtures/vcr_cassettes/google_country_code_biased_result_orly.yml
|
212
|
+
- fixtures/vcr_cassettes/google_country_code_biased_result_toledo.yml
|
204
213
|
- fixtures/vcr_cassettes/google_full.yml
|
205
214
|
- fixtures/vcr_cassettes/google_full_short.yml
|
206
215
|
- fixtures/vcr_cassettes/google_language_response_fr.yml
|
207
216
|
- fixtures/vcr_cassettes/google_multi.yml
|
217
|
+
- fixtures/vcr_cassettes/google_result_toledo_default_bias.yml
|
208
218
|
- fixtures/vcr_cassettes/google_reverse_madrid.yml
|
209
219
|
- fixtures/vcr_cassettes/google_reverse_madrid_es.yml
|
220
|
+
- fixtures/vcr_cassettes/google_sublocality.yml
|
210
221
|
- fixtures/vcr_cassettes/map_quest_full.yml
|
211
222
|
- fixtures/vcr_cassettes/map_quest_reverse_madrid.yml
|
223
|
+
- fixtures/vcr_cassettes/mapbox_forward_geocode.yml
|
224
|
+
- fixtures/vcr_cassettes/mapbox_reverse_geocode.yml
|
225
|
+
- fixtures/vcr_cassettes/opencage_city.yml
|
226
|
+
- fixtures/vcr_cassettes/opencage_full.yml
|
227
|
+
- fixtures/vcr_cassettes/opencage_language_response_es.yml
|
228
|
+
- fixtures/vcr_cassettes/opencage_reverse_madrid.yml
|
229
|
+
- fixtures/vcr_cassettes/opencage_reverse_prilep.yml
|
212
230
|
- fixtures/vcr_cassettes/ripe_geocode.yml
|
213
231
|
- fixtures/vcr_cassettes/ripe_geocode_45.yml
|
214
232
|
- fixtures/vcr_cassettes/ripe_geocode_au.yml
|
@@ -231,8 +249,10 @@ files:
|
|
231
249
|
- lib/geokit/geocoders/geonames.rb
|
232
250
|
- lib/geokit/geocoders/google.rb
|
233
251
|
- lib/geokit/geocoders/ip.rb
|
252
|
+
- lib/geokit/geocoders/mapbox.rb
|
234
253
|
- lib/geokit/geocoders/mapquest.rb
|
235
254
|
- lib/geokit/geocoders/maxmind.rb
|
255
|
+
- lib/geokit/geocoders/opencage.rb
|
236
256
|
- lib/geokit/geocoders/openstreetmap.rb
|
237
257
|
- lib/geokit/geocoders/ripe.rb
|
238
258
|
- lib/geokit/geocoders/us_geocoder.rb
|
@@ -262,13 +282,15 @@ files:
|
|
262
282
|
- test/test_ipgeocoder.rb
|
263
283
|
- test/test_latlng.rb
|
264
284
|
- test/test_map_quest.rb
|
285
|
+
- test/test_mapbox_geocoder.rb
|
265
286
|
- test/test_mappable.rb
|
266
287
|
- test/test_maxmind_geocoder.rb
|
267
288
|
- test/test_multi_geocoder.rb
|
268
289
|
- test/test_multi_ip_geocoder.rb
|
269
290
|
- test/test_net_adapter.rb
|
291
|
+
- test/test_opencage_geocoder.rb
|
270
292
|
- test/test_openstreetmap_geocoder.rb
|
271
|
-
- test/
|
293
|
+
- test/test_polygon.rb
|
272
294
|
- test/test_ripe_geocoder.rb
|
273
295
|
- test/test_us_geocoder.rb
|
274
296
|
- test/test_yahoo_geocoder.rb
|
@@ -276,30 +298,29 @@ files:
|
|
276
298
|
homepage: http://github.com/geokit/geokit
|
277
299
|
licenses:
|
278
300
|
- MIT
|
301
|
+
metadata: {}
|
279
302
|
post_install_message:
|
280
303
|
rdoc_options:
|
281
|
-
- --main
|
304
|
+
- "--main"
|
282
305
|
- README.markdown
|
283
306
|
require_paths:
|
284
307
|
- lib
|
285
308
|
required_ruby_version: !ruby/object:Gem::Requirement
|
286
|
-
none: false
|
287
309
|
requirements:
|
288
|
-
- -
|
310
|
+
- - ">="
|
289
311
|
- !ruby/object:Gem::Version
|
290
312
|
version: '0'
|
291
313
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
292
|
-
none: false
|
293
314
|
requirements:
|
294
|
-
- -
|
315
|
+
- - ">="
|
295
316
|
- !ruby/object:Gem::Version
|
296
317
|
version: '0'
|
297
318
|
requirements: []
|
298
319
|
rubyforge_project:
|
299
|
-
rubygems_version:
|
320
|
+
rubygems_version: 2.2.2
|
300
321
|
signing_key:
|
301
|
-
specification_version:
|
302
|
-
summary:
|
322
|
+
specification_version: 4
|
323
|
+
summary: 'Geokit: encoding and distance calculation gem'
|
303
324
|
test_files:
|
304
325
|
- test/helper.rb
|
305
326
|
- test/test_base_geocoder.rb
|
@@ -317,13 +338,15 @@ test_files:
|
|
317
338
|
- test/test_ipgeocoder.rb
|
318
339
|
- test/test_latlng.rb
|
319
340
|
- test/test_map_quest.rb
|
341
|
+
- test/test_mapbox_geocoder.rb
|
320
342
|
- test/test_mappable.rb
|
321
343
|
- test/test_maxmind_geocoder.rb
|
322
344
|
- test/test_multi_geocoder.rb
|
323
345
|
- test/test_multi_ip_geocoder.rb
|
324
346
|
- test/test_net_adapter.rb
|
347
|
+
- test/test_opencage_geocoder.rb
|
325
348
|
- test/test_openstreetmap_geocoder.rb
|
326
|
-
- test/
|
349
|
+
- test/test_polygon.rb
|
327
350
|
- test/test_ripe_geocoder.rb
|
328
351
|
- test/test_us_geocoder.rb
|
329
352
|
- test/test_yahoo_geocoder.rb
|