civic_aide 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e03d0a671bc6b095f5761c2e5f07e660863fef87
4
+ data.tar.gz: 77148f826be45b90e9fcee16a6087f2b1353853f
5
+ SHA512:
6
+ metadata.gz: a194ab4d66d26d4c71da53752a0a10ae5785de5f832bbb255be965db315f943bef1f52290876999650ba93adc1349b72ddb5cfac6671436c53fa2d51422ac2c6
7
+ data.tar.gz: bb8c4cfed6cc5923528dedfcf4f004300b26e3bfbfaba7829f137cc62a2a5943de13df2f049dc28a7dfe28919c95129bf439b918f45ea7212e0eac31596183ed
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .DS_Store
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1.0
6
+ notifications:
7
+ email:
8
+ - ty.pearson@gmail.com
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in civic_aide.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Tyler Pearson
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,454 @@
1
+ # CivicAide
2
+
3
+ A (unofficial) Ruby wrapper to interact with the [Google Civic Information API](https://developers.google.com/civic-information/).
4
+
5
+ Currently the API only provides information for the United States.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'civic_aide'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install civic_aide
20
+
21
+ ## Usage
22
+
23
+ ### Setup
24
+
25
+ The Google Civic Information API requires an API key, so before you start grab a [server API key](https://developers.google.com/civic-information/docs/using_api) from the [Google Cloud Console](https://cloud.google.com/console#/project).
26
+
27
+ The current default API limits for the Google Civic Information API are 1/request/second/user and 25,000 requests/day.
28
+
29
+ ### Response
30
+
31
+ All responses are wrapped in a [hashie](https://github.com/intridea/hashie) object that can be accessed in a number of ways. All methods have been rubyify'ed **but** those matching [Open Civic Data identifiers](https://github.com/opencivicdata/ocd-division-ids) (e.g. `ocd-division/country:us/state:nc/county:durham`).
32
+
33
+ Additionally, to avoid clashing with the [Array#zip Ruby method](http://apidock.com/ruby/Array/zip), any `zip` address fields in the API response have been renamed to `zip_code`.
34
+
35
+ ### Configuration
36
+
37
+ ```ruby
38
+ google_api_key = `ABCaSyD5aMsdmaXxHc7aiUyYuVXtCICV-y_PWnf5w`
39
+ client = CivicAide::Client.new(google_api_key)
40
+ ```
41
+
42
+ Alternatively, the API key can be set with global configuration.
43
+
44
+ ```ruby
45
+ CivicAide.api_key = "ABCaSyD5aMsdmaXxHc7aiUyYuVXtCICV-y_PWnf5w"
46
+ client = CivicAide::Client.new
47
+ ```
48
+
49
+ ## Resources
50
+
51
+ ### [Elections](https://developers.google.com/civic-information/docs/us_v1/elections)
52
+
53
+ #### All elections
54
+
55
+ To fetch a list of all available elections and their ids.
56
+
57
+ `client.elections.all`
58
+
59
+ ##### Sample response
60
+
61
+ ```ruby
62
+ {"elections"=>
63
+ [{"id"=>"2000", "name"=>"VIP Test Election", "election_day"=>"2015-06-06"},
64
+ {"id"=>"4000",
65
+ "name"=>"U.S. 2012 General Election",
66
+ "election_day"=>"2012-11-06"},
67
+ {"id"=>"4001",
68
+ "name"=>"Los Angeles City Primary",
69
+ "election_day"=>"2013-03-05"},
70
+ {"id"=>"4002",
71
+ "name"=>"California Combined Special Elections",
72
+ "election_day"=>"2013-03-12"},
73
+ {"id"=>"4003",
74
+ "name"=>"South Carolina HD-01 Special Primary",
75
+ "election_day"=>"2013-03-19"},
76
+ {"id"=>"4004",
77
+ "name"=>"California Special Election SD-32",
78
+ "election_day"=>"2013-05-14"},
79
+ {"id"=>"4005",
80
+ "name"=>"Los Angeles City Election",
81
+ "election_day"=>"2013-05-21"},
82
+ {"id"=>"4006",
83
+ "name"=>"South Carolina HD-01",
84
+ "election_day"=>"2013-05-07"},
85
+ {"id"=>"4007", "name"=>"New Jersey Primary", "election_day"=>"2013-06-04"},
86
+ {"id"=>"4008", "name"=>"Virginia Primary", "election_day"=>"2013-06-11"},
87
+ {"id"=>"4009",
88
+ "name"=>"Delaware Presidential Primary 2012",
89
+ "election_day"=>"2013-09-01"},
90
+ {"id"=>"4010",
91
+ "name"=>"NYC 2013 Mayoral Primary",
92
+ "election_day"=>"2013-09-10"},
93
+ {"id"=>"4011",
94
+ "name"=>"NYC 2013 Mayoral Primary Runoff",
95
+ "election_day"=>"2013-10-01"},
96
+ {"id"=>"4012",
97
+ "name"=>"NJ 2013 U.S. Senate Special Election",
98
+ "election_day"=>"2013-10-16"},
99
+ {"id"=>"4013",
100
+ "name"=>"NYC 2013 Mayoral Election",
101
+ "election_day"=>"2013-11-05"},
102
+ {"id"=>"4014", "name"=>"NJ State Election", "election_day"=>"2013-11-05"},
103
+ {"id"=>"4015", "name"=>"VA State Election", "election_day"=>"2013-11-05"},
104
+ {"id"=>"4016",
105
+ "name"=>"MN 2013 Municipal General",
106
+ "election_day"=>"2013-11-05"}]}
107
+ ```
108
+
109
+ #### Find election info by address
110
+
111
+ After finding the id for the election you want, pass the election id and the voter's registered address.
112
+
113
+ `client.elections(4015).at('4910 Willet Drive, Annandale, VA 22003')`
114
+
115
+ ##### Sample Response
116
+
117
+ ```ruby
118
+ {"election"=>
119
+ {"id"=>"4015", "name"=>"VA State Election", "election_day"=>"2013-11-05"},
120
+ "normalized_input"=>
121
+ {"line1"=>"4910 willet dr",
122
+ "city"=>"annandale",
123
+ "state"=>"VA",
124
+ "zip_code"=>"22003"},
125
+ "contests"=>
126
+ [{"type"=>"general",
127
+ "special"=>"no",
128
+ "office"=>"Governor",
129
+ "district"=>{"name"=>"Statewide", "scope"=>"statewide"},
130
+ "ballot_placement"=>"4",
131
+ "candidates"=>
132
+ [{"name"=>"Ken T. Cuccinelli II",
133
+ "party"=>"Republican",
134
+ "candidate_url"=>"http://www.cuccinelli.com",
135
+ "phone"=>"8047863808",
136
+ "email"=>"ken@cuccinelli.com"},
137
+ {"name"=>"Robert C. Sarvis",
138
+ "party"=>"Libertarian",
139
+ "candidate_url"=>"http://www.robertsarvis.com",
140
+ "email"=>"info@robertsarvis.com"},
141
+ {"name"=>"Terry R. McAuliffe",
142
+ "party"=>"Democrat",
143
+ "candidate_url"=>"http://www.terrymcauliffe.com",
144
+ "phone"=>"7038227604",
145
+ "email"=>"info@terrymcauliffe.com"}],
146
+ "sources"=>[{"name"=>"Voting Information Project", "official"=>true}]},
147
+ {"type"=>"general",
148
+ "special"=>"no",
149
+ "office"=>"Attorney General",
150
+ "district"=>{"name"=>"Statewide", "scope"=>"statewide"},
151
+ "ballot_placement"=>"6",
152
+ "candidates"=>
153
+ [{"name"=>"Mark D. Obenshain",
154
+ "party"=>"Republican",
155
+ "candidate_url"=>"http://www.markobenshain.com",
156
+ "phone"=>"5404371451",
157
+ "email"=>"campaign@markobenshain.com"},
158
+ {"name"=>"Mark R. Herring",
159
+ "party"=>"Democrat",
160
+ "candidate_url"=>"http://www.herringforag.com",
161
+ "phone"=>"7036699090",
162
+ "email"=>"kevin@herringforag.com"}],
163
+ "sources"=>[{"name"=>"Voting Information Project", "official"=>true}]},
164
+ {"type"=>"general",
165
+ "special"=>"no",
166
+ "office"=>"Sheriff",
167
+ "district"=>{"name"=>"FAIRFAX COUNTY"},
168
+ "ballot_placement"=>"11",
169
+ "candidates"=>
170
+ [{"name"=>"Stacey Ann Kincaid",
171
+ "party"=>"Democrat",
172
+ "candidate_url"=>"http://staceykincaid.com",
173
+ "phone"=>"7039381658",
174
+ "email"=>"Kincaidforsheriff@gmail.com"},
175
+ {"name"=>"Christopher F. DeCarlo",
176
+ "party"=>"Independent",
177
+ "candidate_url"=>"http://www.honestyandethics.com",
178
+ "phone"=>"7035736160",
179
+ "email"=>"cdecarlo@fairfaxpropane.com"},
180
+ {"name"=>"Bryan A. /B. A./ Wolfe",
181
+ "party"=>"Republican",
182
+ "candidate_url"=>"http://www.wolfeforsheriff.com",
183
+ "phone"=>"7035436360",
184
+ "email"=>"fairfaxwolfe@yahoo.com"},
185
+ {"name"=>"Robert A. Rivera",
186
+ "party"=>"Independent",
187
+ "phone"=>"7039783034",
188
+ "email"=>"riveraforsheriff@gmail.com"}],
189
+ "sources"=>[{"name"=>"Voting Information Project", "official"=>true}]},
190
+ {"type"=>"Referendum",
191
+ "special"=>"no",
192
+ "office"=>"School Bonds",
193
+ "district"=>{"name"=>"FAIRFAX COUNTY", "id"=>"59"},
194
+ "ballot_placement"=>"9999",
195
+ "sources"=>[{"name"=>"Voting Information Project", "official"=>true}]}],
196
+ "state"=>
197
+ [{"name"=>"Virginia",
198
+ "election_administration_body"=>
199
+ {"name"=>"State Board of Elections",
200
+ "election_info_url"=>"http://www.sbe.virginia.gov/",
201
+ "election_registration_url"=>"https://www.vote.virginia.gov/",
202
+ "election_registration_confirmation_url"=>
203
+ "https://www.vote.virginia.gov/",
204
+ "absentee_voting_info_url"=>
205
+ "http://www.sbe.virginia.gov/absenteevoting.html",
206
+ "voting_location_finder_url"=>"https://www.vote.virginia.gov/",
207
+ "ballot_info_url"=>"https://www.vote.virginia.gov/",
208
+ "election_rules_url"=>"http://www.sbe.virginia.gov/",
209
+ "physical_address"=>
210
+ {"location_name"=>"State Board of Elections",
211
+ "line1"=>"Washington Building First Floor",
212
+ "line2"=>"1100 Bank Street",
213
+ "city"=>"Richmond",
214
+ "state"=>"VA",
215
+ "zip_code"=>"23219"}},
216
+ "local_jurisdiction"=>
217
+ {"name"=>"FAIRFAX COUNTY",
218
+ "election_administration_body"=>
219
+ {"name"=>"FAIRFAX COUNTY",
220
+ "election_info_url"=>"http://www.fairfaxcounty.gov/elections",
221
+ "election_registration_url"=>"http://www.vote.virginia.gov",
222
+ "election_registration_confirmation_url"=>
223
+ "http://www.vote.virginia.gov",
224
+ "absentee_voting_info_url"=>"http://www.vote.virginia.gov",
225
+ "voting_location_finder_url"=>"http://www.vote.virginia.gov",
226
+ "ballot_info_url"=>"http://www.vote.virginia.gov",
227
+ "election_rules_url"=>"http://www.vote.virginia.gov",
228
+ "hours_of_operation"=>
229
+ "8:00 a.m. to 4:30 p.m Monday-Wednesday and Friday and 8:00 a.m. to 7:00 p.m. Thursday",
230
+ "physical_address"=>
231
+ {"location_name"=>"FAIRFAX COUNTY",
232
+ "line1"=>"OFFICE OF ELECTIONS",
233
+ "line2"=>"12000 GOVERNMENT CENTER PKWY",
234
+ "line3"=>"SUITE 323",
235
+ "city"=>"FAIRFAX",
236
+ "state"=>"VA",
237
+ "zip_code"=>"22035-0081"},
238
+ "election_officials"=>
239
+ [{"name"=>"CAMERON P. QUINN",
240
+ "title"=>"General Registrar Physical",
241
+ "office_phone_number"=>"7033244715",
242
+ "email_address"=>"cameronquinn@fairfaxcounty.gov"}]},
243
+ "sources"=>[{"name"=>"Voting Information Project", "official"=>true}]},
244
+ "sources"=>[{"name"=>"Voting Information Project", "official"=>true}]}]}
245
+ ```
246
+
247
+ ### [Representatives](https://developers.google.com/civic-information/docs/us_v1/representatives/representativeInfoQuery)
248
+
249
+ Retrieve political geography and representative information based on an address.
250
+
251
+ `client.representatives.at('118 E. Main St. Carrboro, NC 27510')`
252
+
253
+ ##### Response (shortened some to save space)
254
+
255
+ ```ruby
256
+ {"normalized_input"=>
257
+ {"line1"=>"118 e main st",
258
+ "city"=>"carrboro",
259
+ "state"=>"NC",
260
+ "zip_code"=>"27510"},
261
+ "divisions"=>
262
+ {"ocd-division/country:us/state:nc/cd:4"=>
263
+ {"name"=>"North Carolina's 4th congressional district",
264
+ "scope"=>"congressional",
265
+ "office_ids"=>["O0"]},
266
+ "ocd-division/country:us/state:nc"=>
267
+ {"name"=>"North Carolina",
268
+ "scope"=>"statewide",
269
+ "office_ids"=>
270
+ ["O1", "O2", "O3", "O4", "O5", "O6", "O7", "O8", "O9", "Oa", "Ob"]},
271
+ "ocd-division/country:us/state:nc/place:carrboro"=>
272
+ {"name"=>"Carrboro town", "scope"=>"citywide"},
273
+ "ocd-division/country:us"=>
274
+ {"name"=>"United States", "scope"=>"national", "office_ids"=>["Oc", "Od"]},
275
+ "ocd-division/country:us/state:nc/county:orange"=>
276
+ {"name"=>"Orange County",
277
+ "scope"=>"countywide",
278
+ "office_ids"=>["Oe", "Of", "O10", "O11", "O12"]}},
279
+ "offices"=>
280
+ {"o0"=>
281
+ {"name"=>"United States House of Representatives NC-04",
282
+ "level"=>"federal",
283
+ "official_ids"=>["P0"]},
284
+ "o1"=>{"name"=>"Governor", "level"=>"state", "official_ids"=>["P1"]},
285
+ "o2"=>{"name"=>"State Auditor", "level"=>"state", "official_ids"=>["P2"]},
286
+ "o3"=>{"name"=>"State Treasurer", "level"=>"state", "official_ids"=>["P3"]},
287
+ "o4"=>
288
+ {"name"=>"Attorney General", "level"=>"state", "official_ids"=>["P4"]},
289
+ "o5"=>
290
+ {"name"=>"Secretary of State", "level"=>"state", "official_ids"=>["P5"]},
291
+ "o6"=>
292
+ {"name"=>"Lieutenant Governor", "level"=>"state", "official_ids"=>["P6"]},
293
+ "o7"=>
294
+ {"name"=>"United States Senate",
295
+ "level"=>"federal",
296
+ "official_ids"=>["P7", "P8"]},
297
+ "officials"=>
298
+ {"p4"=>
299
+ {"name"=>"Roy Cooper",
300
+ "address"=>
301
+ [{"line1"=>"9001 Mail Service Center",
302
+ "city"=>"raleigh",
303
+ "state"=>"NC",
304
+ "zip_code"=>"27699"}],
305
+ "phones"=>["(919) 716-6400"],
306
+ "urls"=>["http://www.ncdoj.gov/"],
307
+ "channels"=>
308
+ [{"type"=>"Facebook", "id"=>"157759274279900"},
309
+ {"type"=>"Twitter", "id"=>"NCAGO"}]},
310
+ "p5"=>
311
+ {"name"=>"Elaine Marshall",
312
+ "address"=>
313
+ [{"line1"=>"NC Secretary of State PO Box 29622",
314
+ "city"=>"raleigh",
315
+ "state"=>"NC",
316
+ "zip_code"=>"27626"}],
317
+ "phones"=>["(919) 807-2000"],
318
+ "urls"=>["http://www.sosnc.com/"]},
319
+ "p6"=>
320
+ {"name"=>"Dan Forest",
321
+ "address"=>
322
+ [{"line1"=>"20401 Mail Service Center",
323
+ "city"=>"raleigh",
324
+ "state"=>"NC",
325
+ "zip_code"=>"27699"}],
326
+ "party"=>"Republican",
327
+ "phones"=>["(919) 733-7350"],
328
+ "urls"=>["http://www.ltgov.state.nc.us/"],
329
+ "emails"=>["lt.gov@nc.gov"],
330
+ "channels"=>
331
+ [{"type"=>"Facebook", "id"=>"DanForestNC"},
332
+ {"type"=>"Twitter", "id"=>"DanForestNC"}]},
333
+ "p7"=>
334
+ {"name"=>"Kay R. Hagan",
335
+ "address"=>
336
+ [{"line1"=>"521 Dirksen Senate Office Building",
337
+ "city"=>"washington",
338
+ "state"=>"DC",
339
+ "zip_code"=>"20510"}],
340
+ "party"=>"Democratic",
341
+ "phones"=>["(202) 224-6342"],
342
+ "urls"=>["http://www.hagan.senate.gov/"],
343
+ "photo_url"=>
344
+ "http://www.senate.gov/general/resources/graphic/medium/Hagan_200.jpg",
345
+ "emails"=>["Senator_Hagan@hagan.senate.gov"],
346
+ "channels"=>
347
+ [{"type"=>"Facebook", "id"=>"SenatorHagan"},
348
+ {"type"=>"Twitter", "id"=>"SenatorHagan"},
349
+ {"type"=>"YouTube", "id"=>"SenatorHagan"}]},
350
+ "p8"=>
351
+ {"name"=>"Richard Burr",
352
+ "address"=>
353
+ [{"line1"=>"217 Russell Senate Office Building",
354
+ "city"=>"washington",
355
+ "state"=>"DC",
356
+ "zip_code"=>"20510"}],
357
+ "party"=>"Republican",
358
+ "phones"=>["(202) 224-3154"],
359
+ "urls"=>["http://www.burr.senate.gov/public/"],
360
+ "photo_url"=>"http://bioguide.congress.gov/bioguide/photo/B/B001135.jpg",
361
+ "channels"=>
362
+ [{"type"=>"Facebook", "id"=>"SenatorRichardBurr"},
363
+ {"type"=>"Twitter", "id"=>"senatorburr"},
364
+ {"type"=>"YouTube", "id"=>"SenatorRichardBurr"}]},
365
+ "p9"=>
366
+ {"name"=>"Cherie Berry",
367
+ "address"=>
368
+ [{"line1"=>"NC Department of Labor 1101 Mail Service Center",
369
+ "city"=>"raleigh",
370
+ "state"=>"NC",
371
+ "zip_code"=>"27699"}],
372
+ "phones"=>["(919) 807-2796"],
373
+ "urls"=>["http://www.nclabor.com/"],
374
+ "emails"=>["Commissioners.Office@labor.nc.gov"]},
375
+ "p10"=>
376
+ {"name"=>"Wayne Goodwin",
377
+ "urls"=>["http://www.ncdoi.com/"],
378
+ "emails"=>["Commissioner@ncdoi.gov"],
379
+ "channels"=>
380
+ [{"type"=>"Facebook", "id"=>"ncdoi"},
381
+ {"type"=>"Twitter", "id"=>"NCInsuranceDept"}]},
382
+ "p11"=>
383
+ {"name"=>"Steve Troxler",
384
+ "address"=>
385
+ [{"line1"=>"1001 Mail Service Center",
386
+ "city"=>"raleigh",
387
+ "state"=>"NC",
388
+ "zip_code"=>"27699"}],
389
+ "phones"=>["(919) 707-3021"],
390
+ "urls"=>["http://www.ncagr.gov/"]},
391
+ "p12"=>
392
+ {"name"=>"June Atkinson",
393
+ "address"=>
394
+ [{"line1"=>
395
+ "Office of the State Superintendent NC Education Building 6301 Mail Service Center",
396
+ "city"=>"raleigh",
397
+ "state"=>"NC",
398
+ "zip_code"=>"27699"}],
399
+ "phones"=>["(919) 807-3430"],
400
+ "urls"=>["http://www.ncpublicschools.org/statesuperintendent/"],
401
+ "emails"=>["june.atkinson@dpi.nc.gov"]},
402
+ "p13"=>
403
+ {"name"=>"Barack Hussein Obama II",
404
+ "address"=>
405
+ [{"line1"=>"The White House",
406
+ "line2"=>"1600 Pennsylvania Avenue NW",
407
+ "line3"=>"",
408
+ "city"=>"Washington",
409
+ "state"=>"DC",
410
+ "zip_code"=>"20500"}],
411
+ "party"=>"Democrat",
412
+ "phones"=>["(202) 456-1111", "(202) 456-1414"],
413
+ "urls"=>
414
+ ["http://www.whitehouse.gov/administration/president_obama/",
415
+ "http://www.barackobama.com/index.php"],
416
+ "photo_url"=>
417
+ "http://www.whitehouse.gov/sites/default/files/imagecache/admin_official_lowres/administration-official/ao_image/president_official_portrait_hires.jpg",
418
+ "channels"=>
419
+ [{"type"=>"GooglePlus", "id"=>"110031535020051778989"},
420
+ {"type"=>"YouTube", "id"=>"barackobama"},
421
+ {"type"=>"Twitter", "id"=>"barackobama"},
422
+ {"type"=>"Facebook", "id"=>"barackobama"}]},
423
+ "p14"=>
424
+ {"name"=>"Joseph (Joe) Robinette Biden Jr.",
425
+ "address"=>
426
+ [{"line1"=>"The White House",
427
+ "line2"=>"1600 Pennsylvania Avenue NW",
428
+ "line3"=>"",
429
+ "city"=>"Washington",
430
+ "state"=>"DC",
431
+ "zip_code"=>"20500"}],
432
+ "party"=>"Democrat",
433
+ "urls"=>["http://www.whitehouse.gov/administration/vice-president-biden"],
434
+ "photo_url"=>
435
+ "http://www.whitehouse.gov/sites/default/files/imagecache/admin_official_lowres/administration-official/ao_image/vp_portrait.jpeg",
436
+ "channels"=>
437
+ [{"type"=>"Twitter", "id"=>"JoeBiden"},
438
+ {"type"=>"Facebook", "id"=>"joebiden"},
439
+ {"type"=>"Twitter", "id"=>"VP"}]}}
440
+ ```
441
+
442
+ ## Improvements
443
+
444
+ If you find an error with the data, please [let Google know](https://docs.google.com/forms/d/1bEqKzq5y9mnVBaReJP_o7fH6xkc4T484UdEbvJNxZ9c/viewform).
445
+
446
+ If you find an error with the gem, please add an issue. Feedback is appreciated!
447
+
448
+ ## Contributing
449
+
450
+ 1. Fork it
451
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
452
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
453
+ 4. Push to the branch (`git push origin my-new-feature`)
454
+ 5. Create new Pull Request