geocodio 2.0.0 → 2.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f07d6a0f3badaba67e890b973573eacb03e8af1
4
- data.tar.gz: d2f2a3b90df9b526199348811d266b8dbf682b8c
3
+ metadata.gz: 6e41eb68631540823c0d3087613a9f93449bfd6c
4
+ data.tar.gz: 8fac1f8f09a1079ae0708fc5b73eed400968f85b
5
5
  SHA512:
6
- metadata.gz: 5eac91722f01e44514b3c668c16ddc0e36575c545b5658cd58892024ee4a5ceb42af4ef4f4f7d97393941ddf4712aa5201fef901cab7647d69146fe181426cd0
7
- data.tar.gz: 74d43b2b707b96fcf9d73dc0e65ed4956e07e260e951d7051a9f0b0c7370cb69edcbd1ca0a331f682038514ef88de212249630d5091c17567f36e80c2cac866f
6
+ metadata.gz: 3ab47ef498df83514389dd82e9bf4dcfa6d01c0b85520e82dfd680b78e06dc9031b4bcd2cdedb2383dfc6f8e7274195f6dad3f3ee462bc310c1b07743af10c76
7
+ data.tar.gz: e56d5f65d3ef2e7e3d6a1ba35297305f49eb130e7341f6f510f408d30692d8c96bf0804c38ca6c52a158732786931dcfc320f97d3e272b161cdf4bb5911582c7
@@ -91,5 +91,11 @@ module Geocodio
91
91
 
92
92
  @timezone = Timezone.new(timezone)
93
93
  end
94
+
95
+ def <=>(address)
96
+ return -1 if self.accuracy < address.accuracy
97
+ return 0 if self.accuracy == address.accuracy
98
+ return 1 if self.accuracy > address.accuracy
99
+ end
94
100
  end
95
101
  end
@@ -33,5 +33,12 @@ module Geocodio
33
33
  def size
34
34
  @addresses.size
35
35
  end
36
+
37
+ # Returns whether or not there are any addresses in this result set.
38
+ #
39
+ # @return [Boolean] if there were any results returned by Geocodio
40
+ def empty?
41
+ @addresses.empty?
42
+ end
36
43
  end
37
44
  end
@@ -72,8 +72,11 @@ module Geocodio
72
72
  #
73
73
  # @param address [String] the full or partial address to parse
74
74
  # @return [Geocodio::Address] a parsed and formatted Address
75
- def parse(address)
76
- Address.new get('/parse', q: address).body
75
+ def parse(address, options = {})
76
+ params, options = normalize_params_and_options(options)
77
+ params[:q] = address
78
+
79
+ Address.new get('/parse', params, options).body
77
80
  end
78
81
 
79
82
  private
@@ -85,39 +88,40 @@ module Geocodio
85
88
  end
86
89
 
87
90
  def geocode_single(address, options = {})
88
- params = { q: address }
89
- params[:fields] = options[:fields].join(',') if options[:fields]
91
+ params, options = normalize_params_and_options(options)
92
+ params[:q] = address
90
93
 
91
- response = get '/geocode', params
94
+ response = get '/geocode', params, options
92
95
  addresses = parse_results(response)
93
96
 
94
97
  AddressSet.new(address, *addresses)
95
98
  end
96
99
 
97
100
  def reverse_geocode_single(pair, options = {})
101
+ params, options = normalize_params_and_options(options)
98
102
  pair = normalize_coordinates(pair)
99
- params = { q: pair }
100
- params[:fields] = options[:fields].join(',') if options[:fields]
103
+ params[:q] = pair
101
104
 
102
- response = get '/reverse', params
105
+ response = get '/reverse', params, options
103
106
  addresses = parse_results(response)
104
107
 
105
108
  AddressSet.new(pair, *addresses)
106
109
  end
107
110
 
108
111
  def geocode_batch(addresses, options = {})
109
- options[:fields] = options[:fields].join(',') if options[:fields]
112
+ params, options = normalize_params_and_options(options)
113
+ options[:body] = addresses
110
114
 
111
- response = post '/geocode', options, body: addresses
115
+ response = post '/geocode', params, options
112
116
 
113
117
  parse_nested_results(response)
114
118
  end
115
119
 
116
120
  def reverse_geocode_batch(pairs, options = {})
