python-google-weather-api 0.0.10__py3-none-any.whl → 0.0.11__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
google_weather_api/api.py CHANGED
@@ -4,9 +4,10 @@ from __future__ import annotations
4
4
 
5
5
  import logging
6
6
  from http import HTTPStatus
7
- from typing import Any
7
+ from typing import Any, TypeVar
8
8
 
9
9
  import aiohttp
10
+ from mashumaro.exceptions import InvalidFieldValue, MissingField
10
11
 
11
12
  from .exceptions import (
12
13
  GoogleWeatherApiAuthError,
@@ -15,6 +16,7 @@ from .exceptions import (
15
16
  GoogleWeatherApiResponseError,
16
17
  )
17
18
  from .model import (
19
+ BaseModel,
18
20
  CurrentConditionsResponse,
19
21
  DailyForecastResponse,
20
22
  HourlyForecastResponse,
@@ -23,6 +25,17 @@ from .model import (
23
25
 
24
26
  _LOGGER = logging.getLogger(__name__)
25
27
 
28
+ _ResponseT = TypeVar("_ResponseT", bound=BaseModel)
29
+
30
+
31
+ def _parse_response(model: type[_ResponseT], data: dict[str, Any]) -> _ResponseT:
32
+ """Deserialize an API response dictionary, wrapping schema errors."""
33
+ try:
34
+ return model.from_dict(data)
35
+ except (InvalidFieldValue, MissingField) as err:
36
+ raise GoogleWeatherApiResponseError(str(err)) from err
37
+
38
+
26
39
  _BASE_URL = "https://weather.googleapis.com/v1"
27
40
  # See https://docs.cloud.google.com/docs/authentication/api-keys-use
28
41
  _API_KEY_HEADER = "X-Goog-Api-Key"
@@ -140,7 +153,7 @@ class GoogleWeatherApi:
140
153
  "location.longitude": longitude,
141
154
  },
142
155
  )
143
- return CurrentConditionsResponse.from_dict(data)
156
+ return _parse_response(CurrentConditionsResponse, data)
144
157
 
145
158
  async def async_get_hourly_forecast(self, latitude: float, longitude: float, hours: int = 48) -> HourlyForecastResponse:
146
159
  """Fetch hourly weather forecast.
@@ -157,7 +170,7 @@ class GoogleWeatherApi:
157
170
  "forecastHours",
158
171
  hours,
159
172
  )
160
- return HourlyForecastResponse.from_dict(data)
173
+ return _parse_response(HourlyForecastResponse, data)
161
174
 
162
175
  async def async_get_daily_forecast(self, latitude: float, longitude: float, days: int = 10) -> DailyForecastResponse:
163
176
  """Fetch daily weather forecast.
@@ -174,7 +187,7 @@ class GoogleWeatherApi:
174
187
  "forecastDays",
175
188
  days,
176
189
  )
177
- return DailyForecastResponse.from_dict(data)
190
+ return _parse_response(DailyForecastResponse, data)
178
191
 
179
192
  async def async_get_minute_forecast(
180
193
  self, latitude: float, longitude: float, page_size: int = 360
@@ -197,4 +210,4 @@ class GoogleWeatherApi:
197
210
  page_size,
198
211
  include_language_code=False,
199
212
  )
200
- return MinuteForecastResponse.from_dict(data)
213
+ return _parse_response(MinuteForecastResponse, data)
@@ -93,14 +93,14 @@ class Temperature(BaseModel):
93
93
  class TemperatureUnit(ApiStrEnum):
94
94
  """Represents a unit used to measure temperatures."""
95
95
 
96
- TEMPERATURE_UNIT_UNSPECIFIED = "TEMPERATURE_UNIT_UNSPECIFIED"
96
+ UNIT_UNSPECIFIED = "UNIT_UNSPECIFIED"
97
97
  CELSIUS = "CELSIUS"
98
98
  FAHRENHEIT = "FAHRENHEIT"
99
99
 
100
- degrees: float
100
+ degrees: float | None = None
101
101
  """The temperature value (in degrees) in the specified unit."""
102
102
 
103
- unit: TemperatureUnit
103
+ unit: TemperatureUnit = TemperatureUnit.UNIT_UNSPECIFIED
104
104
  """The code for the unit used to measure the temperature value."""
105
105
 
106
106
 
