Source code for action0.open_meteo.climate.operations
# generated by action0-client-openapi v0.1.2 from climate.yml — do not edit
from __future__ import annotations
import datetime
from typing import Any
from action0.client import JsonOperation
from action0.client import query
from action0.req import Method
from action0.req import Response
from .errors import BadRequestError
from .errors import decode_error
from .models import GetV1ClimateCellSelection
from .models import GetV1ClimateDailyItem
from .models import GetV1ClimateModelsItem
from .models import GetV1ClimatePrecipitationUnit
from .models import GetV1ClimateResponse
from .models import GetV1ClimateTemperatureUnit
from .models import GetV1ClimateTimeformat
from .models import GetV1ClimateWindSpeedUnit
from .models import get_v1_climate_error_from_json
from .models import get_v1_climate_response_from_json
[docs]
class GetV1Climate(JsonOperation[GetV1ClimateResponse]):
"""
``GET /v1/climate`` — Daily climate data from CMIP6 models
Historical and future climate data from downscaled CMIP6 models bias-corrected to ERA5.
"""
method = Method.GET
path = "/v1/climate"
latitude: str = query()
longitude: str = query()
#: Start date in ISO 8601 format. Minimum is 1950-01-01.
start_date: datetime.date = query()
#: End date in ISO 8601 format. Maximum is 2050-12-31.
end_date: datetime.date = query()
#: A list of daily climate variables.
daily: list[GetV1ClimateDailyItem] | None = query(
default=None, serialize=lambda values: ",".join(str(item.value) for item in values)
)
temperature_unit: GetV1ClimateTemperatureUnit = query(
default=GetV1ClimateTemperatureUnit.CELSIUS
)
wind_speed_unit: GetV1ClimateWindSpeedUnit = query(default=GetV1ClimateWindSpeedUnit.KMH)
precipitation_unit: GetV1ClimatePrecipitationUnit = query(
default=GetV1ClimatePrecipitationUnit.MM
)
timeformat: GetV1ClimateTimeformat = query(default=GetV1ClimateTimeformat.ISO8601)
timezone: str | None = query(default=None)
#: Disable statistical downscaling and bias correction onto ERA5 climate data.
disable_bias_correction: bool | None = query(default=None)
cell_selection: GetV1ClimateCellSelection | None = query(default=None)
#: Manually select one or more weather models.
models: list[GetV1ClimateModelsItem] | None = query(
default=None, serialize=lambda values: ",".join(str(item.value) for item in values)
)
#: Only required for commercial subscriptions.
apikey: str | None = query(default=None)
[docs]
def check(self, response: Response) -> None:
"""
:param response: the response the backend produced
:raises BadRequestError: for the documented ``400`` answer
:raises APIError: for any other non-2xx status
"""
if response.status == 400:
data = decode_error(response)
if isinstance(data, dict):
message = f"{type(self).__name__}: unexpected status {response.status}"
raise BadRequestError(
f"{message} {response.phrase}".rstrip(),
response=response,
error=get_v1_climate_error_from_json(data),
)
super().check(response)
[docs]
def load_json(self, data: Any) -> GetV1ClimateResponse:
"""
:param data: the decoded JSON payload
:return: the parsed result
"""
return get_v1_climate_response_from_json(data)