Source code for publicdata.census.api.url

# Copyright (c) 2017 Civic Knowledge. This file is licensed under the terms of the
# MIT License, included in this distribution as LICENSE

"""

"""


import json
from os.path import dirname, join

import requests
from publicdata.census.appurl import CensusUrl

from rowgenerators import parse_app_url
from rowgenerators.appurl.web import WebUrl
from rowgenerators.exceptions import AppUrlError
from publicdata.census.censusreporter.jsonurl import CensusReporterJsonUrl
from publicdata.census.api.censusapi import  CensusApi
from rowgenerators import Url

[docs]class CensusApiUrl(Url): """A URL for censusreporter tables. General form: censusapi:<dataset>/<in_specification>/<for_specification>#<column_list> for instance: """ def __init__(self, url=None, downloader='default', **kwargs): self._proto = 'censusapi' super().__init__(url, downloader, **kwargs) self.dataset_id, self.geo_in, self.geo_for = self.path.split('/') if not self.dataset_id: # The url has a :// in it self.dataset_id = self.netloc self._dataset = None @classmethod def _match(cls, url, **kwargs): return url.scheme.startswith('censusapi') @property def dataset(self): if not self._dataset: self._dataset = CensusApi().get_dataset(self.dataset_id) return self._dataset @property def resource_url(self): predicates = {} url = self.dataset.fetch_url(*self.target_file.split(','), geo_for=self.geo_for, geo_in=self.geo_in, **predicates) return parse_app_url(url, downloader=self.downloader)
[docs] def get_resource(self): ru = self.resource_url.get_resource() return CensusApiResourceUrl(ru, downloader=self.downloader)
[docs] def get_target(self): return self.get_resource().get_target()
@property def generator(self): """ Return the generator for this URL, if the rowgenerator package is installed. :return: A row generator object. """ from rowgenerators.core import get_generator return self.get_resource().get_target().generator @property def dataframe(self): return self.generator.dataframe() @property def cache_key(self): """Return the path for this url's data in the cache""" raise NotImplementedError() @property def path_parts(self): raise NotImplementedError
[docs] def join(self, s): raise NotImplementedError()
[docs] def join_dir(self, s): raise NotImplementedError()
[docs] def join_target(self, tf): raise NotImplementedError()
from rowgenerators.generator.json import JsonRowSource from rowgenerators.appurl.file.file import FileUrl
[docs]class CensusApiResourceUrl(FileUrl): """A URL for censusreporter tables. General form: censusapi:<dataset>/<in_specification>/<for_specification>#<column_list> for instance: """ @classmethod def _match(cls, url, **kwargs): raise NotImplementedError @property def dataset(self): if not self._dataset: self._dataset = CensusApi().get_dataset(self.dataset_id) return self._dataset
[docs] def get_resource(self): return self
[docs] def get_target(self): return self
@property def generator(self): return JsonRowSource(self)