geokit 1.11.0 → 1.12.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/.rubocop.yml +1 -1
- data/CHANGELOG.md +8 -0
- data/README.markdown +16 -3
- data/fixtures/vcr_cassettes/ip_api_geocode.yml +35 -0
- data/fixtures/vcr_cassettes/ipstack_geocode.yml +44 -0
- data/lib/geokit/geocoders.rb +2 -0
- data/lib/geokit/geocoders/free_geo_ip.rb +4 -0
- data/lib/geokit/geocoders/google.rb +3 -2
- data/lib/geokit/geocoders/ip_api_geocoder.rb +31 -0
- data/lib/geokit/geocoders/ipstack.rb +36 -0
- data/lib/geokit/lat_lng.rb +1 -1
- data/lib/geokit/version.rb +1 -1
- data/test/test_google_geocoder.rb +13 -0
- data/test/test_ip_api_geocoder.rb +23 -0
- data/test/test_ipstack_geocoder.rb +27 -0
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45cd130b831e467dddf0f1ee196ad1a9c454709d
|
4
|
+
data.tar.gz: abc3aae596ba4407b204936be4f5af7b7cc07ff6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f38b92f2a28271fe715528a4508af36f388b7303f54f1fd9423e939e36771912dadbbe84b88ff40a5a69f20596b9e14e12bd95bb1479cc450636c583796b6d0b
|
7
|
+
data.tar.gz: 6713c52093f575b38576a426586447f4b921d5df80f53f277145d82de36e8e1ad7f126bfdadf328d5772f4cbb450988036701753f9e69796ecd392376cb58e57
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/README.markdown
CHANGED
@@ -62,7 +62,9 @@ Combine this gem with the [geokit-rails](http://github.com/geokit/geokit-rails)
|
|
62
62
|
* Geobytes
|
63
63
|
* RIPE
|
64
64
|
* MaxMind
|
65
|
-
*
|
65
|
+
* Ipstack
|
66
|
+
* freegeoip.net (deprecated, now Ipstack)
|
67
|
+
* IP-API.com
|
66
68
|
|
67
69
|
### HTTPS-supporting geocoders
|
68
70
|
* Google
|
@@ -169,6 +171,11 @@ If you're using this gem by itself, here are the configuration options:
|
|
169
171
|
# See http://www.geonames.org
|
170
172
|
Geokit::Geocoders::GeonamesGeocoder.key = 'KEY'
|
171
173
|
|
174
|
+
# This is your access key for ipstack.
|
175
|
+
# To use this service either free or premium, you must register a key.
|
176
|
+
# See https://ipstack.com
|
177
|
+
Geokit::Geocoders::IpstackGeocoder.api_key = 'API_KEY'
|
178
|
+
|
172
179
|
# Most other geocoders need either no setup or a key
|
173
180
|
Geokit::Geocoders::BingGeocoder.key = ''
|
174
181
|
Geokit::Geocoders::MapQuestGeocoder.key = ''
|
@@ -187,13 +194,19 @@ If you're using this gem by itself, here are the configuration options:
|
|
187
194
|
|
188
195
|
# This is the order in which the geocoders are called in a failover scenario
|
189
196
|
# If you only want to use a single geocoder, put a single symbol in the array.
|
190
|
-
#
|
197
|
+
#
|
198
|
+
# Valid symbols are: :bing, :ca, :fcc, :geocodio, :geonames, :google,
|
199
|
+
# :map_quest, :mapbox, :maxmind, :opencage, :osm, :us, :yahoo, and :yandex.
|
200
|
+
#
|
191
201
|
# Be aware that there are Terms of Use restrictions on how you can use the
|
192
202
|
# various geocoders. Make sure you read up on relevant Terms of Use for each
|
193
203
|
# geocoder you are going to use.
|
194
204
|
Geokit::Geocoders::provider_order = [:google,:us]
|
195
205
|
|
196
|
-
# The IP provider order.
|
206
|
+
# The IP provider order.
|
207
|
+
#
|
208
|
+
# Valid symbols are :ipstack, :geo_plugin, :geobytes, :ip, and :ripe.
|
209
|
+
#
|
197
210
|
# As before, make sure you read up on relevant Terms of Use for each.
|
198
211
|
# Geokit::Geocoders::ip_provider_order = [:external,:geo_plugin,:ip]
|
199
212
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://ip-api.com/json/74.125.237.209
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept-Encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
Accept:
|
13
|
+
- "*/*"
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Access-Control-Allow-Origin:
|
22
|
+
- "*"
|
23
|
+
Content-Type:
|
24
|
+
- application/json; charset=utf-8
|
25
|
+
Date:
|
26
|
+
- Sat, 23 Sep 2017 04:40:17 GMT
|
27
|
+
Content-Length:
|
28
|
+
- '287'
|
29
|
+
body:
|
30
|
+
encoding: UTF-8
|
31
|
+
string: '{"as":"AS15169 Google Inc.","city":"Mountain View","country":"United
|
32
|
+
States","countryCode":"US","isp":"Google","lat":37.4192,"lon":-122.0574,"org":"Google","query":"74.125.237.209","region":"CA","regionName":"California","status":"success","timezone":"America/Los_Angeles","zip":"94043"}'
|
33
|
+
http_version:
|
34
|
+
recorded_at: Sat, 23 Sep 2017 04:34:33 GMT
|
35
|
+
recorded_with: VCR 3.0.3
|
@@ -0,0 +1,44 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://api.ipstack.com/68.194.36.44?access_key=some_api_key
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept-Encoding:
|
11
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
12
|
+
Accept:
|
13
|
+
- "*/*"
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Server:
|
22
|
+
- nginx
|
23
|
+
Date:
|
24
|
+
- Tue, 08 May 2018 13:21:13 GMT
|
25
|
+
Content-Type:
|
26
|
+
- application/json; Charset=UTF-8
|
27
|
+
Transfer-Encoding:
|
28
|
+
- chunked
|
29
|
+
X-Apilayer-Transaction-Id:
|
30
|
+
- 595071a3-1531-41eb-8697-1143f21a78cb
|
31
|
+
Access-Control-Allow-Origin:
|
32
|
+
- "*"
|
33
|
+
X-Request-Time:
|
34
|
+
- '0.026'
|
35
|
+
body:
|
36
|
+
encoding: UTF-8
|
37
|
+
string: '{"ip":"68.194.36.44","type":"ipv4","continent_code":"NA","continent_name":"North
|
38
|
+
America","country_code":"US","country_name":"United States","region_code":"NY","region_name":"New
|
39
|
+
York","city":"The Bronx","zip":"10466","latitude":40.8913,"longitude":-73.8448,"location":{"geoname_id":5110266,"capital":"Washington
|
40
|
+
D.C.","languages":[{"code":"en","name":"English","native":"English"}],"country_flag":"http:\/\/assets.ipstack.com\/flags\/us.svg","country_flag_emoji":"\ud83c\uddfa\ud83c\uddf8","country_flag_emoji_unicode":"U+1F1FA
|
41
|
+
U+1F1F8","calling_code":"1","is_eu":false}}'
|
42
|
+
http_version:
|
43
|
+
recorded_at: Tue, 08 May 2018 13:21:13 GMT
|
44
|
+
recorded_with: VCR 4.0.0
|
data/lib/geokit/geocoders.rb
CHANGED
@@ -26,6 +26,7 @@ module Geokit
|
|
26
26
|
# ### IP address geocoders
|
27
27
|
# * IP Geocoder - geocodes an IP address using hostip.info's web service.
|
28
28
|
# * Geoplugin.net -- another IP address geocoder
|
29
|
+
# * IP-API.com -- another IP address geocoder
|
29
30
|
#
|
30
31
|
# ### The Multigeocoder
|
31
32
|
# * Multi Geocoder - provides failover for the physical location geocoders.
|
@@ -39,6 +40,7 @@ module Geokit
|
|
39
40
|
@@ip_provider_order = [:geo_plugin, :ip]
|
40
41
|
@@logger = Logger.new(STDOUT)
|
41
42
|
@@logger.level = Logger::INFO
|
43
|
+
@@host = nil
|
42
44
|
@@domain = nil
|
43
45
|
@@net_adapter = Geokit::NetAdapter::NetHttp
|
44
46
|
@@secure = true
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Geokit
|
2
2
|
module Geocoders
|
3
3
|
class GoogleGeocoder < Geocoder
|
4
|
-
config :client_id, :cryptographic_key, :channel, :api_key
|
4
|
+
config :client_id, :cryptographic_key, :channel, :api_key, :host
|
5
5
|
self.secure = true
|
6
6
|
|
7
7
|
private
|
@@ -89,7 +89,8 @@ module Geokit
|
|
89
89
|
url_with_key = query_string + "&key=#{api_key}"
|
90
90
|
"#{protocol}://maps.googleapis.com" + url_with_key
|
91
91
|
else
|
92
|
-
|
92
|
+
request_host = host || 'maps.google.com'
|
93
|
+
"#{protocol}://#{request_host}#{query_string}"
|
93
94
|
end
|
94
95
|
end
|
95
96
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Geokit
|
2
|
+
module Geocoders
|
3
|
+
# Provides geocoding based upon an IP address. The underlying web service is ip-api.com
|
4
|
+
class IpApiGeocoder < BaseIpGeocoder
|
5
|
+
private
|
6
|
+
|
7
|
+
def self.do_geocode(ip, _=nil)
|
8
|
+
process :json, ip
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.submit_url(ip)
|
12
|
+
"http://ip-api.com/json/#{ip}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.parse_json(result)
|
16
|
+
loc = new_loc
|
17
|
+
return loc unless result['status'] == 'success'
|
18
|
+
|
19
|
+
loc.success = true
|
20
|
+
loc.city = result['city']
|
21
|
+
loc.state = result['region']
|
22
|
+
loc.state_name = result['regionName']
|
23
|
+
loc.zip = result['zip']
|
24
|
+
loc.lat = result['lat']
|
25
|
+
loc.lng = result['lon']
|
26
|
+
loc.country_code = result['countryCode']
|
27
|
+
loc
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Geokit
|
2
|
+
module Geocoders
|
3
|
+
# Provides geocoding based upon an IP address. The underlying web service is
|
4
|
+
# ipstack, old freegeoip.net
|
5
|
+
class IpstackGeocoder < BaseIpGeocoder
|
6
|
+
config :api_key
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def self.do_geocode(ip, _options = nil)
|
11
|
+
process :json, ip
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.submit_url(ip)
|
15
|
+
"http://api.ipstack.com/#{ip}?access_key=#{api_key}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.parse_json(result)
|
19
|
+
loc = new_loc
|
20
|
+
return loc if result['success'] == false
|
21
|
+
|
22
|
+
loc.city = result['city']
|
23
|
+
loc.state_code = result['region_code']
|
24
|
+
loc.state_name = result['region_name']
|
25
|
+
loc.zip = result['zip']
|
26
|
+
loc.lat = result['latitude']
|
27
|
+
loc.lng = result['longitude']
|
28
|
+
loc.country_code = result['country_code']
|
29
|
+
loc.country = result['country_name']
|
30
|
+
loc.success = !loc.city.nil?
|
31
|
+
|
32
|
+
loc
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/geokit/lat_lng.rb
CHANGED
data/lib/geokit/version.rb
CHANGED
@@ -50,6 +50,19 @@ class GoogleGeocoderTest < BaseGeocoderTest #:nodoc: all
|
|
50
50
|
assert_equal 'http://maps.google.com/maps/api/geocode/json?sensor=false&address=New+York', url
|
51
51
|
end
|
52
52
|
|
53
|
+
def test_google_cn
|
54
|
+
Geokit::Geocoders.host = 'maps.google.cn'
|
55
|
+
url = "#{@base_url}?sensor=false&address=#{escape(@address)}"
|
56
|
+
TestHelper.expects(:last_url).with(url)
|
57
|
+
res = geocode(@address, :google_full_short)
|
58
|
+
assert_equal 'CA', res.state
|
59
|
+
assert_equal 'San Francisco', res.city
|
60
|
+
assert_array_in_delta [37.7749295, -122.4194155], res.to_a # slightly dif from yahoo
|
61
|
+
assert res.is_us?
|
62
|
+
assert_equal 'San Francisco, CA, USA', res.full_address # slightly different from yahoo
|
63
|
+
assert_equal 'google', res.provider
|
64
|
+
end
|
65
|
+
|
53
66
|
def test_google_full_address
|
54
67
|
url = "#{@base_url}?sensor=false&address=#{escape(@address)}"
|
55
68
|
TestHelper.expects(:last_url).with(url)
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
2
|
+
|
3
|
+
class IpApiGeocoderTest < BaseGeocoderTest #:nodoc: all
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
@ip = '74.125.237.209'
|
7
|
+
end
|
8
|
+
|
9
|
+
def assert_url(expected_url)
|
10
|
+
assert_equal expected_url, TestHelper.last_url
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_free_geo_ip_geocode
|
14
|
+
url = "http://ip-api.com/json/#{@ip}"
|
15
|
+
res = geocode(@ip, :ip_api_geocode)
|
16
|
+
assert_url url
|
17
|
+
assert_equal res.city, 'Mountain View'
|
18
|
+
assert_equal res.state, 'CA'
|
19
|
+
assert_equal res.state_name, 'California'
|
20
|
+
assert_equal res.zip, '94043'
|
21
|
+
assert_equal res.country_code, 'US'
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
2
|
+
|
3
|
+
class IpstackGeocoderTest < BaseGeocoderTest #:nodoc: all
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
@ip = '68.194.36.44'
|
7
|
+
geocoder_class.api_key = 'some_api_key'
|
8
|
+
end
|
9
|
+
|
10
|
+
def assert_url(expected_url)
|
11
|
+
assert_equal expected_url, TestHelper.last_url
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_free_geo_ip_geocode
|
15
|
+
url = "http://api.ipstack.com/#{@ip}?access_key=some_api_key"
|
16
|
+
res = geocode(@ip, :ipstack_geocode)
|
17
|
+
|
18
|
+
assert_url url
|
19
|
+
assert_equal res.city, 'The Bronx'
|
20
|
+
assert_equal res.state, 'NY'
|
21
|
+
assert_equal res.state_name, 'New York'
|
22
|
+
assert_equal res.zip, '10466'
|
23
|
+
assert_equal res.country_code, 'US'
|
24
|
+
assert_equal res.country, 'United States'
|
25
|
+
assert_equal res.success?, true
|
26
|
+
end
|
27
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geokit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Noack
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2018-05-10 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|
@@ -226,6 +226,8 @@ files:
|
|
226
226
|
- fixtures/vcr_cassettes/google_reverse_madrid.yml
|
227
227
|
- fixtures/vcr_cassettes/google_reverse_madrid_es.yml
|
228
228
|
- fixtures/vcr_cassettes/google_sublocality.yml
|
229
|
+
- fixtures/vcr_cassettes/ip_api_geocode.yml
|
230
|
+
- fixtures/vcr_cassettes/ipstack_geocode.yml
|
229
231
|
- fixtures/vcr_cassettes/map_quest_full.yml
|
230
232
|
- fixtures/vcr_cassettes/map_quest_reverse_madrid.yml
|
231
233
|
- fixtures/vcr_cassettes/mapbox_forward_geocode.yml
|
@@ -263,6 +265,8 @@ files:
|
|
263
265
|
- lib/geokit/geocoders/geonames.rb
|
264
266
|
- lib/geokit/geocoders/google.rb
|
265
267
|
- lib/geokit/geocoders/ip.rb
|
268
|
+
- lib/geokit/geocoders/ip_api_geocoder.rb
|
269
|
+
- lib/geokit/geocoders/ipstack.rb
|
266
270
|
- lib/geokit/geocoders/mapbox.rb
|
267
271
|
- lib/geokit/geocoders/mapquest.rb
|
268
272
|
- lib/geokit/geocoders/maxmind.rb
|
@@ -295,7 +299,9 @@ files:
|
|
295
299
|
- test/test_geonames_geocoder.rb
|
296
300
|
- test/test_google_geocoder.rb
|
297
301
|
- test/test_inflector.rb
|
302
|
+
- test/test_ip_api_geocoder.rb
|
298
303
|
- test/test_ipgeocoder.rb
|
304
|
+
- test/test_ipstack_geocoder.rb
|
299
305
|
- test/test_latlng.rb
|
300
306
|
- test/test_map_quest.rb
|
301
307
|
- test/test_mapbox_geocoder.rb
|
@@ -335,7 +341,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
335
341
|
version: '0'
|
336
342
|
requirements: []
|
337
343
|
rubyforge_project:
|
338
|
-
rubygems_version: 2.
|
344
|
+
rubygems_version: 2.6.14.1
|
339
345
|
signing_key:
|
340
346
|
specification_version: 4
|
341
347
|
summary: 'Geokit: encoding and distance calculation gem'
|
@@ -355,7 +361,9 @@ test_files:
|
|
355
361
|
- test/test_geonames_geocoder.rb
|
356
362
|
- test/test_google_geocoder.rb
|
357
363
|
- test/test_inflector.rb
|
364
|
+
- test/test_ip_api_geocoder.rb
|
358
365
|
- test/test_ipgeocoder.rb
|
366
|
+
- test/test_ipstack_geocoder.rb
|
359
367
|
- test/test_latlng.rb
|
360
368
|
- test/test_map_quest.rb
|
361
369
|
- test/test_mapbox_geocoder.rb
|