117
- pairs.map! { |pair| normalize_coordinates(pair) }
118
- options[:fields] = options[:fields].join(',') if options[:fields]
121
+ params, options = normalize_params_and_options(options)
122
+ options[:body] = pairs.map { |pair| normalize_coordinates(pair) }
119
123
 
120
- response = post '/reverse', options, body: pairs
124
+ response = post '/reverse', params, options
121
125
 
122
126
  parse_nested_results(response)
123
127
  end
@@ -138,6 +142,7 @@ module Geocodio
138
142
  end
139
143
 
140
144
  http = Net::HTTP.new HOST, PORT
145
+ http.read_timeout = options[:timeout] if options[:timeout]
141
146
  res = http.start { http.request(req) }
142
147
 
143
148
  case res
@@ -9,8 +9,8 @@ module Geocodio
9
9
  results = response.body['results']
10
10
 
11
11
  results.map do |result_set|
12
- results = result_set['response']['results']
13
- addresses = results.map { |result| Address.new(result) }
12
+ addresses = Array(result_set['response']['results'])
13
+ addresses.map! { |result| Address.new(result) }
14
14
 
15
15
  query = result_set['query']
16
16
 
@@ -22,5 +22,20 @@ module Geocodio
22
22
  return coordinates unless coordinates.is_a?(Hash)
23
23
  coordinates.sort.map { |p| p[1] }.join(',')
24
24
  end
25
+
26
+ def normalize_params_and_options(hash)
27
+ hash = Hash[hash.map { |k, v| [k.to_sym, v] }]
28
+
29
+ # The only supported parameter is fields
30
+ params = hash.select { |k, _| [:fields].include?(k) }
31
+
32
+ # Normalize this particular parameter to be a comma-separated string
33
+ params[:fields] = params[:fields].join(',') if params[:fields]
34
+
35
+ # The only supported option is `timeout`
36
+ options = hash.select { |k, _| [:timeout].include?(k) }
37
+
38
+ [params, options]
39
+ end
25
40
  end
26
41
  end
@@ -2,7 +2,7 @@ module Geocodio
2
2
  class Version
3
3
  MAJOR = 2
4
4
  MINOR = 0
5
- PATCH = 0
5
+ PATCH = 1
6
6
 
7
7
  def self.to_s
8
8
  [MAJOR, MINOR, PATCH].join('.')
@@ -19,6 +19,11 @@ describe Geocodio::Client do
19
19
  end
20
20
  end
21
21
 
22
+ it 'sets the read_timeout on the underlying Net::HTTP request if passed an option' do
23
+ expect_any_instance_of(Net::HTTP).to receive(:read_timeout=).with(60 * 5)
24
+ VCR.use_cassette('geocode') { geocodio.geocode([address], timeout: 60 * 5) }
25
+ end
26
+
22
27
  describe '#geocode' do
23
28
  it 'geocodes a single address' do
24
29
  VCR.use_cassette('geocode') do
@@ -38,6 +43,12 @@ describe Geocodio::Client do
38
43
  end
39
44
  end
40
45
 
46
+ it 'raises a client error when geocoding a bad address' do
47
+ VCR.use_cassette('geocode_bad_address') do
48
+ expect { geocodio.geocode([' , , ']) }.to raise_error(Geocodio::Client::Error)
49
+ end
50
+ end
51
+
41
52
  it 'geocodes multiple addresses' do
42
53
  VCR.use_cassette('batch_geocode') do
