geocodio-ocd 1.7.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/lib/geocodio/address.rb +114 -0
- data/lib/geocodio/address_set.rb +48 -0
- data/lib/geocodio/canadian/electoral_district_base.rb +21 -0
- data/lib/geocodio/canadian/electoral_districts.rb +23 -0
- data/lib/geocodio/canadian/federal_electoral_district.rb +12 -0
- data/lib/geocodio/canadian/provincial_electoral_district.rb +6 -0
- data/lib/geocodio/canadian.rb +14 -0
- data/lib/geocodio/client/error.rb +15 -0
- data/lib/geocodio/client/response.rb +13 -0
- data/lib/geocodio/client.rb +155 -0
- data/lib/geocodio/congressional_district.rb +30 -0
- data/lib/geocodio/legislator.rb +69 -0
- data/lib/geocodio/school_district.rb +15 -0
- data/lib/geocodio/state_legislative_district.rb +16 -0
- data/lib/geocodio/timezone.rb +16 -0
- data/lib/geocodio/utils.rb +43 -0
- data/lib/geocodio/version.rb +13 -0
- data/lib/geocodio.rb +9 -0
- data/spec/address_set_spec.rb +31 -0
- data/spec/address_spec.rb +235 -0
- data/spec/canadian_spec.rb +77 -0
- data/spec/client_spec.rb +196 -0
- data/spec/congressional_district_spec.rb +45 -0
- data/spec/legislator_spec.rb +116 -0
- data/spec/school_district_spec.rb +27 -0
- data/spec/spec_helper.rb +25 -0
- data/spec/state_legislative_district_spec.rb +43 -0
- data/spec/timezone_spec.rb +23 -0
- data/spec/vcr_cassettes/alaska_geocode_with_fields.yml +68 -0
- data/spec/vcr_cassettes/batch_geocode.yml +83 -0
- data/spec/vcr_cassettes/batch_geocode_with_bad_address.yml +61 -0
- data/spec/vcr_cassettes/batch_geocode_with_fields.yml +121 -0
- data/spec/vcr_cassettes/batch_reverse.yml +181 -0
- data/spec/vcr_cassettes/batch_reverse_with_fields.yml +384 -0
- data/spec/vcr_cassettes/canadian.yml +101 -0
- data/spec/vcr_cassettes/geocode.yml +61 -0
- data/spec/vcr_cassettes/geocode_bad_address.yml +53 -0
- data/spec/vcr_cassettes/geocode_with_fields.yml +71 -0
- data/spec/vcr_cassettes/geocode_with_fields_legacy.yml +91 -0
- data/spec/vcr_cassettes/geocode_with_postdirectional.yml +61 -0
- data/spec/vcr_cassettes/invalid_key.yml +59 -0
- data/spec/vcr_cassettes/parse.yml +51 -0
- data/spec/vcr_cassettes/reverse.yml +97 -0
- data/spec/vcr_cassettes/reverse_with_fields.yml +163 -0
- data/spec/vcr_cassettes/reverse_with_fields_no_house_info.yml +138 -0
- metadata +189 -0
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Geocodio::AddressSet do
|
4
|
+
let(:geocodio) { Geocodio::Client.new }
|
5
|
+
let(:addresses) do
|
6
|
+
[
|
7
|
+
'1 Infinite Loop Cupertino CA 95014',
|
8
|
+
'54 West Colorado Boulevard Pasadena CA 91105',
|
9
|
+
'826 Howard Street San Francisco CA 94103'
|
10
|
+
]
|
11
|
+
end
|
12
|
+
|
13
|
+
subject(:address_set) do
|
14
|
+
VCR.use_cassette('batch_geocode') do
|
15
|
+
geocodio.geocode(addresses).last
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'has a size' do
|
20
|
+
expect(address_set.size).to eq(4)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'has a best' do
|
24
|
+
expect(address_set.best).to be_a(Geocodio::Address)
|
25
|
+
expect(address_set.best.accuracy).to eq(1)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'references the original query' do
|
29
|
+
expect(address_set.query).to eq('826 Howard Street San Francisco CA 94103')
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,235 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Geocodio::Address do
|
4
|
+
let(:geocodio) { Geocodio::Client.new }
|
5
|
+
|
6
|
+
context 'when parsed' do
|
7
|
+
subject(:address) do
|
8
|
+
VCR.use_cassette('parse') do
|
9
|
+
geocodio.parse('54 West Colorado Boulevard Pasadena CA 91105')
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'has a number' do
|
14
|
+
expect(address.number).to eq('54')
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'has a predirectional' do
|
18
|
+
expect(address.predirectional).to eq('W')
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'has a street' do
|
22
|
+
expect(address.street).to eq('Colorado')
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'has a formatted_street' do
|
26
|
+
expect(address.formatted_street).to eq('W Colorado Blvd')
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'has a suffix' do
|
30
|
+
expect(address.suffix).to eq('Blvd')
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'has a city' do
|
34
|
+
expect(address.city).to eq('Pasadena')
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'has a state' do
|
38
|
+
expect(address.state).to eq('CA')
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'has a zip' do
|
42
|
+
expect(address.zip).to eq('91105')
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'does not have a latitude' do
|
46
|
+
expect(address.latitude).to be_nil
|
47
|
+
expect(address.lat).to be_nil
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'does not have a longitude' do
|
51
|
+
expect(address.longitude).to be_nil
|
52
|
+
expect(address.lng).to be_nil
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'does not have an accuracy' do
|
56
|
+
expect(address.accuracy).to be_nil
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'does not have an accuracy_type' do
|
60
|
+
expect(address.accuracy_type).to be_nil
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'when geocoded' do
|
65
|
+
context 'has predirectional' do
|
66
|
+
subject(:address) do
|
67
|
+
VCR.use_cassette('geocode') do
|
68
|
+
geocodio.geocode(['54 West Colorado Boulevard Pasadena CA 91105']).best
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'has a number' do
|
73
|
+
expect(address.number).to eq('54')
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'has a predirectional' do
|
77
|
+
expect(address.predirectional).to eq('W')
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'has a street' do
|
81
|
+
expect(address.street).to eq('Colorado')
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'has a formatted_street' do
|
85
|
+
expect(address.formatted_street).to eq('W Colorado Blvd')
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'has a suffix' do
|
89
|
+
expect(address.suffix).to eq('Blvd')
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'has a city' do
|
93
|
+
expect(address.city).to eq('Pasadena')
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'has a county' do
|
97
|
+
expect(address.county).to eq('Los Angeles County')
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'has a state' do
|
101
|
+
expect(address.state).to eq('CA')
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'has a zip' do
|
105
|
+
expect(address.zip).to eq('91105')
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'has a latitude' do
|
109
|
+
expect(address.latitude).to eq(34.145375)
|
110
|
+
expect(address.lat).to eq(34.145375)
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'has a longitude' do
|
114
|
+
expect(address.longitude).to eq(-118.151622)
|
115
|
+
expect(address.lng).to eq(-118.151622)
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'has an accuracy' do
|
119
|
+
expect(address.accuracy).to eq(1)
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'has an accuracy_type' do
|
123
|
+
expect(address.accuracy_type).to eq("rooftop")
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'has a source' do
|
127
|
+
expect(address.source).to eq("Los Angeles")
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
context 'has postdirectional' do
|
132
|
+
subject(:address) do
|
133
|
+
VCR.use_cassette('geocode_with_postdirectional') do
|
134
|
+
geocodio.geocode(['1600 Pennsylvania Ave NW Washington DC 20500']).best
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'has a number' do
|
139
|
+
expect(address.number).to eq('1600')
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'has a street' do
|
143
|
+
expect(address.street).to eq('Pennsylvania')
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'has a formatted_street' do
|
147
|
+
expect(address.formatted_street).to eq('Pennsylvania Ave NW')
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'has a postdirectional' do
|
151
|
+
expect(address.postdirectional).to eq('NW')
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'has a suffix' do
|
155
|
+
expect(address.suffix).to eq('Ave')
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'has a city' do
|
159
|
+
expect(address.city).to eq('Washington')
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'has a county' do
|
163
|
+
expect(address.county).to eq('District of Columbia')
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'has a state' do
|
167
|
+
expect(address.state).to eq('DC')
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'has a zip' do
|
171
|
+
expect(address.zip).to eq('20500')
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'has a latitude' do
|
175
|
+
expect(address.latitude).to eq(38.897675)
|
176
|
+
expect(address.lat).to eq(38.897675)
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'has a longitude' do
|
180
|
+
expect(address.longitude).to eq(-77.036547)
|
181
|
+
expect(address.lng).to eq(-77.036547)
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'has an accuracy' do
|
185
|
+
expect(address.accuracy).to eq(1)
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'has an accuracy_type' do
|
189
|
+
expect(address.accuracy_type).to eq("rooftop")
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
context 'with additional fields' do
|
194
|
+
subject(:address) do
|
195
|
+
VCR.use_cassette('geocode_with_fields') do
|
196
|
+
geocodio.geocode(['54 West Colorado Boulevard Pasadena CA 91105'], fields: %w[cd118 stateleg-next school timezone]).best
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'has congressional districts' do
|
201
|
+
address.congressional_districts.each do |district|
|
202
|
+
expect(district).to be_a(Geocodio::CongressionalDistrict)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
it 'has house districts' do
|
207
|
+
expect(address.house_districts).to be_a(Array)
|
208
|
+
expect(address.house_districts.size).to eq(1)
|
209
|
+
expect(address.house_districts.first).to be_a(Geocodio::StateLegislativeDistrict)
|
210
|
+
end
|
211
|
+
|
212
|
+
it 'has senate districts' do
|
213
|
+
expect(address.senate_districts).to be_a(Array)
|
214
|
+
expect(address.senate_districts.size).to eq(1)
|
215
|
+
expect(address.senate_districts.first).to be_a(Geocodio::StateLegislativeDistrict)
|
216
|
+
end
|
217
|
+
|
218
|
+
it 'has a unified school district' do
|
219
|
+
expect(address.unified_school_district).to be_a(Geocodio::SchoolDistrict)
|
220
|
+
end
|
221
|
+
|
222
|
+
it 'could have an elementary school district' do
|
223
|
+
expect(address.elementary_school_district).to be_nil
|
224
|
+
end
|
225
|
+
|
226
|
+
it 'could have a secondary school district' do
|
227
|
+
expect(address.secondary_school_district).to be_nil
|
228
|
+
end
|
229
|
+
|
230
|
+
it 'has a timezone' do
|
231
|
+
expect(address.timezone).to be_a(Geocodio::Timezone)
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Geocodio::Canadian do
|
4
|
+
let(:geocodio) { Geocodio::Client.new }
|
5
|
+
|
6
|
+
subject do
|
7
|
+
VCR.use_cassette('canadian') do
|
8
|
+
geocodio.geocode([
|
9
|
+
'1 Infinite Loop Cupertino CA 95014',
|
10
|
+
'356 Yonge St, Toronto, ON M5G, Canada',
|
11
|
+
'3475 Bd Sainte-Anne, Beauport, QC G1E 3L5, Canada'
|
12
|
+
], fields: %w[timezone cd118 provriding riding stateleg-next]).map(&:best)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:us_address) { subject[0] }
|
17
|
+
let(:ca_en_address){ subject[1] }
|
18
|
+
let(:ca_fr_address){ subject[2] }
|
19
|
+
|
20
|
+
it 'is a canadian address' do
|
21
|
+
expect(ca_en_address).to be_canadian
|
22
|
+
expect(ca_fr_address).to be_canadian
|
23
|
+
end
|
24
|
+
|
25
|
+
it "isn't a canadian address" do
|
26
|
+
expect(us_address).to_not be_canadian
|
27
|
+
expect(us_address.canadian).to be_nil
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'has canadian federal electoral district' do
|
31
|
+
expect(ca_en_address.canadian).to_not be_nil
|
32
|
+
expect(ca_en_address.canadian.federal_electoral_district).to_not be_nil
|
33
|
+
|
34
|
+
federal_district1 = ca_en_address.canadian.federal_electoral_district
|
35
|
+
|
36
|
+
expect(federal_district1.code).to eq('35110')
|
37
|
+
expect(federal_district1.name_english).to eq('University--Rosedale')
|
38
|
+
expect(federal_district1.name_french).to eq('University--Rosedale')
|
39
|
+
expect(federal_district1.ocd_id).to eq('ocd-division/country:ca/ed:35110-2013')
|
40
|
+
expect(federal_district1.source).to eq('Statistics Canada')
|
41
|
+
|
42
|
+
expect(ca_fr_address.canadian).to_not be_nil
|
43
|
+
expect(ca_fr_address.canadian.federal_electoral_district).to_not be_nil
|
44
|
+
|
45
|
+
federal_district2 = ca_fr_address.canadian.federal_electoral_district
|
46
|
+
|
47
|
+
expect(federal_district2.code).to eq('24008')
|
48
|
+
expect(federal_district2.name_english).to eq('Beauport--Limoilou')
|
49
|
+
expect(federal_district2.name_french).to eq('Beauport--Limoilou')
|
50
|
+
expect(federal_district2.ocd_id).to eq('ocd-division/country:ca/ed:24008-2013')
|
51
|
+
expect(federal_district2.source).to eq('Statistics Canada')
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'has canadian provincial electoral district' do
|
55
|
+
expect(ca_en_address.canadian).to_not be_nil
|
56
|
+
expect(ca_en_address.canadian.provincial_electoral_district).to_not be_nil
|
57
|
+
|
58
|
+
provincial_district1 = ca_en_address.canadian.provincial_electoral_district
|
59
|
+
|
60
|
+
expect(provincial_district1.name_english).to eq('University - Rosedale')
|
61
|
+
expect(provincial_district1.name_french).to eq('University - Rosedale')
|
62
|
+
expect(provincial_district1.ocd_id).to eq('ocd-division/country:ca/province:on/ed:112-2015')
|
63
|
+
expect(provincial_district1.source).to eq('Elections Ontario')
|
64
|
+
|
65
|
+
expect(ca_fr_address.canadian).to_not be_nil
|
66
|
+
expect(ca_fr_address.canadian.provincial_electoral_district).to_not be_nil
|
67
|
+
|
68
|
+
provincial_district2 = ca_fr_address.canadian.provincial_electoral_district
|
69
|
+
|
70
|
+
expect(provincial_district2.name_english).to eq('Montmorency')
|
71
|
+
expect(provincial_district2.name_french).to eq('Montmorency')
|
72
|
+
expect(provincial_district2.ocd_id).to eq('ocd-division/country:ca/province:qc/ed:742-2017')
|
73
|
+
expect(provincial_district2.source).to eq("Contains open data granted under the Chief Electoral Officer's Open Data User Licence available at http://dgeq.org/en/. The fact of granting the licence in no way implies that the Chief Electoral Officer approves the use made of the open data.")
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
end
|
data/spec/client_spec.rb
ADDED
@@ -0,0 +1,196 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Geocodio::Client do
|
4
|
+
let(:geocodio) { Geocodio::Client.new }
|
5
|
+
let(:address) { '54 West Colorado Boulevard Pasadena CA 91105' }
|
6
|
+
let(:coordinates) { '34.145760590909,-118.15204363636' }
|
7
|
+
|
8
|
+
it 'requires an API key' do
|
9
|
+
VCR.use_cassette('invalid_key') do
|
10
|
+
expect { geocodio.geocode([address]) }.to raise_error(Geocodio::Client::Error)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'parses an address into components' do
|
15
|
+
VCR.use_cassette('parse') do
|
16
|
+
result = geocodio.parse(address)
|
17
|
+
|
18
|
+
expect(result).to be_a(Geocodio::Address)
|
19
|
+
end
|
20
|
+
end
|
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
|
+
|
27
|
+
describe '#geocode' do
|
28
|
+
it 'geocodes a single address' do
|
29
|
+
VCR.use_cassette('geocode') do
|
30
|
+
addresses = geocodio.geocode([address])
|
31
|
+
|
32
|
+
expect(addresses.size).to eq(2)
|
33
|
+
expect(addresses).to be_a(Geocodio::AddressSet)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'geocodes a single address with an options hash' do
|
38
|
+
VCR.use_cassette('geocode_with_fields') do
|
39
|
+
addresses = geocodio.geocode([address], fields: %w[cd118 stateleg-next school timezone])
|
40
|
+
|
41
|
+
expect(addresses.size).to eq(2)
|
42
|
+
expect(addresses).to be_a(Geocodio::AddressSet)
|
43
|
+
end
|
44
|
+
end
|
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
|
+
|
52
|
+
it 'geocodes multiple addresses' do
|
53
|
+
VCR.use_cassette('batch_geocode') do
|
54
|
+
addresses = [
|
55
|
+
'1 Infinite Loop Cupertino CA 95014',
|
56
|
+
'54 West Colorado Boulevard Pasadena CA 91105',
|
57
|
+
'826 Howard Street San Francisco CA 94103'
|
58
|
+
]
|
59
|
+
|
60
|
+
addresses = geocodio.geocode(addresses)
|
61
|
+
|
62
|
+
expect(addresses.size).to eq(3)
|
63
|
+
addresses.each { |address| expect(address).to be_a(Geocodio::AddressSet) }
|
64
|
+
end
|
65
|
+
end
|
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
|
+
|
80
|
+
it 'geocodes multiple addresses with an options hash' do
|
81
|
+
VCR.use_cassette('batch_geocode_with_fields') do
|
82
|
+
addresses = [
|
83
|
+
'1 Infinite Loop Cupertino CA 95014',
|
84
|
+
'54 West Colorado Boulevard Pasadena CA 91105',
|
85
|
+
'826 Howard Street San Francisco CA 94103'
|
86
|
+
]
|
87
|
+
|
88
|
+
addresses = geocodio.geocode(addresses, fields: %w[cd118 stateleg-next school timezone])
|
89
|
+
|
90
|
+
expect(addresses.size).to eq(3)
|
91
|
+
addresses.each { |address| expect(address).to be_a(Geocodio::AddressSet) }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe '#reverse_geocode' do
|
97
|
+
context 'with a single address' do
|
98
|
+
it 'uses strings' do
|
99
|
+
VCR.use_cassette('reverse') do
|
100
|
+
addresses = geocodio.reverse_geocode([coordinates])
|
101
|
+
|
102
|
+
expect(addresses.size).to eq(13)
|
103
|
+
expect(addresses).to be_a(Geocodio::AddressSet)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'handles a response without legislator house info' do
|
108
|
+
VCR.use_cassette('reverse_with_fields_no_house_info') do
|
109
|
+
expect { geocodio.reverse_geocode(["41.25,-96.00"], fields: %w[cd118 stateleg-next school timezone]) }.not_to raise_error(NoMethodError)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'uses hashes' do
|
114
|
+
VCR.use_cassette('reverse') do
|
115
|
+
lat, lng = coordinates.split(',')
|
116
|
+
addresses = geocodio.reverse_geocode([{ latitude: lat, longitude: lng }])
|
117
|
+
|
118
|
+
expect(addresses.size).to eq(13)
|
119
|
+
expect(addresses).to be_a(Geocodio::AddressSet)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'accepts an options hash' do
|
124
|
+
VCR.use_cassette('reverse_with_fields') do
|
125
|
+
lat, lng = coordinates.split(',')
|
126
|
+
addresses = geocodio.reverse_geocode([{ latitude: lat, longitude: lng} ], fields: %w[cd118 stateleg-next school timezone])
|
127
|
+
|
128
|
+
expect(addresses.size).to eq(13)
|
129
|
+
expect(addresses).to be_a(Geocodio::AddressSet)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'reverse geocoding multiple addresses' do
|
135
|
+
it 'uses strings' do
|
136
|
+
VCR.use_cassette('batch_reverse') do
|
137
|
+
coordinate_pairs = [
|
138
|
+
'37.331669,-122.03074',
|
139
|
+
'34.145760590909,-118.15204363636',
|
140
|
+
'37.7815,-122.404933'
|
141
|
+
]
|
142
|
+
|
143
|
+
addresses = geocodio.reverse_geocode(coordinate_pairs)
|
144
|
+
|
145
|
+
expect(addresses.size).to eq(3)
|
146
|
+
addresses.each { |address| expect(address).to be_a(Geocodio::AddressSet) }
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'uses hashes' do
|
151
|
+
VCR.use_cassette('batch_reverse') do
|
152
|
+
coordinate_pairs = [
|
153
|
+
{ latitude: 37.331669, longitude: -122.03074 },
|
154
|
+
{ latitude: 34.145760590909, longitude: -118.15204363636 },
|
155
|
+
{ latitude: 37.7815, longitude: -122.404933 }
|
156
|
+
]
|
157
|
+
|
158
|
+
addresses = geocodio.reverse_geocode(coordinate_pairs)
|
159
|
+
|
160
|
+
expect(addresses.size).to eq(3)
|
161
|
+
addresses.each { |address| expect(address).to be_a(Geocodio::AddressSet) }
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'uses an arbitrary combination of strings and hashes' do
|
166
|
+
VCR.use_cassette('batch_reverse') do
|
167
|
+
coordinate_pairs = [
|
168
|
+
{ latitude: 37.331669, longitude: -122.03074 },
|
169
|
+
'34.145760590909,-118.15204363636',
|
170
|
+
{ latitude: 37.7815, longitude: -122.404933 }
|
171
|
+
]
|
172
|
+
|
173
|
+
addresses = geocodio.reverse_geocode(coordinate_pairs)
|
174
|
+
|
175
|
+
expect(addresses.size).to eq(3)
|
176
|
+
addresses.each { |address| expect(address).to be_a(Geocodio::AddressSet) }
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
it 'accepts an options hash' do
|
181
|
+
VCR.use_cassette('batch_reverse_with_fields') do
|
182
|
+
coordinate_pairs = [
|
183
|
+
{ latitude: 37.331669, longitude: -122.03074 },
|
184
|
+
'34.145760590909,-118.15204363636',
|
185
|
+
{ latitude: 37.7815, longitude: -122.404933 }
|
186
|
+
]
|
187
|
+
|
188
|
+
addresses = geocodio.reverse_geocode(coordinate_pairs, fields: %w[cd118 stateleg-next school timezone])
|
189
|
+
|
190
|
+
expect(addresses.size).to eq(3)
|
191
|
+
addresses.each { |address| expect(address).to be_a(Geocodio::AddressSet) }
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Geocodio::CongressionalDistrict do
|
4
|
+
let(:geocodio) { Geocodio::Client.new }
|
5
|
+
|
6
|
+
subject(:district) do
|
7
|
+
VCR.use_cassette('geocode_with_fields') do
|
8
|
+
geocodio.geocode(['54 West Colorado Boulevard Pasadena CA 91105'], fields: %w[cd118 stateleg-next school timezone]).
|
9
|
+
best.
|
10
|
+
congressional_districts.
|
11
|
+
first
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'has a name' do
|
16
|
+
expect(district.name).to eq("Congressional District 28")
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'has a district_number' do
|
20
|
+
expect(district.district_number).to eq(28)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'has a congress_number' do
|
24
|
+
expect(district.congress_number).to eq(118)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'has a congress_years' do
|
28
|
+
expect(district.congress_years).to eq(2023..2025)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'has a proportion' do
|
32
|
+
expect(district.proportion).to eq(1)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'has ocd_id' do
|
36
|
+
expect(district.ocd_id).to eq('ocd-division/country:us/state:ca/cd:28')
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
it 'has current_legislators' do
|
41
|
+
district.current_legislators.each do |legislator|
|
42
|
+
expect(legislator).to be_a(Geocodio::Legislator)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Geocodio::Legislator do
|
4
|
+
let(:geocodio) { Geocodio::Client.new }
|
5
|
+
|
6
|
+
subject(:legislator) do
|
7
|
+
VCR.use_cassette('geocode_with_fields_legacy') do
|
8
|
+
geocodio.geocode(['54 West Colorado Boulevard Pasadena CA 91105'], fields: %w[cd stateleg-next school timezone]).
|
9
|
+
best.
|
10
|
+
congressional_districts.
|
11
|
+
first.
|
12
|
+
current_legislators.
|
13
|
+
first
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'has a type' do
|
18
|
+
expect(legislator.type).to eq('representative')
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'has a name' do
|
22
|
+
expect(legislator.name).to eq('Judy Chu')
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'has a birthday' do
|
26
|
+
expect(legislator.birthday).to eq(Date.new(1953, 07, 07))
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'has a gender' do
|
30
|
+
expect(legislator.gender).to eq('F')
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'has a party' do
|
34
|
+
expect(legislator.party).to eq('Democrat')
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'has a url' do
|
38
|
+
expect(legislator.url).to eq('https://chu.house.gov')
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'has a address' do
|
42
|
+
expect(legislator.address).to eq('2423 Rayburn House Office Building Washington DC 20515-0527')
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'has a phone' do
|
46
|
+
expect(legislator.phone).to eq('202-225-5464')
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'has a contact_form' do
|
50
|
+
expect(legislator.contact_form).to be_nil
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'has a rss_url' do
|
54
|
+
expect(legislator.rss_url).to eq('http://chu.house.gov/rss.xml')
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'has a twitter' do
|
58
|
+
expect(legislator.twitter).to eq('RepJudyChu')
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'has a facebook' do
|
62
|
+
expect(legislator.facebook).to eq('RepJudyChu')
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'has a youtube' do
|
66
|
+
expect(legislator.youtube).to eq('RepJudyChu')
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'has a youtube_id' do
|
70
|
+
expect(legislator.youtube_id).to eq('UCfcbYOvdEXZNelM8T05nK-w')
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'has a bioguide_id' do
|
74
|
+
expect(legislator.bioguide_id).to eq('C001080')
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'has a thomas_id' do
|
78
|
+
expect(legislator.thomas_id).to eq('01970')
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'has a opensecrets_id' do
|
82
|
+
expect(legislator.opensecrets_id).to eq('N00030600')
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'has a lis_id' do
|
86
|
+
expect(legislator.lis_id).to be_nil
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'has a cspan_id' do
|
90
|
+
expect(legislator.cspan_id).to eq('92573')
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'has a govtrack_id' do
|
94
|
+
expect(legislator.govtrack_id).to eq('412379')
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'has a votesmart_id' do
|
98
|
+
expect(legislator.votesmart_id).to eq('16539')
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'has a ballotpedia_id' do
|
102
|
+
expect(legislator.ballotpedia_id).to eq('Judy Chu')
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'has a washington_post_id' do
|
106
|
+
expect(legislator.washington_post_id).to be_nil
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'has a icpsr_id' do
|
110
|
+
expect(legislator.icpsr_id).to eq('20955')
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'has a wikipedia_id' do
|
114
|
+
expect(legislator.wikipedia_id).to eq('Judy Chu')
|
115
|
+
end
|
116
|
+
end
|