@@ -115,10 +115,10 @@ class QuantitativePrecipitationForecast(BaseModel):
115
115
  MILLIMETERS = "MILLIMETERS"
116
116
  INCHES = "INCHES"
117
117
 
118
- quantity: float
118
+ quantity: float | None = None
119
119
  """The amount of precipitation, measured as liquid water equivalent."""
120
120
 
121
- unit: Unit
121
+ unit: Unit = Unit.UNIT_UNSPECIFIED
122
122
  """The code of the unit used to measure the amount of accumulated precipitation."""
123
123
 
124
124
 
@@ -129,7 +129,7 @@ class PrecipitationProbability(BaseModel):
129
129
  class PrecipitationType(ApiStrEnum):
130
130
  """Represents the type of precipitation at a given location."""
131
131
 
132
- PRECIPITATION_TYPE_UNSPECIFIED = "PRECIPITATION_TYPE_UNSPECIFIED"
132
+ TYPE_UNSPECIFIED = "TYPE_UNSPECIFIED"
133
133
  NONE = "NONE"
134
134
  SNOW = "SNOW"
135
135
  RAIN = "RAIN"
@@ -138,6 +138,7 @@ class PrecipitationProbability(BaseModel):
138
138
  RAIN_AND_SNOW = "RAIN_AND_SNOW"
139
139
  SLEET = "SLEET"
140
140
  FREEZING_RAIN = "FREEZING_RAIN"
141
+ PRECIPITATION_TYPE_HAIL = "PRECIPITATION_TYPE_HAIL"
141
142
 
142
143
  type: PrecipitationType
143
144
  """A code that indicates the type of precipitation."""
@@ -167,14 +168,14 @@ class WindSpeed(BaseModel):
167
168
  class SpeedUnit(ApiStrEnum):
168
169
  """Represents the unit used to measure speed."""
169
170
 
170
- SPEED_UNIT_UNSPECIFIED = "SPEED_UNIT_UNSPECIFIED"
171
+ UNIT_UNSPECIFIED = "UNIT_UNSPECIFIED"
171
172
  KILOMETERS_PER_HOUR = "KILOMETERS_PER_HOUR"
172
173
  MILES_PER_HOUR = "MILES_PER_HOUR"
173
174
 
174
- value: float
175
+ value: float | None = None
175
176
  """The value of the wind speed."""
176
177
 
177
- unit: SpeedUnit
178
+ unit: SpeedUnit = SpeedUnit.UNIT_UNSPECIFIED
178
179
  """The code that represents the unit used to measure the wind speed."""
179
180
 
180
181
 
@@ -185,7 +186,7 @@ class WindDirection(BaseModel):
185
186
  class CardinalDirection(ApiStrEnum):
186
187
  """Represents a cardinal direction (including ordinal directions)."""
187
188
 
188
- CARDINAL_DIRECTION_UNSPECIFIED = "CARDINAL_DIRECTION_UNSPECIFIED"
189
+ CARDINAL_UNSPECIFIED = "CARDINAL_UNSPECIFIED"
189
190
  NORTH = "NORTH"
190
191
  NORTH_NORTHEAST = "NORTH_NORTHEAST"
191
192
  NORTHEAST = "NORTHEAST"
@@ -220,7 +221,7 @@ class Wind(BaseModel):
220
221
  speed: WindSpeed
221
222
  """The speed of the wind."""
222
223
 
223
- gust: WindSpeed
224
+ gust: WindSpeed | None = None
224
225
  """The wind gust (sudden increase in the wind speed)."""
225
226
 
226
227
 
@@ -235,10 +236,10 @@ class Visibility(BaseModel):
235
236
  KILOMETERS = "KILOMETERS"
236
237
  MILES = "MILES"
237
238
 
238
- distance: float
239
+ distance: float | None = None
239
240
  """The visibility distance in the specified unit."""
240
241
 
241
- unit: Unit
242
+ unit: Unit = Unit.UNIT_UNSPECIFIED
242
243
  """The code that represents the unit used to measure the distance."""
243
244
 
244
245
 
@@ -290,6 +291,120 @@ class WeatherCondition(BaseModel):
290
291
  LIGHT_THUNDERSTORM_RAIN = "LIGHT_THUNDERSTORM_RAIN"
291
292
  SCATTERED_THUNDERSTORMS = "SCATTERED_THUNDERSTORMS"
292
293
  HEAVY_THUNDERSTORM = "HEAVY_THUNDERSTORM"
