Source code for parsons.google.google_civic

from parsons.utilities import check_env
import requests
from parsons.etl import Table

URI = 'https://www.googleapis.com/civicinfo/v2/'


[docs]class GoogleCivic(object): """ `Args:` api_key : str A valid Google api key. Not required if ``GOOGLE_CIVIC_API_KEY`` env variable set. `Returns:` class """ def __init__(self, api_key=None): self.api_key = check_env.check('GOOGLE_CIVIC_API_KEY', api_key) self.uri = URI def request(self, url, args=None): # Internal request method if not args: args = {} args['key'] = self.api_key r = requests.get(url, params=args) return r.json()
[docs] def get_elections(self): """ Get a collection of information about elections and voter information. `Returns:` Parsons Table See :ref:`parsons-table` for output options. """ url = self.uri + 'elections' return Table((self.request(url))['elections'])
def _get_voter_info(self, election_id, address): # Internal method to call voter info end point. Portions of this are # parsed for other methods. url = self.uri + 'voterinfo' args = {'address': address, 'electionId': election_id} return self.request(url, args=args)
[docs] def get_polling_location(self, election_id, address): """ Get polling location information for a given address. `Args:` election_id: int A valid election id. Election ids can be found by running the :meth:`get_elections` method. address: str A valid US address in a single string. `Returns:` Parsons Table See :ref:`parsons-table` for output options. """ r = self._get_voter_info(election_id, address) return r['pollingLocations']
[docs] def get_polling_locations(self, election_id, table, address_field='address'): """ Get polling location information for a table of addresses. `Args:` election_id: int A valid election id. Election ids can be found by running the :meth:`get_elections` method. address: str A valid US address in a single string. address_field: str The name of the column where the address is stored. `Returns:` Parsons Table See :ref:`parsons-table` for output options. """ polling_locations = [] # Iterate through the rows of the table for row in table: loc = self.get_polling_location(election_id, row[address_field]) # Insert original passed address loc[0]['passed_address'] = row[address_field] # Add to list of lists polling_locations.append(loc[0]) # Unpack values tbl = Table(polling_locations) tbl.unpack_dict('address', prepend_value='polling') tbl.unpack_list('sources', replace=True) tbl.unpack_dict('sources_0', prepend_value='source') tbl.rename_column('polling_line1', 'polling_address') # Resort columns tbl.move_column('pollingHours', len(tbl.columns)) tbl.move_column('notes', len(tbl.columns)) tbl.move_column('polling_locationName', 1) tbl.move_column('polling_address', 2) return tbl