geocodio 2.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
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