294
+ CLEAR_AFTER_FOG_IN_THE_MORNING = "CLEAR_AFTER_FOG_IN_THE_MORNING"
295
+ CLEAR_BUT_LATER_TURNING_CLOUDY = "CLEAR_BUT_LATER_TURNING_CLOUDY"
296
+ CLEAR_BUT_LATER_TURNING_TO_RAIN_AND_SNOW_MAIN_CONSTITUENT_RAIN = (
297
+ "CLEAR_BUT_LATER_TURNING_TO_RAIN_AND_SNOW_MAIN_CONSTITUENT_RAIN"
298
+ )
299
+ CLEAR_BUT_LATER_TURNING_TO_SNOW_AND_RAIN_MAIN_CONSTITUENT_SNOW = (
300
+ "CLEAR_BUT_LATER_TURNING_TO_SNOW_AND_RAIN_MAIN_CONSTITUENT_SNOW"
301
+ )
302
+ CLEAR_BUT_THUNDERSTORMS_LATER = "CLEAR_BUT_THUNDERSTORMS_LATER"
303
+ CLEAR_IN_THE_MORNING_BUT_CLOUDY_IN_THE_EVENING = "CLEAR_IN_THE_MORNING_BUT_CLOUDY_IN_THE_EVENING"
304
+ CLEAR_IN_THE_MORNING_WITH_BRIEF_RAIN_IN_THE_EVENING = "CLEAR_IN_THE_MORNING_WITH_BRIEF_RAIN_IN_THE_EVENING"
305
+ CLEAR_MORNING_WITH_BRIEF_RAIN = "CLEAR_MORNING_WITH_BRIEF_RAIN"
306
+ CLEAR_WITH_BRIEF_RAIN = "CLEAR_WITH_BRIEF_RAIN"
307
+ CLEAR_WITH_BRIEF_RAIN_AND_SNOW_RAIN_AS_MAIN_CONSTITUENT = "CLEAR_WITH_BRIEF_RAIN_AND_SNOW_RAIN_AS_MAIN_CONSTITUENT"
308
+ CLEAR_WITH_BRIEF_RAIN_LATER = "CLEAR_WITH_BRIEF_RAIN_LATER"
309
+ CLEAR_WITH_BRIEF_SNOW = "CLEAR_WITH_BRIEF_SNOW"
310
+ CLEAR_WITH_BRIEF_SNOW_AND_RAIN_SNOW_AS_MAIN_CONSTITUENT = "CLEAR_WITH_BRIEF_SNOW_AND_RAIN_SNOW_AS_MAIN_CONSTITUENT"
311
+ CLEAR_WITH_BRIEF_SNOW_LATER = "CLEAR_WITH_BRIEF_SNOW_LATER"
312
+ CLEAR_WITH_PERIODIC_CLOUDS_LATER = "CLEAR_WITH_PERIODIC_CLOUDS_LATER"
313
+ CLEAR_WITH_PERIODIC_RAIN = "CLEAR_WITH_PERIODIC_RAIN"
314
+ CLEAR_WITH_PERIODIC_RAIN_ACCOMPANIED_BY_THUNDER = "CLEAR_WITH_PERIODIC_RAIN_ACCOMPANIED_BY_THUNDER"
315
+ CLEAR_WITH_PERIODIC_RAIN_AND_SNOW_RAIN_AS_MAIN_CONSTITUENT = (
316
+ "CLEAR_WITH_PERIODIC_RAIN_AND_SNOW_RAIN_AS_MAIN_CONSTITUENT"
317
+ )
318
+ CLEAR_WITH_PERIODIC_RAIN_LATER = "CLEAR_WITH_PERIODIC_RAIN_LATER"
319
+ CLEAR_WITH_PERIODIC_SNOW = "CLEAR_WITH_PERIODIC_SNOW"
320
+ CLEAR_WITH_PERIODIC_SNOW_AND_RAIN_SNOW_AS_MAIN_CONSTITUENT = (
321
+ "CLEAR_WITH_PERIODIC_SNOW_AND_RAIN_SNOW_AS_MAIN_CONSTITUENT"
322
+ )
323
+ CLEAR_WITH_PERIODIC_SNOW_LATER = "CLEAR_WITH_PERIODIC_SNOW_LATER"
324
+ CLEAR_WITH_RAIN_AFTER_MIDNIGHT = "CLEAR_WITH_RAIN_AFTER_MIDNIGHT"
325
+ CLEAR_WITH_RAIN_IN_THE_NIGHT = "CLEAR_WITH_RAIN_IN_THE_NIGHT"
326
+ CLEAR_WITH_RAIN_LATER = "CLEAR_WITH_RAIN_LATER"
327
+ CLEAR_WITH_SNOW_ALONG_THE_MOUNTAINS = "CLEAR_WITH_SNOW_ALONG_THE_MOUNTAINS"
328
+ CLEAR_WITH_SNOW_LATER = "CLEAR_WITH_SNOW_LATER"
329
+ CLEAR_WITH_THUNDERSTORMS_ALONG_THE_MOUNTAINS = "CLEAR_WITH_THUNDERSTORMS_ALONG_THE_MOUNTAINS"
330
+ CLEAR_WITH_THUNDERSTORMS_IN_THE_AFTERNOON = "CLEAR_WITH_THUNDERSTORMS_IN_THE_AFTERNOON"
331
+ CLOUDY_BUT_CLEAR_LATER = "CLOUDY_BUT_CLEAR_LATER"
332
+ CLOUDY_BUT_LATER_TURNING_TO_RAIN_AND_SNOW_MAIN_CONSTITUENT_RAIN = (
333
+ "CLOUDY_BUT_LATER_TURNING_TO_RAIN_AND_SNOW_MAIN_CONSTITUENT_RAIN"
334
+ )
335
+ CLOUDY_BUT_LATER_TURNING_TO_SNOW_AND_RAIN_MAIN_CONSTITUENT_SNOW = (
336
+ "CLOUDY_BUT_LATER_TURNING_TO_SNOW_AND_RAIN_MAIN_CONSTITUENT_SNOW"
337
+ )
338
+ CLOUDY_BUT_PERIODICALLY_CLEAR_LATER = "CLOUDY_BUT_PERIODICALLY_CLEAR_LATER"
339
+ CLOUDY_BUT_THUNDERSTORMS_LATER = "CLOUDY_BUT_THUNDERSTORMS_LATER"
340
+ CLOUDY_MORNING_WITH_BRIEF_RAIN = "CLOUDY_MORNING_WITH_BRIEF_RAIN"
341
+ CLOUDY_PERIODICALLY_CLEAR = "CLOUDY_PERIODICALLY_CLEAR"
342
+ CLOUDY_SNOWING_IN_THE_EVENING = "CLOUDY_SNOWING_IN_THE_EVENING"
343
+ CLOUDY_SNOWING_IN_THE_NIGHT = "CLOUDY_SNOWING_IN_THE_NIGHT"
344
+ CLOUDY_WITH_BRIEF_RAIN = "CLOUDY_WITH_BRIEF_RAIN"
345
+ CLOUDY_WITH_BRIEF_RAIN_AND_SNOW_RAIN_AS_MAIN_CONSTITUENT = "CLOUDY_WITH_BRIEF_RAIN_AND_SNOW_RAIN_AS_MAIN_CONSTITUENT"
346
+ CLOUDY_WITH_BRIEF_RAIN_LATER = "CLOUDY_WITH_BRIEF_RAIN_LATER"
347
+ CLOUDY_WITH_BRIEF_SNOW = "CLOUDY_WITH_BRIEF_SNOW"
348
+ CLOUDY_WITH_BRIEF_SNOW_AND_RAIN_SNOW_AS_MAIN_CONSTITUENT = "CLOUDY_WITH_BRIEF_SNOW_AND_RAIN_SNOW_AS_MAIN_CONSTITUENT"
349
+ CLOUDY_WITH_BRIEF_SNOW_LATER = "CLOUDY_WITH_BRIEF_SNOW_LATER"
350
+ CLOUDY_WITH_BRIEF_THUNDERSTORM = "CLOUDY_WITH_BRIEF_THUNDERSTORM"
351
+ CLOUDY_WITH_FOG_ON_THE_OCEAN_AND_AT_THE_SEASHORE = "CLOUDY_WITH_FOG_ON_THE_OCEAN_AND_AT_THE_SEASHORE"
352
+ CLOUDY_WITH_PERIODIC_RAIN = "CLOUDY_WITH_PERIODIC_RAIN"
353
+ CLOUDY_WITH_PERIODIC_RAIN_ACCOMPANIED_BY_THUNDER = "CLOUDY_WITH_PERIODIC_RAIN_ACCOMPANIED_BY_THUNDER"
354
+ CLOUDY_WITH_PERIODIC_RAIN_AND_SNOW_RAIN_AS_MAIN_CONSTITUENT = (
355
+ "CLOUDY_WITH_PERIODIC_RAIN_AND_SNOW_RAIN_AS_MAIN_CONSTITUENT"
356
+ )
357
+ CLOUDY_WITH_PERIODIC_RAIN_LATER = "CLOUDY_WITH_PERIODIC_RAIN_LATER"
358
+ CLOUDY_WITH_PERIODIC_SNOW = "CLOUDY_WITH_PERIODIC_SNOW"
359
+ CLOUDY_WITH_PERIODIC_SNOW_ACCOMPANIED_BY_THUNDER = "CLOUDY_WITH_PERIODIC_SNOW_ACCOMPANIED_BY_THUNDER"
360
+ CLOUDY_WITH_PERIODIC_SNOW_AND_RAIN_SNOW_AS_MAIN_CONSTITUENT = (
361
+ "CLOUDY_WITH_PERIODIC_SNOW_AND_RAIN_SNOW_AS_MAIN_CONSTITUENT"
362
+ )
363
+ CLOUDY_WITH_PERIODIC_SNOW_LATER = "CLOUDY_WITH_PERIODIC_SNOW_LATER"
364
+ CLOUDY_WITH_RAIN_AFTER_MIDNIGHT = "CLOUDY_WITH_RAIN_AFTER_MIDNIGHT"
365
+ CLOUDY_WITH_RAIN_FROM_ABOUT_NOON = "CLOUDY_WITH_RAIN_FROM_ABOUT_NOON"
366
+ CLOUDY_WITH_RAIN_FROM_EVENING = "CLOUDY_WITH_RAIN_FROM_EVENING"
367
+ CLOUDY_WITH_RAIN_LATER = "CLOUDY_WITH_RAIN_LATER"
368
+ CLOUDY_WITH_SNOW_FROM_AROUND_NOON = "CLOUDY_WITH_SNOW_FROM_AROUND_NOON"
369
+ CLOUDY_WITH_SNOW_LATER = "CLOUDY_WITH_SNOW_LATER"
370
+ FOG = "FOG"
371
+ RAINSNOW_MIX_LATER_BECOMING_CLEAR_RAIN_AS_MAIN = "RAINSNOW_MIX_LATER_BECOMING_CLEAR_RAIN_AS_MAIN"
372
+ RAINSNOW_MIX_RAIN_AS_MAIN = "RAINSNOW_MIX_RAIN_AS_MAIN"
373
+ RAINY_BUT_PERIODICALLY_CLEAR = "RAINY_BUT_PERIODICALLY_CLEAR"
374
+ RAIN_ACCOMPANIED_BY_LIGHTNING = "RAIN_ACCOMPANIED_BY_LIGHTNING"
375
+ RAIN_ACCOMPANIED_BY_WINDSTORM = "RAIN_ACCOMPANIED_BY_WINDSTORM"
376
+ RAIN_CLEAR_AT_NIGHT = "RAIN_CLEAR_AT_NIGHT"
377
+ RAIN_CLEAR_FROM_AROUND_EVENING = "RAIN_CLEAR_FROM_AROUND_EVENING"
378
+ RAIN_CLEAR_FROM_AROUND_NOON = "RAIN_CLEAR_FROM_AROUND_NOON"
379
+ RAIN_LATER_BECOMING_CLEAR = "RAIN_LATER_BECOMING_CLEAR"
380
+ RAIN_LATER_BECOMING_CLOUDY = "RAIN_LATER_BECOMING_CLOUDY"
381
+ RAIN_LATER_BECOMING_SNOW = "RAIN_LATER_BECOMING_SNOW"
382
+ RAIN_LATER_WITH_PERIODIC_SNOW = "RAIN_LATER_WITH_PERIODIC_SNOW"
383
+ RAIN_SNOW_AT_NIGHT = "RAIN_SNOW_AT_NIGHT"
384
+ RAIN_SNOW_IN_THE_EVENING = "RAIN_SNOW_IN_THE_EVENING"
385
+ RAIN_TEMPORARILY_BECOMING_SLEET = "RAIN_TEMPORARILY_BECOMING_SLEET"
386
+ RAIN_THAT_PERIODICALLY_STOPS = "RAIN_THAT_PERIODICALLY_STOPS"
387
+ RAIN_WITH_BRIEF_SNOW = "RAIN_WITH_BRIEF_SNOW"
388
+ RAIN_WITH_PERIODIC_SNOW = "RAIN_WITH_PERIODIC_SNOW"
389
+ SNOWRAIN_MIX_LATER_BECOMING_CLEAR_SNOW_AS_MAIN = "SNOWRAIN_MIX_LATER_BECOMING_CLEAR_SNOW_AS_MAIN"
390
+ SNOWRAIN_MIX_LATER_BECOMING_CLOUDY_SNOW_AS_MAIN = "SNOWRAIN_MIX_LATER_BECOMING_CLOUDY_SNOW_AS_MAIN"
391
+ SNOWRAIN_MIX_SNOW_AS_MAIN = "SNOWRAIN_MIX_SNOW_AS_MAIN"
392
+ SNOW_ACCOMPANIED_BY_LIGHTNING = "SNOW_ACCOMPANIED_BY_LIGHTNING"
393
+ SNOW_BECOMING_SLEET = "SNOW_BECOMING_SLEET"
394
+ SNOW_LATER_CLEAR = "SNOW_LATER_CLEAR"
395
+ SNOW_LATER_CLOUDY = "SNOW_LATER_CLOUDY"
396
+ SNOW_LATER_RAIN = "SNOW_LATER_RAIN"
397
+ SNOW_PERIODICALLY_CLEAR = "SNOW_PERIODICALLY_CLEAR"
398
+ SNOW_THAT_PERIODICALLY_STOPS = "SNOW_THAT_PERIODICALLY_STOPS"
399
+ SNOW_TURNING_TO_RAIN_AROUND_NOON = "SNOW_TURNING_TO_RAIN_AROUND_NOON"
400
+ SNOW_TURNING_TO_RAIN_IN_THE_EVENING = "SNOW_TURNING_TO_RAIN_IN_THE_EVENING"
401
+ SNOW_TURNING_TO_RAIN_IN_THE_NIGHT = "SNOW_TURNING_TO_RAIN_IN_THE_NIGHT"
402
+ SNOW_WITH_BRIEF_RAIN = "SNOW_WITH_BRIEF_RAIN"
403
+ SNOW_WITH_BRIEF_SLEET = "SNOW_WITH_BRIEF_SLEET"
404
+ SNOW_WITH_PERIODIC_RAIN = "SNOW_WITH_PERIODIC_RAIN"
405
+ VERY_HOT = "VERY_HOT"
406
+ SLEET = "SLEET"
407
+ HEAVY_RAIN_TO_RAINSTORM = "HEAVY_RAIN_TO_RAINSTORM"
293
408
 
