geocodio 1.0.1 → 1.1.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/lib/geocodio/client.rb +45 -13
- data/lib/geocodio/utils.rb +26 -0
- data/lib/geocodio/version.rb +2 -2
- data/spec/address_set_spec.rb +1 -1
- data/spec/client_spec.rb +71 -2
- data/spec/vcr_cassettes/batch_reverse.yml +53 -0
- data/spec/vcr_cassettes/geocode.yml +2 -2
- data/spec/vcr_cassettes/reverse.yml +45 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 527dfc5568d5e04687a5e77ed4be5a618f63d1f0
|
4
|
+
data.tar.gz: 511078ee7c3cfbd7d8002faf2b1e35fef9f8da3d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ccc773caf2885c4801dd40b647e97b092830349f43fcea0a125325fa9be308da0faaef6416a01de3675b4d9f36ee6cbcf8718815774a3c1d895950d2b776c1ce
|
7
|
+
data.tar.gz: cffce0a8438f2016369ad80a839987941e45fccdb5aabc2490dc4499813da0731ad54f37989ceb8f0bac6f9b30dd289074c201516d2a284beccd793308e3e287
|
data/lib/geocodio/client.rb
CHANGED
@@ -4,9 +4,12 @@ require 'cgi'
|
|
4
4
|
|
5
5
|
require 'geocodio/client/error'
|
6
6
|
require 'geocodio/client/response'
|
7
|
+
require 'geocodio/utils'
|
7
8
|
|
8
9
|
module Geocodio
|
9
10
|
class Client
|
11
|
+
include Geocodio::Utils
|
12
|
+
|
10
13
|
CONTENT_TYPE = 'application/json'
|
11
14
|
METHODS = {
|
12
15
|
:get => Net::HTTP::Get,
|
@@ -26,7 +29,7 @@ module Geocodio
|
|
26
29
|
# is submitted to http://api.geocod.io/v1/geocode. Multiple addresses will
|
27
30
|
# instead submit a POST request.
|
28
31
|
#
|
29
|
-
# @param addresses [Array] one or more String addresses
|
32
|
+
# @param addresses [Array<String>] one or more String addresses
|
30
33
|
# @return [Geocodio::Address, Array<Geocodio::AddressSet>] One or more Address Sets
|
31
34
|
def geocode(*addresses)
|
32
35
|
addresses = addresses.first if addresses.first.is_a?(Array)
|
@@ -40,6 +43,28 @@ module Geocodio
|
|
40
43
|
end
|
41
44
|
end
|
42
45
|
|
46
|
+
# Reverse geocodes one or more pairs of coordinates. Coordinate pairs may be
|
47
|
+
# specified either as a comma-separated "latitude,longitude" string, or as
|
48
|
+
# a Hash with :lat/:latitude and :lng/:longitude keys. If one pair of
|
49
|
+
# coordinates is specified, a GET request is submitted to
|
50
|
+
# http://api.geocod.io/v1/reverse. Multiple pairs of coordinates will
|
51
|
+
# instead submit a POST request.
|
52
|
+
#
|
53
|
+
# @param coordinates [Array<String>, Array<Hash>] one or more pairs of coordinates
|
54
|
+
# @return [Geocodio::Address, Array<Geocodio::AddressSet>] One or more Address Sets
|
55
|
+
def reverse_geocode(*coordinates)
|
56
|
+
coordinates = coordinates.first if coordinates.first.is_a?(Array)
|
57
|
+
|
58
|
+
if coordinates.size < 1
|
59
|
+
raise ArgumentError, 'You must provide coordinates to reverse geocode.'
|
60
|
+
elsif coordinates.size == 1
|
61
|
+
reverse_geocode_single(coordinates.first)
|
62
|
+
else
|
63
|
+
reverse_geocode_batch(coordinates)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
alias :reverse :reverse_geocode
|
67
|
+
|
43
68
|
# Sends a GET request to http://api.geocod.io/v1/parse to correctly dissect
|
44
69
|
# an address into individual parts. As this endpoint does not do any
|
45
70
|
# geocoding, parts missing from the passed address will be missing from the
|
@@ -61,24 +86,31 @@ module Geocodio
|
|
61
86
|
|
62
87
|
def geocode_single(address)
|
63
88
|
response = get '/geocode', q: address
|
64
|
-
|
65
|
-
|
66
|
-
|
89
|
+
addresses = parse_results(response)
|
90
|
+
|
91
|
+
AddressSet.new(address, *addresses)
|
92
|
+
end
|
93
|
+
|
94
|
+
def reverse_geocode_single(pair)
|
95
|
+
pair = normalize_coordinates(pair)
|
67
96
|
|
68
|
-
|
97
|
+
response = get '/reverse', q: pair
|
98
|
+
addresses = parse_results(response)
|
99
|
+
|
100
|
+
AddressSet.new(pair, *addresses)
|
69
101
|
end
|
70
102
|
|
71
103
|
def geocode_batch(addresses)
|
72
|
-
response
|
73
|
-
|
104
|
+
response = post '/geocode', {}, body: addresses
|
105
|
+
|
106
|
+
parse_nested_results(response)
|
107
|
+
end
|
74
108
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
addresses = results.map { |result| Address.new(result) }
|
109
|
+
def reverse_geocode_batch(pairs)
|
110
|
+
pairs.map! { |pair| normalize_coordinates(pair) }
|
111
|
+
response = post '/reverse', {}, body: pairs
|
79
112
|
|
80
|
-
|
81
|
-
end
|
113
|
+
parse_nested_results(response)
|
82
114
|
end
|
83
115
|
|
84
116
|
def request(method, path, options)
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Geocodio
|
2
|
+
module Utils
|
3
|
+
def parse_results(response)
|
4
|
+
results = response.body['results']
|
5
|
+
addresses = results.map { |result| Address.new(result) }
|
6
|
+
end
|
7
|
+
|
8
|
+
def parse_nested_results(response)
|
9
|
+
results = response.body['results']
|
10
|
+
|
11
|
+
results.map do |result_set|
|
12
|
+
results = result_set['response']['results']
|
13
|
+
addresses = results.map { |result| Address.new(result) }
|
14
|
+
|
15
|
+
query = result_set['query']
|
16
|
+
|
17
|
+
AddressSet.new(query, *addresses)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def normalize_coordinates(coordinates)
|
22
|
+
return coordinates unless coordinates.is_a?(Hash)
|
23
|
+
coordinates.sort.map { |p| p[1] }.join(',')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/geocodio/version.rb
CHANGED
data/spec/address_set_spec.rb
CHANGED
data/spec/client_spec.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Geocodio::Client do
|
4
|
-
let(:geocodio)
|
5
|
-
let(:address)
|
4
|
+
let(:geocodio) { Geocodio::Client.new }
|
5
|
+
let(:address) { '54 West Colorado Boulevard Pasadena CA 91105' }
|
6
|
+
let(:coordinates) { '34.145760590909,-118.15204363636' }
|
6
7
|
|
7
8
|
it 'requires an API key' do
|
8
9
|
VCR.use_cassette('invalid_key') do
|
@@ -27,6 +28,27 @@ describe Geocodio::Client do
|
|
27
28
|
end
|
28
29
|
end
|
29
30
|
|
31
|
+
context 'reverse geocoding a single address' do
|
32
|
+
it 'uses a string' do
|
33
|
+
VCR.use_cassette('reverse') do
|
34
|
+
addresses = geocodio.reverse_geocode(coordinates)
|
35
|
+
|
36
|
+
expect(addresses.size).to eq(3)
|
37
|
+
expect(addresses).to be_a(Geocodio::AddressSet)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'uses a hash' do
|
42
|
+
VCR.use_cassette('reverse') do
|
43
|
+
lat, lng = coordinates.split(',')
|
44
|
+
addresses = geocodio.reverse_geocode(latitude: lat, longitude: lng)
|
45
|
+
|
46
|
+
expect(addresses.size).to eq(3)
|
47
|
+
expect(addresses).to be_a(Geocodio::AddressSet)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
30
52
|
it 'geocodes multiple addresses' do
|
31
53
|
VCR.use_cassette('batch_geocode') do
|
32
54
|
addresses = [
|
@@ -41,4 +63,51 @@ describe Geocodio::Client do
|
|
41
63
|
addresses.each { |address| expect(address).to be_a(Geocodio::AddressSet) }
|
42
64
|
end
|
43
65
|
end
|
66
|
+
|
67
|
+
context 'reverse geocoding multiple addresses' do
|
68
|
+
it 'uses strings' do
|
69
|
+
VCR.use_cassette('batch_reverse') do
|
70
|
+
coordinate_pairs = [
|
71
|
+
'37.331669,-122.03074',
|
72
|
+
'34.145760590909,-118.15204363636',
|
73
|
+
'37.7815,-122.404933'
|
74
|
+
]
|
75
|
+
|
76
|
+
addresses = geocodio.reverse_geocode(*coordinate_pairs)
|
77
|
+
|
78
|
+
expect(addresses.size).to eq(3)
|
79
|
+
addresses.each { |address| expect(address).to be_a(Geocodio::AddressSet) }
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'uses hashes' do
|
84
|
+
VCR.use_cassette('batch_reverse') do
|
85
|
+
coordinate_pairs = [
|
86
|
+
{ latitude: 37.331669, longitude: -122.03074 },
|
87
|
+
{ latitude: 34.145760590909, longitude: -118.15204363636 },
|
88
|
+
{ latitude: 37.7815, longitude: -122.404933 }
|
89
|
+
]
|
90
|
+
|
91
|
+
addresses = geocodio.reverse_geocode(*coordinate_pairs)
|
92
|
+
|
93
|
+
expect(addresses.size).to eq(3)
|
94
|
+
addresses.each { |address| expect(address).to be_a(Geocodio::AddressSet) }
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'uses an arbitrary combination of strings and hashes' do
|
99
|
+
VCR.use_cassette('batch_reverse') do
|
100
|
+
coordinate_pairs = [
|
101
|
+
{ latitude: 37.331669, longitude: -122.03074 },
|
102
|
+
'34.145760590909,-118.15204363636',
|
103
|
+
{ latitude: 37.7815, longitude: -122.404933 }
|
104
|
+
]
|
105
|
+
|
106
|
+
addresses = geocodio.reverse_geocode(*coordinate_pairs)
|
107
|
+
|
108
|
+
expect(addresses.size).to eq(3)
|
109
|
+
addresses.each { |address| expect(address).to be_a(Geocodio::AddressSet) }
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
44
113
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: http://api.geocod.io/v1/reverse?api_key=secret_api_key
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: "[\"37.331669,-122.03074\",\"34.145760590909,-118.15204363636\",\"37.7815,-122.404933\"]"
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/json
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
Content-Type:
|
17
|
+
- application/json
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Date:
|
24
|
+
- Mon, 03 Feb 2014 16:12:36 GMT
|
25
|
+
Server:
|
26
|
+
- Apache
|
27
|
+
X-Powered-By:
|
28
|
+
- PHP/5.4.24
|
29
|
+
Cache-Control:
|
30
|
+
- no-cache
|
31
|
+
Access-Control-Allow-Origin:
|
32
|
+
- "*"
|
33
|
+
Transfer-Encoding:
|
34
|
+
- chunked
|
35
|
+
Content-Type:
|
36
|
+
- application/json
|
37
|
+
body:
|
38
|
+
encoding: UTF-8
|
39
|
+
string: "{\"results\":[{\"query\":\"37.331669,-122.03074\",\"response\":{\"results\":[]}},{\"query\":\"34.145760590909,-118.15204363636\",\"response\":{\"results\":[{\"address_components\":{\"number\":\"43\",\"predirectional\":\"W\",\"street\":\"Colorado\",\"suffix\":\"Blvd\",\"city\":\"Pasadena\",\"state\":\"CA\",\"zip\":\"91105\"},\"formatted_address\":\"43
|
40
|
+
W Colorado Blvd, Pasadena, CA 91105\",\"location\":{\"lat\":34.145766,\"lng\":-118.15141},\"accuracy\":1},{\"address_components\":{\"number\":\"1\",\"predirectional\":\"N\",\"street\":\"De
|
41
|
+
Lacey\",\"suffix\":\"Ave\",\"city\":\"Pasadena\",\"state\":\"CA\",\"zip\":\"91103\"},\"formatted_address\":\"1
|
42
|
+
N De Lacey Ave, Pasadena, CA 91103\",\"location\":{\"lat\":34.145759,\"lng\":-118.15223},\"accuracy\":0},{\"address_components\":{\"number\":\"1\",\"predirectional\":\"S\",\"street\":\"De
|
43
|
+
Lacey\",\"suffix\":\"Ave\",\"city\":\"Pasadena\",\"state\":\"CA\",\"zip\":\"91105\"},\"formatted_address\":\"1
|
44
|
+
S De Lacey Ave, Pasadena, CA 91105\",\"location\":{\"lat\":34.145759,\"lng\":-118.15223},\"accuracy\":0}]}},{\"query\":\"37.7815,-122.404933\",\"response\":{\"results\":[{\"address_components\":{\"number\":\"177\",\"street\":\"5th\",\"suffix\":\"St\",\"city\":\"San
|
45
|
+
Francisco\",\"state\":\"CA\",\"zip\":\"94102\"},\"formatted_address\":\"177
|
46
|
+
5th St, San Francisco, CA 94102\",\"location\":{\"lat\":37.781925,\"lng\":-122.405466},\"accuracy\":0},{\"address_components\":{\"number\":\"861\",\"street\":\"Howard\",\"suffix\":\"St\",\"city\":\"San
|
47
|
+
Francisco\",\"state\":\"CA\",\"zip\":\"94103\"},\"formatted_address\":\"861
|
48
|
+
Howard St, San Francisco, CA 94103\",\"location\":{\"lat\":37.782831,\"lng\":-122.40325},\"accuracy\":0},{\"address_components\":{\"number\":\"900\",\"street\":\"Howard\",\"suffix\":\"St\",\"city\":\"San
|
49
|
+
Francisco\",\"state\":\"CA\",\"zip\":\"94103\"},\"formatted_address\":\"900
|
50
|
+
Howard St, San Francisco, CA 94103\",\"location\":{\"lat\":37.7815,\"lng\":-122.404933},\"accuracy\":0}]}}]}"
|
51
|
+
http_version:
|
52
|
+
recorded_at: Mon, 03 Feb 2014 16:12:38 GMT
|
53
|
+
recorded_with: VCR 2.8.0
|
@@ -19,7 +19,7 @@ http_interactions:
|
|
19
19
|
message: OK
|
20
20
|
headers:
|
21
21
|
Date:
|
22
|
-
-
|
22
|
+
- Mon, 03 Feb 2014 16:11:04 GMT
|
23
23
|
Server:
|
24
24
|
- Apache
|
25
25
|
X-Powered-By:
|
@@ -39,5 +39,5 @@ http_interactions:
|
|
39
39
|
W Colorado Blvd, Pasadena, CA 91105\",\"location\":{\"lat\":34.145760590909,\"lng\":-118.15204363636},\"accuracy\":1},{\"address_components\":{\"number\":\"54\",\"predirectional\":\"W\",\"street\":\"Colorado\",\"suffix\":\"Blvd\",\"city\":\"Pasadena\",\"state\":\"CA\",\"zip\":\"91105\"},\"formatted_address\":\"54
|
40
40
|
W Colorado Blvd, Pasadena, CA 91105\",\"location\":{\"lat\":34.1457634625,\"lng\":-118.15170725},\"accuracy\":0.8}]}"
|
41
41
|
http_version:
|
42
|
-
recorded_at:
|
42
|
+
recorded_at: Mon, 03 Feb 2014 16:11:05 GMT
|
43
43
|
recorded_with: VCR 2.8.0
|
@@ -0,0 +1,45 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://api.geocod.io/v1/reverse?api_key=secret_api_key&q=34.145760590909,-118.15204363636
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
Accept:
|
11
|
+
- application/json
|
12
|
+
Accept-Encoding:
|
13
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
14
|
+
User-Agent:
|
15
|
+
- Ruby
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Date:
|
22
|
+
- Mon, 03 Feb 2014 16:12:36 GMT
|
23
|
+
Server:
|
24
|
+
- Apache
|
25
|
+
X-Powered-By:
|
26
|
+
- PHP/5.4.24
|
27
|
+
Cache-Control:
|
28
|
+
- no-cache
|
29
|
+
Access-Control-Allow-Origin:
|
30
|
+
- "*"
|
31
|
+
Transfer-Encoding:
|
32
|
+
- chunked
|
33
|
+
Content-Type:
|
34
|
+
- application/json
|
35
|
+
body:
|
36
|
+
encoding: UTF-8
|
37
|
+
string: "{\"results\":[{\"address_components\":{\"number\":\"43\",\"predirectional\":\"W\",\"street\":\"Colorado\",\"suffix\":\"Blvd\",\"city\":\"Pasadena\",\"state\":\"CA\",\"zip\":\"91105\"},\"formatted_address\":\"43
|
38
|
+
W Colorado Blvd, Pasadena, CA 91105\",\"location\":{\"lat\":34.145766,\"lng\":-118.15141},\"accuracy\":1},{\"address_components\":{\"number\":\"1\",\"predirectional\":\"N\",\"street\":\"De
|
39
|
+
Lacey\",\"suffix\":\"Ave\",\"city\":\"Pasadena\",\"state\":\"CA\",\"zip\":\"91103\"},\"formatted_address\":\"1
|
40
|
+
N De Lacey Ave, Pasadena, CA 91103\",\"location\":{\"lat\":34.145759,\"lng\":-118.15223},\"accuracy\":0},{\"address_components\":{\"number\":\"1\",\"predirectional\":\"S\",\"street\":\"De
|
41
|
+
Lacey\",\"suffix\":\"Ave\",\"city\":\"Pasadena\",\"state\":\"CA\",\"zip\":\"91105\"},\"formatted_address\":\"1
|
42
|
+
S De Lacey Ave, Pasadena, CA 91105\",\"location\":{\"lat\":34.145759,\"lng\":-118.15223},\"accuracy\":0}]}"
|
43
|
+
http_version:
|
44
|
+
recorded_at: Mon, 03 Feb 2014 16:12:38 GMT
|
45
|
+
recorded_with: VCR 2.8.0
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geocodio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Celis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-02-
|
11
|
+
date: 2014-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -95,15 +95,18 @@ files:
|
|
95
95
|
- lib/geocodio/client.rb
|
96
96
|
- lib/geocodio/client/error.rb
|
97
97
|
- lib/geocodio/client/response.rb
|
98
|
+
- lib/geocodio/utils.rb
|
98
99
|
- lib/geocodio/version.rb
|
99
100
|
- spec/address_set_spec.rb
|
100
101
|
- spec/address_spec.rb
|
101
102
|
- spec/client_spec.rb
|
102
103
|
- spec/spec_helper.rb
|
103
104
|
- spec/vcr_cassettes/batch_geocode.yml
|
105
|
+
- spec/vcr_cassettes/batch_reverse.yml
|
104
106
|
- spec/vcr_cassettes/geocode.yml
|
105
107
|
- spec/vcr_cassettes/invalid_key.yml
|
106
108
|
- spec/vcr_cassettes/parse.yml
|
109
|
+
- spec/vcr_cassettes/reverse.yml
|
107
110
|
homepage: https://github.com/davidcelis/geocodio
|
108
111
|
licenses:
|
109
112
|
- MIT
|
@@ -134,6 +137,8 @@ test_files:
|
|
134
137
|
- spec/client_spec.rb
|
135
138
|
- spec/spec_helper.rb
|
136
139
|
- spec/vcr_cassettes/batch_geocode.yml
|
140
|
+
- spec/vcr_cassettes/batch_reverse.yml
|
137
141
|
- spec/vcr_cassettes/geocode.yml
|
138
142
|
- spec/vcr_cassettes/invalid_key.yml
|
139
143
|
- spec/vcr_cassettes/parse.yml
|
144
|
+
- spec/vcr_cassettes/reverse.yml
|