43
54
  addresses = [
@@ -53,6 +64,19 @@ describe Geocodio::Client do
53
64
  end
54
65
  end
55
66
 
67
+ it 'will return empty AddressSets for bad addresses in a batch geocode' do
68
+ VCR.use_cassette('batch_geocode_with_bad_address') do
69
+ addresses = [
70
+ '1 Infinite Loop Cupertino CA 95014',
71
+ ' , , '
72
+ ]
73
+
74
+ addresses = geocodio.geocode(addresses)
75
+
76
+ expect(addresses.last).to be_empty
77
+ end
78
+ end
79
+
56
80
  it 'geocodes multiple addresses with an options hash' do
57
81
  VCR.use_cassette('batch_geocode_with_fields') do
58
82
  addresses = [
@@ -0,0 +1,46 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: http://api.geocod.io/v1/geocode?api_key=secret_api_key
6
+ body:
7
+ encoding: UTF-8
8
+ string: '["1 Infinite Loop Cupertino CA 95014"," , , "]'
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
+ Server:
24
+ - nginx/1.2.1
25
+ Content-Type:
26
+ - application/json
27
+ Transfer-Encoding:
28
+ - chunked
29
+ Connection:
30
+ - keep-alive
31
+ Cache-Control:
32
+ - no-cache
33
+ Date:
34
+ - Thu, 10 Apr 2014 15:55:59 GMT
35
+ Access-Control-Allow-Origin:
36
+ - "*"
37
+ body:
38
+ encoding: UTF-8
39
+ string: '{"results":[{"query":"1 Infinite Loop Cupertino CA 95014","response":{"input":{"address_components":{"number":"1","street":"Infinite","suffix":"Loop","city":"Cupertino","state":"CA","zip":"95014"},"formatted_address":"1
40
+ Infinite Loop, Cupertino, CA 95014"},"results":[{"address_components":{"number":"1","street":"Infinite","suffix":"Loop","city":"Cupertino","county":"Santa
41
+ Clara County","state":"CA","zip":"95014"},"formatted_address":"1 Infinite
42
+ Loop, Cupertino, CA 95014","location":{"lat":37.331669,"lng":-122.03074},"accuracy":1}]}},{"query":"
43
+ , , ","response":{"error":"Could not parse address"}}]}'
44
+ http_version:
45
+ recorded_at: Thu, 10 Apr 2014 15:55:59 GMT
46
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,40 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://api.geocod.io/v1/geocode?api_key=secret_api_key&q=%20,%20,%20
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: 422
19
+ message: Unprocessable Entity
20
+ headers:
21
+ Server:
22
+ - nginx/1.2.1
23
+ Content-Type:
24
+ - application/json
25
+ Transfer-Encoding:
26
+ - chunked
27
+ Connection:
28
+ - keep-alive
29
+ Cache-Control:
30
+ - no-cache
31
+ Date:
32
+ - Thu, 10 Apr 2014 15:54:12 GMT
33
+ Access-Control-Allow-Origin:
34
+ - "*"
35
+ body:
36
+ encoding: UTF-8
37
+ string: '{"error":"Could not parse address"}'
38
+ http_version:
39
+ recorded_at: Thu, 10 Apr 2014 15:54:12 GMT
40
+ 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: 2.0.0
4
+ version: 2.0.1
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-04-02 00:00:00.000000000 Z
11
+ date: 2014-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -110,10 +110,12 @@ files:
110
110
  - spec/state_legislative_district_spec.rb
111
111
  - spec/timezone_spec.rb
112
112
  - spec/vcr_cassettes/batch_geocode.yml
113
+ - spec/vcr_cassettes/batch_geocode_with_bad_address.yml
113
114
  - spec/vcr_cassettes/batch_geocode_with_fields.yml
114
115
  - spec/vcr_cassettes/batch_reverse.yml
115
116
  - spec/vcr_cassettes/batch_reverse_with_fields.yml
116
117
  - spec/vcr_cassettes/geocode.yml
118
+ - spec/vcr_cassettes/geocode_bad_address.yml
117
119
  - spec/vcr_cassettes/geocode_with_fields.yml
118
120
  - spec/vcr_cassettes/invalid_key.yml
119
121
  - spec/vcr_cassettes/parse.yml
@@ -153,10 +155,12 @@ test_files:
153
155
  - spec/state_legislative_district_spec.rb
154
156
  - spec/timezone_spec.rb
155
157
  - spec/vcr_cassettes/batch_geocode.yml
158
+ - spec/vcr_cassettes/batch_geocode_with_bad_address.yml
156
159
  - spec/vcr_cassettes/batch_geocode_with_fields.yml
157
160
  - spec/vcr_cassettes/batch_reverse.yml
158
161
  - spec/vcr_cassettes/batch_reverse_with_fields.yml
159
162
  - spec/vcr_cassettes/geocode.yml
163
+ - spec/vcr_cassettes/geocode_bad_address.yml
160
164
  - spec/vcr_cassettes/geocode_with_fields.yml
161
165
  - spec/vcr_cassettes/invalid_key.yml
162
166
  - spec/vcr_cassettes/parse.yml