294
409
  icon_base_uri: str = field(metadata={"alias": "iconBaseUri"})
295
410
  """The base URI for the icon not including the file type extension."""
@@ -312,10 +427,10 @@ class IceThickness(BaseModel):
312
427
  MILLIMETERS = "MILLIMETERS"
313
428
  INCHES = "INCHES"
314
429
 
315
- thickness: float
430
+ thickness: float | None = None
316
431
  """The ice thickness value."""
317
432
 
318
- unit: Unit
433
+ unit: Unit = Unit.UNIT_UNSPECIFIED
319
434
  """The code that represents the unit used to measure the ice thickness."""
320
435
 
321
436
 
@@ -335,6 +450,9 @@ class CurrentConditionsHistory(BaseModel):
335
450
  qpf: QuantitativePrecipitationForecast
336
451
  """The amount of precipitation (rain or snow) accumulated over the last 24 hours."""
337
452
 
453
+ snow_qpf: QuantitativePrecipitationForecast | None = field(default=None, metadata={"alias": "snowQpf"})
454
+ """The amount of snow accumulation over the last 24 hours, measured as liquid water equivalent."""
455
+
338
456
 
339
457
  @dataclass
340
458
  class CurrentConditionsResponse(BaseModel):
@@ -388,11 +506,11 @@ class CurrentConditionsResponse(BaseModel):
388
506
  uv_index: int = field(metadata={"alias": "uvIndex"})
