import json from urllib.parse import urljoin import posixpath import requests from itertools import groupby from serenitas.utils.misc import get_credential_path def load_api_key(): with get_credential_path("markit_api").open() as fh: creds = json.load(fh) base_url = creds.pop("url") r = requests.post( urljoin(base_url, "apikey"), data=creds, ) return base_url, r.text def lowercase_keys(d): return {k.lower(): v for k, v in d.items()} class MarkitAPI: base_url, api_key = load_api_key() @classmethod def get_data(cls, asset_class, after=None, service="latest"): params = { "format": "json", "assetClass": asset_class.value, "apikey": cls.api_key, "limit": 1000, "sortBy": "receivedDateTime", "descending": "false", "dateformat": "MILLISECONDSSINCEEPOCH", } if after: params["after"] = after print(params) path = posixpath.join("parsing", "Quote", service) url = urljoin(cls.base_url, path) r = requests.get(url, params) grouped_data = groupby( json.loads(r.text), key=lambda x: (x["message"]["id"], x["receivedDateTime"]), ) for key, data in grouped_data: yield key, map(lowercase_keys, data) @classmethod def update_api_key(cls): cls.base_url, cls.api_key = load_api_key() if "APIKEY_LIMIT_EXCEEDED" in cls.api_key: raise ValueError("API Key limit exceeded")