From cd01a2202337cbc464e33997b9325ceb4012006b Mon Sep 17 00:00:00 2001 From: agessaman Date: Thu, 1 Oct 2026 19:17:18 -0700 Subject: [PATCH] test(characterization): pin gwx's Open-Meteo formatting over real responses Five locations captured from api.open-meteo.com on 2026-10-01 (three metric, two imperial), replayed with a frozen clock across day/night, length budgets up to 600, the default/tomorrow/multiday types and fifteen distortions of the current and daily fields, recording the reply text, the request parameters and the info/warning/error log calls. The goldens include a real failure: Open-Meteo's default model returns nulls for the last forecast days, so a 15- or 16-day gwx reply for London or Reykjavik is the multiday error. --- .../open_meteo_gwx_distorted_london.json | 199 ++++++++ .../open_meteo_gwx_distorted_phoenix.json | 199 ++++++++ .../golden/open_meteo_gwx_london.json | 444 ++++++++++++++++++ .../golden/open_meteo_gwx_phoenix.json | 434 +++++++++++++++++ .../golden/open_meteo_gwx_reykjavik.json | 444 ++++++++++++++++++ .../golden/open_meteo_gwx_seattle.json | 434 +++++++++++++++++ .../golden/open_meteo_gwx_tokyo.json | 434 +++++++++++++++++ .../test_open_meteo_format.py | 165 +++++++ tests/fixtures/open_meteo/london.json | 1 + tests/fixtures/open_meteo/phoenix.json | 1 + tests/fixtures/open_meteo/reykjavik.json | 1 + tests/fixtures/open_meteo/seattle.json | 1 + tests/fixtures/open_meteo/tokyo.json | 1 + 13 files changed, 2758 insertions(+) create mode 100644 tests/characterization/golden/open_meteo_gwx_distorted_london.json create mode 100644 tests/characterization/golden/open_meteo_gwx_distorted_phoenix.json create mode 100644 tests/characterization/golden/open_meteo_gwx_london.json create mode 100644 tests/characterization/golden/open_meteo_gwx_phoenix.json create mode 100644 tests/characterization/golden/open_meteo_gwx_reykjavik.json create mode 100644 tests/characterization/golden/open_meteo_gwx_seattle.json create mode 100644 tests/characterization/golden/open_meteo_gwx_tokyo.json create mode 100644 tests/characterization/test_open_meteo_format.py create mode 100644 tests/fixtures/open_meteo/london.json create mode 100644 tests/fixtures/open_meteo/phoenix.json create mode 100644 tests/fixtures/open_meteo/reykjavik.json create mode 100644 tests/fixtures/open_meteo/seattle.json create mode 100644 tests/fixtures/open_meteo/tokyo.json diff --git a/tests/characterization/golden/open_meteo_gwx_distorted_london.json b/tests/characterization/golden/open_meteo_gwx_distorted_london.json new file mode 100644 index 0000000..a746136 --- /dev/null +++ b/tests/characterization/golden/open_meteo_gwx_distorted_london.json @@ -0,0 +1,199 @@ +{ + "calm-default": ": ⛅ 14°C | :20°C :13°C", + "calm-default-budget260": ": ⛅ 14°C | :20°C :13°C", + "calm-default-budget600": ": ⛅ 14°C | :20°C :13°C | : ☁️ :21°C :14°C", + "calm-multiday": ": ☁️:21°C :14°C\n: 🌫️:19°C :14°C\n: ☁️:19°C :14°C\n: 🌦️:18°C :12°C\n: 🌦️:14°C :10°C", + "calm-tomorrow": ": ☁️ :21°C :14°C 9", + "feels_cold-default": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "feels_cold-default-budget260": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "feels_cold-default-budget600": ": ⛅ 14°C ↙️5 | :20°C :13°C | : ☁️ :21°C :14°C", + "feels_cold-multiday": ": ☁️:21°C :14°C\n: 🌫️:19°C :14°C\n: ☁️:19°C :14°C\n: 🌦️:18°C :12°C\n: 🌦️:14°C :10°C", + "feels_cold-tomorrow": ": ☁️ :21°C :14°C 9", + "feet_visibility-default": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "feet_visibility-default-budget260": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "feet_visibility-default-budget600": ": ⛅ 14°C ↙️5 | :20°C :13°C | : ☁️ :21°C :14°C", + "feet_visibility-multiday": ": ☁️:21°C :14°C\n: 🌫️:19°C :14°C\n: ☁️:19°C :14°C\n: 🌦️:18°C :12°C\n: 🌦️:14°C :10°C", + "feet_visibility-tomorrow": ": ☁️ :21°C :14°C 9", + "gusty-default": ": ⛅ 14°C ↙️12 | :20°C :13°C", + "gusty-default-budget260": ": ⛅ 14°C ↙️12 | :20°C :13°C", + "gusty-default-budget600": ": ⛅ 14°C ↙️12 | :20°C :13°C | : ☁️ :21°C :14°C", + "gusty-multiday": ": ☁️:21°C :14°C\n: 🌫️:19°C :14°C\n: ☁️:19°C :14°C\n: 🌦️:18°C :12°C\n: 🌦️:14°C :10°C", + "gusty-tomorrow": ": ☁️ :21°C :14°C 9", + "http-error": [ + "", + "", + "" + ], + "likely_dry_tomorrow-default": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "likely_dry_tomorrow-default-budget260": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "likely_dry_tomorrow-default-budget600": ": ⛅ 14°C ↙️5 | :20°C :13°C | : ☁️ :21°C :14°C 🌦️45%", + "likely_dry_tomorrow-multiday": ": ☁️:21°C :14°C\n: 🌫️:19°C :14°C\n: ☁️:19°C :14°C\n: 🌦️:18°C :12°C\n: 🌦️:14°C :10°C", + "likely_dry_tomorrow-tomorrow": ": ☁️ :21°C :14°C 9 🌦️45%", + "low_pressure-default": [ + ": ⛅ 14°C ↙️5 | :20°C :13°C", + [ + [ + "warning", + "Extremely low pressure value: 512.0 hPa - might be invalid" + ] + ] + ], + "low_pressure-default-budget260": [ + ": ⛅ 14°C ↙️5 | :20°C :13°C", + [ + [ + "warning", + "Extremely low pressure value: 512.0 hPa - might be invalid" + ] + ] + ], + "low_pressure-default-budget600": [ + ": ⛅ 14°C ↙️5 | :20°C :13°C | : ☁️ :21°C :14°C", + [ + [ + "warning", + "Extremely low pressure value: 512.0 hPa - might be invalid" + ] + ] + ], + "low_pressure-multiday": ": ☁️:21°C :14°C\n: 🌫️:19°C :14°C\n: ☁️:19°C :14°C\n: 🌦️:18°C :12°C\n: 🌦️:14°C :10°C", + "low_pressure-tomorrow": ": ☁️ :21°C :14°C 9", + "mmhg": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "model-override": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "ecmwf_ifs025", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ 14°C ↙️5 | :20°C :13°C" + }, + "no_current-default": ": ☀️ 0°C | :20°C :13°C", + "no_current-default-budget260": ": ☀️ 0°C | :20°C :13°C", + "no_current-default-budget600": ": ☀️ 0°C | :20°C :13°C | : ☁️ :21°C :14°C", + "no_current-multiday": ": ☁️:21°C :14°C\n: 🌫️:19°C :14°C\n: ☁️:19°C :14°C\n: 🌦️:18°C :12°C\n: 🌦️:14°C :10°C", + "no_current-tomorrow": ": ☁️ :21°C :14°C 9", + "no_daily-default": ": ⛅ 14°C ↙️5 ", + "no_daily-default-budget260": ": ⛅ 14°C ↙️5 ", + "no_daily-default-budget600": ": ⛅ 14°C ↙️5 ", + "no_daily-multiday": "", + "no_daily-tomorrow": "", + "no_dewpoint-default": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "no_dewpoint-default-budget260": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "no_dewpoint-default-budget600": ": ⛅ 14°C ↙️5 | :20°C :13°C | : ☁️ :21°C :14°C", + "no_dewpoint-multiday": ": ☁️:21°C :14°C\n: 🌫️:19°C :14°C\n: ☁️:19°C :14°C\n: 🌦️:18°C :12°C\n: 🌦️:14°C :10°C", + "no_dewpoint-tomorrow": ": ☁️ :21°C :14°C 9", + "no_pressure-default": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "no_pressure-default-budget260": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "no_pressure-default-budget600": ": ⛅ 14°C ↙️5 | :20°C :13°C | : ☁️ :21°C :14°C", + "no_pressure-multiday": ": ☁️:21°C :14°C\n: 🌫️:19°C :14°C\n: ☁️:19°C :14°C\n: 🌦️:18°C :12°C\n: 🌦️:14°C :10°C", + "no_pressure-tomorrow": ": ☁️ :21°C :14°C 9", + "no_visibility-default": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "no_visibility-default-budget260": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "no_visibility-default-budget600": ": ⛅ 14°C ↙️5 | :20°C :13°C | : ☁️ :21°C :14°C", + "no_visibility-multiday": ": ☁️:21°C :14°C\n: 🌫️:19°C :14°C\n: ☁️:19°C :14°C\n: 🌦️:18°C :12°C\n: 🌦️:14°C :10°C", + "no_visibility-tomorrow": ": ☁️ :21°C :14°C 9", + "null_code-default": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "null_code-default-budget260": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "null_code-default-budget600": ": ⛅ 14°C ↙️5 | :20°C :13°C | : 🌤️ :21°C :14°C", + "null_code-multiday": ": 🌤️:21°C :14°C\n: 🌤️:19°C :14°C\n: 🌤️:19°C :14°C\n: 🌤️:18°C :12°C\n: 🌤️:14°C :10°C", + "null_code-tomorrow": ": 🌤️ :21°C :14°C 9", + "null_highs-default": [ + "", + [ + [ + "error", + "Error fetching Open-Meteo weather: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ] + ], + "null_highs-default-budget260": [ + "", + [ + [ + "error", + "Error fetching Open-Meteo weather: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ] + ], + "null_highs-default-budget600": [ + "", + [ + [ + "error", + "Error fetching Open-Meteo weather: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ] + ], + "null_highs-multiday": [ + "", + [ + [ + "error", + "Error formatting 5-day forecast: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ] + ], + "null_highs-tomorrow": [ + "", + [ + [ + "error", + "Error formatting tomorrow forecast: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ] + ], + "null_temp-default": [ + "", + [ + [ + "error", + "Error fetching Open-Meteo weather: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ] + ], + "null_temp-default-budget260": [ + "", + [ + [ + "error", + "Error fetching Open-Meteo weather: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ] + ], + "null_temp-default-budget600": [ + "", + [ + [ + "error", + "Error fetching Open-Meteo weather: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ] + ], + "null_temp-multiday": ": ☁️:21°C :14°C\n: 🌫️:19°C :14°C\n: ☁️:19°C :14°C\n: 🌦️:18°C :12°C\n: 🌦️:14°C :10°C", + "null_temp-tomorrow": ": ☁️ :21°C :14°C 9", + "one_day-default": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "one_day-default-budget260": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "one_day-default-budget600": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "one_day-multiday": "", + "one_day-tomorrow": "", + "wet_tomorrow-default": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "wet_tomorrow-default-budget260": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "wet_tomorrow-default-budget600": ": ⛅ 14°C ↙️5 | :20°C :13°C | : ☁️ :21°C :14°C 🌦️80% 4.20mm", + "wet_tomorrow-multiday": ": ☁️:21°C :14°C\n: 🌫️:19°C :14°C\n: ☁️:19°C :14°C\n: 🌦️:18°C :12°C\n: 🌦️:14°C :10°C", + "wet_tomorrow-tomorrow": ": ☁️ :21°C :14°C 9 🌦️80% 4.20mm", + "zero_visibility-default": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "zero_visibility-default-budget260": ": ⛅ 14°C ↙️5 | :20°C :13°C", + "zero_visibility-default-budget600": ": ⛅ 14°C ↙️5 | :20°C :13°C | : ☁️ :21°C :14°C", + "zero_visibility-multiday": ": ☁️:21°C :14°C\n: 🌫️:19°C :14°C\n: ☁️:19°C :14°C\n: 🌦️:18°C :12°C\n: 🌦️:14°C :10°C", + "zero_visibility-tomorrow": ": ☁️ :21°C :14°C 9" +} diff --git a/tests/characterization/golden/open_meteo_gwx_distorted_phoenix.json b/tests/characterization/golden/open_meteo_gwx_distorted_phoenix.json new file mode 100644 index 0000000..8bfe70a --- /dev/null +++ b/tests/characterization/golden/open_meteo_gwx_distorted_phoenix.json @@ -0,0 +1,199 @@ +{ + "calm-default": ": ☀️ 84°F | :93°F :69°F", + "calm-default-budget260": ": ☀️ 84°F | :93°F :69°F", + "calm-default-budget600": ": ☀️ 84°F | :93°F :69°F | : ☀️ :95°F :70°F", + "calm-multiday": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F\n: ☁️:97°F :84°F\n: ☁️:97°F :85°F", + "calm-tomorrow": ": ☀️ :95°F :70°F 14", + "feels_cold-default": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "feels_cold-default-budget260": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "feels_cold-default-budget600": ": ☀️ 84°F ↙️4 | :93°F :69°F | : ☀️ :95°F :70°F", + "feels_cold-multiday": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F\n: ☁️:97°F :84°F\n: ☁️:97°F :85°F", + "feels_cold-tomorrow": ": ☀️ :95°F :70°F 14", + "feet_visibility-default": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "feet_visibility-default-budget260": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "feet_visibility-default-budget600": ": ☀️ 84°F ↙️4 | :93°F :69°F | : ☀️ :95°F :70°F", + "feet_visibility-multiday": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F\n: ☁️:97°F :84°F\n: ☁️:97°F :85°F", + "feet_visibility-tomorrow": ": ☀️ :95°F :70°F 14", + "gusty-default": ": ☀️ 84°F ↙️12 | :93°F :69°F", + "gusty-default-budget260": ": ☀️ 84°F ↙️12 | :93°F :69°F", + "gusty-default-budget600": ": ☀️ 84°F ↙️12 | :93°F :69°F | : ☀️ :95°F :70°F", + "gusty-multiday": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F\n: ☁️:97°F :84°F\n: ☁️:97°F :85°F", + "gusty-tomorrow": ": ☀️ :95°F :70°F 14", + "http-error": [ + "", + "", + "" + ], + "likely_dry_tomorrow-default": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "likely_dry_tomorrow-default-budget260": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "likely_dry_tomorrow-default-budget600": ": ☀️ 84°F ↙️4 | :93°F :69°F | : ☀️ :95°F :70°F 🌦️45%", + "likely_dry_tomorrow-multiday": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F\n: ☁️:97°F :84°F\n: ☁️:97°F :85°F", + "likely_dry_tomorrow-tomorrow": ": ☀️ :95°F :70°F 14 🌦️45%", + "low_pressure-default": [ + ": ☀️ 84°F ↙️4 | :93°F :69°F", + [ + [ + "warning", + "Extremely low pressure value: 512.0 hPa - might be invalid" + ] + ] + ], + "low_pressure-default-budget260": [ + ": ☀️ 84°F ↙️4 | :93°F :69°F", + [ + [ + "warning", + "Extremely low pressure value: 512.0 hPa - might be invalid" + ] + ] + ], + "low_pressure-default-budget600": [ + ": ☀️ 84°F ↙️4 | :93°F :69°F | : ☀️ :95°F :70°F", + [ + [ + "warning", + "Extremely low pressure value: 512.0 hPa - might be invalid" + ] + ] + ], + "low_pressure-multiday": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F\n: ☁️:97°F :84°F\n: ☁️:97°F :85°F", + "low_pressure-tomorrow": ": ☀️ :95°F :70°F 14", + "mmhg": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "model-override": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "ecmwf_ifs025", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ 84°F ↙️4 | :93°F :69°F" + }, + "no_current-default": ": ☀️ 0°F | :93°F :69°F", + "no_current-default-budget260": ": ☀️ 0°F | :93°F :69°F", + "no_current-default-budget600": ": ☀️ 0°F | :93°F :69°F | : ☀️ :95°F :70°F", + "no_current-multiday": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F\n: ☁️:97°F :84°F\n: ☁️:97°F :85°F", + "no_current-tomorrow": ": ☀️ :95°F :70°F 14", + "no_daily-default": ": ☀️ 84°F ↙️4 ", + "no_daily-default-budget260": ": ☀️ 84°F ↙️4 ", + "no_daily-default-budget600": ": ☀️ 84°F ↙️4 ", + "no_daily-multiday": "", + "no_daily-tomorrow": "", + "no_dewpoint-default": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "no_dewpoint-default-budget260": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "no_dewpoint-default-budget600": ": ☀️ 84°F ↙️4 | :93°F :69°F | : ☀️ :95°F :70°F", + "no_dewpoint-multiday": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F\n: ☁️:97°F :84°F\n: ☁️:97°F :85°F", + "no_dewpoint-tomorrow": ": ☀️ :95°F :70°F 14", + "no_pressure-default": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "no_pressure-default-budget260": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "no_pressure-default-budget600": ": ☀️ 84°F ↙️4 | :93°F :69°F | : ☀️ :95°F :70°F", + "no_pressure-multiday": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F\n: ☁️:97°F :84°F\n: ☁️:97°F :85°F", + "no_pressure-tomorrow": ": ☀️ :95°F :70°F 14", + "no_visibility-default": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "no_visibility-default-budget260": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "no_visibility-default-budget600": ": ☀️ 84°F ↙️4 | :93°F :69°F | : ☀️ :95°F :70°F", + "no_visibility-multiday": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F\n: ☁️:97°F :84°F\n: ☁️:97°F :85°F", + "no_visibility-tomorrow": ": ☀️ :95°F :70°F 14", + "null_code-default": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "null_code-default-budget260": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "null_code-default-budget600": ": ☀️ 84°F ↙️4 | :93°F :69°F | : 🌤️ :95°F :70°F", + "null_code-multiday": ": 🌤️:95°F :70°F\n: 🌤️:95°F :74°F\n: 🌤️:96°F :84°F\n: 🌤️:97°F :84°F\n: 🌤️:97°F :85°F", + "null_code-tomorrow": ": 🌤️ :95°F :70°F 14", + "null_highs-default": [ + "", + [ + [ + "error", + "Error fetching Open-Meteo weather: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ] + ], + "null_highs-default-budget260": [ + "", + [ + [ + "error", + "Error fetching Open-Meteo weather: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ] + ], + "null_highs-default-budget600": [ + "", + [ + [ + "error", + "Error fetching Open-Meteo weather: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ] + ], + "null_highs-multiday": [ + "", + [ + [ + "error", + "Error formatting 5-day forecast: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ] + ], + "null_highs-tomorrow": [ + "", + [ + [ + "error", + "Error formatting tomorrow forecast: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ] + ], + "null_temp-default": [ + "", + [ + [ + "error", + "Error fetching Open-Meteo weather: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ] + ], + "null_temp-default-budget260": [ + "", + [ + [ + "error", + "Error fetching Open-Meteo weather: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ] + ], + "null_temp-default-budget600": [ + "", + [ + [ + "error", + "Error fetching Open-Meteo weather: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ] + ], + "null_temp-multiday": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F\n: ☁️:97°F :84°F\n: ☁️:97°F :85°F", + "null_temp-tomorrow": ": ☀️ :95°F :70°F 14", + "one_day-default": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "one_day-default-budget260": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "one_day-default-budget600": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "one_day-multiday": "", + "one_day-tomorrow": "", + "wet_tomorrow-default": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "wet_tomorrow-default-budget260": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "wet_tomorrow-default-budget600": ": ☀️ 84°F ↙️4 | :93°F :69°F | : ☀️ :95°F :70°F 🌦️80% 4.20in", + "wet_tomorrow-multiday": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F\n: ☁️:97°F :84°F\n: ☁️:97°F :85°F", + "wet_tomorrow-tomorrow": ": ☀️ :95°F :70°F 14 🌦️80% 4.20in", + "zero_visibility-default": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "zero_visibility-default-budget260": ": ☀️ 84°F ↙️4 | :93°F :69°F", + "zero_visibility-default-budget600": ": ☀️ 84°F ↙️4 | :93°F :69°F | : ☀️ :95°F :70°F", + "zero_visibility-multiday": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F\n: ☁️:97°F :84°F\n: ☁️:97°F :85°F", + "zero_visibility-tomorrow": ": ☀️ :95°F :70°F 14" +} diff --git a/tests/characterization/golden/open_meteo_gwx_london.json b/tests/characterization/golden/open_meteo_gwx_london.json new file mode 100644 index 0000000..7ba1308 --- /dev/null +++ b/tests/characterization/golden/open_meteo_gwx_london.json @@ -0,0 +1,444 @@ +{ + "default-day-budget160": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ 14°C ↙️5 | :20°C :13°C" + }, + "default-day-budget200": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ 14°C ↙️5 | :20°C :13°C" + }, + "default-day-budget240": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ 14°C ↙️5 | :20°C :13°C" + }, + "default-day-budget300": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ 14°C ↙️5 | :20°C :13°C" + }, + "default-day-budget600": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ 14°C ↙️5 | :20°C :13°C | : ☁️ :21°C :14°C" + }, + "default-day-prefix0": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ 14°C ↙️5 | :20°C :13°C" + }, + "default-day-prefix30": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ 14°C ↙️5 | :20°C :13°C" + }, + "default-day-prefix60": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ 14°C ↙️5 | :20°C :13°C" + }, + "default-night-budget160": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ 14°C ↙️5 | :20°C :13°C" + }, + "default-night-budget200": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ 14°C ↙️5 | :20°C :13°C" + }, + "default-night-budget240": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ 14°C ↙️5 | :20°C :13°C" + }, + "default-night-budget300": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ 14°C ↙️5 | :20°C :13°C" + }, + "default-night-budget600": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ 14°C ↙️5 | :20°C :13°C | : ☁️ :21°C :14°C" + }, + "default-night-prefix0": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ 14°C ↙️5 | :20°C :13°C" + }, + "default-night-prefix30": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ 14°C ↙️5 | :20°C :13°C" + }, + "default-night-prefix60": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ 14°C ↙️5 | :20°C :13°C" + }, + "multiday16-day": { + "logs": [ + [ + "error", + "Error formatting 15-day forecast: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 16, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": "" + }, + "multiday16-night": { + "logs": [ + [ + "error", + "Error formatting 15-day forecast: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 16, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": "" + }, + "multiday3-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 3, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ☁️:21°C :14°C\n: 🌫️:19°C :14°C\n: ☁️:19°C :14°C" + }, + "multiday3-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 3, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ☁️:21°C :14°C\n: 🌫️:19°C :14°C\n: ☁️:19°C :14°C" + }, + "multiday7-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 7, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ☁️:21°C :14°C\n: 🌫️:19°C :14°C\n: ☁️:19°C :14°C\n: 🌦️:18°C :12°C\n: 🌦️:14°C :10°C\n: ☁️:15°C :9°C\n: 🌧️:15°C :9°C" + }, + "multiday7-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 7, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ☁️:21°C :14°C\n: 🌫️:19°C :14°C\n: ☁️:19°C :14°C\n: 🌦️:18°C :12°C\n: 🌦️:14°C :10°C\n: ☁️:15°C :9°C\n: 🌧️:15°C :9°C" + }, + "tomorrow-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ☁️ :21°C :14°C 9" + }, + "tomorrow-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 51.51147, + "longitude": -0.13078308, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ☁️ :21°C :14°C 9" + } +} diff --git a/tests/characterization/golden/open_meteo_gwx_phoenix.json b/tests/characterization/golden/open_meteo_gwx_phoenix.json new file mode 100644 index 0000000..bb2a07b --- /dev/null +++ b/tests/characterization/golden/open_meteo_gwx_phoenix.json @@ -0,0 +1,434 @@ +{ + "default-day-budget160": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ 84°F ↙️4 | :93°F :69°F" + }, + "default-day-budget200": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ 84°F ↙️4 | :93°F :69°F" + }, + "default-day-budget240": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ 84°F ↙️4 | :93°F :69°F" + }, + "default-day-budget300": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ 84°F ↙️4 | :93°F :69°F" + }, + "default-day-budget600": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ 84°F ↙️4 | :93°F :69°F | : ☀️ :95°F :70°F" + }, + "default-day-prefix0": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ 84°F ↙️4 | :93°F :69°F" + }, + "default-day-prefix30": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ 84°F ↙️4 | :93°F :69°F" + }, + "default-day-prefix60": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ 84°F ↙️4 | :93°F :69°F" + }, + "default-night-budget160": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ 84°F ↙️4 | :93°F :69°F" + }, + "default-night-budget200": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ 84°F ↙️4 | :93°F :69°F" + }, + "default-night-budget240": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ 84°F ↙️4 | :93°F :69°F" + }, + "default-night-budget300": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ 84°F ↙️4 | :93°F :69°F" + }, + "default-night-budget600": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ 84°F ↙️4 | :93°F :69°F | : ☀️ :95°F :70°F" + }, + "default-night-prefix0": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ 84°F ↙️4 | :93°F :69°F" + }, + "default-night-prefix30": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ 84°F ↙️4 | :93°F :69°F" + }, + "default-night-prefix60": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ 84°F ↙️4 | :93°F :69°F" + }, + "multiday16-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 16, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F\n: ☁️:97°F :84°F\n: ☁️:97°F :85°F\n: ☀️:100°F :87°F\n: ☀️:102°F :87°F\n: ☀️:100°F :87°F\n: ☀️:97°F :85°F\n: ☀️:95°F :84°F\n: ⛅:93°F :85°F\n: 🌤️:95°F :85°F\n: 🌦️:95°F :86°F\n: ☁️:93°F :80°F\n: 🌤️:82°F :71°F" + }, + "multiday16-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 16, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F\n: ☁️:97°F :84°F\n: ☁️:97°F :85°F\n: ☀️:100°F :87°F\n: ☀️:102°F :87°F\n: ☀️:100°F :87°F\n: ☀️:97°F :85°F\n: ☀️:95°F :84°F\n: ⛅:93°F :85°F\n: 🌤️:95°F :85°F\n: 🌦️:95°F :86°F\n: ☁️:93°F :80°F\n: 🌤️:82°F :71°F" + }, + "multiday3-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 3, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F" + }, + "multiday3-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 3, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F" + }, + "multiday7-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 7, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F\n: ☁️:97°F :84°F\n: ☁️:97°F :85°F\n: ☀️:100°F :87°F\n: ☀️:102°F :87°F" + }, + "multiday7-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 7, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️:95°F :70°F\n: ☀️:95°F :74°F\n: ☀️:96°F :84°F\n: ☁️:97°F :84°F\n: ☁️:97°F :85°F\n: ☀️:100°F :87°F\n: ☀️:102°F :87°F" + }, + "tomorrow-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ :95°F :70°F 14" + }, + "tomorrow-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 33.440266, + "longitude": -112.06021, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☀️ :95°F :70°F 14" + } +} diff --git a/tests/characterization/golden/open_meteo_gwx_reykjavik.json b/tests/characterization/golden/open_meteo_gwx_reykjavik.json new file mode 100644 index 0000000..7c1ad00 --- /dev/null +++ b/tests/characterization/golden/open_meteo_gwx_reykjavik.json @@ -0,0 +1,444 @@ +{ + "default-day-budget160": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": ☁️ 9°C | :10°C :8°C" + }, + "default-day-budget200": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": ☁️ 9°C | :10°C :8°C" + }, + "default-day-budget240": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": ☁️ 9°C | :10°C :8°C" + }, + "default-day-budget300": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": ☁️ 9°C | :10°C :8°C" + }, + "default-day-budget600": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": ☁️ 9°C | :10°C :8°C | : 🌧️ :10°C :7°C 🌦️100% 9.70mm" + }, + "default-day-prefix0": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": ☁️ 9°C | :10°C :8°C" + }, + "default-day-prefix30": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": ☁️ 9°C | :10°C :8°C" + }, + "default-day-prefix60": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": ☁️ 9°C | :10°C :8°C" + }, + "default-night-budget160": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": ☁️ 9°C | :10°C :8°C" + }, + "default-night-budget200": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": ☁️ 9°C | :10°C :8°C" + }, + "default-night-budget240": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": ☁️ 9°C | :10°C :8°C" + }, + "default-night-budget300": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": ☁️ 9°C | :10°C :8°C" + }, + "default-night-budget600": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": ☁️ 9°C | :10°C :8°C | : 🌧️ :10°C :7°C 🌦️100% 9.70mm" + }, + "default-night-prefix0": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": ☁️ 9°C | :10°C :8°C" + }, + "default-night-prefix30": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": ☁️ 9°C | :10°C :8°C" + }, + "default-night-prefix60": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": ☁️ 9°C | :10°C :8°C" + }, + "multiday16-day": { + "logs": [ + [ + "error", + "Error formatting 15-day forecast: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 16, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": "" + }, + "multiday16-night": { + "logs": [ + [ + "error", + "Error formatting 15-day forecast: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'" + ] + ], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 16, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": "" + }, + "multiday3-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 3, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": 🌧️:10°C :7°C\n: 🌦️:9°C :6°C\n: 🌦️:6°C :1°C" + }, + "multiday3-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 3, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": 🌧️:10°C :7°C\n: 🌦️:9°C :6°C\n: 🌦️:6°C :1°C" + }, + "multiday7-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 7, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": 🌧️:10°C :7°C\n: 🌦️:9°C :6°C\n: 🌦️:6°C :1°C\n: 🌦️:8°C :-1°C\n: 🌦️:7°C :2°C\n: 🌧️:7°C :4°C\n: 🌦️:8°C :6°C" + }, + "multiday7-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 7, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": 🌧️:10°C :7°C\n: 🌦️:9°C :6°C\n: 🌦️:6°C :1°C\n: 🌦️:8°C :-1°C\n: 🌦️:7°C :2°C\n: 🌧️:7°C :4°C\n: 🌦️:8°C :6°C" + }, + "tomorrow-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": 🌧️ :10°C :7°C 7 🌦️100% 9.70mm" + }, + "tomorrow-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 64.139565, + "longitude": -21.971603, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "ms" + }, + "requests": 1, + "text": ": 🌧️ :10°C :7°C 7 🌦️100% 9.70mm" + } +} diff --git a/tests/characterization/golden/open_meteo_gwx_seattle.json b/tests/characterization/golden/open_meteo_gwx_seattle.json new file mode 100644 index 0000000..d8f5d45 --- /dev/null +++ b/tests/characterization/golden/open_meteo_gwx_seattle.json @@ -0,0 +1,434 @@ +{ + "default-day-budget160": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ 60°F | :64°F :48°F" + }, + "default-day-budget200": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ 60°F | :64°F :48°F" + }, + "default-day-budget240": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ 60°F | :64°F :48°F" + }, + "default-day-budget300": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ 60°F | :64°F :48°F" + }, + "default-day-budget600": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ 60°F | :64°F :48°F | : ☁️ :67°F :51°F" + }, + "default-day-prefix0": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ 60°F | :64°F :48°F" + }, + "default-day-prefix30": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ 60°F | :64°F :48°F" + }, + "default-day-prefix60": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ 60°F | :64°F :48°F" + }, + "default-night-budget160": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ 60°F | :64°F :48°F" + }, + "default-night-budget200": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ 60°F | :64°F :48°F" + }, + "default-night-budget240": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ 60°F | :64°F :48°F" + }, + "default-night-budget300": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ 60°F | :64°F :48°F" + }, + "default-night-budget600": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ 60°F | :64°F :48°F | : ☁️ :67°F :51°F" + }, + "default-night-prefix0": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ 60°F | :64°F :48°F" + }, + "default-night-prefix30": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ 60°F | :64°F :48°F" + }, + "default-night-prefix60": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ 60°F | :64°F :48°F" + }, + "multiday16-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 16, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️:67°F :51°F\n: ☁️:67°F :50°F\n: ☁️:71°F :52°F\n: ☁️:72°F :53°F\n: 🌦️:66°F :54°F\n: ☁️:64°F :49°F\n: ☁️:67°F :49°F\n: ☁️:72°F :50°F\n: ☁️:64°F :49°F\n: 🌦️:64°F :47°F\n: ☁️:62°F :44°F\n: 🌧️:49°F :47°F\n: ☁️:58°F :42°F\n: ☁️:59°F :43°F\n: ☁️:60°F :43°F" + }, + "multiday16-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 16, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️:67°F :51°F\n: ☁️:67°F :50°F\n: ☁️:71°F :52°F\n: ☁️:72°F :53°F\n: 🌦️:66°F :54°F\n: ☁️:64°F :49°F\n: ☁️:67°F :49°F\n: ☁️:72°F :50°F\n: ☁️:64°F :49°F\n: 🌦️:64°F :47°F\n: ☁️:62°F :44°F\n: 🌧️:49°F :47°F\n: ☁️:58°F :42°F\n: ☁️:59°F :43°F\n: ☁️:60°F :43°F" + }, + "multiday3-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 3, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️:67°F :51°F\n: ☁️:67°F :50°F\n: ☁️:71°F :52°F" + }, + "multiday3-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 3, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️:67°F :51°F\n: ☁️:67°F :50°F\n: ☁️:71°F :52°F" + }, + "multiday7-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 7, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️:67°F :51°F\n: ☁️:67°F :50°F\n: ☁️:71°F :52°F\n: ☁️:72°F :53°F\n: 🌦️:66°F :54°F\n: ☁️:64°F :49°F\n: ☁️:67°F :49°F" + }, + "multiday7-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 7, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️:67°F :51°F\n: ☁️:67°F :50°F\n: ☁️:71°F :52°F\n: ☁️:72°F :53°F\n: 🌦️:66°F :54°F\n: ☁️:64°F :49°F\n: ☁️:67°F :49°F" + }, + "tomorrow-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ :67°F :51°F 8" + }, + "tomorrow-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 47.595562, + "longitude": -122.32443, + "models": "best_match", + "precipitation_unit": "inch", + "temperature_unit": "fahrenheit", + "timezone": "auto", + "wind_speed_unit": "mph" + }, + "requests": 1, + "text": ": ☁️ :67°F :51°F 8" + } +} diff --git a/tests/characterization/golden/open_meteo_gwx_tokyo.json b/tests/characterization/golden/open_meteo_gwx_tokyo.json new file mode 100644 index 0000000..15b4409 --- /dev/null +++ b/tests/characterization/golden/open_meteo_gwx_tokyo.json @@ -0,0 +1,434 @@ +{ + "default-day-budget160": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": 🌦️ 19°C ↗️5 | :21°C :18°C" + }, + "default-day-budget200": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": 🌦️ 19°C ↗️5 | :21°C :18°C" + }, + "default-day-budget240": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": 🌦️ 19°C ↗️5 | :21°C :18°C" + }, + "default-day-budget300": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": 🌦️ 19°C ↗️5 | :21°C :18°C" + }, + "default-day-budget600": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": 🌦️ 19°C ↗️5 | :21°C :18°C | : ⛅ :23°C :16°C" + }, + "default-day-prefix0": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": 🌦️ 19°C ↗️5 | :21°C :18°C" + }, + "default-day-prefix30": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": 🌦️ 19°C ↗️5 | :21°C :18°C" + }, + "default-day-prefix60": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": 🌦️ 19°C ↗️5 | :21°C :18°C" + }, + "default-night-budget160": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": 🌦️ 19°C ↗️5 | :21°C :18°C" + }, + "default-night-budget200": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": 🌦️ 19°C ↗️5 | :21°C :18°C" + }, + "default-night-budget240": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": 🌦️ 19°C ↗️5 | :21°C :18°C" + }, + "default-night-budget300": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": 🌦️ 19°C ↗️5 | :21°C :18°C" + }, + "default-night-budget600": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": 🌦️ 19°C ↗️5 | :21°C :18°C | : ⛅ :23°C :16°C" + }, + "default-night-prefix0": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": 🌦️ 19°C ↗️5 | :21°C :18°C" + }, + "default-night-prefix30": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": 🌦️ 19°C ↗️5 | :21°C :18°C" + }, + "default-night-prefix60": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": 🌦️ 19°C ↗️5 | :21°C :18°C" + }, + "multiday16-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 16, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅:23°C :16°C\n: ☁️:22°C :15°C\n: 🌦️:20°C :15°C\n: ☁️:26°C :18°C\n: ☁️:25°C :18°C\n: ☁️:23°C :17°C\n: ☀️:23°C :15°C\n: ☀️:23°C :15°C\n: ☀️:24°C :14°C\n: 🌦️:24°C :15°C\n: 🌦️:20°C :15°C\n: ☁️:22°C :14°C\n: 🌦️:25°C :17°C\n: 🌦️:24°C :18°C\n: 🌧️:17°C :14°C" + }, + "multiday16-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 16, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅:23°C :16°C\n: ☁️:22°C :15°C\n: 🌦️:20°C :15°C\n: ☁️:26°C :18°C\n: ☁️:25°C :18°C\n: ☁️:23°C :17°C\n: ☀️:23°C :15°C\n: ☀️:23°C :15°C\n: ☀️:24°C :14°C\n: 🌦️:24°C :15°C\n: 🌦️:20°C :15°C\n: ☁️:22°C :14°C\n: 🌦️:25°C :17°C\n: 🌦️:24°C :18°C\n: 🌧️:17°C :14°C" + }, + "multiday3-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 3, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅:23°C :16°C\n: ☁️:22°C :15°C\n: 🌦️:20°C :15°C" + }, + "multiday3-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 3, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅:23°C :16°C\n: ☁️:22°C :15°C\n: 🌦️:20°C :15°C" + }, + "multiday7-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 7, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅:23°C :16°C\n: ☁️:22°C :15°C\n: 🌦️:20°C :15°C\n: ☁️:26°C :18°C\n: ☁️:25°C :18°C\n: ☁️:23°C :17°C\n: ☀️:23°C :15°C" + }, + "multiday7-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 7, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅:23°C :16°C\n: ☁️:22°C :15°C\n: 🌦️:20°C :15°C\n: ☁️:26°C :18°C\n: ☁️:25°C :18°C\n: ☁️:23°C :17°C\n: ☀️:23°C :15°C" + }, + "tomorrow-day": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ :23°C :16°C 5" + }, + "tomorrow-night": { + "logs": [], + "params": { + "current": "temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m,dewpoint_2m,visibility,surface_pressure", + "daily": "weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,wind_speed_10m_max,wind_gusts_10m_max", + "forecast_days": 2, + "hourly": "temperature_2m,weather_code,wind_speed_10m,wind_direction_10m,wind_gusts_10m", + "latitude": 35.7, + "longitude": 139.625, + "models": "best_match", + "precipitation_unit": "mm", + "temperature_unit": "celsius", + "timezone": "auto", + "wind_speed_unit": "kmh" + }, + "requests": 1, + "text": ": ⛅ :23°C :16°C 5" + } +} diff --git a/tests/characterization/test_open_meteo_format.py b/tests/characterization/test_open_meteo_format.py new file mode 100644 index 0000000..b49fdb3 --- /dev/null +++ b/tests/characterization/test_open_meteo_format.py @@ -0,0 +1,165 @@ +"""Characterization: gwx's Open-Meteo forecast formatting. + +Replays real api.open-meteo.com responses captured on 2026-10-01 (London, +Tokyo, Reykjavik in metric units; Phoenix, Seattle in imperial; +tests/fixtures/open_meteo) with the clock frozen. Variants change the time of +day, the length budget, the forecast type, and drop or distort current fields. +""" + +import configparser +import copy +import json +from datetime import datetime +from pathlib import Path +from unittest.mock import Mock, patch + +import pytest + +from tests.characterization.golden_util import assert_golden + +FIXTURES = Path(__file__).resolve().parents[1] / "fixtures" / "open_meteo" +UNITS = { + "london": ("celsius", "kmh", "mm"), + "tokyo": ("celsius", "kmh", "mm"), + "reykjavik": ("celsius", "ms", "mm"), + "phoenix": ("fahrenheit", "mph", "inch"), + "seattle": ("fahrenheit", "mph", "inch"), +} +DAY = datetime(2026, 10, 1, 10, 15, 0) +NIGHT = datetime(2026, 10, 1, 21, 45, 0) +MODULE = "modules.commands.alternatives.wx_international" + + +def _frozen(now): + class _FrozenDateTime(datetime): + @classmethod + def now(cls, tz=None): + return now if tz is None else now.astimezone(tz) + + return _FrozenDateTime + + +def _gwx(units, extra_weather=None): + from modules.commands.alternatives.wx_international import GlobalWxCommand + + temperature, wind, precipitation = units + weather = { + "temperature_unit": temperature, + "wind_speed_unit": wind, + "precipitation_unit": precipitation, + } + weather.update(extra_weather or {}) + config = configparser.ConfigParser() + config.read_dict({"Weather": weather, "Gwx_Command": {}, "Bot": {}}) + bot = Mock() + bot.config = config + bot.logger = Mock() + bot.translator.translate.side_effect = lambda key, **kwargs: f"<{key}{sorted(kwargs.items()) or ''}>" + return GlobalWxCommand(bot) + + +def _response(payload, ok=True): + response = Mock() + response.ok = ok + response.status_code = 200 if ok else 503 + response.json.return_value = payload + return response + + +def _load(name): + return json.loads((FIXTURES / f"{name}.json").read_text(encoding="utf-8")) + + +def _run(cmd, data, now, budget=None, **kwargs): + if budget is not None: + # A message makes the command ask for its budget instead of using 130. + cmd.get_max_message_length = Mock(return_value=budget) + kwargs["message"] = Mock() + get = Mock(return_value=_response(data)) + with patch(f"{MODULE}.datetime", _frozen(now)), patch(f"{MODULE}.requests.get", get): + text = cmd.get_open_meteo_weather(data["latitude"], data["longitude"], **kwargs) + params = get.call_args.kwargs["params"] if get.call_args else None + logs = [(c[0], c[1][0]) for c in cmd.logger.method_calls if c[0] in ("info", "warning", "error")] + return {"text": text, "requests": get.call_count, "params": params, "logs": logs} + + +def _text_and_logs(result): + return [result["text"], result["logs"]] if result["logs"] else result["text"] + + +@pytest.mark.parametrize("name", sorted(UNITS)) +def test_open_meteo_text(name): + data = _load(name) + results = {} + for label, now in (("day", DAY), ("night", NIGHT)): + for prefix in (0, 30, 60): + cmd = _gwx(UNITS[name]) + results[f"default-{label}-prefix{prefix}"] = _run(cmd, data, now, location_prefix_len=prefix) + for budget in (160, 200, 240, 300, 600): + cmd = _gwx(UNITS[name]) + results[f"default-{label}-budget{budget}"] = _run(cmd, data, now, budget=budget, location_prefix_len=20) + cmd = _gwx(UNITS[name]) + results[f"tomorrow-{label}"] = _run(cmd, data, now, forecast_type="tomorrow") + for days in (3, 7, 16): + cmd = _gwx(UNITS[name]) + results[f"multiday{days}-{label}"] = _run(cmd, data, now, forecast_type="multiday", num_days=days) + assert_golden(f"open_meteo_gwx_{name}", results) + + +DISTORTIONS = { + "no_visibility": lambda d: d["current"].pop("visibility"), + "zero_visibility": lambda d: d["current"].__setitem__("visibility", 0), + "feet_visibility": lambda d: d["current_units"].__setitem__("visibility", "ft"), + "low_pressure": lambda d: d["current"].__setitem__("surface_pressure", 512.0), + "no_pressure": lambda d: d["current"].pop("surface_pressure"), + "no_dewpoint": lambda d: d["current"].pop("dewpoint_2m"), + "gusty": lambda d: d["current"].update(wind_speed_10m=12.0, wind_gusts_10m=31.0), + "calm": lambda d: d["current"].update(wind_speed_10m=1.0, wind_gusts_10m=2.0), + "feels_cold": lambda d: d["current"].update(apparent_temperature=d["current"]["temperature_2m"] - 9), + "wet_tomorrow": lambda d: d["daily"].update( + precipitation_probability_max=[10, 80] + d["daily"]["precipitation_probability_max"][2:], + precipitation_sum=[0.0, 4.2] + d["daily"]["precipitation_sum"][2:], + ), + "likely_dry_tomorrow": lambda d: d["daily"].update( + precipitation_probability_max=[10, 45] + d["daily"]["precipitation_probability_max"][2:], + precipitation_sum=[0.0, 0.0] + d["daily"]["precipitation_sum"][2:], + ), + "one_day": lambda d: d["daily"].update({k: v[:1] for k, v in d["daily"].items()}), + "no_daily": lambda d: d.pop("daily"), + "no_current": lambda d: d.pop("current"), + "null_temp": lambda d: d["current"].__setitem__("temperature_2m", None), + "null_highs": lambda d: d["daily"].update(temperature_2m_max=[None] * len(d["daily"]["temperature_2m_max"])), + "null_code": lambda d: d["daily"].update(weather_code=[None] * len(d["daily"]["weather_code"])), +} + + +@pytest.mark.parametrize("name", ["london", "phoenix"]) +def test_open_meteo_text_distorted(name): + results = {} + for key, distort in DISTORTIONS.items(): + data = copy.deepcopy(_load(name)) + distort(data) + for forecast_type in ("default", "tomorrow", "multiday"): + cmd = _gwx(UNITS[name]) + results[f"{key}-{forecast_type}"] = _text_and_logs(_run(cmd, data, DAY, forecast_type=forecast_type, num_days=5)) + cmd = _gwx(UNITS[name]) + results[f"{key}-default-budget260"] = _text_and_logs(_run(cmd, data, DAY, budget=260)) + cmd = _gwx(UNITS[name]) + results[f"{key}-default-budget600"] = _text_and_logs(_run(cmd, data, DAY, budget=600)) + # A model override, and a catalog whose pressure unit is mmHg. + data = _load(name) + cmd = _gwx(UNITS[name], {"weather_model": "ecmwf_ifs025"}) + results["model-override"] = _run(cmd, data, DAY) + cmd = _gwx(UNITS[name]) + base_translate = cmd.bot.translator.translate.side_effect + cmd.bot.translator.translate.side_effect = ( + lambda key, **kw: "mmHg" if key.endswith("gwx.pressure_unit") else base_translate(key, **kw) + ) + results["mmhg"] = _text_and_logs(_run(cmd, data, DAY, budget=260)) + cmd = _gwx(UNITS[name]) + get = Mock(return_value=_response({}, ok=False)) + with patch(f"{MODULE}.requests.get", get): + results["http-error"] = [ + cmd.get_open_meteo_weather(1.0, 2.0, forecast_type=t) for t in ("default", "tomorrow", "multiday") + ] + assert_golden(f"open_meteo_gwx_distorted_{name}", results) diff --git a/tests/fixtures/open_meteo/london.json b/tests/fixtures/open_meteo/london.json new file mode 100644 index 0000000..e3f81c4 --- /dev/null +++ b/tests/fixtures/open_meteo/london.json @@ -0,0 +1 @@ +{"latitude":51.51147,"longitude":-0.13078308,"generationtime_ms":1.6378164291381836,"utc_offset_seconds":3600,"timezone":"Europe/London","timezone_abbreviation":"GMT+1","elevation":16.0,"current_units":{"time":"iso8601","interval":"seconds","temperature_2m":"°C","relative_humidity_2m":"%","apparent_temperature":"°C","precipitation":"mm","weather_code":"wmo code","wind_speed_10m":"km/h","wind_direction_10m":"°","wind_gusts_10m":"km/h","dewpoint_2m":"°C","visibility":"m","surface_pressure":"hPa"},"current":{"time":"2026-10-02T03:15","interval":900,"temperature_2m":14.2,"relative_humidity_2m":78,"apparent_temperature":13.6,"precipitation":0.00,"weather_code":2,"wind_speed_10m":5.4,"wind_direction_10m":220,"wind_gusts_10m":11.5,"dewpoint_2m":10.5,"visibility":17180.00,"surface_pressure":1027.5},"hourly_units":{"time":"iso8601","temperature_2m":"°C","weather_code":"wmo code","wind_speed_10m":"km/h","wind_direction_10m":"°","wind_gusts_10m":"km/h"},"hourly":{"time":["2026-10-02T00:00","2026-10-02T01:00","2026-10-02T02:00","2026-10-02T03:00","2026-10-02T04:00","2026-10-02T05:00","2026-10-02T06:00","2026-10-02T07:00","2026-10-02T08:00","2026-10-02T09:00","2026-10-02T10:00","2026-10-02T11:00","2026-10-02T12:00","2026-10-02T13:00","2026-10-02T14:00","2026-10-02T15:00","2026-10-02T16:00","2026-10-02T17:00","2026-10-02T18:00","2026-10-02T19:00","2026-10-02T20:00","2026-10-02T21:00","2026-10-02T22:00","2026-10-02T23:00","2026-10-03T00:00","2026-10-03T01:00","2026-10-03T02:00","2026-10-03T03:00","2026-10-03T04:00","2026-10-03T05:00","2026-10-03T06:00","2026-10-03T07:00","2026-10-03T08:00","2026-10-03T09:00","2026-10-03T10:00","2026-10-03T11:00","2026-10-03T12:00","2026-10-03T13:00","2026-10-03T14:00","2026-10-03T15:00","2026-10-03T16:00","2026-10-03T17:00","2026-10-03T18:00","2026-10-03T19:00","2026-10-03T20:00","2026-10-03T21:00","2026-10-03T22:00","2026-10-03T23:00","2026-10-04T00:00","2026-10-04T01:00","2026-10-04T02:00","2026-10-04T03:00","2026-10-04T04:00","2026-10-04T05:00","2026-10-04T06:00","2026-10-04T07:00","2026-10-04T08:00","2026-10-04T09:00","2026-10-04T10:00","2026-10-04T11:00","2026-10-04T12:00","2026-10-04T13:00","2026-10-04T14:00","2026-10-04T15:00","2026-10-04T16:00","2026-10-04T17:00","2026-10-04T18:00","2026-10-04T19:00","2026-10-04T20:00","2026-10-04T21:00","2026-10-04T22:00","2026-10-04T23:00","2026-10-05T00:00","2026-10-05T01:00","2026-10-05T02:00","2026-10-05T03:00","2026-10-05T04:00","2026-10-05T05:00","2026-10-05T06:00","2026-10-05T07:00","2026-10-05T08:00","2026-10-05T09:00","2026-10-05T10:00","2026-10-05T11:00","2026-10-05T12:00","2026-10-05T13:00","2026-10-05T14:00","2026-10-05T15:00","2026-10-05T16:00","2026-10-05T17:00","2026-10-05T18:00","2026-10-05T19:00","2026-10-05T20:00","2026-10-05T21:00","2026-10-05T22:00","2026-10-05T23:00","2026-10-06T00:00","2026-10-06T01:00","2026-10-06T02:00","2026-10-06T03:00","2026-10-06T04:00","2026-10-06T05:00","2026-10-06T06:00","2026-10-06T07:00","2026-10-06T08:00","2026-10-06T09:00","2026-10-06T10:00","2026-10-06T11:00","2026-10-06T12:00","2026-10-06T13:00","2026-10-06T14:00","2026-10-06T15:00","2026-10-06T16:00","2026-10-06T17:00","2026-10-06T18:00","2026-10-06T19:00","2026-10-06T20:00","2026-10-06T21:00","2026-10-06T22:00","2026-10-06T23:00","2026-10-07T00:00","2026-10-07T01:00","2026-10-07T02:00","2026-10-07T03:00","2026-10-07T04:00","2026-10-07T05:00","2026-10-07T06:00","2026-10-07T07:00","2026-10-07T08:00","2026-10-07T09:00","2026-10-07T10:00","2026-10-07T11:00","2026-10-07T12:00","2026-10-07T13:00","2026-10-07T14:00","2026-10-07T15:00","2026-10-07T16:00","2026-10-07T17:00","2026-10-07T18:00","2026-10-07T19:00","2026-10-07T20:00","2026-10-07T21:00","2026-10-07T22:00","2026-10-07T23:00","2026-10-08T00:00","2026-10-08T01:00","2026-10-08T02:00","2026-10-08T03:00","2026-10-08T04:00","2026-10-08T05:00","2026-10-08T06:00","2026-10-08T07:00","2026-10-08T08:00","2026-10-08T09:00","2026-10-08T10:00","2026-10-08T11:00","2026-10-08T12:00","2026-10-08T13:00","2026-10-08T14:00","2026-10-08T15:00","2026-10-08T16:00","2026-10-08T17:00","2026-10-08T18:00","2026-10-08T19:00","2026-10-08T20:00","2026-10-08T21:00","2026-10-08T22:00","2026-10-08T23:00","2026-10-09T00:00","2026-10-09T01:00","2026-10-09T02:00","2026-10-09T03:00","2026-10-09T04:00","2026-10-09T05:00","2026-10-09T06:00","2026-10-09T07:00","2026-10-09T08:00","2026-10-09T09:00","2026-10-09T10:00","2026-10-09T11:00","2026-10-09T12:00","2026-10-09T13:00","2026-10-09T14:00","2026-10-09T15:00","2026-10-09T16:00","2026-10-09T17:00","2026-10-09T18:00","2026-10-09T19:00","2026-10-09T20:00","2026-10-09T21:00","2026-10-09T22:00","2026-10-09T23:00","2026-10-10T00:00","2026-10-10T01:00","2026-10-10T02:00","2026-10-10T03:00","2026-10-10T04:00","2026-10-10T05:00","2026-10-10T06:00","2026-10-10T07:00","2026-10-10T08:00","2026-10-10T09:00","2026-10-10T10:00","2026-10-10T11:00","2026-10-10T12:00","2026-10-10T13:00","2026-10-10T14:00","2026-10-10T15:00","2026-10-10T16:00","2026-10-10T17:00","2026-10-10T18:00","2026-10-10T19:00","2026-10-10T20:00","2026-10-10T21:00","2026-10-10T22:00","2026-10-10T23:00","2026-10-11T00:00","2026-10-11T01:00","2026-10-11T02:00","2026-10-11T03:00","2026-10-11T04:00","2026-10-11T05:00","2026-10-11T06:00","2026-10-11T07:00","2026-10-11T08:00","2026-10-11T09:00","2026-10-11T10:00","2026-10-11T11:00","2026-10-11T12:00","2026-10-11T13:00","2026-10-11T14:00","2026-10-11T15:00","2026-10-11T16:00","2026-10-11T17:00","2026-10-11T18:00","2026-10-11T19:00","2026-10-11T20:00","2026-10-11T21:00","2026-10-11T22:00","2026-10-11T23:00","2026-10-12T00:00","2026-10-12T01:00","2026-10-12T02:00","2026-10-12T03:00","2026-10-12T04:00","2026-10-12T05:00","2026-10-12T06:00","2026-10-12T07:00","2026-10-12T08:00","2026-10-12T09:00","2026-10-12T10:00","2026-10-12T11:00","2026-10-12T12:00","2026-10-12T13:00","2026-10-12T14:00","2026-10-12T15:00","2026-10-12T16:00","2026-10-12T17:00","2026-10-12T18:00","2026-10-12T19:00","2026-10-12T20:00","2026-10-12T21:00","2026-10-12T22:00","2026-10-12T23:00","2026-10-13T00:00","2026-10-13T01:00","2026-10-13T02:00","2026-10-13T03:00","2026-10-13T04:00","2026-10-13T05:00","2026-10-13T06:00","2026-10-13T07:00","2026-10-13T08:00","2026-10-13T09:00","2026-10-13T10:00","2026-10-13T11:00","2026-10-13T12:00","2026-10-13T13:00","2026-10-13T14:00","2026-10-13T15:00","2026-10-13T16:00","2026-10-13T17:00","2026-10-13T18:00","2026-10-13T19:00","2026-10-13T20:00","2026-10-13T21:00","2026-10-13T22:00","2026-10-13T23:00","2026-10-14T00:00","2026-10-14T01:00","2026-10-14T02:00","2026-10-14T03:00","2026-10-14T04:00","2026-10-14T05:00","2026-10-14T06:00","2026-10-14T07:00","2026-10-14T08:00","2026-10-14T09:00","2026-10-14T10:00","2026-10-14T11:00","2026-10-14T12:00","2026-10-14T13:00","2026-10-14T14:00","2026-10-14T15:00","2026-10-14T16:00","2026-10-14T17:00","2026-10-14T18:00","2026-10-14T19:00","2026-10-14T20:00","2026-10-14T21:00","2026-10-14T22:00","2026-10-14T23:00","2026-10-15T00:00","2026-10-15T01:00","2026-10-15T02:00","2026-10-15T03:00","2026-10-15T04:00","2026-10-15T05:00","2026-10-15T06:00","2026-10-15T07:00","2026-10-15T08:00","2026-10-15T09:00","2026-10-15T10:00","2026-10-15T11:00","2026-10-15T12:00","2026-10-15T13:00","2026-10-15T14:00","2026-10-15T15:00","2026-10-15T16:00","2026-10-15T17:00","2026-10-15T18:00","2026-10-15T19:00","2026-10-15T20:00","2026-10-15T21:00","2026-10-15T22:00","2026-10-15T23:00","2026-10-16T00:00","2026-10-16T01:00","2026-10-16T02:00","2026-10-16T03:00","2026-10-16T04:00","2026-10-16T05:00","2026-10-16T06:00","2026-10-16T07:00","2026-10-16T08:00","2026-10-16T09:00","2026-10-16T10:00","2026-10-16T11:00","2026-10-16T12:00","2026-10-16T13:00","2026-10-16T14:00","2026-10-16T15:00","2026-10-16T16:00","2026-10-16T17:00","2026-10-16T18:00","2026-10-16T19:00","2026-10-16T20:00","2026-10-16T21:00","2026-10-16T22:00","2026-10-16T23:00","2026-10-17T00:00","2026-10-17T01:00","2026-10-17T02:00","2026-10-17T03:00","2026-10-17T04:00","2026-10-17T05:00","2026-10-17T06:00","2026-10-17T07:00","2026-10-17T08:00","2026-10-17T09:00","2026-10-17T10:00","2026-10-17T11:00","2026-10-17T12:00","2026-10-17T13:00","2026-10-17T14:00","2026-10-17T15:00","2026-10-17T16:00","2026-10-17T17:00","2026-10-17T18:00","2026-10-17T19:00","2026-10-17T20:00","2026-10-17T21:00","2026-10-17T22:00","2026-10-17T23:00"],"temperature_2m":[15.0,14.7,14.5,14.3,14.2,14.3,14.0,13.9,14.3,15.3,17.0,17.9,18.8,19.3,19.9,20.1,20.1,19.9,19.2,18.4,17.7,17.0,16.6,16.2,15.9,15.5,15.3,14.9,14.6,14.3,14.1,14.3,14.3,14.9,16.1,17.2,18.5,19.4,20.3,20.9,21.2,21.3,21.0,20.5,20.0,19.6,18.7,17.9,17.3,16.7,16.4,16.0,15.6,15.2,14.8,14.5,14.2,14.1,14.2,14.4,14.9,15.5,16.5,17.6,18.5,19.0,19.4,19.5,19.4,19.1,18.7,18.1,17.4,16.8,16.2,15.6,15.2,14.7,14.4,14.2,14.3,14.5,15.0,15.8,17.0,17.9,18.6,19.1,19.5,19.7,19.9,19.8,19.6,19.1,18.6,17.9,17.1,16.3,15.7,15.1,14.8,14.7,14.9,15.0,15.0,15.0,15.2,15.7,16.5,17.2,17.8,18.4,18.7,18.9,18.9,18.3,16.9,15.0,13.5,12.7,12.3,12.0,11.8,11.7,11.5,11.2,10.9,10.7,10.6,10.7,11.0,12.9,13.5,13.9,14.1,14.3,14.4,14.4,14.3,14.1,13.7,13.1,12.4,11.7,11.0,10.5,10.2,9.8,9.6,9.4,9.4,9.6,10.0,10.6,11.4,12.4,13.5,14.5,15.1,15.1,14.9,14.5,14.1,13.6,13.1,12.4,11.6,10.8,10.1,9.7,9.5,9.5,9.6,9.8,10.0,10.4,10.8,11.4,12.1,12.8,13.4,13.9,14.3,14.7,15.0,15.3,15.4,15.4,15.3,15.1,14.8,14.4,13.9,13.5,12.9,12.1,11.2,10.5,10.0,9.9,10.3,11.2,12.4,13.6,14.6,15.1,15.2,15.0,14.5,14.0,13.4,12.9,12.4,11.8,11.2,10.6,10.1,9.6,9.2,8.8,8.4,8.1,8.0,8.2,8.8,9.8,11.0,12.1,13.1,13.7,13.8,13.7,13.4,12.9,12.5,12.0,11.6,11.0,10.4,9.9,9.3,8.9,8.4,8.0,7.5,7.2,7.1,7.3,8.0,9.0,10.3,11.5,12.6,13.1,13.2,13.0,12.5,11.9,11.3,10.7,10.1,9.3,8.6,7.9,7.2,6.7,6.3,5.9,5.6,5.5,5.6,6.0,7.0,8.5,10.3,12.1,13.5,14.4,14.7,14.5,14.1,13.5,12.9,12.5,12.3,12.0,11.8,11.6,11.5,11.3,11.2,11.2,11.1,11.1,11.2,11.3,11.5,11.8,12.2,12.5,12.9,13.1,13.3,13.5,13.7,13.8,13.8,13.6,13.2,12.6,11.8,11.1,10.4,9.8,9.2,8.6,8.0,7.6,7.5,7.8,8.7,10.2,11.9,13.6,15.1,16.1,16.6,16.7,16.7,16.4,16.0,15.7,15.2,14.6,13.8,13.1,12.5,12.0,11.6,11.3,11.1,10.9,11.0,11.3,11.9,12.9,14.0,15.1,16.1,16.7,16.9,16.8,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"weather_code":[3,3,0,2,1,2,2,2,0,2,0,3,3,51,2,2,3,2,1,2,0,3,3,3,3,3,3,3,2,0,1,3,3,3,3,3,3,3,3,3,3,0,0,0,0,2,1,1,0,0,2,0,0,0,0,0,45,45,45,3,3,3,2,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,2,3,3,3,3,3,2,1,2,2,3,3,3,3,2,1,0,0,0,1,2,3,3,3,2,2,2,3,3,3,3,3,3,3,3,51,51,51,53,53,53,53,53,53,3,3,3,2,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,3,3,3,3,3,3,3,3,3,3,3,51,51,51,51,51,51,53,53,53,53,53,53,55,55,55,55,55,55,51,51,51,51,51,51,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,3,3,2,2,2,2,1,2,2,2,3,3,3,51,51,51,51,51,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,3,3,2,2,1,0,0,0,1,1,2,3,3,3,3,3,3,3,3,51,51,51,51,51,51,51,51,51,51,51,51,0,1,2,2,3,3,3,3,3,2,2,2,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wind_speed_10m":[8.3,7.6,7.2,6.1,3.6,4.7,4.0,4.7,5.8,8.3,10.1,11.9,14.4,14.8,14.0,14.0,14.4,15.8,15.5,14.0,12.6,10.1,9.7,7.9,7.6,6.5,6.5,6.1,5.0,4.3,4.7,4.7,4.0,4.3,5.4,5.0,6.8,6.8,7.2,6.8,6.5,5.8,6.1,6.1,7.9,8.6,9.0,8.6,7.9,6.8,5.8,4.5,3.8,3.6,4.3,4.7,5.0,5.4,5.8,5.8,5.4,5.4,5.4,5.8,6.1,6.5,6.5,6.8,7.2,7.9,8.3,9.0,9.4,9.7,9.4,8.6,8.3,7.9,7.9,7.9,7.9,8.3,8.6,9.4,10.4,11.2,11.9,12.2,12.6,12.2,11.5,10.8,10.4,10.4,10.4,10.4,10.4,10.4,10.1,9.4,8.6,7.9,6.8,6.5,6.8,7.6,7.9,7.6,7.2,6.5,5.8,4.7,4.7,5.8,7.6,9.4,11.9,14.8,16.2,15.8,14.4,13.0,12.2,12.2,11.9,11.9,11.9,11.9,11.9,11.9,12.2,13.3,13.7,14.0,14.4,14.8,15.1,15.1,15.5,15.5,15.5,15.1,14.8,14.4,14.0,14.0,14.4,14.8,15.1,15.5,16.2,16.6,16.9,17.3,17.6,17.0,16.4,16.0,14.4,12.9,11.0,9.0,7.2,6.1,5.6,5.6,5.9,6.3,6.8,7.4,8.1,8.7,9.2,10.1,10.8,11.9,13.1,14.7,16.2,17.8,19.1,19.6,19.6,19.0,18.0,16.8,15.6,14.5,13.4,12.2,11.5,11.0,11.1,11.2,11.1,10.9,10.6,10.4,10.7,11.2,11.9,13.2,14.4,15.6,16.5,17.0,16.9,16.3,15.5,14.7,13.8,13.3,13.0,12.9,13.0,12.9,13.0,13.0,12.9,13.1,13.0,13.0,13.0,13.1,13.5,14.2,15.3,16.6,17.8,18.3,18.3,17.7,16.7,15.7,14.8,14.1,13.7,13.7,13.5,13.6,13.6,13.3,13.0,12.8,12.2,11.9,11.4,11.2,11.0,10.9,10.7,10.6,10.5,10.1,9.6,8.8,7.9,7.1,6.0,5.2,4.3,3.6,2.9,2.7,2.8,3.0,3.1,3.3,3.2,3.5,3.8,4.1,4.5,5.0,5.2,5.7,6.2,6.7,7.4,8.1,8.8,9.6,10.2,10.4,10.2,9.4,8.6,7.9,7.4,7.3,7.6,8.5,9.4,10.4,11.5,12.3,12.8,13.6,14.1,14.5,14.6,14.0,12.8,11.0,9.2,8.0,7.9,8.1,8.5,8.6,8.8,8.8,8.7,8.6,8.3,7.8,7.2,6.7,6.5,6.3,6.7,7.3,7.9,8.5,9.0,9.3,9.3,8.9,8.4,7.8,7.4,7.2,7.1,7.2,7.3,7.2,7.2,7.2,6.9,6.2,5.6,5.1,4.6,4.8,5.4,6.3,7.6,9.1,10.3,11.1,11.6,11.2,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wind_direction_10m":[228,228,234,228,194,162,190,186,188,198,204,216,216,218,218,222,212,204,206,204,202,208,204,206,214,212,222,228,218,208,218,224,216,230,240,244,244,248,240,238,230,228,214,226,210,214,230,238,250,230,240,246,261,258,254,250,295,266,236,238,240,242,244,246,248,245,242,239,246,254,261,260,258,257,255,253,251,246,242,237,233,229,225,229,232,236,240,243,247,244,242,239,241,244,246,249,251,254,257,261,264,252,240,228,238,247,257,256,255,254,267,281,294,304,315,325,341,356,12,12,13,13,9,6,2,357,353,348,345,341,338,335,333,330,326,321,317,312,308,303,297,292,286,280,275,269,271,273,276,278,280,282,287,292,298,303,307,309,307,306,304,299,292,284,274,264,256,250,243,238,231,225,219,215,212,212,213,217,220,223,225,226,227,228,228,228,230,233,238,246,256,267,277,282,283,279,274,268,262,259,259,260,261,262,263,263,263,262,261,259,258,257,256,254,253,251,251,250,249,247,246,246,246,249,254,262,269,276,281,284,286,287,289,290,291,292,292,291,289,288,287,286,287,286,287,288,289,291,293,297,300,304,307,309,310,309,309,308,307,304,298,288,270,250,230,213,201,186,177,165,161,157,157,161,164,167,170,174,177,181,185,186,188,189,188,185,182,179,174,173,173,175,178,180,182,183,185,185,187,188,190,193,197,205,219,236,253,265,270,271,269,266,263,260,259,255,251,246,240,235,232,230,229,228,227,226,224,222,220,217,214,212,210,208,208,207,207,205,203,202,201,197,193,191,188,187,187,185,186,186,185,186,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"wind_gusts_10m":[17.3,15.8,15.5,13.0,7.6,10.1,8.6,9.4,12.2,17.3,22.0,25.9,31.0,32.0,31.0,31.3,31.7,33.8,33.8,31.0,27.0,22.0,20.9,17.3,15.8,14.0,14.0,13.0,10.8,9.7,9.4,10.1,8.3,9.0,11.5,11.2,15.8,16.6,17.6,18.0,16.6,14.0,14.8,14.0,17.3,18.7,19.4,19.1,17.3,14.8,12.1,9.4,7.0,5.8,6.8,7.6,10.1,11.2,12.2,12.6,12.6,12.6,13.0,13.7,14.0,14.4,14.4,14.8,15.1,15.5,16.2,17.3,18.4,19.1,18.4,16.9,15.8,15.5,15.5,15.8,16.2,16.9,18.0,19.8,22.0,23.8,25.2,26.3,26.6,25.6,24.1,22.7,22.0,21.6,21.2,21.2,21.2,20.9,20.2,19.1,18.0,16.2,13.7,12.6,13.3,15.1,16.6,16.6,16.2,15.5,14.4,13.0,12.6,14.0,16.6,19.8,24.8,30.6,33.8,32.8,29.9,27.0,25.9,25.2,24.8,24.5,24.5,24.5,24.5,24.5,25.2,28.4,29.9,30.6,31.3,31.7,32.0,32.0,32.0,32.0,31.7,31.0,29.9,28.8,28.4,28.1,28.4,28.8,29.9,30.6,31.7,32.8,33.8,34.9,36.0,36.7,37.8,38.6,39.2,40.0,40.3,40.7,40.0,38.5,35.6,31.3,26.3,21.6,17.6,15.5,15.1,15.8,17.6,19.8,22.3,24.8,27.7,31.7,35.6,39.6,42.8,45.0,46.1,45.7,45.4,44.3,43.6,42.8,42.8,42.8,42.8,42.8,42.5,41.8,40.3,37.8,34.9,32.4,30.6,29.9,30.6,32.0,34.2,36.7,38.9,40.7,42.1,43.2,44.3,45.0,45.0,44.6,43.2,40.3,37.4,34.2,31.3,29.5,28.4,27.7,27.7,27.7,28.4,29.5,31.3,33.8,37.1,40.0,42.5,44.3,45.4,45.7,46.1,45.7,45.4,44.3,42.8,40.7,38.2,35.6,33.5,31.7,30.6,30.2,30.2,30.2,30.2,29.9,29.5,29.2,28.4,28.1,27.7,27.4,27.4,28.1,28.4,28.8,28.8,27.7,25.6,22.7,19.1,15.5,12.2,10.1,8.6,7.9,7.9,7.9,8.3,8.6,9.4,10.8,12.2,14.0,15.5,16.9,18.0,18.7,19.8,20.5,21.2,21.6,22.0,22.0,22.0,22.0,22.0,22.3,22.7,23.0,23.8,24.1,24.8,25.6,26.3,27.0,28.1,28.8,29.5,30.2,31.0,32.0,32.8,33.5,33.5,32.8,31.0,28.4,25.6,22.3,19.4,17.6,16.6,16.2,15.8,15.8,16.6,16.9,17.6,18.7,20.2,21.6,23.0,24.5,25.9,27.4,28.8,29.9,30.6,30.6,29.5,27.7,25.6,23.0,20.9,19.1,17.6,16.2,14.8,13.7,13.0,13.3,14.4,16.6,19.4,22.3,25.2,27.1,28.1,27.7,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]},"daily_units":{"time":"iso8601","weather_code":"wmo code","temperature_2m_max":"°C","temperature_2m_min":"°C","precipitation_sum":"mm","precipitation_probability_max":"%","wind_speed_10m_max":"km/h","wind_gusts_10m_max":"km/h"},"daily":{"time":["2026-10-02","2026-10-03","2026-10-04","2026-10-05","2026-10-06","2026-10-07","2026-10-08","2026-10-09","2026-10-10","2026-10-11","2026-10-12","2026-10-13","2026-10-14","2026-10-15","2026-10-16","2026-10-17"],"weather_code":[51,3,45,3,53,53,3,55,51,51,1,3,51,3,null,null],"temperature_2m_max":[20.1,21.3,19.5,19.9,18.9,14.4,15.1,15.4,15.2,13.8,13.2,14.7,13.8,16.7,null,null],"temperature_2m_min":[13.9,14.1,14.1,14.2,12.7,10.6,9.4,9.5,9.9,8.0,7.1,5.5,11.1,7.5,null,null],"precipitation_sum":[0.10,0.00,0.00,0.00,3.20,1.60,0.00,13.00,0.20,0.60,0.00,0.00,1.80,0.00,null,null],"precipitation_probability_max":[0,16,0,0,20,32,7,14,14,16,24,22,null,null,null,null],"wind_speed_10m_max":[15.8,9.0,9.0,12.6,16.2,15.5,17.6,19.6,17.0,18.3,13.6,10.4,14.6,9.3,null,null],"wind_gusts_10m_max":[33.8,19.4,17.3,26.6,33.8,32.0,40.7,46.1,45.0,46.1,33.5,22.0,33.5,30.6,null,null]}} \ No newline at end of file diff --git a/tests/fixtures/open_meteo/phoenix.json b/tests/fixtures/open_meteo/phoenix.json new file mode 100644 index 0000000..bd4d16b --- /dev/null +++ b/tests/fixtures/open_meteo/phoenix.json @@ -0,0 +1 @@ +{"latitude":33.440266,"longitude":-112.06021,"generationtime_ms":1.13677978515625,"utc_offset_seconds":-25200,"timezone":"America/Phoenix","timezone_abbreviation":"GMT-7","elevation":333.0,"current_units":{"time":"iso8601","interval":"seconds","temperature_2m":"°F","relative_humidity_2m":"%","apparent_temperature":"°F","precipitation":"inch","weather_code":"wmo code","wind_speed_10m":"mp/h","wind_direction_10m":"°","wind_gusts_10m":"mp/h","dewpoint_2m":"°F","visibility":"ft","surface_pressure":"hPa"},"current":{"time":"2026-10-01T19:15","interval":900,"temperature_2m":84.6,"relative_humidity_2m":32,"apparent_temperature":83.0,"precipitation":0.000,"weather_code":0,"wind_speed_10m":4.7,"wind_direction_10m":245,"wind_gusts_10m":5.8,"dewpoint_2m":51.5,"visibility":193241.472,"surface_pressure":971.1},"hourly_units":{"time":"iso8601","temperature_2m":"°F","weather_code":"wmo code","wind_speed_10m":"mp/h","wind_direction_10m":"°","wind_gusts_10m":"mp/h"},"hourly":{"time":["2026-10-01T00:00","2026-10-01T01:00","2026-10-01T02:00","2026-10-01T03:00","2026-10-01T04:00","2026-10-01T05:00","2026-10-01T06:00","2026-10-01T07:00","2026-10-01T08:00","2026-10-01T09:00","2026-10-01T10:00","2026-10-01T11:00","2026-10-01T12:00","2026-10-01T13:00","2026-10-01T14:00","2026-10-01T15:00","2026-10-01T16:00","2026-10-01T17:00","2026-10-01T18:00","2026-10-01T19:00","2026-10-01T20:00","2026-10-01T21:00","2026-10-01T22:00","2026-10-01T23:00","2026-10-02T00:00","2026-10-02T01:00","2026-10-02T02:00","2026-10-02T03:00","2026-10-02T04:00","2026-10-02T05:00","2026-10-02T06:00","2026-10-02T07:00","2026-10-02T08:00","2026-10-02T09:00","2026-10-02T10:00","2026-10-02T11:00","2026-10-02T12:00","2026-10-02T13:00","2026-10-02T14:00","2026-10-02T15:00","2026-10-02T16:00","2026-10-02T17:00","2026-10-02T18:00","2026-10-02T19:00","2026-10-02T20:00","2026-10-02T21:00","2026-10-02T22:00","2026-10-02T23:00","2026-10-03T00:00","2026-10-03T01:00","2026-10-03T02:00","2026-10-03T03:00","2026-10-03T04:00","2026-10-03T05:00","2026-10-03T06:00","2026-10-03T07:00","2026-10-03T08:00","2026-10-03T09:00","2026-10-03T10:00","2026-10-03T11:00","2026-10-03T12:00","2026-10-03T13:00","2026-10-03T14:00","2026-10-03T15:00","2026-10-03T16:00","2026-10-03T17:00","2026-10-03T18:00","2026-10-03T19:00","2026-10-03T20:00","2026-10-03T21:00","2026-10-03T22:00","2026-10-03T23:00","2026-10-04T00:00","2026-10-04T01:00","2026-10-04T02:00","2026-10-04T03:00","2026-10-04T04:00","2026-10-04T05:00","2026-10-04T06:00","2026-10-04T07:00","2026-10-04T08:00","2026-10-04T09:00","2026-10-04T10:00","2026-10-04T11:00","2026-10-04T12:00","2026-10-04T13:00","2026-10-04T14:00","2026-10-04T15:00","2026-10-04T16:00","2026-10-04T17:00","2026-10-04T18:00","2026-10-04T19:00","2026-10-04T20:00","2026-10-04T21:00","2026-10-04T22:00","2026-10-04T23:00","2026-10-05T00:00","2026-10-05T01:00","2026-10-05T02:00","2026-10-05T03:00","2026-10-05T04:00","2026-10-05T05:00","2026-10-05T06:00","2026-10-05T07:00","2026-10-05T08:00","2026-10-05T09:00","2026-10-05T10:00","2026-10-05T11:00","2026-10-05T12:00","2026-10-05T13:00","2026-10-05T14:00","2026-10-05T15:00","2026-10-05T16:00","2026-10-05T17:00","2026-10-05T18:00","2026-10-05T19:00","2026-10-05T20:00","2026-10-05T21:00","2026-10-05T22:00","2026-10-05T23:00","2026-10-06T00:00","2026-10-06T01:00","2026-10-06T02:00","2026-10-06T03:00","2026-10-06T04:00","2026-10-06T05:00","2026-10-06T06:00","2026-10-06T07:00","2026-10-06T08:00","2026-10-06T09:00","2026-10-06T10:00","2026-10-06T11:00","2026-10-06T12:00","2026-10-06T13:00","2026-10-06T14:00","2026-10-06T15:00","2026-10-06T16:00","2026-10-06T17:00","2026-10-06T18:00","2026-10-06T19:00","2026-10-06T20:00","2026-10-06T21:00","2026-10-06T22:00","2026-10-06T23:00","2026-10-07T00:00","2026-10-07T01:00","2026-10-07T02:00","2026-10-07T03:00","2026-10-07T04:00","2026-10-07T05:00","2026-10-07T06:00","2026-10-07T07:00","2026-10-07T08:00","2026-10-07T09:00","2026-10-07T10:00","2026-10-07T11:00","2026-10-07T12:00","2026-10-07T13:00","2026-10-07T14:00","2026-10-07T15:00","2026-10-07T16:00","2026-10-07T17:00","2026-10-07T18:00","2026-10-07T19:00","2026-10-07T20:00","2026-10-07T21:00","2026-10-07T22:00","2026-10-07T23:00","2026-10-08T00:00","2026-10-08T01:00","2026-10-08T02:00","2026-10-08T03:00","2026-10-08T04:00","2026-10-08T05:00","2026-10-08T06:00","2026-10-08T07:00","2026-10-08T08:00","2026-10-08T09:00","2026-10-08T10:00","2026-10-08T11:00","2026-10-08T12:00","2026-10-08T13:00","2026-10-08T14:00","2026-10-08T15:00","2026-10-08T16:00","2026-10-08T17:00","2026-10-08T18:00","2026-10-08T19:00","2026-10-08T20:00","2026-10-08T21:00","2026-10-08T22:00","2026-10-08T23:00","2026-10-09T00:00","2026-10-09T01:00","2026-10-09T02:00","2026-10-09T03:00","2026-10-09T04:00","2026-10-09T05:00","2026-10-09T06:00","2026-10-09T07:00","2026-10-09T08:00","2026-10-09T09:00","2026-10-09T10:00","2026-10-09T11:00","2026-10-09T12:00","2026-10-09T13:00","2026-10-09T14:00","2026-10-09T15:00","2026-10-09T16:00","2026-10-09T17:00","2026-10-09T18:00","2026-10-09T19:00","2026-10-09T20:00","2026-10-09T21:00","2026-10-09T22:00","2026-10-09T23:00","2026-10-10T00:00","2026-10-10T01:00","2026-10-10T02:00","2026-10-10T03:00","2026-10-10T04:00","2026-10-10T05:00","2026-10-10T06:00","2026-10-10T07:00","2026-10-10T08:00","2026-10-10T09:00","2026-10-10T10:00","2026-10-10T11:00","2026-10-10T12:00","2026-10-10T13:00","2026-10-10T14:00","2026-10-10T15:00","2026-10-10T16:00","2026-10-10T17:00","2026-10-10T18:00","2026-10-10T19:00","2026-10-10T20:00","2026-10-10T21:00","2026-10-10T22:00","2026-10-10T23:00","2026-10-11T00:00","2026-10-11T01:00","2026-10-11T02:00","2026-10-11T03:00","2026-10-11T04:00","2026-10-11T05:00","2026-10-11T06:00","2026-10-11T07:00","2026-10-11T08:00","2026-10-11T09:00","2026-10-11T10:00","2026-10-11T11:00","2026-10-11T12:00","2026-10-11T13:00","2026-10-11T14:00","2026-10-11T15:00","2026-10-11T16:00","2026-10-11T17:00","2026-10-11T18:00","2026-10-11T19:00","2026-10-11T20:00","2026-10-11T21:00","2026-10-11T22:00","2026-10-11T23:00","2026-10-12T00:00","2026-10-12T01:00","2026-10-12T02:00","2026-10-12T03:00","2026-10-12T04:00","2026-10-12T05:00","2026-10-12T06:00","2026-10-12T07:00","2026-10-12T08:00","2026-10-12T09:00","2026-10-12T10:00","2026-10-12T11:00","2026-10-12T12:00","2026-10-12T13:00","2026-10-12T14:00","2026-10-12T15:00","2026-10-12T16:00","2026-10-12T17:00","2026-10-12T18:00","2026-10-12T19:00","2026-10-12T20:00","2026-10-12T21:00","2026-10-12T22:00","2026-10-12T23:00","2026-10-13T00:00","2026-10-13T01:00","2026-10-13T02:00","2026-10-13T03:00","2026-10-13T04:00","2026-10-13T05:00","2026-10-13T06:00","2026-10-13T07:00","2026-10-13T08:00","2026-10-13T09:00","2026-10-13T10:00","2026-10-13T11:00","2026-10-13T12:00","2026-10-13T13:00","2026-10-13T14:00","2026-10-13T15:00","2026-10-13T16:00","2026-10-13T17:00","2026-10-13T18:00","2026-10-13T19:00","2026-10-13T20:00","2026-10-13T21:00","2026-10-13T22:00","2026-10-13T23:00","2026-10-14T00:00","2026-10-14T01:00","2026-10-14T02:00","2026-10-14T03:00","2026-10-14T04:00","2026-10-14T05:00","2026-10-14T06:00","2026-10-14T07:00","2026-10-14T08:00","2026-10-14T09:00","2026-10-14T10:00","2026-10-14T11:00","2026-10-14T12:00","2026-10-14T13:00","2026-10-14T14:00","2026-10-14T15:00","2026-10-14T16:00","2026-10-14T17:00","2026-10-14T18:00","2026-10-14T19:00","2026-10-14T20:00","2026-10-14T21:00","2026-10-14T22:00","2026-10-14T23:00","2026-10-15T00:00","2026-10-15T01:00","2026-10-15T02:00","2026-10-15T03:00","2026-10-15T04:00","2026-10-15T05:00","2026-10-15T06:00","2026-10-15T07:00","2026-10-15T08:00","2026-10-15T09:00","2026-10-15T10:00","2026-10-15T11:00","2026-10-15T12:00","2026-10-15T13:00","2026-10-15T14:00","2026-10-15T15:00","2026-10-15T16:00","2026-10-15T17:00","2026-10-15T18:00","2026-10-15T19:00","2026-10-15T20:00","2026-10-15T21:00","2026-10-15T22:00","2026-10-15T23:00","2026-10-16T00:00","2026-10-16T01:00","2026-10-16T02:00","2026-10-16T03:00","2026-10-16T04:00","2026-10-16T05:00","2026-10-16T06:00","2026-10-16T07:00","2026-10-16T08:00","2026-10-16T09:00","2026-10-16T10:00","2026-10-16T11:00","2026-10-16T12:00","2026-10-16T13:00","2026-10-16T14:00","2026-10-16T15:00","2026-10-16T16:00","2026-10-16T17:00","2026-10-16T18:00","2026-10-16T19:00","2026-10-16T20:00","2026-10-16T21:00","2026-10-16T22:00","2026-10-16T23:00"],"temperature_2m":[75.5,74.1,72.6,71.8,70.9,70.5,69.8,70.0,74.1,78.4,83.2,86.7,89.3,91.4,92.8,93.0,93.6,93.4,89.5,85.5,82.3,80.3,78.7,77.0,75.8,74.8,74.6,73.7,72.8,71.9,70.8,72.0,80.0,84.7,88.7,92.1,93.6,94.4,95.7,94.8,94.6,93.2,90.0,85.8,82.9,81.1,79.6,77.6,76.5,76.8,76.6,76.0,75.1,74.8,74.1,74.4,78.2,81.6,84.9,89.1,91.1,93.0,94.1,95.0,95.3,94.9,94.2,93.5,92.8,91.7,90.6,89.5,88.4,87.5,86.6,85.9,85.9,85.7,84.8,84.7,86.1,88.4,91.0,92.9,94.4,95.3,96.2,96.9,96.9,96.2,95.1,94.2,92.9,91.9,90.6,89.3,88.3,87.4,87.2,86.5,85.7,84.8,84.5,84.3,85.4,87.4,89.7,92.2,94.0,95.5,96.5,97.1,97.1,96.9,96.5,96.2,95.6,93.7,92.4,91.9,91.1,90.6,89.9,89.0,87.9,87.0,86.3,85.7,86.6,88.1,90.1,92.0,93.7,95.1,96.2,96.9,97.4,97.4,97.1,96.4,95.6,94.9,94.1,93.3,92.5,91.8,91.0,90.2,89.4,88.8,88.3,87.9,88.3,89.9,92.2,94.4,96.2,97.9,99.2,100.1,100.7,100.7,100.1,98.9,97.8,96.9,96.0,95.0,93.8,92.6,91.3,90.1,88.9,88.1,87.7,87.7,88.6,90.8,93.8,96.5,98.6,100.3,101.6,102.3,102.5,102.1,101.1,99.6,98.2,96.9,95.6,94.4,93.0,91.8,90.6,89.7,88.9,88.4,88.1,87.9,88.6,90.8,93.7,96.2,97.8,98.9,99.6,100.0,99.9,99.4,98.5,97.3,96.0,94.9,93.8,92.8,91.7,90.7,89.7,88.7,87.7,87.0,86.3,85.8,86.1,87.7,90.2,92.4,94.3,95.9,97.1,97.6,97.6,97.3,96.4,94.9,93.5,92.0,90.4,89.1,88.3,87.7,87.1,86.1,85.0,84.3,84.1,84.3,85.0,86.6,88.8,90.8,92.4,93.9,94.9,95.3,95.3,95.1,94.9,94.6,94.0,93.3,92.4,91.5,90.7,90.0,89.2,88.3,87.4,86.6,86.0,85.6,85.7,87.1,89.1,90.8,92.0,93.0,93.5,92.9,91.9,91.0,90.7,90.6,90.4,90.2,89.9,89.4,88.8,88.1,87.5,86.8,86.4,85.9,85.6,85.3,85.6,86.6,88.0,89.5,91.1,92.8,94.0,94.7,95.0,94.9,94.3,93.3,92.4,91.7,91.1,90.3,89.6,88.8,88.1,87.5,86.9,86.5,86.1,86.0,86.3,87.4,88.9,90.4,92.0,93.5,94.6,95.0,95.0,94.7,93.8,92.5,91.3,90.2,89.3,88.4,87.7,87.3,86.7,85.9,85.1,84.5,84.1,84.1,84.5,85.6,87.2,88.8,90.8,92.9,93.8,92.6,90.3,88.3,87.0,85.9,84.8,83.6,82.2,80.8,79.2,77.4,75.8,74.7,73.7,73.0,72.2,71.7,71.8,73.0,74.8,76.7,78.5,80.4,81.9,82.6,82.9,82.9,82.7,82.3,81.8,81.2,80.5,79.8],"weather_code":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,51,51,51,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,1,2,3,2,1,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"wind_speed_10m":[3.6,4.9,3.0,1.6,3.2,3.9,2.9,1.6,2.3,3.4,1.1,0.7,0.2,1.4,0.9,1.4,1.8,1.1,3.2,4.6,4.1,0.0,4.4,4.6,4.3,3.5,5.8,5.3,5.4,5.8,4.9,5.2,7.9,8.3,8.7,13.0,13.9,12.8,9.2,14.1,12.2,11.8,7.5,5.2,4.7,5.7,5.3,4.7,5.4,10.7,12.3,9.4,10.0,10.8,11.6,12.3,15.3,17.0,16.2,15.4,14.9,14.1,13.7,13.4,12.6,12.8,11.5,9.9,7.5,7.1,5.4,5.4,5.4,5.6,6.7,8.1,10.1,12.6,11.6,11.4,12.2,15.9,18.0,17.2,17.8,15.5,13.7,13.8,14.1,14.0,14.1,13.2,11.0,10.5,12.0,10.2,6.5,8.8,12.7,12.2,12.0,9.9,9.1,9.0,11.7,13.2,12.5,12.0,11.3,9.7,9.0,7.9,7.2,6.5,6.9,7.2,7.8,8.2,5.1,6.9,6.5,6.1,6.4,6.3,6.2,6.3,5.4,5.4,5.8,6.5,6.5,5.8,5.0,3.9,3.2,2.9,3.8,5.0,5.9,6.5,6.8,5.9,4.5,3.4,3.4,3.6,3.7,3.0,2.1,1.9,2.6,3.4,4.2,4.8,5.2,5.1,4.3,2.8,1.6,2.2,4.3,5.8,5.9,5.4,4.5,3.7,3.7,4.3,3.9,3.4,3.8,4.3,4.7,5.2,5.4,5.5,5.7,6.1,6.8,7.2,6.3,5.3,5.3,6.5,10.0,12.4,11.5,8.6,6.7,7.0,8.1,8.5,7.4,5.8,4.6,4.1,3.7,3.8,4.1,5.2,6.5,8.7,11.3,13.2,13.7,13.5,13.3,13.0,12.3,11.7,11.4,11.2,11.7,13.0,14.8,15.6,14.9,13.2,11.1,8.0,4.5,3.4,3.8,5.4,7.6,10.6,13.9,16.2,16.6,15.8,14.8,13.6,12.2,10.9,9.6,8.2,8.1,10.1,13.0,14.3,12.0,8.4,7.0,7.4,8.0,8.7,9.3,10.3,10.5,9.9,9.6,9.9,9.7,8.8,7.8,6.9,6.0,5.2,4.0,3.4,3.6,2.9,1.8,1.4,1.5,1.9,1.9,1.3,0.7,0.8,1.6,2.4,3.3,4.1,4.9,6.3,9.0,12.4,13.9,12.8,10.1,7.7,5.5,3.5,2.0,1.4,1.8,2.1,2.1,2.3,2.2,2.0,1.8,1.6,1.8,2.0,2.2,2.6,3.1,3.8,4.8,5.8,6.6,6.4,6.0,6.1,7.2,8.6,9.3,9.0,7.8,7.0,6.2,5.4,4.5,3.7,3.2,2.9,2.5,2.2,2.1,2.2,2.7,3.2,3.7,4.6,5.5,7.2,10.4,12.7,12.3,11.0,9.9,8.5,7.0,5.6,4.5,3.8,3.1,2.3,1.8,1.7,1.7,2.1,1.7,1.4,4.3,6.7,8.8,11.5,13.9,15.0,16.2,17.4,16.5,14.6,13.0,11.3,9.7,8.8,9.2,10.7,11.5,9.9,7.4,5.4,4.7,4.5,4.5,4.3,4.3,4.5,5.2,6.3,7.0,7.3,7.2,7.1,7.1,6.9,6.6,5.8,4.8,4.1],"wind_direction_10m":[101,120,73,74,98,100,81,172,101,86,37,18,360,321,76,108,97,143,205,241,229,270,30,129,87,108,106,118,120,113,137,149,119,104,103,101,86,112,93,117,122,119,120,130,115,116,112,90,95,102,102,91,99,96,80,78,82,86,83,103,108,110,112,113,117,123,122,115,113,108,99,97,88,85,84,85,93,86,79,79,82,88,97,108,117,117,118,113,110,112,113,108,108,102,112,105,76,69,73,77,73,76,80,81,86,93,99,104,115,116,120,115,104,98,103,104,87,116,92,94,88,82,80,82,77,73,83,90,90,86,88,86,77,59,34,356,315,297,281,268,261,261,270,281,293,300,308,318,342,21,52,67,72,68,59,52,47,45,16,315,291,286,279,268,264,284,322,348,10,37,62,69,71,72,71,69,72,86,99,106,96,75,68,96,119,128,129,129,127,130,132,133,131,126,119,119,123,118,103,85,82,90,99,106,111,119,123,122,119,119,125,134,138,135,128,125,126,130,132,128,110,82,83,97,104,105,105,104,104,103,104,107,114,121,127,135,141,139,135,131,123,106,81,74,77,78,73,70,70,82,102,115,119,117,117,123,132,137,124,90,68,67,83,108,117,111,111,121,162,236,270,292,290,279,270,264,263,264,264,267,273,278,284,288,297,288,263,252,252,259,264,264,270,270,270,270,276,290,300,306,304,298,294,290,285,276,268,261,259,263,270,277,283,287,290,284,262,247,243,246,257,264,275,278,287,293,284,261,245,239,245,257,267,267,261,254,250,249,249,253,277,293,310,319,310,219,189,194,212,231,244,260,276,285,283,274,266,261,257,255,263,272,278,278,273,270,270,276,279,279,276,276,277,278,279,282,286,290,294,299,303,302,298,292],"wind_gusts_10m":[6.5,8.9,6.0,5.6,6.0,8.5,4.9,3.4,3.1,4.3,4.5,3.4,5.8,10.3,9.8,9.2,11.0,9.8,5.6,5.1,8.3,4.3,6.9,7.2,7.4,4.5,11.6,9.6,9.6,12.1,12.5,17.9,21.3,17.2,15.4,18.8,22.1,19.2,20.1,19.0,18.6,18.3,17.4,10.7,12.5,16.1,12.8,9.8,12.1,17.9,24.2,19.5,22.1,23.0,24.2,29.5,29.8,29.1,25.5,23.3,22.4,23.9,23.0,21.3,17.4,16.0,14.1,13.4,11.6,12.5,11.4,12.1,14.1,17.9,19.9,21.9,23.7,23.7,22.1,21.5,21.3,22.6,23.9,21.9,21.0,18.8,16.6,16.3,16.8,17.0,17.0,16.1,16.3,17.9,19.0,16.3,14.8,19.2,22.4,23.0,23.3,22.4,21.7,21.5,21.9,19.2,17.2,14.8,13.2,9.6,8.5,8.1,8.3,8.7,9.6,9.8,10.5,11.9,11.9,13.0,11.2,10.1,10.1,9.6,8.3,8.5,8.5,7.8,7.6,6.9,6.3,5.6,4.9,4.3,4.0,4.5,5.4,6.0,6.5,6.7,6.7,6.3,5.6,4.9,4.3,3.8,3.4,3.4,3.6,4.0,4.9,6.0,6.7,6.5,5.6,5.1,5.4,5.8,6.5,7.2,7.8,8.1,7.8,7.4,6.9,7.2,7.4,7.6,7.4,7.2,7.4,8.3,9.6,10.3,10.1,9.2,8.5,8.5,8.7,8.9,9.4,10.1,10.7,11.2,11.4,11.6,11.6,11.4,12.1,14.5,17.7,19.5,18.6,16.6,14.1,11.6,8.9,7.4,7.6,9.2,11.0,13.4,16.3,18.1,17.9,16.6,15.2,14.3,13.6,13.4,13.9,15.0,16.6,19.0,21.9,23.7,23.5,22.1,20.6,18.3,15.9,14.3,14.8,16.6,18.1,19.5,20.8,21.3,20.6,19.2,17.9,16.8,15.4,14.5,13.6,13.0,13.4,16.3,20.1,22.4,20.6,17.0,14.8,15.4,17.4,19.0,19.2,19.0,18.1,16.6,14.3,12.3,10.7,9.6,8.5,7.6,6.7,6.0,5.6,5.6,5.1,4.5,3.6,2.9,2.7,2.7,2.7,2.5,2.5,2.7,3.6,4.9,5.8,6.0,6.0,6.3,6.9,8.1,8.7,8.9,8.9,8.3,6.3,3.8,2.0,1.6,2.0,2.5,2.7,2.7,2.7,2.2,1.8,1.6,1.8,2.0,2.5,2.9,3.4,3.8,4.3,4.7,5.1,5.1,5.1,5.4,6.3,7.4,8.5,9.6,10.5,11.0,10.7,10.1,8.9,6.9,4.5,2.7,1.8,1.6,1.6,1.8,2.5,3.4,5.1,7.2,8.9,9.8,10.3,10.7,11.0,11.2,11.0,10.5,10.1,8.9,6.9,4.7,2.9,2.2,2.2,2.2,1.8,1.3,1.8,4.0,7.2,10.5,13.9,17.2,19.7,21.0,21.7,21.7,21.5,20.8,19.5,16.6,13.2,11.0,11.6,13.6,14.3,12.5,9.4,6.9,5.4,4.3,3.6,3.6,4.0,4.5,5.1,5.8,6.3,6.3,6.0,5.8,6.3,6.7,6.9,6.5,5.8,5.1]},"daily_units":{"time":"iso8601","weather_code":"wmo code","temperature_2m_max":"°F","temperature_2m_min":"°F","precipitation_sum":"inch","precipitation_probability_max":"%","wind_speed_10m_max":"mp/h","wind_gusts_10m_max":"mp/h"},"daily":{"time":["2026-10-01","2026-10-02","2026-10-03","2026-10-04","2026-10-05","2026-10-06","2026-10-07","2026-10-08","2026-10-09","2026-10-10","2026-10-11","2026-10-12","2026-10-13","2026-10-14","2026-10-15","2026-10-16"],"weather_code":[0,0,0,0,3,3,0,0,0,0,0,2,1,51,3,1],"temperature_2m_max":[93.6,95.7,95.3,96.9,97.1,97.4,100.7,102.5,100.0,97.6,95.3,93.5,95.0,95.0,93.8,82.9],"temperature_2m_min":[69.8,70.8,74.1,84.7,84.3,85.7,87.9,87.7,87.9,85.8,84.1,85.6,85.3,86.0,80.8,71.7],"precipitation_sum":[0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.024,0.000,0.000],"precipitation_probability_max":[0,1,1,0,0,1,0,0,1,2,3,4,3,3,6,7],"wind_speed_10m_max":[4.9,14.1,17.0,18.0,13.2,6.8,5.9,12.4,15.6,16.6,12.0,13.9,9.3,12.7,17.4,11.5],"wind_gusts_10m_max":[11.0,22.1,29.8,23.9,23.3,11.2,8.1,19.5,23.7,23.5,20.6,8.9,11.0,11.2,21.7,14.3]}} \ No newline at end of file diff --git a/tests/fixtures/open_meteo/reykjavik.json b/tests/fixtures/open_meteo/reykjavik.json new file mode 100644 index 0000000..07962dd --- /dev/null +++ b/tests/fixtures/open_meteo/reykjavik.json @@ -0,0 +1 @@ +{"latitude":64.139565,"longitude":-21.971603,"generationtime_ms":13.698220252990723,"utc_offset_seconds":0,"timezone":"Atlantic/Reykjavik","timezone_abbreviation":"GMT","elevation":7.0,"current_units":{"time":"iso8601","interval":"seconds","temperature_2m":"°C","relative_humidity_2m":"%","apparent_temperature":"°C","precipitation":"mm","weather_code":"wmo code","wind_speed_10m":"m/s","wind_direction_10m":"°","wind_gusts_10m":"m/s","dewpoint_2m":"°C","visibility":"m","surface_pressure":"hPa"},"current":{"time":"2026-10-02T02:15","interval":900,"temperature_2m":9.6,"relative_humidity_2m":89,"apparent_temperature":7.7,"precipitation":0.00,"weather_code":3,"wind_speed_10m":2.60,"wind_direction_10m":175,"wind_gusts_10m":5.70,"dewpoint_2m":7.9,"visibility":25840.00,"surface_pressure":988.5},"hourly_units":{"time":"iso8601","temperature_2m":"°C","weather_code":"wmo code","wind_speed_10m":"m/s","wind_direction_10m":"°","wind_gusts_10m":"m/s"},"hourly":{"time":["2026-10-02T00:00","2026-10-02T01:00","2026-10-02T02:00","2026-10-02T03:00","2026-10-02T04:00","2026-10-02T05:00","2026-10-02T06:00","2026-10-02T07:00","2026-10-02T08:00","2026-10-02T09:00","2026-10-02T10:00","2026-10-02T11:00","2026-10-02T12:00","2026-10-02T13:00","2026-10-02T14:00","2026-10-02T15:00","2026-10-02T16:00","2026-10-02T17:00","2026-10-02T18:00","2026-10-02T19:00","2026-10-02T20:00","2026-10-02T21:00","2026-10-02T22:00","2026-10-02T23:00","2026-10-03T00:00","2026-10-03T01:00","2026-10-03T02:00","2026-10-03T03:00","2026-10-03T04:00","2026-10-03T05:00","2026-10-03T06:00","2026-10-03T07:00","2026-10-03T08:00","2026-10-03T09:00","2026-10-03T10:00","2026-10-03T11:00","2026-10-03T12:00","2026-10-03T13:00","2026-10-03T14:00","2026-10-03T15:00","2026-10-03T16:00","2026-10-03T17:00","2026-10-03T18:00","2026-10-03T19:00","2026-10-03T20:00","2026-10-03T21:00","2026-10-03T22:00","2026-10-03T23:00","2026-10-04T00:00","2026-10-04T01:00","2026-10-04T02:00","2026-10-04T03:00","2026-10-04T04:00","2026-10-04T05:00","2026-10-04T06:00","2026-10-04T07:00","2026-10-04T08:00","2026-10-04T09:00","2026-10-04T10:00","2026-10-04T11:00","2026-10-04T12:00","2026-10-04T13:00","2026-10-04T14:00","2026-10-04T15:00","2026-10-04T16:00","2026-10-04T17:00","2026-10-04T18:00","2026-10-04T19:00","2026-10-04T20:00","2026-10-04T21:00","2026-10-04T22:00","2026-10-04T23:00","2026-10-05T00:00","2026-10-05T01:00","2026-10-05T02:00","2026-10-05T03:00","2026-10-05T04:00","2026-10-05T05:00","2026-10-05T06:00","2026-10-05T07:00","2026-10-05T08:00","2026-10-05T09:00","2026-10-05T10:00","2026-10-05T11:00","2026-10-05T12:00","2026-10-05T13:00","2026-10-05T14:00","2026-10-05T15:00","2026-10-05T16:00","2026-10-05T17:00","2026-10-05T18:00","2026-10-05T19:00","2026-10-05T20:00","2026-10-05T21:00","2026-10-05T22:00","2026-10-05T23:00","2026-10-06T00:00","2026-10-06T01:00","2026-10-06T02:00","2026-10-06T03:00","2026-10-06T04:00","2026-10-06T05:00","2026-10-06T06:00","2026-10-06T07:00","2026-10-06T08:00","2026-10-06T09:00","2026-10-06T10:00","2026-10-06T11:00","2026-10-06T12:00","2026-10-06T13:00","2026-10-06T14:00","2026-10-06T15:00","2026-10-06T16:00","2026-10-06T17:00","2026-10-06T18:00","2026-10-06T19:00","2026-10-06T20:00","2026-10-06T21:00","2026-10-06T22:00","2026-10-06T23:00","2026-10-07T00:00","2026-10-07T01:00","2026-10-07T02:00","2026-10-07T03:00","2026-10-07T04:00","2026-10-07T05:00","2026-10-07T06:00","2026-10-07T07:00","2026-10-07T08:00","2026-10-07T09:00","2026-10-07T10:00","2026-10-07T11:00","2026-10-07T12:00","2026-10-07T13:00","2026-10-07T14:00","2026-10-07T15:00","2026-10-07T16:00","2026-10-07T17:00","2026-10-07T18:00","2026-10-07T19:00","2026-10-07T20:00","2026-10-07T21:00","2026-10-07T22:00","2026-10-07T23:00","2026-10-08T00:00","2026-10-08T01:00","2026-10-08T02:00","2026-10-08T03:00","2026-10-08T04:00","2026-10-08T05:00","2026-10-08T06:00","2026-10-08T07:00","2026-10-08T08:00","2026-10-08T09:00","2026-10-08T10:00","2026-10-08T11:00","2026-10-08T12:00","2026-10-08T13:00","2026-10-08T14:00","2026-10-08T15:00","2026-10-08T16:00","2026-10-08T17:00","2026-10-08T18:00","2026-10-08T19:00","2026-10-08T20:00","2026-10-08T21:00","2026-10-08T22:00","2026-10-08T23:00","2026-10-09T00:00","2026-10-09T01:00","2026-10-09T02:00","2026-10-09T03:00","2026-10-09T04:00","2026-10-09T05:00","2026-10-09T06:00","2026-10-09T07:00","2026-10-09T08:00","2026-10-09T09:00","2026-10-09T10:00","2026-10-09T11:00","2026-10-09T12:00","2026-10-09T13:00","2026-10-09T14:00","2026-10-09T15:00","2026-10-09T16:00","2026-10-09T17:00","2026-10-09T18:00","2026-10-09T19:00","2026-10-09T20:00","2026-10-09T21:00","2026-10-09T22:00","2026-10-09T23:00","2026-10-10T00:00","2026-10-10T01:00","2026-10-10T02:00","2026-10-10T03:00","2026-10-10T04:00","2026-10-10T05:00","2026-10-10T06:00","2026-10-10T07:00","2026-10-10T08:00","2026-10-10T09:00","2026-10-10T10:00","2026-10-10T11:00","2026-10-10T12:00","2026-10-10T13:00","2026-10-10T14:00","2026-10-10T15:00","2026-10-10T16:00","2026-10-10T17:00","2026-10-10T18:00","2026-10-10T19:00","2026-10-10T20:00","2026-10-10T21:00","2026-10-10T22:00","2026-10-10T23:00","2026-10-11T00:00","2026-10-11T01:00","2026-10-11T02:00","2026-10-11T03:00","2026-10-11T04:00","2026-10-11T05:00","2026-10-11T06:00","2026-10-11T07:00","2026-10-11T08:00","2026-10-11T09:00","2026-10-11T10:00","2026-10-11T11:00","2026-10-11T12:00","2026-10-11T13:00","2026-10-11T14:00","2026-10-11T15:00","2026-10-11T16:00","2026-10-11T17:00","2026-10-11T18:00","2026-10-11T19:00","2026-10-11T20:00","2026-10-11T21:00","2026-10-11T22:00","2026-10-11T23:00","2026-10-12T00:00","2026-10-12T01:00","2026-10-12T02:00","2026-10-12T03:00","2026-10-12T04:00","2026-10-12T05:00","2026-10-12T06:00","2026-10-12T07:00","2026-10-12T08:00","2026-10-12T09:00","2026-10-12T10:00","2026-10-12T11:00","2026-10-12T12:00","2026-10-12T13:00","2026-10-12T14:00","2026-10-12T15:00","2026-10-12T16:00","2026-10-12T17:00","2026-10-12T18:00","2026-10-12T19:00","2026-10-12T20:00","2026-10-12T21:00","2026-10-12T22:00","2026-10-12T23:00","2026-10-13T00:00","2026-10-13T01:00","2026-10-13T02:00","2026-10-13T03:00","2026-10-13T04:00","2026-10-13T05:00","2026-10-13T06:00","2026-10-13T07:00","2026-10-13T08:00","2026-10-13T09:00","2026-10-13T10:00","2026-10-13T11:00","2026-10-13T12:00","2026-10-13T13:00","2026-10-13T14:00","2026-10-13T15:00","2026-10-13T16:00","2026-10-13T17:00","2026-10-13T18:00","2026-10-13T19:00","2026-10-13T20:00","2026-10-13T21:00","2026-10-13T22:00","2026-10-13T23:00","2026-10-14T00:00","2026-10-14T01:00","2026-10-14T02:00","2026-10-14T03:00","2026-10-14T04:00","2026-10-14T05:00","2026-10-14T06:00","2026-10-14T07:00","2026-10-14T08:00","2026-10-14T09:00","2026-10-14T10:00","2026-10-14T11:00","2026-10-14T12:00","2026-10-14T13:00","2026-10-14T14:00","2026-10-14T15:00","2026-10-14T16:00","2026-10-14T17:00","2026-10-14T18:00","2026-10-14T19:00","2026-10-14T20:00","2026-10-14T21:00","2026-10-14T22:00","2026-10-14T23:00","2026-10-15T00:00","2026-10-15T01:00","2026-10-15T02:00","2026-10-15T03:00","2026-10-15T04:00","2026-10-15T05:00","2026-10-15T06:00","2026-10-15T07:00","2026-10-15T08:00","2026-10-15T09:00","2026-10-15T10:00","2026-10-15T11:00","2026-10-15T12:00","2026-10-15T13:00","2026-10-15T14:00","2026-10-15T15:00","2026-10-15T16:00","2026-10-15T17:00","2026-10-15T18:00","2026-10-15T19:00","2026-10-15T20:00","2026-10-15T21:00","2026-10-15T22:00","2026-10-15T23:00","2026-10-16T00:00","2026-10-16T01:00","2026-10-16T02:00","2026-10-16T03:00","2026-10-16T04:00","2026-10-16T05:00","2026-10-16T06:00","2026-10-16T07:00","2026-10-16T08:00","2026-10-16T09:00","2026-10-16T10:00","2026-10-16T11:00","2026-10-16T12:00","2026-10-16T13:00","2026-10-16T14:00","2026-10-16T15:00","2026-10-16T16:00","2026-10-16T17:00","2026-10-16T18:00","2026-10-16T19:00","2026-10-16T20:00","2026-10-16T21:00","2026-10-16T22:00","2026-10-16T23:00","2026-10-17T00:00","2026-10-17T01:00","2026-10-17T02:00","2026-10-17T03:00","2026-10-17T04:00","2026-10-17T05:00","2026-10-17T06:00","2026-10-17T07:00","2026-10-17T08:00","2026-10-17T09:00","2026-10-17T10:00","2026-10-17T11:00","2026-10-17T12:00","2026-10-17T13:00","2026-10-17T14:00","2026-10-17T15:00","2026-10-17T16:00","2026-10-17T17:00","2026-10-17T18:00","2026-10-17T19:00","2026-10-17T20:00","2026-10-17T21:00","2026-10-17T22:00","2026-10-17T23:00"],"temperature_2m":[9.9,9.7,9.6,9.5,9.2,9.1,8.8,8.6,8.5,9.0,9.2,9.3,9.7,10.0,9.9,9.6,8.1,8.3,8.6,8.5,8.4,8.4,8.3,8.0,8.1,8.2,8.3,8.4,8.4,8.2,7.6,8.1,8.1,9.2,9.9,9.1,9.7,10.4,10.4,10.4,10.3,10.3,9.8,9.8,9.7,9.4,9.1,9.1,9.2,9.3,9.4,9.8,9.8,9.7,9.1,8.6,8.1,7.7,7.8,7.9,7.9,8.0,7.9,7.9,8.2,8.2,7.9,7.3,6.8,6.3,6.1,6.0,6.0,5.8,5.7,5.4,5.0,4.9,5.0,5.1,5.1,5.1,5.4,5.7,6.0,6.2,6.4,6.5,6.4,6.1,5.7,4.9,4.0,3.0,2.1,1.2,0.4,-0.6,-1.4,-1.8,-1.2,-0.2,0.9,1.8,2.7,3.6,4.7,5.9,6.8,7.5,8.0,8.1,7.8,7.2,6.6,5.9,5.1,4.6,4.5,4.7,4.6,4.1,3.3,2.8,2.7,2.8,3.0,3.0,3.1,3.5,4.4,5.5,6.4,7.0,7.3,7.3,6.8,6.1,5.6,6.4,6.0,5.6,5.1,4.8,4.6,4.5,4.6,4.7,4.9,5.1,5.3,5.4,5.6,5.7,5.9,6.0,6.1,6.2,6.2,6.3,6.3,6.3,6.4,6.5,6.6,6.8,6.9,7.0,7.0,7.0,6.8,6.6,6.5,6.4,6.4,6.6,7.0,7.4,7.8,8.2,8.5,8.6,8.8,8.8,8.8,8.8,8.7,8.5,8.1,7.8,7.4,7.0,6.6,6.2,5.7,5.2,4.7,4.4,4.4,4.6,5.1,5.8,6.5,7.1,7.5,7.7,7.7,7.7,7.6,7.5,7.3,7.0,6.6,6.1,5.6,5.2,5.0,4.9,5.0,5.1,5.3,5.5,5.6,5.7,5.8,5.9,6.1,6.2,6.3,6.4,6.6,6.8,6.9,7.0,7.0,7.0,6.8,6.6,6.4,6.2,6.0,5.9,5.7,5.6,5.5,5.5,5.6,5.9,6.3,6.8,7.3,7.7,8.0,8.0,7.8,7.5,7.2,7.0,7.0,7.2,7.6,8.1,8.6,9.0,9.3,9.3,9.2,9.0,8.8,8.6,8.5,8.5,8.5,8.5,8.5,8.5,8.5,8.5,8.5,8.5,8.5,8.5,8.4,8.3,8.1,7.9,7.7,7.5,7.4,7.3,7.4,7.5,7.5,7.6,7.6,7.6,7.6,7.5,7.5,7.4,7.4,7.4,7.4,7.4,7.4,7.4,7.3,7.1,7.0,6.8,6.6,6.3,6.1,5.9,5.6,5.3,5.0,4.8,4.7,4.7,4.9,5.2,5.4,5.6,5.7,5.7,5.6,5.4,5.3,5.0,4.8,4.6,4.2,3.8,3.5,3.2,3.1,3.1,3.1,3.3,3.5,3.7,3.9,4.1,4.3,4.5,4.7,4.9,6.1,7.3,8.4,9.6,9.8,10.0,10.0,9.7,9.2,8.7,8.3,7.9,7.5,7.3,7.2,7.0,6.5,5.9,5.4,5.4,5.5,5.8,6.1,6.4,6.8,7.4,8.0,8.2,7.8,7.1,6.6,null,null,null,null,null],"weather_code":[1,51,51,3,3,51,53,3,2,3,3,3,3,2,3,3,53,51,3,3,3,3,51,3,3,3,3,3,51,3,51,3,51,51,3,53,53,55,61,61,55,53,53,3,3,53,3,3,3,3,3,3,3,3,3,3,3,51,51,51,51,51,51,3,3,3,3,3,3,51,51,51,51,51,51,51,51,51,51,51,51,3,3,3,3,3,2,1,1,1,1,1,0,0,0,1,2,2,2,2,2,3,3,3,3,3,2,2,2,2,2,2,51,51,51,53,53,53,51,51,51,51,51,51,51,51,51,2,2,1,1,0,0,0,1,1,1,0,0,3,3,3,3,3,3,3,3,3,3,3,3,51,51,51,51,51,51,61,61,61,61,61,61,53,53,53,53,53,53,51,51,51,51,51,51,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,53,53,53,53,53,53,80,80,80,80,80,80,53,53,53,53,53,53,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,80,80,80,80,80,80,80,80,80,80,80,80,3,3,3,3,3,3,53,53,53,53,53,53,55,55,55,55,55,55,55,55,55,55,55,55,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,1,1,2,2,3,3,51,51,51,51,51,51,53,53,53,53,53,53,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,53,53,53,53,53,53,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,1,2,2,null,null,null,null,null],"wind_speed_10m":[2.80,3.70,2.70,2.50,2.70,3.40,5.40,6.30,5.70,6.70,7.40,7.50,7.30,7.40,7.10,6.40,4.50,3.80,4.10,3.50,3.80,3.80,2.90,2.70,3.10,3.20,2.70,3.90,3.80,3.90,4.00,5.80,6.60,4.40,5.30,5.00,6.40,6.10,7.10,6.70,6.50,6.30,5.80,3.50,2.70,2.20,2.00,2.90,2.90,2.40,3.80,3.80,5.10,8.00,7.78,8.35,8.75,8.85,8.02,6.77,5.81,4.32,3.42,2.93,2.33,1.16,1.61,1.57,2.53,1.52,1.76,1.32,1.81,2.08,2.11,2.50,3.54,3.47,3.66,3.91,3.93,3.41,2.83,2.80,2.23,2.30,2.53,2.66,2.66,2.59,2.36,1.88,1.38,1.17,0.83,0.45,0.46,0.85,1.28,1.76,2.24,2.69,3.14,3.45,3.73,3.89,3.94,3.91,3.91,3.97,4.21,4.45,4.55,4.56,4.50,4.27,4.07,3.94,3.76,3.59,3.60,4.12,4.85,5.08,4.43,3.27,2.35,1.91,1.75,1.50,1.26,1.27,1.49,1.75,2.05,2.07,1.52,0.63,0.11,0.80,0.97,1.47,2.10,2.74,3.34,3.87,4.43,4.99,5.56,6.03,6.49,6.85,7.09,7.34,7.60,7.92,8.34,9.01,9.91,10.87,11.77,12.42,12.67,12.45,11.84,11.03,10.07,9.13,8.36,7.76,7.23,6.74,6.25,5.74,5.11,4.25,3.21,2.10,1.15,0.67,0.76,0.80,0.87,1.32,1.96,2.57,2.91,2.96,2.80,2.60,2.30,2.05,1.96,2.01,2.21,2.51,2.87,3.18,3.36,3.40,3.47,3.64,3.90,4.17,4.32,4.17,3.74,3.21,2.75,2.45,2.47,2.75,3.29,3.93,4.58,5.19,5.63,5.91,6.09,6.24,6.38,6.55,6.71,6.84,7.02,7.10,7.18,7.16,7.12,6.95,6.64,6.33,5.99,5.73,5.55,5.48,5.55,5.66,5.78,5.90,6.03,6.06,6.09,6.09,6.22,6.46,6.98,7.81,8.92,10.20,11.52,12.67,13.58,14.35,15.08,15.75,16.13,16.13,15.64,14.36,12.40,10.08,7.77,5.87,4.77,4.43,4.65,5.16,5.88,6.59,7.07,7.41,7.76,8.14,8.47,8.68,8.76,8.66,8.42,8.05,7.66,7.25,6.93,6.72,6.67,6.67,6.62,6.32,5.67,4.31,2.36,0.60,2.44,4.38,5.77,6.45,6.68,6.63,6.37,6.10,5.92,5.79,5.53,5.28,5.04,4.91,4.90,5.16,5.61,6.19,6.64,6.95,6.85,6.32,5.48,4.58,3.80,3.35,3.21,3.18,3.25,3.36,3.47,3.58,3.65,3.67,3.76,4.01,4.43,4.87,5.31,5.58,5.72,5.81,5.85,5.92,6.06,6.19,6.32,6.38,6.44,6.55,6.66,6.83,7.03,7.25,7.47,7.80,8.01,7.88,7.63,8.13,9.77,11.94,12.91,11.86,10.68,10.84,11.20,11.53,11.84,12.21,12.43,12.56,12.47,12.30,12.24,12.55,12.96,12.96,12.37,11.34,10.50,10.02,9.77,9.40,8.92,8.32,8.02,null,null,null,null,null],"wind_direction_10m":[160,165,183,149,127,150,184,184,178,186,183,179,174,172,178,180,219,194,214,197,193,202,189,161,160,155,137,142,138,153,123,135,130,131,141,118,120,152,157,159,151,190,211,192,187,168,204,214,200,202,227,257,275,271,269,274,277,285,289,288,298,300,297,307,335,353,30,37,38,44,35,29,24,24,22,360,352,353,346,339,348,355,347,341,340,336,333,332,332,335,339,349,13,40,57,84,131,135,129,125,119,114,112,114,116,118,117,117,118,126,136,142,141,137,132,125,116,110,109,111,114,114,115,115,115,115,114,110,103,94,72,42,20,2,347,340,337,331,207,176,145,125,115,111,109,110,110,111,112,113,114,114,115,115,116,116,117,117,118,119,119,119,119,119,119,119,118,118,117,116,113,111,108,105,102,99,95,89,72,27,352,360,31,61,75,82,85,86,87,88,89,91,96,104,115,125,131,134,132,126,115,103,91,84,80,80,82,86,93,102,108,109,107,105,104,103,104,107,111,115,120,123,125,126,126,125,125,124,125,126,127,129,131,133,134,134,133,132,130,129,127,125,122,120,117,115,115,115,117,119,120,121,122,122,122,121,121,121,121,122,124,127,131,136,142,143,141,137,132,128,125,122,118,115,111,108,105,103,100,96,93,89,85,79,72,65,59,53,49,44,36,318,244,238,236,236,237,238,239,239,240,239,237,235,233,232,231,232,233,236,237,237,236,233,227,216,201,182,165,150,136,123,113,102,92,79,65,50,37,27,20,15,9,4,359,355,352,350,349,348,348,348,347,347,347,346,347,347,310,268,217,166,169,175,182,194,214,228,229,225,221,220,219,220,222,224,227,229,232,234,236,237,239,243,247,249,247,241,237,null,null,null,null,null],"wind_gusts_10m":[7.00,6.00,6.10,4.30,4.10,5.60,8.90,10.40,10.30,11.20,12.40,12.70,12.70,12.60,12.70,12.10,10.70,7.20,6.60,7.30,6.00,6.10,6.80,4.70,4.90,5.30,6.00,6.40,6.40,6.60,8.40,9.80,11.40,10.90,8.90,9.00,10.60,10.50,12.20,11.80,11.50,12.00,14.70,9.30,5.70,4.40,3.30,4.70,4.70,4.60,6.50,6.10,8.10,12.80,14.28,14.50,15.98,16.50,15.90,14.70,12.60,11.60,8.90,7.00,6.10,5.10,3.30,2.90,4.70,4.60,3.10,3.10,3.10,3.70,4.00,4.50,6.50,6.70,6.50,7.10,7.40,7.20,6.30,6.10,6.10,6.10,6.20,6.30,6.30,6.40,6.20,5.80,5.30,4.60,3.60,2.40,1.80,2.10,3.00,3.80,4.40,4.90,5.40,5.90,6.30,6.70,7.10,7.50,7.90,8.20,8.40,8.70,9.20,9.70,9.90,9.50,8.80,8.20,7.90,7.80,7.80,8.10,8.60,8.90,9.10,9.20,8.70,7.30,5.30,3.90,3.60,3.80,4.10,4.40,4.90,5.20,5.30,5.30,5.30,4.30,4.30,4.40,4.50,4.80,5.30,6.10,7.30,8.60,9.90,11.20,12.20,12.90,13.50,13.90,14.40,14.90,15.70,16.80,18.10,19.50,20.90,22.10,22.90,23.40,23.80,23.90,23.90,23.60,23.00,22.00,20.60,19.00,17.30,15.70,14.30,13.20,12.20,11.20,10.40,9.60,8.80,8.00,7.20,6.50,5.80,5.40,5.10,5.20,5.50,6.00,6.60,7.00,7.20,7.10,6.70,6.30,5.90,5.60,5.50,5.80,6.20,6.90,7.50,8.10,8.50,8.70,8.80,8.90,8.90,8.90,9.00,9.10,9.20,9.40,9.50,9.70,9.90,10.20,10.50,10.80,11.10,11.50,11.80,12.10,12.50,12.90,13.20,13.60,13.90,14.30,14.70,15.10,15.40,15.50,15.40,14.90,14.10,13.20,12.20,11.40,10.90,10.70,10.60,10.60,10.90,11.50,12.40,13.90,16.00,18.30,20.70,22.90,24.70,26.10,27.30,28.30,29.10,29.70,30.10,30.40,30.70,30.80,30.60,30.00,28.80,26.80,23.80,20.50,17.20,14.40,12.70,12.10,12.40,13.30,14.30,15.30,15.80,16.00,16.00,16.00,15.80,15.60,15.40,15.10,14.70,14.30,13.80,13.40,12.90,12.40,11.80,11.30,10.70,10.30,10.00,9.90,10.00,10.20,10.40,10.60,10.70,10.80,10.80,10.80,10.80,10.80,10.90,11.00,11.10,11.30,11.40,11.60,11.70,11.90,12.20,12.50,12.80,12.80,12.60,12.00,10.90,9.70,8.50,7.60,7.10,7.10,7.50,8.20,8.90,9.60,10.20,10.70,11.10,11.60,12.00,12.30,12.50,12.60,12.40,12.30,12.10,12.00,12.10,12.40,12.90,13.50,13.80,14.00,14.44,14.85,15.53,16.90,19.00,21.80,23.30,22.50,20.50,19.00,18.70,18.80,19.10,19.50,20.10,20.30,19.90,19.30,18.80,18.90,19.20,19.10,18.20,17.00,16.00,15.70,15.60,15.30,14.50,13.60,12.90,null,null,null,null,null]},"daily_units":{"time":"iso8601","weather_code":"wmo code","temperature_2m_max":"°C","temperature_2m_min":"°C","precipitation_sum":"mm","precipitation_probability_max":"%","wind_speed_10m_max":"m/s","wind_gusts_10m_max":"m/s"},"daily":{"time":["2026-10-02","2026-10-03","2026-10-04","2026-10-05","2026-10-06","2026-10-07","2026-10-08","2026-10-09","2026-10-10","2026-10-11","2026-10-12","2026-10-13","2026-10-14","2026-10-15","2026-10-16","2026-10-17"],"weather_code":[53,61,51,51,53,51,61,53,53,80,80,80,55,53,53,null],"temperature_2m_max":[10.0,10.4,9.8,6.5,8.1,7.3,7.0,8.8,7.7,7.0,9.0,9.3,7.6,6.1,10.0,null],"temperature_2m_min":[8.0,7.6,6.0,1.2,-1.8,2.7,4.5,6.4,4.4,4.9,5.5,7.5,6.3,3.2,3.1,null],"precipitation_sum":[2.10,9.70,1.83,2.20,2.40,1.20,14.70,1.50,4.50,16.40,19.00,17.10,6.80,4.70,8.35,null],"precipitation_probability_max":[98,100,84,78,29,46,80,67,41,44,58,59,53,45,48,45],"wind_speed_10m_max":[7.50,7.10,8.85,3.93,4.56,5.08,12.67,8.36,5.19,7.18,16.13,8.76,6.95,6.85,12.91,null],"wind_gusts_10m_max":[12.70,14.70,16.50,7.40,9.90,9.20,23.90,23.00,9.70,15.50,30.80,28.80,12.90,12.80,23.30,null]}} \ No newline at end of file diff --git a/tests/fixtures/open_meteo/seattle.json b/tests/fixtures/open_meteo/seattle.json new file mode 100644 index 0000000..e0df723 --- /dev/null +++ b/tests/fixtures/open_meteo/seattle.json @@ -0,0 +1 @@ +{"latitude":47.595562,"longitude":-122.32443,"generationtime_ms":1.0714530944824219,"utc_offset_seconds":-25200,"timezone":"America/Los_Angeles","timezone_abbreviation":"GMT-7","elevation":59.0,"current_units":{"time":"iso8601","interval":"seconds","temperature_2m":"°F","relative_humidity_2m":"%","apparent_temperature":"°F","precipitation":"inch","weather_code":"wmo code","wind_speed_10m":"mp/h","wind_direction_10m":"°","wind_gusts_10m":"mp/h","dewpoint_2m":"°F","visibility":"ft","surface_pressure":"hPa"},"current":{"time":"2026-10-01T19:15","interval":900,"temperature_2m":60.2,"relative_humidity_2m":70,"apparent_temperature":59.3,"precipitation":0.000,"weather_code":3,"wind_speed_10m":2.4,"wind_direction_10m":326,"wind_gusts_10m":2.7,"dewpoint_2m":50.3,"visibility":81364.832,"surface_pressure":1008.6},"hourly_units":{"time":"iso8601","temperature_2m":"°F","weather_code":"wmo code","wind_speed_10m":"mp/h","wind_direction_10m":"°","wind_gusts_10m":"mp/h"},"hourly":{"time":["2026-10-01T00:00","2026-10-01T01:00","2026-10-01T02:00","2026-10-01T03:00","2026-10-01T04:00","2026-10-01T05:00","2026-10-01T06:00","2026-10-01T07:00","2026-10-01T08:00","2026-10-01T09:00","2026-10-01T10:00","2026-10-01T11:00","2026-10-01T12:00","2026-10-01T13:00","2026-10-01T14:00","2026-10-01T15:00","2026-10-01T16:00","2026-10-01T17:00","2026-10-01T18:00","2026-10-01T19:00","2026-10-01T20:00","2026-10-01T21:00","2026-10-01T22:00","2026-10-01T23:00","2026-10-02T00:00","2026-10-02T01:00","2026-10-02T02:00","2026-10-02T03:00","2026-10-02T04:00","2026-10-02T05:00","2026-10-02T06:00","2026-10-02T07:00","2026-10-02T08:00","2026-10-02T09:00","2026-10-02T10:00","2026-10-02T11:00","2026-10-02T12:00","2026-10-02T13:00","2026-10-02T14:00","2026-10-02T15:00","2026-10-02T16:00","2026-10-02T17:00","2026-10-02T18:00","2026-10-02T19:00","2026-10-02T20:00","2026-10-02T21:00","2026-10-02T22:00","2026-10-02T23:00","2026-10-03T00:00","2026-10-03T01:00","2026-10-03T02:00","2026-10-03T03:00","2026-10-03T04:00","2026-10-03T05:00","2026-10-03T06:00","2026-10-03T07:00","2026-10-03T08:00","2026-10-03T09:00","2026-10-03T10:00","2026-10-03T11:00","2026-10-03T12:00","2026-10-03T13:00","2026-10-03T14:00","2026-10-03T15:00","2026-10-03T16:00","2026-10-03T17:00","2026-10-03T18:00","2026-10-03T19:00","2026-10-03T20:00","2026-10-03T21:00","2026-10-03T22:00","2026-10-03T23:00","2026-10-04T00:00","2026-10-04T01:00","2026-10-04T02:00","2026-10-04T03:00","2026-10-04T04:00","2026-10-04T05:00","2026-10-04T06:00","2026-10-04T07:00","2026-10-04T08:00","2026-10-04T09:00","2026-10-04T10:00","2026-10-04T11:00","2026-10-04T12:00","2026-10-04T13:00","2026-10-04T14:00","2026-10-04T15:00","2026-10-04T16:00","2026-10-04T17:00","2026-10-04T18:00","2026-10-04T19:00","2026-10-04T20:00","2026-10-04T21:00","2026-10-04T22:00","2026-10-04T23:00","2026-10-05T00:00","2026-10-05T01:00","2026-10-05T02:00","2026-10-05T03:00","2026-10-05T04:00","2026-10-05T05:00","2026-10-05T06:00","2026-10-05T07:00","2026-10-05T08:00","2026-10-05T09:00","2026-10-05T10:00","2026-10-05T11:00","2026-10-05T12:00","2026-10-05T13:00","2026-10-05T14:00","2026-10-05T15:00","2026-10-05T16:00","2026-10-05T17:00","2026-10-05T18:00","2026-10-05T19:00","2026-10-05T20:00","2026-10-05T21:00","2026-10-05T22:00","2026-10-05T23:00","2026-10-06T00:00","2026-10-06T01:00","2026-10-06T02:00","2026-10-06T03:00","2026-10-06T04:00","2026-10-06T05:00","2026-10-06T06:00","2026-10-06T07:00","2026-10-06T08:00","2026-10-06T09:00","2026-10-06T10:00","2026-10-06T11:00","2026-10-06T12:00","2026-10-06T13:00","2026-10-06T14:00","2026-10-06T15:00","2026-10-06T16:00","2026-10-06T17:00","2026-10-06T18:00","2026-10-06T19:00","2026-10-06T20:00","2026-10-06T21:00","2026-10-06T22:00","2026-10-06T23:00","2026-10-07T00:00","2026-10-07T01:00","2026-10-07T02:00","2026-10-07T03:00","2026-10-07T04:00","2026-10-07T05:00","2026-10-07T06:00","2026-10-07T07:00","2026-10-07T08:00","2026-10-07T09:00","2026-10-07T10:00","2026-10-07T11:00","2026-10-07T12:00","2026-10-07T13:00","2026-10-07T14:00","2026-10-07T15:00","2026-10-07T16:00","2026-10-07T17:00","2026-10-07T18:00","2026-10-07T19:00","2026-10-07T20:00","2026-10-07T21:00","2026-10-07T22:00","2026-10-07T23:00","2026-10-08T00:00","2026-10-08T01:00","2026-10-08T02:00","2026-10-08T03:00","2026-10-08T04:00","2026-10-08T05:00","2026-10-08T06:00","2026-10-08T07:00","2026-10-08T08:00","2026-10-08T09:00","2026-10-08T10:00","2026-10-08T11:00","2026-10-08T12:00","2026-10-08T13:00","2026-10-08T14:00","2026-10-08T15:00","2026-10-08T16:00","2026-10-08T17:00","2026-10-08T18:00","2026-10-08T19:00","2026-10-08T20:00","2026-10-08T21:00","2026-10-08T22:00","2026-10-08T23:00","2026-10-09T00:00","2026-10-09T01:00","2026-10-09T02:00","2026-10-09T03:00","2026-10-09T04:00","2026-10-09T05:00","2026-10-09T06:00","2026-10-09T07:00","2026-10-09T08:00","2026-10-09T09:00","2026-10-09T10:00","2026-10-09T11:00","2026-10-09T12:00","2026-10-09T13:00","2026-10-09T14:00","2026-10-09T15:00","2026-10-09T16:00","2026-10-09T17:00","2026-10-09T18:00","2026-10-09T19:00","2026-10-09T20:00","2026-10-09T21:00","2026-10-09T22:00","2026-10-09T23:00","2026-10-10T00:00","2026-10-10T01:00","2026-10-10T02:00","2026-10-10T03:00","2026-10-10T04:00","2026-10-10T05:00","2026-10-10T06:00","2026-10-10T07:00","2026-10-10T08:00","2026-10-10T09:00","2026-10-10T10:00","2026-10-10T11:00","2026-10-10T12:00","2026-10-10T13:00","2026-10-10T14:00","2026-10-10T15:00","2026-10-10T16:00","2026-10-10T17:00","2026-10-10T18:00","2026-10-10T19:00","2026-10-10T20:00","2026-10-10T21:00","2026-10-10T22:00","2026-10-10T23:00","2026-10-11T00:00","2026-10-11T01:00","2026-10-11T02:00","2026-10-11T03:00","2026-10-11T04:00","2026-10-11T05:00","2026-10-11T06:00","2026-10-11T07:00","2026-10-11T08:00","2026-10-11T09:00","2026-10-11T10:00","2026-10-11T11:00","2026-10-11T12:00","2026-10-11T13:00","2026-10-11T14:00","2026-10-11T15:00","2026-10-11T16:00","2026-10-11T17:00","2026-10-11T18:00","2026-10-11T19:00","2026-10-11T20:00","2026-10-11T21:00","2026-10-11T22:00","2026-10-11T23:00","2026-10-12T00:00","2026-10-12T01:00","2026-10-12T02:00","2026-10-12T03:00","2026-10-12T04:00","2026-10-12T05:00","2026-10-12T06:00","2026-10-12T07:00","2026-10-12T08:00","2026-10-12T09:00","2026-10-12T10:00","2026-10-12T11:00","2026-10-12T12:00","2026-10-12T13:00","2026-10-12T14:00","2026-10-12T15:00","2026-10-12T16:00","2026-10-12T17:00","2026-10-12T18:00","2026-10-12T19:00","2026-10-12T20:00","2026-10-12T21:00","2026-10-12T22:00","2026-10-12T23:00","2026-10-13T00:00","2026-10-13T01:00","2026-10-13T02:00","2026-10-13T03:00","2026-10-13T04:00","2026-10-13T05:00","2026-10-13T06:00","2026-10-13T07:00","2026-10-13T08:00","2026-10-13T09:00","2026-10-13T10:00","2026-10-13T11:00","2026-10-13T12:00","2026-10-13T13:00","2026-10-13T14:00","2026-10-13T15:00","2026-10-13T16:00","2026-10-13T17:00","2026-10-13T18:00","2026-10-13T19:00","2026-10-13T20:00","2026-10-13T21:00","2026-10-13T22:00","2026-10-13T23:00","2026-10-14T00:00","2026-10-14T01:00","2026-10-14T02:00","2026-10-14T03:00","2026-10-14T04:00","2026-10-14T05:00","2026-10-14T06:00","2026-10-14T07:00","2026-10-14T08:00","2026-10-14T09:00","2026-10-14T10:00","2026-10-14T11:00","2026-10-14T12:00","2026-10-14T13:00","2026-10-14T14:00","2026-10-14T15:00","2026-10-14T16:00","2026-10-14T17:00","2026-10-14T18:00","2026-10-14T19:00","2026-10-14T20:00","2026-10-14T21:00","2026-10-14T22:00","2026-10-14T23:00","2026-10-15T00:00","2026-10-15T01:00","2026-10-15T02:00","2026-10-15T03:00","2026-10-15T04:00","2026-10-15T05:00","2026-10-15T06:00","2026-10-15T07:00","2026-10-15T08:00","2026-10-15T09:00","2026-10-15T10:00","2026-10-15T11:00","2026-10-15T12:00","2026-10-15T13:00","2026-10-15T14:00","2026-10-15T15:00","2026-10-15T16:00","2026-10-15T17:00","2026-10-15T18:00","2026-10-15T19:00","2026-10-15T20:00","2026-10-15T21:00","2026-10-15T22:00","2026-10-15T23:00","2026-10-16T00:00","2026-10-16T01:00","2026-10-16T02:00","2026-10-16T03:00","2026-10-16T04:00","2026-10-16T05:00","2026-10-16T06:00","2026-10-16T07:00","2026-10-16T08:00","2026-10-16T09:00","2026-10-16T10:00","2026-10-16T11:00","2026-10-16T12:00","2026-10-16T13:00","2026-10-16T14:00","2026-10-16T15:00","2026-10-16T16:00","2026-10-16T17:00","2026-10-16T18:00","2026-10-16T19:00","2026-10-16T20:00","2026-10-16T21:00","2026-10-16T22:00","2026-10-16T23:00"],"temperature_2m":[50.6,50.5,50.0,49.8,48.9,49.3,48.5,48.2,48.8,53.1,56.3,58.9,60.3,61.8,63.5,64.0,64.0,63.8,62.2,60.5,59.2,58.3,56.7,55.5,54.5,53.4,52.2,51.8,51.7,51.8,51.3,51.3,53.0,57.4,60.3,62.7,64.3,65.7,66.4,67.0,66.6,65.7,63.9,60.9,58.6,57.7,56.7,55.8,55.2,54.3,53.7,53.1,52.6,52.1,51.6,50.5,51.3,54.2,57.2,60.7,63.4,65.0,66.5,67.3,67.3,66.0,63.1,58.7,57.5,56.6,55.7,55.1,54.6,54.2,53.9,53.5,53.0,52.6,52.4,52.1,53.3,57.8,62.2,65.8,68.8,70.8,71.2,71.0,70.3,68.8,65.2,60.4,58.9,58.0,57.3,56.4,55.5,54.8,54.6,54.2,54.6,54.2,53.3,53.0,54.1,58.2,62.2,65.8,68.8,70.3,71.3,72.1,71.2,70.1,66.1,60.5,58.9,58.2,58.4,58.7,58.2,57.5,57.1,56.8,56.8,56.4,56.4,56.6,56.6,57.8,58.7,60.5,62.8,65.3,66.8,66.7,65.5,64.0,62.0,59.5,57.5,56.1,55.2,54.4,53.7,53.0,52.4,51.9,51.4,51.1,50.4,49.7,50.3,52.8,56.5,59.6,61.7,63.2,64.0,63.8,62.9,61.4,59.2,56.4,54.2,53.2,52.6,52.2,51.5,51.0,50.5,50.3,50.0,49.9,49.5,49.1,50.1,53.5,58.3,62.3,65.0,66.9,67.9,67.6,66.5,64.7,62.0,58.7,56.2,55.0,54.4,54.0,53.4,52.9,52.4,52.0,51.5,51.4,51.1,50.9,52.1,55.3,59.8,64.0,67.5,70.5,72.2,71.9,70.3,68.1,65.5,62.5,60.2,59.2,58.7,58.2,57.0,55.7,54.3,53.1,51.8,50.8,49.8,49.0,49.4,51.8,55.3,58.6,61.2,63.5,64.7,64.4,63.1,61.1,58.0,54.3,51.5,50.6,50.6,50.5,49.2,47.8,47.0,47.8,49.3,50.5,50.9,51.2,51.4,51.3,51.3,52.3,55.4,59.6,62.7,64.0,64.0,62.9,59.8,55.7,52.3,50.6,49.9,49.2,48.4,47.6,46.9,46.4,46.0,45.6,45.0,44.4,45.2,48.3,52.6,56.4,59.0,60.9,62.2,62.6,62.2,61.3,59.2,56.5,54.1,52.4,51.1,50.1,49.4,49.0,48.7,48.2,47.8,47.8,48.4,49.3,49.7,49.2,48.1,47.4,47.3,47.6,47.9,48.3,48.7,48.9,48.7,48.4,48.1,48.2,48.4,48.2,47.3,46.0,45.0,44.2,43.8,43.4,43.0,42.7,43.3,45.1,47.9,50.6,53.4,56.2,58.0,58.1,57.2,55.9,54.4,52.6,50.9,49.6,48.3,47.2,46.4,45.8,45.2,44.7,44.3,44.0,43.4,43.0,43.4,45.4,48.4,51.4,54.2,57.1,59.0,59.6,59.4,58.2,55.7,52.3,49.5,48.1,47.4,46.8,46.0,45.4,44.9,44.6,44.4,44.3,43.8,43.2,43.8,46.5,50.4,53.9,56.8,59.3,60.5,59.9,58.0,55.9,53.5,50.9,48.9,48.1,48.0,47.9],"weather_code":[1,3,3,2,2,2,1,1,3,1,3,3,3,0,2,2,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,3,1,1,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,1,0,3,3,0,0,0,0,1,1,2,0,0,2,3,3,3,3,3,2,1,0,0,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,51,51,51,51,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,1,2,3,3,3,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,1,1,1,2,2,2,2,2,3,3,3,3,3,2,1,1,0,0,1,1,1,1,2,2,3,3,51,51,51,3,2,1,1,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,2,1,0,0,0,0,0,1,2,3,3,3,55,55,55,63,63,63,51,51,51,55,55,55,3,3,3,3,3,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,0,0,0,0,0,1,1,2,3,3,3,3,3,2,1,0,0,0,0,1,2,3,3,3,3,3,3,3,2,2,2,3,3,3,2,1,1,0,0,1,1,2,3,3,3,3],"wind_speed_10m":[1.2,2.7,2.1,2.0,0.2,0.8,1.2,1.8,2.6,0.5,0.9,1.1,2.7,2.7,2.6,2.5,2.5,4.3,1.6,2.6,3.3,3.2,4.1,2.8,0.8,2.2,3.7,2.7,1.2,1.6,0.3,6.0,4.9,5.0,5.9,6.6,7.0,7.5,7.7,8.3,7.2,4.4,3.9,4.5,4.9,2.3,2.4,3.5,3.0,2.4,1.1,3.9,2.0,2.8,2.1,3.1,4.0,4.0,3.3,3.6,5.4,5.4,5.6,7.0,7.2,7.1,6.5,5.8,5.5,4.8,4.3,4.3,3.9,3.9,3.9,3.6,3.9,3.9,3.6,3.6,3.1,4.1,4.6,5.4,5.4,5.8,6.4,6.2,6.2,5.9,4.9,4.4,3.8,3.6,3.6,3.2,2.9,3.1,2.9,2.0,0.5,0.4,1.4,1.9,2.3,3.4,3.3,2.9,2.8,3.0,3.3,2.4,2.6,1.2,5.7,7.2,4.0,3.4,4.6,5.1,5.6,6.0,6.0,5.6,5.7,5.3,4.6,3.7,3.4,2.8,2.7,2.5,1.4,1.7,2.1,1.7,4.0,6.3,6.6,5.9,5.2,5.0,5.0,5.0,4.6,4.3,3.8,3.6,3.7,4.1,3.8,3.6,3.6,4.0,4.7,5.4,6.1,6.6,7.2,7.4,7.3,7.0,6.5,5.6,5.0,4.5,4.1,3.8,3.6,3.4,3.4,3.4,3.2,3.2,3.2,3.0,3.2,3.8,4.7,5.4,5.8,6.5,6.8,7.1,7.3,7.1,6.5,5.6,5.0,4.3,3.6,3.2,2.7,2.2,1.8,1.2,0.8,0.7,1.1,2.3,3.4,4.5,5.6,7.0,9.2,11.7,13.9,15.3,16.1,15.9,14.2,11.5,8.5,4.7,0.7,3.4,5.8,7.7,8.6,8.0,6.5,5.4,4.9,4.8,4.3,4.1,3.6,2.8,0.9,1.7,3.2,3.8,5.0,6.0,5.7,4.7,3.9,2.4,2.2,3.6,4.6,5.4,6.4,7.7,9.0,9.5,8.7,7.4,6.3,4.7,2.7,1.5,2.0,3.2,3.8,3.1,3.3,4.2,4.7,4.9,5.0,4.6,4.0,3.2,2.6,2.1,1.6,1.1,0.5,0.5,0.8,0.9,1.1,0.6,0.3,0.9,1.5,1.8,1.6,0.9,2.2,3.6,3.6,3.2,2.6,2.0,1.6,1.0,0.5,1.8,3.3,3.9,4.3,4.5,4.5,4.6,4.2,3.3,1.8,1.4,3.1,5.6,6.8,5.3,2.5,0.8,2.0,4.3,5.8,5.4,4.2,3.5,3.8,4.5,5.1,5.1,4.7,4.5,4.3,4.3,4.3,4.7,5.6,5.6,4.9,3.6,1.7,2.6,6.5,9.1,9.5,8.6,7.6,6.6,5.3,4.2,3.3,2.8,2.3,2.6,2.7,2.9,2.5,1.8,1.2,0.8,0.5,0.5,1.2,2.1,3.3,4.3,5.2,5.9,5.6,5.0,4.5,4.5,4.5,4.5,4.3,4.3,4.1,4.1,4.1,4.1,4.1,4.2,4.5,5.1,6.1,6.7,6.7,6.5,6.6,6.9,7.4,7.4,6.7,5.3,4.3,3.6,3.2,2.8],"wind_direction_10m":[112,66,77,63,360,304,338,330,15,117,284,217,279,265,301,243,280,291,8,329,344,8,9,18,304,264,284,265,158,352,135,167,150,153,189,208,220,231,232,232,240,255,204,207,5,61,68,55,54,56,127,31,63,61,49,360,43,38,16,360,353,351,344,344,349,351,356,2,12,13,12,6,13,13,13,11,10,10,11,11,4,13,11,358,353,347,342,341,341,340,344,345,357,11,356,352,4,360,356,6,27,270,189,201,209,184,208,189,194,197,208,202,195,292,349,5,43,53,61,56,61,59,59,56,69,78,67,76,94,72,85,100,129,203,238,310,360,8,10,9,10,18,27,36,39,43,40,30,17,6,360,356,356,357,360,360,356,348,346,346,349,353,356,2,8,9,6,3,4,8,11,11,12,12,12,13,12,7,3,360,356,352,349,347,348,349,354,360,8,9,11,8,5,360,353,338,304,252,191,169,169,174,180,187,198,206,210,209,207,206,208,212,215,215,162,58,62,68,70,67,59,52,51,53,55,61,68,76,104,220,245,273,306,321,334,352,13,41,114,150,166,182,190,190,189,189,198,213,228,235,235,243,243,245,249,274,318,344,360,16,27,29,27,25,20,13,8,11,27,63,56,45,37,45,135,194,207,210,225,284,354,4,7,12,15,6,352,333,207,166,164,167,171,174,183,191,198,200,194,162,150,151,153,152,153,124,96,102,106,109,122,140,159,171,178,180,180,180,180,177,177,177,180,180,180,176,157,59,41,36,30,21,14,12,12,16,16,18,17,15,9,9,10,14,22,34,27,27,22,18,16,12,10,9,7,8,6,6,9,9,9,6,6,6,6,9,13,16,18,15,10,6,2,356,350,347,344,344,346,348,354,360,8,14],"wind_gusts_10m":[2.7,4.0,3.8,3.1,2.2,0.9,3.1,2.5,3.4,1.6,1.1,5.6,4.7,5.6,6.0,8.5,8.5,9.8,4.7,2.9,3.8,5.4,10.1,8.1,4.7,2.5,3.6,2.9,2.2,1.8,1.1,7.8,8.9,10.5,11.4,12.5,12.8,12.1,12.1,12.3,11.6,7.6,7.6,9.2,7.2,6.9,5.4,5.1,5.1,3.8,2.2,5.1,5.8,5.6,8.3,10.3,10.7,10.7,8.5,8.7,7.6,7.6,7.2,8.4,9.3,10.0,11.4,13.4,12.8,11.2,9.4,7.8,7.2,6.5,5.8,5.6,4.9,4.5,4.3,3.1,3.6,5.4,5.4,5.6,5.4,4.9,5.1,4.9,5.1,6.3,8.5,7.8,6.3,5.4,2.9,2.0,2.0,1.8,1.3,0.9,0.7,1.6,2.2,2.2,3.4,5.4,5.4,4.5,4.9,4.9,5.4,5.1,5.4,4.7,4.5,8.1,5.1,4.3,3.6,2.9,3.1,3.1,3.1,3.8,5.1,6.0,3.6,4.0,4.5,4.0,2.0,1.6,1.1,0.9,1.3,2.2,3.8,5.4,7.2,8.9,10.5,12.1,13.4,14.3,14.3,13.9,13.4,13.6,14.1,13.9,12.1,9.6,7.8,7.4,7.8,8.3,8.5,8.7,8.9,9.4,9.8,10.3,10.7,11.2,11.2,10.1,8.5,7.2,6.0,5.4,4.7,4.5,4.7,4.7,4.5,4.3,4.5,5.1,6.0,6.9,7.4,7.6,8.1,8.7,9.2,9.8,10.7,11.4,11.2,9.2,6.0,3.6,2.2,1.1,0.7,0.4,0.7,1.3,2.9,4.9,6.9,8.7,10.5,12.3,14.1,16.1,17.9,19.7,21.5,22.6,23.3,23.5,22.6,19.7,15.7,12.1,8.9,6.3,4.5,4.7,6.0,6.9,6.5,5.6,4.7,4.0,3.6,3.8,5.4,7.8,9.4,9.8,9.4,8.7,6.9,4.9,4.0,5.6,8.7,11.6,14.1,16.3,18.3,20.4,21.9,23.0,23.5,23.3,22.1,19.7,16.6,13.9,12.8,12.3,11.4,9.2,6.7,5.1,5.8,7.4,8.1,6.7,4.5,2.7,1.8,1.3,1.1,1.1,1.1,1.3,1.3,1.3,1.3,1.1,0.7,0.7,1.1,2.0,2.5,2.2,1.6,1.3,1.6,2.0,2.2,2.0,1.6,1.8,3.6,6.3,8.5,9.8,10.7,11.4,12.1,12.5,11.9,9.2,5.4,3.4,4.0,6.5,8.9,12.1,15.7,17.0,14.5,10.1,7.2,7.4,8.7,10.3,11.2,11.9,12.5,12.8,13.0,13.0,13.0,12.8,12.3,11.4,10.3,8.9,6.9,4.5,3.1,3.4,4.5,6.5,10.3,15.2,17.9,17.2,14.5,11.6,8.7,5.8,3.6,2.7,2.7,2.5,2.0,1.6,1.1,0.9,0.7,0.9,1.8,3.1,4.5,5.8,7.4,8.7,10.3,11.9,12.5,11.6,9.8,8.5,8.1,8.3,8.3,8.3,8.3,8.5,8.7,9.2,9.2,8.9,8.3,7.8,7.2,6.7,6.7,7.8,9.6,10.5,9.6,8.1,6.3,4.7,3.4,2.2]},"daily_units":{"time":"iso8601","weather_code":"wmo code","temperature_2m_max":"°F","temperature_2m_min":"°F","precipitation_sum":"inch","precipitation_probability_max":"%","wind_speed_10m_max":"mp/h","wind_gusts_10m_max":"mp/h"},"daily":{"time":["2026-10-01","2026-10-02","2026-10-03","2026-10-04","2026-10-05","2026-10-06","2026-10-07","2026-10-08","2026-10-09","2026-10-10","2026-10-11","2026-10-12","2026-10-13","2026-10-14","2026-10-15","2026-10-16"],"weather_code":[3,3,3,3,3,51,3,3,3,3,51,3,63,3,3,3],"temperature_2m_max":[64.0,67.0,67.3,71.2,72.1,66.8,64.0,67.9,72.2,64.7,64.0,62.6,49.7,58.1,59.6,60.5],"temperature_2m_min":[48.2,51.3,50.5,52.1,53.0,54.4,49.7,49.1,50.9,49.0,47.0,44.4,47.3,42.7,43.0,43.2],"precipitation_sum":[0.000,0.000,0.000,0.000,0.000,0.016,0.000,0.000,0.000,0.000,0.024,0.000,0.602,0.000,0.000,0.000],"precipitation_probability_max":[4,4,2,0,4,6,1,3,14,12,11,25,19,32,23,14],"wind_speed_10m_max":[4.3,8.3,7.2,6.4,7.2,6.6,7.4,7.3,16.1,8.6,9.5,3.6,6.8,9.5,5.9,7.4],"wind_gusts_10m_max":[10.1,12.8,13.4,8.5,8.1,14.3,14.3,11.4,23.5,11.6,23.5,2.5,17.0,17.9,12.5,10.5]}} \ No newline at end of file diff --git a/tests/fixtures/open_meteo/tokyo.json b/tests/fixtures/open_meteo/tokyo.json new file mode 100644 index 0000000..aeec803 --- /dev/null +++ b/tests/fixtures/open_meteo/tokyo.json @@ -0,0 +1 @@ +{"latitude":35.7,"longitude":139.625,"generationtime_ms":0.78582763671875,"utc_offset_seconds":32400,"timezone":"Asia/Tokyo","timezone_abbreviation":"GMT+9","elevation":37.0,"current_units":{"time":"iso8601","interval":"seconds","temperature_2m":"°C","relative_humidity_2m":"%","apparent_temperature":"°C","precipitation":"mm","weather_code":"wmo code","wind_speed_10m":"km/h","wind_direction_10m":"°","wind_gusts_10m":"km/h","dewpoint_2m":"°C","visibility":"m","surface_pressure":"hPa"},"current":{"time":"2026-10-02T11:15","interval":900,"temperature_2m":19.4,"relative_humidity_2m":93,"apparent_temperature":21.7,"precipitation":0.10,"weather_code":51,"wind_speed_10m":5.6,"wind_direction_10m":27,"wind_gusts_10m":23.4,"dewpoint_2m":18.3,"visibility":3180.00,"surface_pressure":1010.1},"hourly_units":{"time":"iso8601","temperature_2m":"°C","weather_code":"wmo code","wind_speed_10m":"km/h","wind_direction_10m":"°","wind_gusts_10m":"km/h"},"hourly":{"time":["2026-10-02T00:00","2026-10-02T01:00","2026-10-02T02:00","2026-10-02T03:00","2026-10-02T04:00","2026-10-02T05:00","2026-10-02T06:00","2026-10-02T07:00","2026-10-02T08:00","2026-10-02T09:00","2026-10-02T10:00","2026-10-02T11:00","2026-10-02T12:00","2026-10-02T13:00","2026-10-02T14:00","2026-10-02T15:00","2026-10-02T16:00","2026-10-02T17:00","2026-10-02T18:00","2026-10-02T19:00","2026-10-02T20:00","2026-10-02T21:00","2026-10-02T22:00","2026-10-02T23:00","2026-10-03T00:00","2026-10-03T01:00","2026-10-03T02:00","2026-10-03T03:00","2026-10-03T04:00","2026-10-03T05:00","2026-10-03T06:00","2026-10-03T07:00","2026-10-03T08:00","2026-10-03T09:00","2026-10-03T10:00","2026-10-03T11:00","2026-10-03T12:00","2026-10-03T13:00","2026-10-03T14:00","2026-10-03T15:00","2026-10-03T16:00","2026-10-03T17:00","2026-10-03T18:00","2026-10-03T19:00","2026-10-03T20:00","2026-10-03T21:00","2026-10-03T22:00","2026-10-03T23:00","2026-10-04T00:00","2026-10-04T01:00","2026-10-04T02:00","2026-10-04T03:00","2026-10-04T04:00","2026-10-04T05:00","2026-10-04T06:00","2026-10-04T07:00","2026-10-04T08:00","2026-10-04T09:00","2026-10-04T10:00","2026-10-04T11:00","2026-10-04T12:00","2026-10-04T13:00","2026-10-04T14:00","2026-10-04T15:00","2026-10-04T16:00","2026-10-04T17:00","2026-10-04T18:00","2026-10-04T19:00","2026-10-04T20:00","2026-10-04T21:00","2026-10-04T22:00","2026-10-04T23:00","2026-10-05T00:00","2026-10-05T01:00","2026-10-05T02:00","2026-10-05T03:00","2026-10-05T04:00","2026-10-05T05:00","2026-10-05T06:00","2026-10-05T07:00","2026-10-05T08:00","2026-10-05T09:00","2026-10-05T10:00","2026-10-05T11:00","2026-10-05T12:00","2026-10-05T13:00","2026-10-05T14:00","2026-10-05T15:00","2026-10-05T16:00","2026-10-05T17:00","2026-10-05T18:00","2026-10-05T19:00","2026-10-05T20:00","2026-10-05T21:00","2026-10-05T22:00","2026-10-05T23:00","2026-10-06T00:00","2026-10-06T01:00","2026-10-06T02:00","2026-10-06T03:00","2026-10-06T04:00","2026-10-06T05:00","2026-10-06T06:00","2026-10-06T07:00","2026-10-06T08:00","2026-10-06T09:00","2026-10-06T10:00","2026-10-06T11:00","2026-10-06T12:00","2026-10-06T13:00","2026-10-06T14:00","2026-10-06T15:00","2026-10-06T16:00","2026-10-06T17:00","2026-10-06T18:00","2026-10-06T19:00","2026-10-06T20:00","2026-10-06T21:00","2026-10-06T22:00","2026-10-06T23:00","2026-10-07T00:00","2026-10-07T01:00","2026-10-07T02:00","2026-10-07T03:00","2026-10-07T04:00","2026-10-07T05:00","2026-10-07T06:00","2026-10-07T07:00","2026-10-07T08:00","2026-10-07T09:00","2026-10-07T10:00","2026-10-07T11:00","2026-10-07T12:00","2026-10-07T13:00","2026-10-07T14:00","2026-10-07T15:00","2026-10-07T16:00","2026-10-07T17:00","2026-10-07T18:00","2026-10-07T19:00","2026-10-07T20:00","2026-10-07T21:00","2026-10-07T22:00","2026-10-07T23:00","2026-10-08T00:00","2026-10-08T01:00","2026-10-08T02:00","2026-10-08T03:00","2026-10-08T04:00","2026-10-08T05:00","2026-10-08T06:00","2026-10-08T07:00","2026-10-08T08:00","2026-10-08T09:00","2026-10-08T10:00","2026-10-08T11:00","2026-10-08T12:00","2026-10-08T13:00","2026-10-08T14:00","2026-10-08T15:00","2026-10-08T16:00","2026-10-08T17:00","2026-10-08T18:00","2026-10-08T19:00","2026-10-08T20:00","2026-10-08T21:00","2026-10-08T22:00","2026-10-08T23:00","2026-10-09T00:00","2026-10-09T01:00","2026-10-09T02:00","2026-10-09T03:00","2026-10-09T04:00","2026-10-09T05:00","2026-10-09T06:00","2026-10-09T07:00","2026-10-09T08:00","2026-10-09T09:00","2026-10-09T10:00","2026-10-09T11:00","2026-10-09T12:00","2026-10-09T13:00","2026-10-09T14:00","2026-10-09T15:00","2026-10-09T16:00","2026-10-09T17:00","2026-10-09T18:00","2026-10-09T19:00","2026-10-09T20:00","2026-10-09T21:00","2026-10-09T22:00","2026-10-09T23:00","2026-10-10T00:00","2026-10-10T01:00","2026-10-10T02:00","2026-10-10T03:00","2026-10-10T04:00","2026-10-10T05:00","2026-10-10T06:00","2026-10-10T07:00","2026-10-10T08:00","2026-10-10T09:00","2026-10-10T10:00","2026-10-10T11:00","2026-10-10T12:00","2026-10-10T13:00","2026-10-10T14:00","2026-10-10T15:00","2026-10-10T16:00","2026-10-10T17:00","2026-10-10T18:00","2026-10-10T19:00","2026-10-10T20:00","2026-10-10T21:00","2026-10-10T22:00","2026-10-10T23:00","2026-10-11T00:00","2026-10-11T01:00","2026-10-11T02:00","2026-10-11T03:00","2026-10-11T04:00","2026-10-11T05:00","2026-10-11T06:00","2026-10-11T07:00","2026-10-11T08:00","2026-10-11T09:00","2026-10-11T10:00","2026-10-11T11:00","2026-10-11T12:00","2026-10-11T13:00","2026-10-11T14:00","2026-10-11T15:00","2026-10-11T16:00","2026-10-11T17:00","2026-10-11T18:00","2026-10-11T19:00","2026-10-11T20:00","2026-10-11T21:00","2026-10-11T22:00","2026-10-11T23:00","2026-10-12T00:00","2026-10-12T01:00","2026-10-12T02:00","2026-10-12T03:00","2026-10-12T04:00","2026-10-12T05:00","2026-10-12T06:00","2026-10-12T07:00","2026-10-12T08:00","2026-10-12T09:00","2026-10-12T10:00","2026-10-12T11:00","2026-10-12T12:00","2026-10-12T13:00","2026-10-12T14:00","2026-10-12T15:00","2026-10-12T16:00","2026-10-12T17:00","2026-10-12T18:00","2026-10-12T19:00","2026-10-12T20:00","2026-10-12T21:00","2026-10-12T22:00","2026-10-12T23:00","2026-10-13T00:00","2026-10-13T01:00","2026-10-13T02:00","2026-10-13T03:00","2026-10-13T04:00","2026-10-13T05:00","2026-10-13T06:00","2026-10-13T07:00","2026-10-13T08:00","2026-10-13T09:00","2026-10-13T10:00","2026-10-13T11:00","2026-10-13T12:00","2026-10-13T13:00","2026-10-13T14:00","2026-10-13T15:00","2026-10-13T16:00","2026-10-13T17:00","2026-10-13T18:00","2026-10-13T19:00","2026-10-13T20:00","2026-10-13T21:00","2026-10-13T22:00","2026-10-13T23:00","2026-10-14T00:00","2026-10-14T01:00","2026-10-14T02:00","2026-10-14T03:00","2026-10-14T04:00","2026-10-14T05:00","2026-10-14T06:00","2026-10-14T07:00","2026-10-14T08:00","2026-10-14T09:00","2026-10-14T10:00","2026-10-14T11:00","2026-10-14T12:00","2026-10-14T13:00","2026-10-14T14:00","2026-10-14T15:00","2026-10-14T16:00","2026-10-14T17:00","2026-10-14T18:00","2026-10-14T19:00","2026-10-14T20:00","2026-10-14T21:00","2026-10-14T22:00","2026-10-14T23:00","2026-10-15T00:00","2026-10-15T01:00","2026-10-15T02:00","2026-10-15T03:00","2026-10-15T04:00","2026-10-15T05:00","2026-10-15T06:00","2026-10-15T07:00","2026-10-15T08:00","2026-10-15T09:00","2026-10-15T10:00","2026-10-15T11:00","2026-10-15T12:00","2026-10-15T13:00","2026-10-15T14:00","2026-10-15T15:00","2026-10-15T16:00","2026-10-15T17:00","2026-10-15T18:00","2026-10-15T19:00","2026-10-15T20:00","2026-10-15T21:00","2026-10-15T22:00","2026-10-15T23:00","2026-10-16T00:00","2026-10-16T01:00","2026-10-16T02:00","2026-10-16T03:00","2026-10-16T04:00","2026-10-16T05:00","2026-10-16T06:00","2026-10-16T07:00","2026-10-16T08:00","2026-10-16T09:00","2026-10-16T10:00","2026-10-16T11:00","2026-10-16T12:00","2026-10-16T13:00","2026-10-16T14:00","2026-10-16T15:00","2026-10-16T16:00","2026-10-16T17:00","2026-10-16T18:00","2026-10-16T19:00","2026-10-16T20:00","2026-10-16T21:00","2026-10-16T22:00","2026-10-16T23:00","2026-10-17T00:00","2026-10-17T01:00","2026-10-17T02:00","2026-10-17T03:00","2026-10-17T04:00","2026-10-17T05:00","2026-10-17T06:00","2026-10-17T07:00","2026-10-17T08:00","2026-10-17T09:00","2026-10-17T10:00","2026-10-17T11:00","2026-10-17T12:00","2026-10-17T13:00","2026-10-17T14:00","2026-10-17T15:00","2026-10-17T16:00","2026-10-17T17:00","2026-10-17T18:00","2026-10-17T19:00","2026-10-17T20:00","2026-10-17T21:00","2026-10-17T22:00","2026-10-17T23:00"],"temperature_2m":[21.7,21.6,21.3,21.3,21.1,20.9,20.6,20.6,21.0,21.1,21.1,19.6,19.2,19.9,20.2,20.3,20.2,19.9,19.5,19.1,18.8,18.5,18.2,18.1,17.8,17.8,18.0,18.1,17.4,16.7,16.3,17.0,18.5,19.6,20.6,21.6,22.5,23.1,23.5,23.6,23.3,22.3,20.8,19.7,19.0,18.3,17.6,17.3,17.1,16.9,16.6,16.3,16.0,15.7,15.5,16.3,17.5,18.9,20.3,21.2,21.9,21.5,21.7,22.1,21.5,20.6,19.8,19.2,18.6,18.3,17.9,17.6,17.4,16.7,16.2,15.7,15.5,15.5,15.3,15.9,17.0,19.4,20.3,20.3,20.9,20.8,20.0,19.6,19.5,19.3,18.7,18.4,18.4,18.4,18.4,18.4,18.4,18.4,18.4,18.4,18.3,18.2,18.5,19.4,20.8,22.1,23.4,24.7,25.7,26.5,26.9,26.8,25.7,24.0,22.6,21.7,21.1,20.8,20.7,20.8,20.8,20.5,20.1,19.7,19.4,19.2,19.3,20.0,21.0,22.1,23.1,24.1,24.7,25.0,25.0,24.5,23.1,21.1,19.7,19.2,19.2,19.1,18.9,18.7,18.4,17.9,17.4,17.0,17.6,17.8,18.1,18.4,18.9,19.3,20.0,20.8,21.7,22.6,23.2,23.4,23.1,22.4,21.5,20.5,19.5,18.7,18.0,17.2,16.5,15.9,15.5,15.4,15.7,16.3,17.2,18.1,19.1,19.9,20.7,21.6,22.4,23.2,23.7,23.7,23.3,22.4,21.2,19.9,18.8,17.9,17.2,16.5,15.9,15.5,15.3,15.3,15.6,16.2,17.0,17.9,18.8,19.6,20.4,21.3,22.2,23.0,23.5,23.6,23.2,22.2,21.0,19.7,18.5,17.6,16.8,16.1,15.4,14.9,14.6,14.6,14.9,15.6,16.6,17.6,18.6,19.5,20.4,21.4,22.4,23.2,23.8,24.0,23.7,23.0,22.1,21.0,20.0,19.2,18.5,17.7,17.0,16.4,16.0,15.9,16.2,16.7,17.4,18.2,19.1,19.9,20.7,21.8,22.8,23.7,24.4,24.5,24.1,23.1,21.9,20.6,19.4,18.6,18.1,17.8,17.6,17.5,17.5,17.4,17.4,17.4,17.4,17.5,17.6,17.8,18.1,18.6,19.1,19.6,20.0,20.0,19.8,19.2,18.5,17.8,17.1,16.5,16.1,15.7,15.3,15.1,14.9,14.9,15.1,15.4,15.8,16.3,16.9,17.5,18.2,19.2,20.2,21.1,21.9,22.3,22.3,22.1,21.6,21.0,20.5,20.0,19.5,18.8,18.1,17.6,17.2,17.2,17.5,18.2,19.0,20.0,20.9,21.7,22.5,23.3,24.1,24.8,25.2,25.4,25.2,24.7,23.9,23.1,22.4,21.9,21.5,21.3,21.1,20.9,20.9,21.0,21.3,21.8,22.3,22.9,23.4,23.8,24.1,24.4,24.7,24.9,24.9,24.9,24.6,24.1,23.5,22.1,20.8,19.7,18.5,18.1,17.7,17.4,17.2,17.0,17.0,17.0,17.0,16.8,16.7,16.6,16.7,16.8,16.8,16.4,15.7,15.2,15.0,14.8,14.6,14.4,14.2,14.1,14.5,15.0],"weather_code":[2,2,3,2,1,1,1,1,2,2,3,53,51,2,2,2,2,2,2,2,2,2,1,1,1,1,2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,1,0,0,0,0,0,1,0,0,0,3,3,3,2,1,2,1,1,1,1,1,1,1,1,2,1,3,2,3,3,53,2,51,51,51,51,53,53,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,2,3,3,3,3,3,3,3,3,3,3,2,2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,51,51,51,51,51,51,51,51,51,51,51,51,3,3,3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,3,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,0,1,1,1,2,2,3,3,3,51,51,51,51,51,51,3,3,3,51,51,51,61,61,61,63,63,63,82,82,82,80,80],"wind_speed_10m":[2.9,2.6,3.1,3.3,6.2,7.4,6.9,7.2,6.1,5.0,4.3,5.8,5.6,5.9,5.0,4.0,3.3,2.3,1.1,1.8,3.1,2.8,2.5,2.5,2.7,3.2,4.1,4.7,4.7,4.3,3.6,3.6,4.5,5.2,5.0,4.4,4.3,4.3,4.3,4.2,3.9,3.6,4.4,4.1,3.6,2.3,2.1,2.4,3.0,3.7,4.1,4.1,4.1,4.5,4.5,4.7,5.1,4.7,5.1,5.6,5.4,4.5,3.6,4.1,5.5,5.0,3.2,3.6,3.2,3.7,3.3,4.6,5.7,7.0,8.0,7.9,9.9,9.8,9.4,8.9,8.2,9.2,9.5,8.8,8.0,7.0,7.8,8.1,8.4,7.6,9.0,9.2,8.9,9.4,9.5,9.7,9.9,10.3,10.7,10.9,11.0,10.6,10.3,9.5,8.5,7.9,8.0,8.8,9.6,9.7,9.5,9.2,9.1,9.9,10.7,10.3,10.1,10.8,11.8,12.9,13.8,14.1,14.0,14.2,14.6,15.4,16.1,16.5,16.9,17.1,17.2,17.0,16.5,15.1,13.5,12.6,13.1,14.1,14.4,13.2,11.5,10.2,9.8,10.1,10.1,9.6,9.1,8.9,9.2,8.7,8.0,7.2,6.5,5.5,4.4,3.2,2.2,2.1,2.8,3.2,3.4,3.3,3.2,2.7,2.1,1.4,0.4,1.3,3.2,4.8,6.1,6.9,6.8,6.4,5.7,4.8,4.0,3.5,2.9,2.7,2.6,3.1,3.8,4.1,4.3,4.5,4.3,4.2,4.0,3.5,2.8,2.6,3.2,4.4,5.6,6.4,6.6,6.6,6.5,6.4,6.3,6.2,6.2,6.1,6.0,5.8,5.8,5.6,5.4,5.0,4.6,4.2,3.7,3.3,2.7,2.4,2.9,4.1,5.1,5.8,6.0,5.9,5.5,5.0,4.4,3.6,2.3,0.7,1.3,3.1,4.6,5.3,5.2,4.4,3.6,2.8,2.7,3.1,3.6,4.4,4.8,5.4,5.7,6.0,5.9,5.9,5.8,5.6,5.5,4.9,4.0,2.7,2.5,3.9,5.2,5.7,5.1,3.9,2.3,1.9,3.1,4.3,5.1,5.6,6.0,6.5,6.7,6.7,6.6,6.3,6.1,5.9,5.8,5.5,5.5,6.0,7.5,9.1,10.3,10.4,9.4,7.2,4.3,1.3,1.7,3.5,4.8,5.8,6.8,7.5,8.1,8.5,8.6,8.5,8.1,7.5,7.0,6.4,5.7,5.0,4.1,3.2,2.3,1.4,0.4,1.3,2.7,4.1,4.9,5.0,4.1,2.3,1.0,2.9,4.6,5.6,5.6,4.8,3.9,2.4,0.9,0.6,2.4,4.8,7.3,9.6,11.8,13.2,14.0,14.3,14.2,14.0,13.6,13.4,13.4,13.2,13.0,12.8,12.6,12.8,13.1,13.5,14.1,14.8,15.3,15.7,16.0,16.6,17.1,17.5,17.3,16.8,15.3,13.4,11.2,15.7,22.4,31.0,40.6,42.2,43.7,44.0,43.6,43.6,44.4,45.2,46.1,46.6,47.1,47.5,48.1,48.2,48.8,49.2,49.7,49.7,49.7,49.7,49.3,48.4,46.8,46.1,45.7,45.7],"wind_direction_10m":[360,16,69,49,350,346,351,360,360,360,5,22,50,79,90,85,77,51,18,11,36,40,352,352,337,333,345,356,4,360,354,354,14,25,30,35,42,42,48,59,68,96,99,105,96,72,329,333,346,349,345,345,345,346,346,356,4,360,4,15,20,29,6,38,67,60,63,45,27,11,347,342,342,338,334,333,327,330,329,324,322,334,341,341,322,320,310,313,317,326,301,317,322,322,327,331,333,333,333,333,335,337,338,338,335,336,346,358,4,4,1,3,18,37,44,35,17,1,351,344,342,346,353,357,351,343,338,338,339,341,342,342,342,340,337,333,328,325,324,326,331,337,343,348,349,344,335,328,327,326,326,325,326,328,333,344,14,52,79,90,96,103,109,113,121,130,180,286,297,299,302,303,305,310,316,326,339,351,7,28,56,77,87,92,92,90,85,80,72,62,45,12,341,322,315,313,315,319,326,333,342,348,353,360,7,14,20,25,30,35,42,47,51,49,37,9,338,319,312,309,309,313,316,322,328,333,337,346,146,149,154,156,160,168,180,207,238,257,270,277,285,290,294,299,305,313,324,333,343,352,3,32,82,112,124,127,126,118,94,34,357,345,337,331,323,318,316,316,319,325,336,348,360,13,32,53,70,82,89,92,93,94,92,74,302,294,297,304,312,318,323,325,327,328,329,330,331,331,332,330,326,322,315,310,270,135,132,131,129,128,124,113,31,338,329,327,327,329,332,333,349,146,163,169,171,172,174,174,173,174,173,173,172,172,173,175,176,178,180,181,182,182,182,182,182,182,181,179,178,176,176,177,180,185,195,162,123,72,13,8,5,3,3,3,5,6,8,9,10,10,9,7,6,6,7,7,7,7,6,5,3,1,1,1],"wind_gusts_10m":[7.9,2.5,4.3,16.2,20.9,19.8,19.8,20.5,18.7,18.7,22.3,23.4,23.0,28.1,27.4,21.6,15.1,11.2,10.4,10.4,7.9,7.2,7.2,8.6,11.2,10.4,13.0,14.0,15.1,15.1,13.7,13.3,15.5,20.9,23.0,22.3,20.9,19.8,20.9,20.9,19.8,17.6,12.2,8.3,5.8,5.4,8.6,11.5,13.7,15.1,15.5,16.2,16.6,17.3,16.2,16.9,18.4,20.2,23.0,26.6,27.0,25.2,24.8,25.2,22.3,16.9,12.6,11.5,15.5,18.4,18.4,18.7,20.2,21.2,20.2,20.2,20.5,20.5,20.5,20.5,20.9,25.2,25.6,26.3,22.0,20.5,17.6,18.4,16.9,17.3,19.1,19.4,19.8,19.8,20.9,22.3,23.4,23.8,23.4,23.4,23.8,24.1,24.1,23.8,23.4,23.4,24.5,26.3,27.4,27.7,27.7,27.4,26.6,25.6,24.8,24.5,24.1,24.5,26.3,28.8,31.0,33.1,34.9,36.0,36.0,35.3,35.3,36.7,38.5,40.3,41.4,42.5,42.8,42.5,41.8,40.3,37.1,33.1,30.2,29.9,30.6,30.2,27.4,23.4,20.9,20.5,21.2,22.0,25.2,23.8,22.7,21.6,20.5,19.8,19.1,18.7,18.4,18.4,18.0,18.0,18.0,18.0,18.4,18.4,18.4,18.0,17.3,16.6,15.5,14.8,13.7,13.3,13.0,13.0,13.3,13.3,13.7,14.0,14.4,14.8,15.1,15.8,16.2,16.2,16.2,16.2,15.8,15.5,15.1,14.8,14.0,13.3,12.2,11.5,11.2,11.2,11.9,13.3,15.1,16.9,18.4,19.4,20.2,20.2,20.2,20.2,20.2,19.8,19.4,19.1,18.7,18.4,17.6,16.9,15.8,14.8,13.3,12.2,11.2,10.8,10.8,11.2,11.9,12.6,13.3,14.0,14.8,15.5,16.6,17.3,18.0,18.4,18.4,18.4,18.0,17.3,16.9,16.2,15.5,14.4,13.3,12.2,11.5,11.2,11.5,12.6,13.7,15.1,16.2,16.9,17.3,17.3,17.3,17.3,17.3,17.6,18.4,19.4,20.9,22.0,22.7,22.7,22.0,20.5,19.1,17.3,15.8,14.8,14.0,14.0,13.7,14.0,14.4,15.1,16.6,18.4,20.9,23.0,24.8,26.3,27.0,27.4,27.4,27.0,26.6,25.9,24.8,23.8,22.0,20.5,19.1,18.4,18.0,18.0,18.4,18.4,18.7,19.1,19.4,19.8,20.2,20.5,20.5,20.2,19.4,18.4,16.9,15.5,14.4,13.3,12.6,11.9,11.5,10.8,10.8,10.4,10.1,9.7,9.7,9.7,10.4,11.9,14.8,18.4,23.0,27.4,31.3,33.8,34.9,35.3,34.9,34.2,33.5,33.1,32.8,32.0,31.3,31.0,30.6,30.6,31.0,31.7,32.4,33.5,34.9,36.4,38.5,41.0,43.9,46.8,48.6,49.7,49.3,47.5,45.4,47.4,50.6,55.3,61.6,63.0,64.1,64.1,64.1,64.4,65.9,68.0,70.2,72.4,74.2,75.6,75.6,75.2,74.5,73.8,72.7,72.7,74.2,76.3,77.4,77.0,75.6,74.5,74.5,74.5]},"daily_units":{"time":"iso8601","weather_code":"wmo code","temperature_2m_max":"°C","temperature_2m_min":"°C","precipitation_sum":"mm","precipitation_probability_max":"%","wind_speed_10m_max":"km/h","wind_gusts_10m_max":"km/h"},"daily":{"time":["2026-10-02","2026-10-03","2026-10-04","2026-10-05","2026-10-06","2026-10-07","2026-10-08","2026-10-09","2026-10-10","2026-10-11","2026-10-12","2026-10-13","2026-10-14","2026-10-15","2026-10-16","2026-10-17"],"weather_code":[53,2,3,53,3,3,3,0,0,0,51,51,3,51,51,82],"temperature_2m_max":[21.7,23.6,22.1,20.9,26.9,25.0,23.4,23.7,23.6,24.0,24.5,20.0,22.3,25.4,24.9,17.7],"temperature_2m_min":[18.1,16.3,15.5,15.3,18.2,18.7,17.0,15.4,15.3,14.6,15.9,15.7,14.9,17.2,18.1,14.1],"precipitation_sum":[0.90,0.00,0.00,3.33,0.00,0.00,0.00,0.00,0.00,0.00,0.40,2.60,0.00,0.40,2.00,50.60],"precipitation_probability_max":[96,20,16,29,44,41,41,29,19,20,19,22,27,17,16,26],"wind_speed_10m_max":[7.4,5.2,5.6,9.9,12.9,17.2,10.1,6.9,6.6,6.0,6.0,10.4,8.6,14.3,42.2,49.7],"wind_gusts_10m_max":[28.1,23.0,27.0,26.3,28.8,42.8,25.2,16.2,20.2,18.4,22.7,27.4,22.0,35.3,63.0,77.4]}} \ No newline at end of file