389
507
  """The current ultraviolet (UV) index."""
390
508
 
391
- thunderstorm_probability: int = field(metadata={"alias": "thunderstormProbability"})
392
- """The current thunderstorm probability (0-100)."""
509
+ thunderstorm_probability: int | None = field(default=None, metadata={"alias": "thunderstormProbability"})
510
+ """The current thunderstorm probability (0-100). Omitted in some regions (e.g. Japan and South Korea)."""
393
511
 
394
- cloud_cover: int = field(metadata={"alias": "cloudCover"})
395
- """The current percentage of the sky covered by clouds (0-100)."""
512
+ cloud_cover: int | None = field(default=None, metadata={"alias": "cloudCover"})
513
+ """The current percentage of the sky covered by clouds (0-100). Omitted in some regions (e.g. Japan and South Korea)."""
396
514
 
397
515
 
398
516
  @dataclass
@@ -411,7 +529,7 @@ class Date(BaseModel):
411
529
 
412
530
  @dataclass
413
531
  class ForecastDayPart(BaseModel):
414
- """Represents a forecast record for a part of the day (daytime or nighttime)."""
532
+ """Represents a forecast record for a part of the day (daytime, nighttime, or full day)."""
415
533
 
416
534
  interval: Interval
417
535
  """The UTC date and time when this part of the day starts and ends."""
