Cleanup weather_data.py.
[python_utils.git] / cached / weather_data.py
index 1b0bef429d4dfcc751e9bf52060c1371080f71d4..8793bd315940b8ef16fb63d059b14b178fabc153 100644 (file)
@@ -1,13 +1,17 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 
+# © Copyright 2021-2022, Scott Gasch
+
+"""How's the weather?"""
+
 import datetime
 import json
 import logging
 import os
 import urllib.request
 from dataclasses import dataclass
-from typing import Any, List
+from typing import Any, Dict, List, Optional
 
 from overrides import overrides
 
@@ -16,6 +20,8 @@ import config
 import datetime_utils
 import list_utils
 import persistent
+import scott_secrets
+import type_utils
 
 logger = logging.getLogger(__name__)
 
@@ -52,7 +58,7 @@ class WeatherData:
 
 @persistent.persistent_autoloaded_singleton()  # type: ignore
 class CachedWeatherData(persistent.Persistent):
-    def __init__(self, weather_data=None):
+    def __init__(self, weather_data: Dict[datetime.date, WeatherData] = None):
         if weather_data is not None:
             self.weather_data = weather_data
             return
@@ -76,12 +82,12 @@ class CachedWeatherData(persistent.Persistent):
         }
         now = datetime.datetime.now()
         dates = set()
-        highs = {}
-        lows = {}
-        conditions = {}
-        precip = {}
+        highs: Dict[datetime.date, Optional[float]] = {}
+        lows: Dict[datetime.date, Optional[float]] = {}
+        conditions: Dict[datetime.date, List[str]] = {}
+        precip: Dict[datetime.date, float] = {}
         param = "id=5786882"  # Bellevue, WA
-        key = "c0b160c49743622f62a9cd3cda0270b3"
+        key = scott_secrets.OPEN_WEATHER_MAP_KEY
         www = urllib.request.urlopen(
             f'http://api.openweathermap.org/data/2.5/weather?zip=98005,us&APPID={key}&units=imperial'
         )
@@ -169,8 +175,8 @@ class CachedWeatherData(persistent.Persistent):
                 icon = '🌙'
             self.weather_data[dt] = WeatherData(
                 date=dt,
-                high=highs[dt],
-                low=lows[dt],
+                high=type_utils.unwrap_optional(highs[dt]),
+                low=type_utils.unwrap_optional(lows[dt]),
                 precipitation_inches=precip[dt] / 25.4,
                 conditions=conditions[dt],
                 most_common_condition=most_common_condition,