weathergrabber 0.0.8b3__py3-none-any.whl → 0.0.8b5__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.
- weathergrabber/__init__.py +1 -1
- weathergrabber/__main__.py +1 -1
- weathergrabber/adapter/tty/console_tty.py +2 -2
- weathergrabber/adapter/tty/waybar_tty.py +6 -6
- weathergrabber/cli.py +0 -3
- weathergrabber/domain/air_quality_index.py +17 -19
- weathergrabber/domain/city_location.py +5 -4
- weathergrabber/domain/color.py +28 -16
- weathergrabber/domain/health_activities.py +3 -3
- weathergrabber/domain/moon_phase_enum.py +1 -0
- weathergrabber/domain/uv_index.py +3 -3
- weathergrabber/domain/weather_icon_enum.py +1 -0
- weathergrabber/service/extract_aqi_service.py +8 -11
- {weathergrabber-0.0.8b3.dist-info → weathergrabber-0.0.8b5.dist-info}/METADATA +1 -1
- {weathergrabber-0.0.8b3.dist-info → weathergrabber-0.0.8b5.dist-info}/RECORD +19 -19
- {weathergrabber-0.0.8b3.dist-info → weathergrabber-0.0.8b5.dist-info}/WHEEL +0 -0
- {weathergrabber-0.0.8b3.dist-info → weathergrabber-0.0.8b5.dist-info}/entry_points.txt +0 -0
- {weathergrabber-0.0.8b3.dist-info → weathergrabber-0.0.8b5.dist-info}/licenses/LICENSE +0 -0
- {weathergrabber-0.0.8b3.dist-info → weathergrabber-0.0.8b5.dist-info}/top_level.txt +0 -0
weathergrabber/__init__.py
CHANGED
weathergrabber/__main__.py
CHANGED
|
@@ -82,7 +82,7 @@ class ConsoleTTY:
|
|
|
82
82
|
# Hourly predictions and daily predictions
|
|
83
83
|
hourly_predictions = [
|
|
84
84
|
f"{h['title']}"
|
|
85
|
-
f"{'\t' if len(h['title']) < 3 else ''}
|
|
85
|
+
f"{'\t\t' if len(h['title']) < 3 else '\t'}"
|
|
86
86
|
f"{h['temperature']}"
|
|
87
87
|
"\t"
|
|
88
88
|
f"{h['icon']}\t"
|
|
@@ -92,7 +92,7 @@ class ConsoleTTY:
|
|
|
92
92
|
|
|
93
93
|
daily_predictions = [
|
|
94
94
|
f"{d['title']}"
|
|
95
|
-
f"{'\t' if len(d['title']) < 3 else ''}
|
|
95
|
+
f"{'\t\t' if len(d['title']) < 3 else '\t'}"
|
|
96
96
|
f"{d['high_low']}"
|
|
97
97
|
f"\t"
|
|
98
98
|
f"{d['icon']}\t"
|
|
@@ -62,12 +62,12 @@ class WaybarTTY:
|
|
|
62
62
|
|
|
63
63
|
#Air quality index
|
|
64
64
|
color = forecast.air_quality_index.color.hex
|
|
65
|
-
aqi_category = f" <span color=\"{color}\">{forecast.air_quality_index.category}</span>"
|
|
65
|
+
aqi_category = f" <span color=\"#{color}\">{forecast.air_quality_index.category}</span>"
|
|
66
66
|
aqi_acronym = forecast.air_quality_index.acronym
|
|
67
67
|
aqi_value = forecast.air_quality_index.value
|
|
68
68
|
|
|
69
69
|
hourly_predictions_format = [{
|
|
70
|
-
'title': h.title if len(h.title) <
|
|
70
|
+
'title': h.title if len(h.title) < 9 else h.title[:8] + '.',
|
|
71
71
|
'temperature' : h.temperature,
|
|
72
72
|
'icon': h.icon.fa_icon if is_fa else h.icon.emoji_icon,
|
|
73
73
|
'precipitation': f"{h.precipitation.percentage if h.precipitation.percentage else ''}"
|
|
@@ -75,7 +75,7 @@ class WaybarTTY:
|
|
|
75
75
|
|
|
76
76
|
daily_predictions_format = [
|
|
77
77
|
{
|
|
78
|
-
'title': d.title if len(d.title) <
|
|
78
|
+
'title': d.title if len(d.title) < 9 else d.title[:8] + '.',
|
|
79
79
|
'high_low': f"{d.high_low.high}/<span size='small'>{d.high_low.low}</span>",
|
|
80
80
|
'icon': d.icon.fa_icon if is_fa else d.icon.emoji_icon,
|
|
81
81
|
'precipitation': f"{d.precipitation.percentage}"
|
|
@@ -85,7 +85,7 @@ class WaybarTTY:
|
|
|
85
85
|
# Hourly predictions and daily predictions
|
|
86
86
|
hourly_predictions = [
|
|
87
87
|
f"{h['title']}"
|
|
88
|
-
f"{'\t\t' if len(h['title']) <
|
|
88
|
+
f"{'\t\t' if len(h['title']) < 5 else '\t'}"
|
|
89
89
|
f"{h['temperature']}"
|
|
90
90
|
"\t\t"
|
|
91
91
|
f"{h['icon']}\t"
|
|
@@ -95,9 +95,9 @@ class WaybarTTY:
|
|
|
95
95
|
|
|
96
96
|
daily_predictions = [
|
|
97
97
|
f"{d['title']}"
|
|
98
|
-
f"
|
|
98
|
+
f"{'\t\t' if len(d['title']) < 5 else '\t'}"
|
|
99
99
|
f"{d['high_low']}"
|
|
100
|
-
f"
|
|
100
|
+
f"{'\t\t' if len(d['high_low']) < 32 else '\t'}"
|
|
101
101
|
f"{d['icon']}\t"
|
|
102
102
|
f"{rain_icon} {d['precipitation']}"
|
|
103
103
|
for d in daily_predictions_format
|
weathergrabber/cli.py
CHANGED
|
@@ -45,34 +45,32 @@ class AirQualityIndex:
|
|
|
45
45
|
return f"Title: {self.title}. AQI: {self.value}, Category: {self.category}, Description: {self.description}, Acronym: {self.acronym}, Color: {self.color}"
|
|
46
46
|
|
|
47
47
|
def __repr__(self) -> str:
|
|
48
|
-
return f"AirQualityIndex(title={self.title}, value={self.value}, category={self.category}, description={self.description}, acronym
|
|
48
|
+
return f"AirQualityIndex(title='{self.title}', value={self.value}, category='{self.category}', description='{self.description}', acronym='{self.acronym}', color='{self.color}')"
|
|
49
49
|
|
|
50
50
|
@staticmethod
|
|
51
51
|
def _extract_aqi(data: str):
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
52
|
+
try:
|
|
53
|
+
parts = data.split('\n')
|
|
54
|
+
title = parts[0].strip()
|
|
55
|
+
aqi = int(parts[1].strip())
|
|
56
|
+
category = parts[2].strip() if len(parts) > 2 else None
|
|
57
|
+
description = parts[3].strip() if len(parts) > 3 else None
|
|
58
|
+
acronym = ''.join(word[0].strip().upper() for word in title.split())
|
|
58
59
|
|
|
59
|
-
|
|
60
|
+
return title, aqi, category, description, acronym
|
|
61
|
+
except (ValueError, IndexError) as e:
|
|
62
|
+
raise ValueError("Invalid AQI data format") from e
|
|
60
63
|
|
|
61
64
|
# 'Air Quality Index\n26\nGood\nAir quality is considered satisfactory, and air pollution poses little or no risk.'
|
|
62
65
|
@classmethod
|
|
63
66
|
def from_string(cls, data: str) -> 'AirQualityIndex':
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return cls(title, aqi, category, description, acronym)
|
|
67
|
-
except (ValueError, IndexError) as e:
|
|
68
|
-
raise ValueError("Invalid AQI data format") from e
|
|
67
|
+
title, aqi, category, description, acronym = AirQualityIndex._extract_aqi(data)
|
|
68
|
+
return cls(title, aqi, category, description, acronym)
|
|
69
69
|
|
|
70
70
|
@classmethod
|
|
71
71
|
def aqi_color_from_string(cls, aqi_data: str, color_data: str):
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
except(ValueError, IndexError) as e:
|
|
77
|
-
raise ValueError("Invalid AQI data format or color data format") from e
|
|
72
|
+
title, aqi, category, description, acronym = AirQualityIndex._extract_aqi(aqi_data)
|
|
73
|
+
color = Color.from_string(color_data)
|
|
74
|
+
return cls(title, aqi, category, description, acronym, color)
|
|
75
|
+
|
|
78
76
|
|
|
@@ -46,9 +46,12 @@ class CityLocation:
|
|
|
46
46
|
country, state_province, city, location = None, None, None, None
|
|
47
47
|
parts = data.split(", ")
|
|
48
48
|
|
|
49
|
+
if data.strip() == "":
|
|
50
|
+
raise ValueError("City location string cannot be empty")
|
|
51
|
+
|
|
49
52
|
if len(parts) > 2:
|
|
50
53
|
i = len(parts) - 1
|
|
51
|
-
while i
|
|
54
|
+
while i >= 0:
|
|
52
55
|
if not country:
|
|
53
56
|
country = parts[i]
|
|
54
57
|
elif not state_province:
|
|
@@ -66,6 +69,4 @@ class CityLocation:
|
|
|
66
69
|
return cls(city=city, state_province=state_province)
|
|
67
70
|
elif len(parts) == 1:
|
|
68
71
|
city = parts[0]
|
|
69
|
-
return cls(city=city)
|
|
70
|
-
else:
|
|
71
|
-
raise ValueError("Invalid city location string format")
|
|
72
|
+
return cls(city=city)
|
weathergrabber/domain/color.py
CHANGED
|
@@ -1,22 +1,29 @@
|
|
|
1
1
|
import re
|
|
2
2
|
|
|
3
3
|
class Color:
|
|
4
|
-
|
|
5
|
-
def __init__(self, red: str, green: str, blue: str):
|
|
6
|
-
self._red = red
|
|
7
|
-
self._green = green
|
|
8
|
-
self._blue = blue
|
|
4
|
+
|
|
5
|
+
def __init__(self, red: str | int, green: str | int, blue: str | int):
|
|
6
|
+
self._red = self._int_or_hex(red)
|
|
7
|
+
self._green = self._int_or_hex(green)
|
|
8
|
+
self._blue = self._int_or_hex(blue)
|
|
9
|
+
|
|
10
|
+
def _int_or_hex(self, value: str | int) -> int:
|
|
11
|
+
if type(value) == int:
|
|
12
|
+
if not (0 <= value <= 255):
|
|
13
|
+
raise ValueError("RGB integer values must be between 0 and 255")
|
|
14
|
+
return value
|
|
15
|
+
return int(value, 16)
|
|
9
16
|
|
|
10
17
|
@property
|
|
11
|
-
def red(self):
|
|
18
|
+
def red(self) -> int:
|
|
12
19
|
return self._red
|
|
13
20
|
|
|
14
21
|
@property
|
|
15
|
-
def green(self):
|
|
22
|
+
def green(self) -> int:
|
|
16
23
|
return self._green
|
|
17
24
|
|
|
18
25
|
@property
|
|
19
|
-
def blue(self):
|
|
26
|
+
def blue(self) -> int:
|
|
20
27
|
return self._blue
|
|
21
28
|
|
|
22
29
|
@classmethod
|
|
@@ -24,20 +31,25 @@ class Color:
|
|
|
24
31
|
|
|
25
32
|
color_pattern = r"#([0-9A-Fa-f]{6})"
|
|
26
33
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
try:
|
|
35
|
+
match = re.search(color_pattern, string_value)
|
|
36
|
+
color = f"#{match.group(1)}"
|
|
37
|
+
hex_color = color.lstrip('#')
|
|
38
|
+
r, g, b = hex_color[:2], hex_color[2:4], hex_color[4:]
|
|
39
|
+
return cls(r, g, b)
|
|
40
|
+
except (AttributeError, ValueError):
|
|
41
|
+
raise ValueError(f"Invalid color string: {string_value}")
|
|
42
|
+
|
|
34
43
|
@property
|
|
35
44
|
def hex(self) -> str:
|
|
36
|
-
return f"
|
|
45
|
+
return f"{self.red:02x}{self.green:02x}{self.blue:02x}".upper()
|
|
37
46
|
|
|
38
47
|
@property
|
|
39
48
|
def rgb(self) -> str:
|
|
40
49
|
return f"rgb({self.red}, {self.green}, {self.blue})"
|
|
41
50
|
|
|
51
|
+
def __str__(self):
|
|
52
|
+
return f"{self.hex}"
|
|
53
|
+
|
|
42
54
|
def __repr__(self):
|
|
43
55
|
return f"Color(red='{self.red}', green='{self.green}', blue='{self.blue}')"
|
|
@@ -23,8 +23,8 @@ class HealthActivities:
|
|
|
23
23
|
return f"HealthActivities(category_name={self._category_name!r}, title={self._title!r}, description={self._description!r})"
|
|
24
24
|
|
|
25
25
|
# 'Health & Activities\nGrass\nSeasonal Allergies and Pollen Count Forecast\nGrass pollen is low in your area'
|
|
26
|
-
@
|
|
27
|
-
def from_text(text: str):
|
|
26
|
+
@classmethod
|
|
27
|
+
def from_text(cls, text: str):
|
|
28
28
|
try:
|
|
29
29
|
lines = text.split('\n')
|
|
30
30
|
if len(lines) >= 4:
|
|
@@ -32,7 +32,7 @@ class HealthActivities:
|
|
|
32
32
|
#Ignore the "grass" line
|
|
33
33
|
title = lines[2].strip()
|
|
34
34
|
description = ' '.join(line.strip() for line in lines[3:]).strip()
|
|
35
|
-
return
|
|
35
|
+
return cls(category_name, title, description)
|
|
36
36
|
else:
|
|
37
37
|
raise ValueError("Insufficient data to parse HealthActivities")
|
|
38
38
|
except Exception as e:
|
|
@@ -38,6 +38,7 @@ class MoonPhaseEnum(Enum):
|
|
|
38
38
|
PHASE_26 = ("phase-26", "\uf186", "🌘")
|
|
39
39
|
PHASE_27 = ("phase-27", "\uf186", "🌘")
|
|
40
40
|
PHASE_28 = ("phase-28", "\uf186", "🌘")
|
|
41
|
+
PHASE_29 = ("phase-29", "\uf186", "🌑")
|
|
41
42
|
DEFAULT = ("default", "\uf186", "🌑")
|
|
42
43
|
|
|
43
44
|
def __init__(self, name: str, fa_icon: str, emoji_icon: str):
|
|
@@ -24,14 +24,14 @@ class UVIndex:
|
|
|
24
24
|
|
|
25
25
|
@classmethod
|
|
26
26
|
def from_string(cls, data: str, label: str = None) -> 'UVIndex':
|
|
27
|
+
if not data:
|
|
28
|
+
raise ValueError("UV Index string cannot be empty")
|
|
27
29
|
parts = data.split(' ')
|
|
28
30
|
if len(parts) == 1:
|
|
29
31
|
return cls(string_value = data, index= parts[0].strip(), of="", label=label)
|
|
30
32
|
elif len(parts) == 3:
|
|
31
33
|
index, of, some = parts
|
|
32
34
|
return cls(string_value = data, index=index.strip(), of=some.strip(), label=label)
|
|
33
|
-
elif len(data) == 0:
|
|
34
|
-
raise ValueError("UV Index string cannot be empty")
|
|
35
35
|
else:
|
|
36
36
|
return cls(string_value = data, index="", of="", label=label)
|
|
37
37
|
|
|
@@ -41,5 +41,5 @@ class UVIndex:
|
|
|
41
41
|
def __str__(self) -> str:
|
|
42
42
|
if self.string_value:
|
|
43
43
|
return f"{self.label} {self.string_value}"
|
|
44
|
-
|
|
44
|
+
else:
|
|
45
45
|
return f"{self.label} {self.index} {self.of}" if self.label else f"{self.index} {self.of}"
|
|
@@ -10,6 +10,7 @@ class WeatherIconEnum(Enum):
|
|
|
10
10
|
DRIZZLE = ('drizzle', '\uf0e9', '🌦️')
|
|
11
11
|
FEEL = ('feel', '\uf2c9', '🥵')
|
|
12
12
|
FOGGY = ('foggy', '\uf74e', '🌫️')
|
|
13
|
+
HEAVY_RAIN = ('heavy-rain', '\uf0e9', '🌧️')
|
|
13
14
|
HUMIDITY = ('humidity', '\uf043', '💧')
|
|
14
15
|
ISOLATED_THUNDERSTORMS = ('isolated-thunderstorms', chr(0x26C8), '⛈️')
|
|
15
16
|
MOSTLY_CLEAR_DAY = ('mostly-clear-day', chr(0xF0599), '☀️')
|
|
@@ -12,19 +12,16 @@ class ExtractAQIService:
|
|
|
12
12
|
|
|
13
13
|
self.logger.debug("Extracting Air Quality Index (AQI)...")
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
aqi_data = weather_data("section[data-testid='AirQualityModule']").text()
|
|
15
|
+
# 'Air Quality Index\n27\nGood\nAir quality is considered satisfactory, and air pollution poses little or no risk.\nSee Details\nInfo'
|
|
16
|
+
aqi_data = weather_data("section[data-testid='AirQualityModule']").text()
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
# 'stroke-width:5;stroke-dasharray:10.021680564951442 172.78759594743863;stroke:#00E838'
|
|
19
|
+
color_data = weather_data("section[data-testid='AirQualityModule'] svg[data-testid='DonutChart'] circle:nth-of-type(2)").attr("style")
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
air_quality_index = AirQualityIndex.aqi_color_from_string(aqi_data,color_data)
|
|
23
22
|
|
|
24
|
-
|
|
23
|
+
self.logger.debug(f"Extracted AQI data: {air_quality_index}")
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
self.logger.error(f"Error extracting AQI data: {e}")
|
|
29
|
-
raise ValueError("Could not extract AQI data") from e
|
|
25
|
+
return air_quality_index
|
|
26
|
+
|
|
30
27
|
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
weathergrabber/__init__.py,sha256=
|
|
2
|
-
weathergrabber/__main__.py,sha256=
|
|
3
|
-
weathergrabber/cli.py,sha256=
|
|
1
|
+
weathergrabber/__init__.py,sha256=6TIaROzqwJ-QsQPRBFWDRzdwiW_APYR1BTq2bl-goGc,218
|
|
2
|
+
weathergrabber/__main__.py,sha256=yYL-jc4kVHqaYVADzjKZfmCN2mziRofsXgnzrECbGDo,68
|
|
3
|
+
weathergrabber/cli.py,sha256=GA1EVClwfHOImM0TEfkTlYOgZU9bzscKg_0HL-Y9TBc,2090
|
|
4
4
|
weathergrabber/core.py,sha256=TiZ2utmYKf9lkIXWv8YBfSdiHZXJZXuHS8B-dBDvevw,1138
|
|
5
5
|
weathergrabber/weathergrabber_application.py,sha256=2JfZAR94En3rmGrYKWRKxdRXmK_ikhJdgrGotFjtDys,3987
|
|
6
6
|
weathergrabber/adapter/client/weather_api.py,sha256=9S7JmXaAVvvPY60dz6rC3lx7X68BcqyvNzvSVM1-af8,963
|
|
7
7
|
weathergrabber/adapter/client/weather_search_api.py,sha256=1oy7JitHcmwkkhFlD0eIt5A7a4cGbf7LMNi26tR8z5o,1724
|
|
8
|
-
weathergrabber/adapter/tty/console_tty.py,sha256=
|
|
8
|
+
weathergrabber/adapter/tty/console_tty.py,sha256=DTxiI6X3MTtc79E6zrhQLcgqU6gP61BbBslpTdPQNNw,5957
|
|
9
9
|
weathergrabber/adapter/tty/json_tty.py,sha256=GyUc13w_5cjFLJda65Xt4e87gYGJow1dYnkY3ZmcmP8,637
|
|
10
|
-
weathergrabber/adapter/tty/waybar_tty.py,sha256=
|
|
11
|
-
weathergrabber/domain/air_quality_index.py,sha256=
|
|
12
|
-
weathergrabber/domain/city_location.py,sha256=
|
|
13
|
-
weathergrabber/domain/color.py,sha256=
|
|
10
|
+
weathergrabber/adapter/tty/waybar_tty.py,sha256=emNN4i1-FgLlk14ANMoqzeppJFAGTv7qIQ1TwdnW7jw,6138
|
|
11
|
+
weathergrabber/domain/air_quality_index.py,sha256=8uBqxVIKCYIvrHuP-XbCHjYZhq7Z0RmqkgAAdCw6Tp4,2680
|
|
12
|
+
weathergrabber/domain/city_location.py,sha256=p-11c7AwA8t-nNdvTjl9-Oc5Kw4D2XP7tI4WrATVYpQ,2382
|
|
13
|
+
weathergrabber/domain/color.py,sha256=HfgB5CwxrSHT05TIXCqVCy0GoRpuEl99aUrUSJhaqcE,1601
|
|
14
14
|
weathergrabber/domain/current_conditions.py,sha256=S14j2lL_gc2pds0wbl5M4_72PbVdubOuX8lnE_tZVTg,1477
|
|
15
15
|
weathergrabber/domain/daily_predictions.py,sha256=8pzmaU-yugS2Hx_6MBWAk24wlSISe1OQIRrCK_lfvbw,1618
|
|
16
16
|
weathergrabber/domain/day_night.py,sha256=7geOuVH9xDb1ecLKnZmj6eqp3H3kp9G0YY497cEyPtg,1442
|
|
17
17
|
weathergrabber/domain/forecast.py,sha256=CO0VTdMI0kjuwbpwwDNRCf_82oNtw5QkN-9GgobPet8,2399
|
|
18
|
-
weathergrabber/domain/health_activities.py,sha256=
|
|
18
|
+
weathergrabber/domain/health_activities.py,sha256=oaIF_nI-iaN4OIHWTL-L7QZUQxCemdmNvzprDXysK-g,1481
|
|
19
19
|
weathergrabber/domain/hourly_predictions.py,sha256=PFiGuo7mBoQHLR-bDirV--R126YAOzkwIHgaeRGFQSA,2179
|
|
20
20
|
weathergrabber/domain/label_value.py,sha256=LvrvZbSrcEUUpxvKAmYkFnpDFWsa6LFmGA9O8i6HB84,446
|
|
21
21
|
weathergrabber/domain/moon_phase.py,sha256=sEHRi8yPIHTzaEcOkz556uNYsKLq4YmYa5qDncSX44c,587
|
|
22
|
-
weathergrabber/domain/moon_phase_enum.py,sha256=
|
|
22
|
+
weathergrabber/domain/moon_phase_enum.py,sha256=_7C7rB-Nmj-X8DEzJ0iNt-DGuGPqTh7hbfj7l2oib48,2120
|
|
23
23
|
weathergrabber/domain/precipitation.py,sha256=eXrpwMOsEJWGqV4bEBhN9niWYXalgdZRLG4-I39JZ2A,466
|
|
24
24
|
weathergrabber/domain/search.py,sha256=j3BzskyPl0hDWV02XTOC4tJonV5RHxr5Rop_rYMKUtA,387
|
|
25
25
|
weathergrabber/domain/sunrise_sunset.py,sha256=wNTk01NIuLbQ7gN_giAFv4f3FaRx9khul-mj19g57vE,1207
|
|
26
26
|
weathergrabber/domain/temperature_hight_low.py,sha256=PQOJ5uDtfMRBR5yMxXA46xuorJC08jva2C0-WAV5yxs,909
|
|
27
27
|
weathergrabber/domain/timestamp.py,sha256=Bk6f8Tx0-yNitYmEKIWHnqh_ALDwxEHrhoCRSrfvYTU,1222
|
|
28
28
|
weathergrabber/domain/today_details.py,sha256=EUlV7xerYw5QhEsBfvO5m6-9Ghm4nPkXJz9zCmSYTbA,2398
|
|
29
|
-
weathergrabber/domain/uv_index.py,sha256=
|
|
30
|
-
weathergrabber/domain/weather_icon_enum.py,sha256=
|
|
29
|
+
weathergrabber/domain/uv_index.py,sha256=7XalamfjJdVSqo4x7G4JVf_HJtrPJxO1BpbvmAfBhnw,1481
|
|
30
|
+
weathergrabber/domain/weather_icon_enum.py,sha256=F4xvUP7t4Q3zmd86VawjzbKW_cyHE5duuPeEjmuB8Z8,3954
|
|
31
31
|
weathergrabber/domain/wind.py,sha256=wTDz3X1rYsnw_eNoDi1miwaomxwhiJkY_q6xrdZtLak,789
|
|
32
32
|
weathergrabber/domain/adapter/icon_enum.py,sha256=YxGYS5vBRV2AiAfeuPOdqaQOHixAssiMbOzQnTmdSBg,84
|
|
33
33
|
weathergrabber/domain/adapter/output_enum.py,sha256=61iR10ppY8DNALPKV-vLnDQni5HxEzpoRNZbdBdRygk,117
|
|
@@ -52,7 +52,7 @@ weathergrabber/domain/adapter/mapper/today_details_mapper.py,sha256=y9F5b3IQXIvb
|
|
|
52
52
|
weathergrabber/domain/adapter/mapper/uv_index_mapper.py,sha256=K3AdRnAPv1Yqudc3eKcw_EBQidNPbHbLcG4lYrQvOOw,230
|
|
53
53
|
weathergrabber/domain/adapter/mapper/weather_icon_enum_mapper.py,sha256=YC7juvt38Ehtb3Y-iQFM77s1EQAv4qNHd6vGOqws6HI,249
|
|
54
54
|
weathergrabber/domain/adapter/mapper/wind_mapper.py,sha256=nXyYwqTvLLMyKtSey27GaGvBV8xVhB_Y3HU0sbmIe_E,149
|
|
55
|
-
weathergrabber/service/extract_aqi_service.py,sha256=
|
|
55
|
+
weathergrabber/service/extract_aqi_service.py,sha256=WKxNvZoLRE-_vmTMR4efWNrowkc8cfo28fVRJ1XmQ1c,1090
|
|
56
56
|
weathergrabber/service/extract_current_conditions_service.py,sha256=R4rd-_53HOQ7YqhHdfI_gKrIy27scYkNEmLgqS23f40,1838
|
|
57
57
|
weathergrabber/service/extract_daily_forecast_oldstyle_service.py,sha256=DiKfaGbMnIIBnxI-IYG8HmfLHNAW5AGew5NjFSMqBk4,2190
|
|
58
58
|
weathergrabber/service/extract_daily_forecast_service.py,sha256=ZN61_neEAdn7RPedLvmmFKH7Pq1EQGhG9A9Dy8o09zM,2709
|
|
@@ -64,9 +64,9 @@ weathergrabber/service/extract_today_details_service.py,sha256=VBsyv-W9y52fXbutb
|
|
|
64
64
|
weathergrabber/service/read_weather_service.py,sha256=7_B8E9IN1KCwOhpuS5PfWazI1sCrDyYrZhkV2R38bhc,649
|
|
65
65
|
weathergrabber/service/search_location_service.py,sha256=tZmVgO45hjwoa4cl5bKPjMBmYlGxJiH_I9Ymb5pwEwU,1422
|
|
66
66
|
weathergrabber/usecase/use_case.py,sha256=OM36GtGlzotgRJqSu_3kaM3F3WaSQsUs90DMHQdWPsk,4627
|
|
67
|
-
weathergrabber-0.0.
|
|
68
|
-
weathergrabber-0.0.
|
|
69
|
-
weathergrabber-0.0.
|
|
70
|
-
weathergrabber-0.0.
|
|
71
|
-
weathergrabber-0.0.
|
|
72
|
-
weathergrabber-0.0.
|
|
67
|
+
weathergrabber-0.0.8b5.dist-info/licenses/LICENSE,sha256=X5JFljoqN43yFwpMLudQ9rtty4K_FeZfnz3v8Yhw23Q,1067
|
|
68
|
+
weathergrabber-0.0.8b5.dist-info/METADATA,sha256=4YDgFjMw3Z4ma87oV4iaXda9QxqQ3UuYXQEMWTV4Ams,5801
|
|
69
|
+
weathergrabber-0.0.8b5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
70
|
+
weathergrabber-0.0.8b5.dist-info/entry_points.txt,sha256=m2P9a4mrJDTzuNaiTU438NA60GxCfaw7VKvruWw43N8,63
|
|
71
|
+
weathergrabber-0.0.8b5.dist-info/top_level.txt,sha256=P3NMDJJYRIvQujf994Vb4gZrobkKWkL2gh3NF_ajQWM,15
|
|
72
|
+
weathergrabber-0.0.8b5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|