@@ -431,11 +549,11 @@ class ForecastDayPart(BaseModel):
431
549
  uv_index: int = field(metadata={"alias": "uvIndex"})
432
550
  """The maximum forecasted ultraviolet (UV) index."""
433
551
 
434
- thunderstorm_probability: int = field(metadata={"alias": "thunderstormProbability"})
435
- """The average thunderstorm probability."""
552
+ thunderstorm_probability: int | None = field(default=None, metadata={"alias": "thunderstormProbability"})
553
+ """The average thunderstorm probability. Omitted in some regions (e.g. Japan and South Korea)."""
436
554
 
437
- cloud_cover: int = field(metadata={"alias": "cloudCover"})
438
- """Average cloud cover percent."""
555
+ cloud_cover: int | None = field(default=None, metadata={"alias": "cloudCover"})
556
+ """Average cloud cover percent. Omitted in some regions (e.g. Japan and South Korea)."""
439
557
 
440
558
  ice_thickness: IceThickness | None = field(default=None, metadata={"alias": "iceThickness"})
441
559
  """The forecasted ice thickness."""
@@ -459,7 +577,7 @@ class MoonEvents(BaseModel):
459
577
  class MoonPhase(ApiStrEnum):
460
578
  """Marks the moon phase (a.k.a. lunar phase)."""
