4
4
import sys
5
5
import os
6
6
import json
7
- from typing import Dict , Tuple
7
+ from typing import Dict , Tuple , List
8
8
from datetime import datetime
9
+ from datetime import timedelta
9
10
import csv
10
11
11
- def get_weather_csv ():
12
+ def get_weather_csv () -> List [ Dict [ str , str ]] :
12
13
csv_path = '/etc/ohmyoled/ecIcons_utf8.csv'
13
14
return list (csv .DictReader (open (csv_path )))
14
- def build_weather_icons ():
15
+ def build_weather_icons () -> str :
15
16
csv = get_weather_csv ()
16
17
icon = {}
17
18
for icn in csv :
18
19
icon .update ({icn ["OWMCode" ]: WeatherIcon (icn ['OWMCode' ], icn ['Description' ], icn ['fontcode' ], icn ['font' ])})
19
20
return icon
20
21
21
22
class WeatherIcon ():
22
- def __init__ (self , owm_id , description , fontcode , font ) -> None :
23
+ def __init__ (self , owm_id : str , description : str , fontcode : str , font : str ) -> None :
23
24
self .owm_id = owm_id
24
25
self .description = description
25
26
self .fontcode = fontcode
26
27
self .font = font
27
28
28
29
@property
29
- def get_owm_id (self ):
30
+ def get_owm_id (self ) -> str :
30
31
return self .owm_id
31
32
@property
32
- def get_description (self ):
33
+ def get_description (self ) -> str :
33
34
return self .description
34
35
@property
35
- def get_fontcode (self ):
36
+ def get_fontcode (self ) -> str :
36
37
return self .fontcode
37
38
@property
38
- def get_font (self ):
39
+ def get_font (self ) -> str :
39
40
return self .font
40
41
41
42
@@ -46,14 +47,14 @@ class WeatherApi(Runner):
46
47
To parse the config file and
47
48
Run Data
48
49
"""
49
- def __init__ (self , config ):
50
+ def __init__ (self , config ) -> None :
50
51
super ().__init__ (config )
51
52
self .weather = self .config ['weather' ]
52
53
try :
53
54
if "open_weather_token" in self .config ['basic' ]:
54
- self .token = self .config ['basic' ].get ('open_weather_token' )
55
+ self .token : str = self .config ['basic' ].get ('open_weather_token' )
55
56
else :
56
- self .token = os .environ ['WEATHERTOKEN' ]
57
+ self .token : str = os .environ ['WEATHERTOKEN' ]
57
58
except KeyError :
58
59
self .logger .critical ("No Weather Token" )
59
60
sys .exit ("No Weather Token" )
@@ -80,7 +81,7 @@ async def get_long_and_lat(self, location: str=None, zipcode: int=None) -> Tuple
80
81
self .logger .debug ("Getting Lat and Long" )
81
82
try :
82
83
if location :
83
- self .logger .debug ("Getting Longitude and Latitude" )
84
+ self .logger .debug ("Computing Longitude and Latitude" )
84
85
url = f'http://api.openweathermap.org/data/2.5/weather?q={ location } &appid={ self .token } '
85
86
response = await self .get_data (url )
86
87
lon = response .get ('coord' ).get ('lon' )
@@ -91,7 +92,8 @@ async def get_long_and_lat(self, location: str=None, zipcode: int=None) -> Tuple
91
92
except Exception as e :
92
93
self .logger .critical (e )
93
94
sys .exit ("No City Found" )
94
- def get_current_location (self ):
95
+
96
+ def get_current_location (self ) -> Dict [str , str ]:
95
97
url = 'http://ipinfo.io/json'
96
98
response = self .run_non_async_request (url )
97
99
return response .json ()
@@ -100,9 +102,9 @@ async def url_builder(self, location=None, zipcode=None, current_location=False)
100
102
"""
101
103
Builds Url to poll the Api
102
104
"""
103
- self .logger .debug ("Building url..." )
105
+ self .logger .debug ("Building Weather url..." )
104
106
if current_location :
105
- ip_json = self .get_current_location ()
107
+ ip_json : Dict [ str , str ] = self .get_current_location ()
106
108
lon , lat = ip_json ['loc' ].split (',' )[1 ], ip_json ['loc' ].split (',' )[0 ]
107
109
url = f"https://api.openweathermap.org/data/2.5/onecall?lat={ lat } &lon={ lon } &appid={ self .token } &units={ self .weather .get ('format' )} "
108
110
elif location :
@@ -114,15 +116,8 @@ async def url_builder(self, location=None, zipcode=None, current_location=False)
114
116
url = f"https://api.openweathermap.org/data/2.5/onecall?lat={ lat } &lon={ lon } &appid={ self .token } &units={ self .weather .get ('format' )} "
115
117
return url
116
118
117
- async def run (self ):
118
- """
119
- Get Args
120
- parse args
121
- Build URL
122
- make request
123
- return Json
124
- """
125
- self .logger .info ("Using to get Weather" )
119
+ async def run (self ) -> Dict :
120
+ self .logger .info ("Running Api for Weather" )
126
121
args = await self .parse_args ()
127
122
api_data = await self .get_data (args )
128
123
api_data ['name' ] = self .get_current_location ()['city' ]
@@ -180,89 +175,89 @@ def __repr__(self) -> str:
180
175
return f"Weather(\n { joined_attrs } )"
181
176
182
177
@property
183
- def get_wind_speed (self ):
178
+ def get_wind_speed (self ) -> int :
184
179
return self ._wind_speed
185
180
186
- def set_wind_speed (self , speed ) :
181
+ def set_wind_speed (self , speed : int ) -> None :
187
182
self ._wind_speed = speed
188
183
189
184
@property
190
- def get_daily (self ):
185
+ def get_daily (self ) -> Dict [ str , str ] :
191
186
return self ._daily
192
187
193
188
@property
194
- def get_wind_deg (self ):
189
+ def get_wind_deg (self ) -> int :
195
190
return self ._wind_deg
196
191
197
192
@property
198
- def get_precipitation (self ):
193
+ def get_precipitation (self ) -> int :
199
194
return self ._pop * 100
200
195
201
196
@property
202
- def get_uv (self ):
197
+ def get_uv (self ) -> int :
203
198
return self ._uv
204
199
205
- def set_place (self , place ) :
200
+ def set_place (self , place : str ) -> None :
206
201
self ._place = place
207
202
208
203
@property
209
- def get_place (self ):
204
+ def get_place (self ) -> str :
210
205
return self ._place
211
206
212
- def set_weather (self , weather ) :
207
+ def set_weather (self , weather : Dict [ str , str ]) -> None :
213
208
self ._weather = weather
214
209
215
210
@property
216
- def get_weather (self ):
211
+ def get_weather (self ) -> Dict [ str , str ] :
217
212
return self ._weather
218
213
219
- def set_conditions (self , conditions ) :
214
+ def set_conditions (self , conditions : str ) -> None :
220
215
self ._conditions = conditions
221
216
222
217
@property
223
- def get_conditions (self ):
218
+ def get_conditions (self ) -> str :
224
219
return self ._conditions
225
220
226
- def set_weather_icon (self , icon ) :
221
+ def set_weather_icon (self , icon : str ) -> None :
227
222
self ._weather_icon = icon
228
223
229
224
@property
230
- def get_weather_icon (self ):
225
+ def get_weather_icon (self ) -> str :
231
226
return self ._weather_icon
232
227
233
- def set_temp (self , temp ) :
228
+ def set_temp (self , temp : int ) -> None :
234
229
self ._temp = temp
235
230
236
231
@property
237
- def get_temp (self ):
232
+ def get_temp (self ) -> int :
238
233
return self ._temp
239
234
240
- def set_feels_like (self , feels ):
235
+ def set_feels_like (self , feels : int ):
241
236
self ._feels_like = feels
242
237
243
238
@property
244
- def get_feels_like (self ):
239
+ def get_feels_like (self ) -> int :
245
240
return self ._feels_like
246
241
247
- def set_min_temp (self , temp ) :
242
+ def set_min_temp (self , temp : int ) -> None :
248
243
self ._min_temp = temp
249
244
250
245
@property
251
- def get_min_temp (self ):
246
+ def get_min_temp (self ) -> int :
252
247
return self ._min_temp
253
248
254
- def set_max_temp (self , temp ) :
249
+ def set_max_temp (self , temp : int ) -> None :
255
250
self ._max_temp = temp
256
251
257
252
@property
258
- def get_max_temp (self ):
253
+ def get_max_temp (self ) -> int :
259
254
return self ._max_temp
260
255
261
- def set_humidity (self , humidity ) :
256
+ def set_humidity (self , humidity : int ) -> None :
262
257
self ._humidity = humidity
263
258
264
259
@property
265
- def get_humidity (self ):
260
+ def get_humidity (self ) -> None :
266
261
return self ._humidity
267
262
268
263
def set_wind (self , wind : Dict ) -> None :
@@ -272,14 +267,14 @@ def set_wind(self, wind: Dict) -> None:
272
267
def get_wind (self ) -> Dict :
273
268
return self ._wind
274
269
275
- def set_time (self , time ) -> None :
270
+ def set_time (self , time : int ) -> None :
276
271
self ._time = datetime .fromtimestamp (time )
277
272
278
273
@property
279
274
def get_time (self ) -> datetime :
280
275
return self ._time
281
276
282
- def set_sunrise (self , time ) -> None :
277
+ def set_sunrise (self , time : int ) -> None :
283
278
self ._sunrise = datetime .fromtimestamp (time )
284
279
285
280
@property
@@ -293,5 +288,5 @@ def set_sunset(self, time) -> None:
293
288
def get_sunset (self ) -> datetime :
294
289
return self ._sunset
295
290
296
- def calculate_duration_of_daylight (self ):
291
+ def calculate_duration_of_daylight (self ) -> timedelta :
297
292
return self ._sunset - self ._time
0 commit comments