weathergrabber 0.0.8b2__py3-none-any.whl → 0.0.8b3__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 +4 -1
- weathergrabber/adapter/tty/json_tty.py +1 -1
- weathergrabber/cli.py +3 -2
- weathergrabber/domain/moon_phase_enum.py +7 -7
- weathergrabber/domain/uv_index.py +3 -1
- weathergrabber/service/extract_hourly_forecast_service.py +42 -48
- weathergrabber/service/extract_today_details_service.py +55 -60
- weathergrabber/usecase/use_case.py +7 -7
- {weathergrabber-0.0.8b2.dist-info → weathergrabber-0.0.8b3.dist-info}/METADATA +1 -1
- {weathergrabber-0.0.8b2.dist-info → weathergrabber-0.0.8b3.dist-info}/RECORD +14 -14
- {weathergrabber-0.0.8b2.dist-info → weathergrabber-0.0.8b3.dist-info}/WHEEL +0 -0
- {weathergrabber-0.0.8b2.dist-info → weathergrabber-0.0.8b3.dist-info}/entry_points.txt +0 -0
- {weathergrabber-0.0.8b2.dist-info → weathergrabber-0.0.8b3.dist-info}/licenses/LICENSE +0 -0
- {weathergrabber-0.0.8b2.dist-info → weathergrabber-0.0.8b3.dist-info}/top_level.txt +0 -0
weathergrabber/__init__.py
CHANGED
weathergrabber/cli.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import argparse
|
|
2
2
|
import os
|
|
3
|
-
|
|
3
|
+
import weathergrabber
|
|
4
4
|
|
|
5
5
|
def main_cli():
|
|
6
6
|
## Get current locale, or use the default one
|
|
@@ -11,6 +11,7 @@ def main_cli():
|
|
|
11
11
|
parser.add_argument("--output", "-o", type=str, choices=['console','json','waybar'], default='console', help="Output format. console, json or waybar")
|
|
12
12
|
parser.add_argument("--keep-open", "-k",action='store_true', default=False, help="Keep open and refreshing every 5 minutes instead of exiting after execution. Does only makes sense for --output=console")
|
|
13
13
|
parser.add_argument("--icons", "-i", type=str, choices=['fa','emoji'], default='emoji', help="Icon set. 'fa' for Font-Awesome, or 'emoji'")
|
|
14
|
+
parser.add_argument("--version", "-v", action='version', version=f'Weathergrabber {weathergrabber.get_version()}', help="Show version and exit")
|
|
14
15
|
parser.add_argument(
|
|
15
16
|
"--log",
|
|
16
17
|
default="critical",
|
|
@@ -25,7 +26,7 @@ def main_cli():
|
|
|
25
26
|
if not args.location_id and not args.location_name:
|
|
26
27
|
location_id = os.getenv('WEATHER_LOCATION_ID')
|
|
27
28
|
|
|
28
|
-
main(
|
|
29
|
+
weathergrabber.main(
|
|
29
30
|
log_level=args.log,
|
|
30
31
|
location_name = args.location_name,
|
|
31
32
|
location_id = location_id,
|
|
@@ -8,9 +8,9 @@ class MoonPhaseEnum(Enum):
|
|
|
8
8
|
PHASE_2 = ("phase-2", "\uf186", "🌒")
|
|
9
9
|
PHASE_3 = ("phase-3", "\uf186", "🌒")
|
|
10
10
|
PHASE_4 = ("phase-4", "\uf186", "🌒")
|
|
11
|
-
PHASE_5 = ("phase-5", "\uf186", "🌒")
|
|
12
|
-
PHASE_6 = ("phase-6", "\uf186", "🌒")
|
|
13
11
|
# First Quarter
|
|
12
|
+
PHASE_5 = ("phase-5", "\uf186", "🌓")
|
|
13
|
+
PHASE_6 = ("phase-6", "\uf186", "🌓")
|
|
14
14
|
PHASE_7 = ("phase-7", "\uf186", "🌓")
|
|
15
15
|
# Waxing Gibbous
|
|
16
16
|
PHASE_8 = ("phase-8", "\uf186", "🌔")
|
|
@@ -21,8 +21,8 @@ class MoonPhaseEnum(Enum):
|
|
|
21
21
|
PHASE_13 = ("phase-13", "\uf186", "🌕")
|
|
22
22
|
# Full Moon
|
|
23
23
|
PHASE_14 = ("phase-14", "\uf186", "🌕")
|
|
24
|
-
# Waning Gibbous
|
|
25
24
|
PHASE_15 = ("phase-15", "\uf186", "🌕")
|
|
25
|
+
# Waning Gibbous
|
|
26
26
|
PHASE_16 = ("phase-16", "\uf186", "🌖")
|
|
27
27
|
PHASE_17 = ("phase-17", "\uf186", "🌖")
|
|
28
28
|
PHASE_18 = ("phase-18", "\uf186", "🌖")
|
|
@@ -30,10 +30,10 @@ class MoonPhaseEnum(Enum):
|
|
|
30
30
|
PHASE_20 = ("phase-20", "\uf186", "🌖")
|
|
31
31
|
# Last Quarter
|
|
32
32
|
PHASE_21 = ("phase-21", "\uf186", "🌗")
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
PHASE_22 = ("phase-22", "\uf186", "🌗")
|
|
34
|
+
PHASE_23 = ("phase-23", "\uf186", "🌗")
|
|
35
|
+
PHASE_24 = ("phase-24", "\uf186", "🌗")
|
|
36
|
+
|
|
37
37
|
PHASE_25 = ("phase-25", "\uf186", "🌘")
|
|
38
38
|
PHASE_26 = ("phase-26", "\uf186", "🌘")
|
|
39
39
|
PHASE_27 = ("phase-27", "\uf186", "🌘")
|
|
@@ -30,8 +30,10 @@ class UVIndex:
|
|
|
30
30
|
elif len(parts) == 3:
|
|
31
31
|
index, of, some = parts
|
|
32
32
|
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")
|
|
33
35
|
else:
|
|
34
|
-
|
|
36
|
+
return cls(string_value = data, index="", of="", label=label)
|
|
35
37
|
|
|
36
38
|
def __repr__(self) -> str:
|
|
37
39
|
return f"UVIndex(string_value={self.string_value!r}, index={self.index!r}, of={self.of!r}, label={self.label!r})"
|
|
@@ -14,51 +14,45 @@ class ExtractHourlyForecastService:
|
|
|
14
14
|
pass
|
|
15
15
|
|
|
16
16
|
def execute(self, weather_data: PyQuery) -> List[HourlyPredictions]:
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
return hourly_forecasts
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
except Exception as e:
|
|
63
|
-
self.logger.error(f"Error extracting hourly forecast: {e}")
|
|
64
|
-
raise ValueError("Could not extract hourly forecast.") from e
|
|
17
|
+
self.logger.debug("Extracting hourly forecast...")
|
|
18
|
+
|
|
19
|
+
data = weather_data.find("section[data-testid='HourlyForecast'] div[class*='Card'] details")
|
|
20
|
+
|
|
21
|
+
if len(data) == 0:
|
|
22
|
+
raise ValueError("There's no hourly forecast data available.")
|
|
23
|
+
|
|
24
|
+
details = [ {
|
|
25
|
+
"title": PyQuery(item).find("h2").text(),
|
|
26
|
+
"temperature" : PyQuery(item).find("div[data-testid='detailsTemperature']").text(),
|
|
27
|
+
"icon" : PyQuery(item).find("svg[class*='DetailsSummary']").attr("name"),
|
|
28
|
+
"summary" : PyQuery(item).find("span[class*='DetailsSummary--wxPhrase']").text(),
|
|
29
|
+
"precip-percentage": PyQuery(item).find("div[data-testid='Precip'] span[data-testid='PercentageValue']").text(),
|
|
30
|
+
"wind": PyQuery(item).find("span[data-testid='WindTitle']").next().eq(0).text(),
|
|
31
|
+
"feels-like" : PyQuery(item).find("span[data-testid='FeelsLikeTitle']").next().text(),
|
|
32
|
+
"humidity" : PyQuery(item).find("span[data-testid='HumidityTitle']").next().text(),
|
|
33
|
+
"uv-index" : PyQuery(item).find("span[data-testid='UVIndexValue']").text(),
|
|
34
|
+
"cloud-cover" : PyQuery(item).find("span[data-testid='CloudCoverTitle']").next().text(),
|
|
35
|
+
"rain-amount" : PyQuery(item).find("span[data-testid='AccumulationTitle']").next().text()
|
|
36
|
+
} for item in data ]
|
|
37
|
+
|
|
38
|
+
self.logger.debug("Extracted %s register(s)...",len(details))
|
|
39
|
+
|
|
40
|
+
hourly_forecasts = [HourlyPredictions(
|
|
41
|
+
title=item["title"],
|
|
42
|
+
temperature=item["temperature"],
|
|
43
|
+
icon=WeatherIconEnum.from_name(item["icon"]),
|
|
44
|
+
summary=item["summary"],
|
|
45
|
+
precipitation=Precipitation(
|
|
46
|
+
percentage=item["precip-percentage"],
|
|
47
|
+
amount=item["rain-amount"]
|
|
48
|
+
),
|
|
49
|
+
wind=Wind.from_string(item["wind"]),
|
|
50
|
+
feels_like=item["feels-like"],
|
|
51
|
+
humidity=item["humidity"],
|
|
52
|
+
uv_index=UVIndex.from_string(item["uv-index"]),
|
|
53
|
+
cloud_cover=item["cloud-cover"]
|
|
54
|
+
) for item in details]
|
|
55
|
+
|
|
56
|
+
self.logger.debug("Created hourly forecast list with %s registers", len(hourly_forecasts))
|
|
57
|
+
|
|
58
|
+
return hourly_forecasts
|
|
@@ -14,72 +14,67 @@ class ExtractTodayDetailsService:
|
|
|
14
14
|
pass
|
|
15
15
|
|
|
16
16
|
def execute(self, weather_data: PyQuery) -> TodayDetails:
|
|
17
|
-
|
|
18
|
-
self.logger.debug("Extracting today's details...")
|
|
17
|
+
self.logger.debug("Extracting today's details...")
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
today_details_data = weather_data.find("div#todayDetails")
|
|
20
|
+
feelslike = PyQuery(today_details_data).find("div[data-testid='FeelsLikeSection'] span")
|
|
21
|
+
sunrise_sunset = PyQuery(today_details_data).find("div[data-testid='sunriseSunsetContainer'] div p[class*='TwcSunChart']")
|
|
23
22
|
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
feelslike_label = feelslike.eq(0).text() #'Feels Like'
|
|
24
|
+
feelslike_value = feelslike.eq(1).text() #'60°'
|
|
26
25
|
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
sunrise = sunrise_sunset.eq(0).text() #'6:12 AM'
|
|
27
|
+
sunset = sunrise_sunset.eq(1).text() #'7:45 PM'
|
|
29
28
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
icons = today_details_data.find('svg[class*="WeatherDetailsListItem--icon"]')
|
|
30
|
+
labels = today_details_data.find('div[class*="WeatherDetailsListItem--label"]')
|
|
31
|
+
values = today_details_data.find('div[data-testid="wxData"]')
|
|
33
32
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
self.logger.debug(f"Parsing today details values...")
|
|
34
|
+
high_low_label = labels.eq(0).text() #'High / Low'
|
|
35
|
+
high_low_value = values.eq(0).text() #'--/54°'
|
|
37
36
|
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
wind_label = labels.eq(1).text() #'Wind'
|
|
38
|
+
wind_value = values.eq(1).text() #'7\xa0mph'
|
|
40
39
|
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
humidity_label = labels.eq(2).text() #'Humidity'
|
|
41
|
+
humidity_value = values.eq(2).text() #'100%'
|
|
43
42
|
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
dew_point_label = labels.eq(3).text() #'Dew Point'
|
|
44
|
+
dew_point_value = values.eq(3).text() #'60°'
|
|
46
45
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
except Exception as e:
|
|
84
|
-
self.logger.error(f"Error extracting today's details: {e}")
|
|
85
|
-
raise ValueError("Could not extract today's details.") from e
|
|
46
|
+
pressure_label = labels.eq(4).text() #'Pressure'
|
|
47
|
+
pressure_value = values.eq(4).text() #'30.31\xa0in'
|
|
48
|
+
|
|
49
|
+
uv_index_label = labels.eq(5).text() #'UV Index'
|
|
50
|
+
uv_index_value = values.eq(5).text() #'5 of 10'
|
|
51
|
+
|
|
52
|
+
visibility_label = labels.eq(6).text() #'Visibility'
|
|
53
|
+
visibility_value = values.eq(6).text() #'10.0 mi'
|
|
54
|
+
|
|
55
|
+
moon_phase_label = labels.eq(7).text() #'Moon Phase'
|
|
56
|
+
moon_phase_icon = icons.eq(7).attr('name') #'phase-2'
|
|
57
|
+
moon_phase_value = values.eq(7).text() #'Waxing Crescent'
|
|
58
|
+
|
|
59
|
+
self.logger.debug(f"Creating domain objects for today details...")
|
|
60
|
+
|
|
61
|
+
sunrise_sunset = SunriseSunset(sunrise=sunrise, sunset=sunset)
|
|
62
|
+
high_low = TemperatureHighLow.from_string(high_low_value, label=high_low_label)
|
|
63
|
+
uv_index = UVIndex.from_string(uv_index_value, label=uv_index_label)
|
|
64
|
+
moon_phase = MoonPhase(MoonPhaseEnum.from_name(moon_phase_icon), moon_phase_value, moon_phase_label)
|
|
65
|
+
|
|
66
|
+
today_details = TodayDetails(
|
|
67
|
+
feelslike=LabelValue(label=feelslike_label, value=feelslike_value),
|
|
68
|
+
sunrise_sunset=sunrise_sunset,
|
|
69
|
+
high_low=high_low,
|
|
70
|
+
wind=LabelValue(label=wind_label, value=wind_value),
|
|
71
|
+
humidity=LabelValue(label=humidity_label, value=humidity_value),
|
|
72
|
+
dew_point=LabelValue(label=dew_point_label, value=dew_point_value),
|
|
73
|
+
pressure=LabelValue(label=pressure_label, value=pressure_value),
|
|
74
|
+
uv_index=uv_index,
|
|
75
|
+
visibility=LabelValue(label=visibility_label, value=visibility_value),
|
|
76
|
+
moon_phase=moon_phase
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
self.logger.debug(f"Extracted today's details: {today_details}")
|
|
80
|
+
return today_details
|
|
@@ -57,16 +57,16 @@ class UseCase:
|
|
|
57
57
|
health_activities = self.extract_health_activities_service.execute(weather_data)
|
|
58
58
|
|
|
59
59
|
try:
|
|
60
|
-
hourly_predictions = self.extract_hourly_forecast_service.execute(weather_data)
|
|
61
|
-
except ValueError:
|
|
62
|
-
self.logger.warning("Falling back to old style hourly forecast extraction")
|
|
63
60
|
hourly_predictions = self.extract_hourly_forecast_oldstyle_service.execute(weather_data)
|
|
64
|
-
|
|
65
|
-
try:
|
|
66
|
-
daily_predictions = self.extract_daily_forecast_service.execute(weather_data)
|
|
67
61
|
except ValueError:
|
|
68
|
-
self.logger.warning("Falling back to
|
|
62
|
+
self.logger.warning("Falling back to new style hourly forecast extraction")
|
|
63
|
+
hourly_predictions = self.extract_hourly_forecast_service.execute(weather_data)
|
|
64
|
+
|
|
65
|
+
try:
|
|
69
66
|
daily_predictions = self.extract_daily_forecast_oldstyle_service.execute(weather_data)
|
|
67
|
+
except ValueError:
|
|
68
|
+
self.logger.warning("Falling back to new style daily forecast extraction")
|
|
69
|
+
daily_predictions = self.extract_daily_forecast_service.execute(weather_data)
|
|
70
70
|
|
|
71
71
|
forecast = Forecast(
|
|
72
72
|
search = Search(
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
weathergrabber/__init__.py,sha256=
|
|
1
|
+
weathergrabber/__init__.py,sha256=2c_1aaXKTGnxemfZCivqkLJ47cjGkGv2mVYbNx0Bp9k,218
|
|
2
2
|
weathergrabber/__main__.py,sha256=K10wQv3-LSRD_FRLHWphdSs3OAcuzIb4sQaKmj7Fql0,105
|
|
3
|
-
weathergrabber/cli.py,sha256=
|
|
3
|
+
weathergrabber/cli.py,sha256=kinuJc4B6HMIzKRlUHDFVnML4OrJsEJpeGiFjxoJfpQ,2133
|
|
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
8
|
weathergrabber/adapter/tty/console_tty.py,sha256=7Ih0DwRyEfaYM4tfCMHhyHo-ti97u-OmZ36ANwEAu5I,5953
|
|
9
|
-
weathergrabber/adapter/tty/json_tty.py,sha256=
|
|
9
|
+
weathergrabber/adapter/tty/json_tty.py,sha256=GyUc13w_5cjFLJda65Xt4e87gYGJow1dYnkY3ZmcmP8,637
|
|
10
10
|
weathergrabber/adapter/tty/waybar_tty.py,sha256=wRvqT63ubb8Zz0YxeJM_mhOiJE0USK4Y5NquFf_V1qw,6136
|
|
11
11
|
weathergrabber/domain/air_quality_index.py,sha256=eH1glUdedtbRCZMcw5_zB5ybJQUcyY-EBMxL8vVJ6zA,2791
|
|
12
12
|
weathergrabber/domain/city_location.py,sha256=GHzFMvOhks7iQkWgR0mS-L21uAb_tlNycvfrdY-itzc,2362
|
|
@@ -19,14 +19,14 @@ weathergrabber/domain/health_activities.py,sha256=wCG82-lBfrnIwxptgnMZt-fXHJsBnI
|
|
|
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=unHTHWKXrYNyRrUbRqI-7KsXWUSYPnd7PeL23-cyiew,2074
|
|
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=
|
|
29
|
+
weathergrabber/domain/uv_index.py,sha256=QskzzUcvvbnPP6HAcGk9LhQk09NKCFpe3YlunwlVaM0,1512
|
|
30
30
|
weathergrabber/domain/weather_icon_enum.py,sha256=oY-V6qIHjJjUE0baTkrECFwL0VSe4IYte-aR53zl_ew,3901
|
|
31
31
|
weathergrabber/domain/wind.py,sha256=wTDz3X1rYsnw_eNoDi1miwaomxwhiJkY_q6xrdZtLak,789
|
|
32
32
|
weathergrabber/domain/adapter/icon_enum.py,sha256=YxGYS5vBRV2AiAfeuPOdqaQOHixAssiMbOzQnTmdSBg,84
|
|
@@ -58,15 +58,15 @@ weathergrabber/service/extract_daily_forecast_oldstyle_service.py,sha256=DiKfaGb
|
|
|
58
58
|
weathergrabber/service/extract_daily_forecast_service.py,sha256=ZN61_neEAdn7RPedLvmmFKH7Pq1EQGhG9A9Dy8o09zM,2709
|
|
59
59
|
weathergrabber/service/extract_health_activities_service.py,sha256=2qJ4tEEz5uV6EwHUIFhWM8zol_BbDW3omEohf8kDg3M,1014
|
|
60
60
|
weathergrabber/service/extract_hourly_forecast_oldstyle_service.py,sha256=U5O2tG9YF8wrUUoTimDr7oqMIb670j9oeVjoIpCKKLs,2100
|
|
61
|
-
weathergrabber/service/extract_hourly_forecast_service.py,sha256=
|
|
61
|
+
weathergrabber/service/extract_hourly_forecast_service.py,sha256=KFsl6G6FAmGtkski3lj31VIhs6guP0BxVZTGQSHk8Do,2757
|
|
62
62
|
weathergrabber/service/extract_temperature_service.py,sha256=46nRO3Izj1QmG4BNTh8flsODsovHyWPzZzOnkl1Gbj4,634
|
|
63
|
-
weathergrabber/service/extract_today_details_service.py,sha256=
|
|
63
|
+
weathergrabber/service/extract_today_details_service.py,sha256=VBsyv-W9y52fXbutb9ETI04zCpJrxJzXBHmKoHTCb80,3743
|
|
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
|
-
weathergrabber/usecase/use_case.py,sha256=
|
|
67
|
-
weathergrabber-0.0.
|
|
68
|
-
weathergrabber-0.0.
|
|
69
|
-
weathergrabber-0.0.
|
|
70
|
-
weathergrabber-0.0.
|
|
71
|
-
weathergrabber-0.0.
|
|
72
|
-
weathergrabber-0.0.
|
|
66
|
+
weathergrabber/usecase/use_case.py,sha256=OM36GtGlzotgRJqSu_3kaM3F3WaSQsUs90DMHQdWPsk,4627
|
|
67
|
+
weathergrabber-0.0.8b3.dist-info/licenses/LICENSE,sha256=X5JFljoqN43yFwpMLudQ9rtty4K_FeZfnz3v8Yhw23Q,1067
|
|
68
|
+
weathergrabber-0.0.8b3.dist-info/METADATA,sha256=S7X1CVpLzCER1xpQzH7zNGGA_yiaBjV-2tFt316LAdI,5801
|
|
69
|
+
weathergrabber-0.0.8b3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
70
|
+
weathergrabber-0.0.8b3.dist-info/entry_points.txt,sha256=m2P9a4mrJDTzuNaiTU438NA60GxCfaw7VKvruWw43N8,63
|
|
71
|
+
weathergrabber-0.0.8b3.dist-info/top_level.txt,sha256=P3NMDJJYRIvQujf994Vb4gZrobkKWkL2gh3NF_ajQWM,15
|
|
72
|
+
weathergrabber-0.0.8b3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|