461
579
 
462
- MOON_PHASE_UNSPECIFIED = "MOON_PHASE_UNSPECIFIED"
580
+ PHASE_UNSPECIFIED = "PHASE_UNSPECIFIED"
463
581
  NEW_MOON = "NEW_MOON"
464
582
  WAXING_CRESCENT = "WAXING_CRESCENT"
465
583
  FIRST_QUARTER = "FIRST_QUARTER"
@@ -489,12 +607,6 @@ class ForecastDay(BaseModel):
489
607
  display_date: Date = field(metadata={"alias": "displayDate"})
490
608
  """The local date in the time zone of the location."""
491
609
 
492
- daytime_forecast: ForecastDayPart = field(metadata={"alias": "daytimeForecast"})
493
- """The forecasted weather conditions for the daytime part of the day."""
494
-
495
- nighttime_forecast: ForecastDayPart = field(metadata={"alias": "nighttimeForecast"})
496
- """The forecasted weather conditions for the nighttime part of the day."""
497
-
498
610
  max_temperature: Temperature = field(metadata={"alias": "maxTemperature"})
499
611
  """The maximum (high) temperature throughout the day."""
500
612
 
@@ -516,6 +628,15 @@ class ForecastDay(BaseModel):
516
628
  moon_events: MoonEvents = field(metadata={"alias": "moonEvents"})
517
629
  """The events related to the moon (e.g. moonrise, moonset)."""
518
630
 
631
+ daytime_forecast: ForecastDayPart | None = field(default=None, metadata={"alias": "daytimeForecast"})
632
+ """The forecasted weather conditions for the daytime part of the day."""
633
+
634
+ nighttime_forecast: ForecastDayPart | None = field(default=None, metadata={"alias": "nighttimeForecast"})
635
+ """The forecasted weather conditions for the nighttime part of the day."""
636
+
637
+ full_day_forecast: ForecastDayPart | None = field(default=None, metadata={"alias": "fullDayForecast"})
638
+ """The forecasted weather conditions for the full day (returned instead of daytime/nighttime in Japan and South Korea)."""
639
+
519
640
  ice_thickness: IceThickness | None = field(default=None, metadata={"alias": "iceThickness"})
