from dataclasses import dataclass from enum import Enum def _json(value): try: return value.json() except AttributeError: return value class _StrEnum(Enum): def __str__(self): return self.value def json(self): return self.value class Model(_StrEnum): AROME = "arome" GEOS5 = "geos5" GFS = "gfs" GFSWAVE = "gfsWave" ICONEU = "iconEu" NAMALASKA = "namAlaska" NAMCONUS = "namConus" NAMHAWAII = "namHawaii" class Level(_StrEnum): SURFACE = "surface" H1000 = "1000h" H950 = "950h" H925 = "925h" H900 = "900h" H850 = "850h" H800 = "800h" H700 = "700h" H600 = "600h" H500 = "500h" H400 = "400h" H300 = "300h" H200 = "200h" H150 = "150h" @dataclass class Request: key: str lat: float lon: float model: Model parameters: list = None levels: list = None def json(self): body = { 'key': self.key, 'lat': self.lat, 'lon': self.lon, 'model': _json(self.model), 'parameters': self.parameters or [], } if self.levels: body['levels'] = [_json(x) for x in self.levels] return body @dataclass class Endpoint: path: str def __call__(self, ctx, *args, **kwargs): try: body = args[0].json() except (IndexError, AttributeError): body = Request(*args, **kwargs).json() return ctx.session.post(ctx.api + self.path, json=body)