Source code for pymanifesto.pymanifesto

"""
`pymanifesto` provides the API client as well as utility classes and functions.
"""
import json
import typing
from dataclasses import dataclass
from urllib import error, parse, request


[docs]class API: """ `API` is the central entry point for the Manifesto Project API. It encapsulates the `api_key` and exposes the API's endpoints. """ def __init__(self, api_key): self.api_key = api_key @property def api_root(self) -> str: """ The API's root URL as defined by: https://manifestoproject.wzb.eu/information/documents/api """ return "https://manifesto-project.wzb.eu/tools"
[docs] def list_core_versions( self, kind: typing.Optional[str] = None ) -> typing.List["DatasetVersion"]: """ Lists all core dataset versions. """ options = {} if kind is not None: options.update({"kind": kind}) data = self._make_request(endpoint="api_list_core_versions", options=options) try: result = [DatasetVersion(**dv) for dv in data["datasets"]] except KeyError: raise ValueError(f"The kind {kind} is not known to the database.") else: return result
def _make_request(self, endpoint: str, options: typing.Dict) -> typing.Dict: url = f"{self.api_root}/{endpoint}.json" if options: encoded_options = parse.urlencode(options) url += f"?{encoded_options}" try: with request.urlopen(url) as content: data = content.read().decode("utf-8") except error.HTTPError: result = {"error": "Element not found"} else: result = json.loads(data) return result
[docs]@dataclass class DatasetVersion: """`DatasetVersion` models the objects returned by calling `API.list_core_versions`""" id: str # pylint: disable=invalid-name name: str