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