520
641
  """The accumulated amount of ice throughout the entire day."""
521
642
 
@@ -618,11 +739,11 @@ class ForecastHour(BaseModel):
618
739
  uv_index: int = field(metadata={"alias": "uvIndex"})
619
740
  """The forecasted ultraviolet (UV) index."""
620
741
 
621
- thunderstorm_probability: int = field(metadata={"alias": "thunderstormProbability"})
622
- """The forecasted thunderstorm probability (0-100)."""
742
+ thunderstorm_probability: int | None = field(default=None, metadata={"alias": "thunderstormProbability"})
743
+ """The forecasted thunderstorm probability (0-100). Omitted in some regions (e.g. Japan and South Korea)."""
623
744
 
624
- cloud_cover: int = field(metadata={"alias": "cloudCover"})
625
- """The forecasted percentage of the sky covered by clouds (0-100)."""
745
+ cloud_cover: int | None = field(default=None, metadata={"alias": "cloudCover"})
746
+ """The forecasted percentage of the sky covered by clouds (0-100). Omitted in some regions (e.g. Japan and South Korea)."""
626
747
 
627
748
  ice_thickness: IceThickness | None = field(default=None, metadata={"alias": "iceThickness"})
628
749
  """The forecasted ice thickness."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-google-weather-api
3
- Version: 0.0.10
3
+ Version: 0.0.11
4
4
  Summary: A python client library for Google Weather API
5
5
  Author-email: tronikos <tronikos@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -0,0 +1,10 @@
1
+ google_weather_api/__init__.py,sha256=sOOI0Muwa4HERSM6W1OCtumAasjuV_7WkCFKEDm3T8c,1691
2
+ google_weather_api/api.py,sha256=m8P4RGegQPS--eDvotlF4LXK8ZglcjLJqydsv9MMiHY,8198
3
+ google_weather_api/exceptions.py,sha256=z4rKXfRZLhkFLt1MISki1-nTxV_5Uc14ppjW7qu0ZNQ,708
4
+ google_weather_api/model.py,sha256=6PKYNwBp6cjLQiCTgTxs_L75VjkrsJVY5sgj00tJiMA,33879
5
+ google_weather_api/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ python_google_weather_api-0.0.11.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
7
+ python_google_weather_api-0.0.11.dist-info/METADATA,sha256=p_PP-eNyR9kjornyCu3efxa-UN7aIM_Gyw4QQyyph_8,1413
8
+ python_google_weather_api-0.0.11.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
9
+ python_google_weather_api-0.0.11.dist-info/top_level.txt,sha256=ZkFbtKDHz3vUJhH6DGEPVLj3PPeNpR9-Wg0f4HqGD78,19
10
+ python_google_weather_api-0.0.11.dist-info/RECORD,,
@@ -1,10 +0,0 @@
1
- google_weather_api/__init__.py,sha256=sOOI0Muwa4HERSM6W1OCtumAasjuV_7WkCFKEDm3T8c,1691
2
- google_weather_api/api.py,sha256=K2G4kh7JN8E9h1HJ4EBDGKBd6DyoryTKyQ7qaZZmSNw,7707
3
- google_weather_api/exceptions.py,sha256=z4rKXfRZLhkFLt1MISki1-nTxV_5Uc14ppjW7qu0ZNQ,708
4
- google_weather_api/model.py,sha256=Mj7eOhu696KXFpuEEXxobQeMUG2aKDjO2D3lGPLugP0,24927
5
- google_weather_api/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- python_google_weather_api-0.0.10.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
7
- python_google_weather_api-0.0.10.dist-info/METADATA,sha256=KgAggQCD2_viCLkwk283XyosqwN2mOi00yRB2rOIay4,1413
8
- python_google_weather_api-0.0.10.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
9
- python_google_weather_api-0.0.10.dist-info/top_level.txt,sha256=ZkFbtKDHz3vUJhH6DGEPVLj3PPeNpR9-Wg0f4HqGD78,19
10
- python_google_weather_api-0.0.10.dist-info/RECORD,,