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.
@@ -4,7 +4,7 @@ from .core import main
4
4
  from .cli import main_cli
5
5
 
6
6
  __all__ = ["main", "main_cli"]
7
- __version__ = "0.0.8b3"
7
+ __version__ = "0.0.8b5"
8
8
 
9
9
  def get_version():
10
10
  return __version__
@@ -1,4 +1,4 @@
1
- """weathergrabber CLI entry point."""
2
1
  from .cli import main_cli
2
+
3
3
  if __name__ == "__main__":
4
4
  main_cli()
@@ -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 ''}\t"
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 ''}\t"
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) < 10 else h.title[:9] + '.',
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) < 10 else d.title[:9] + '.',
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']) < 4 else '\t'}"
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"\t{'\t' if len(d['title']) < 6 else ' '}"
98
+ f"{'\t\t' if len(d['title']) < 5 else '\t'}"
99
99
  f"{d['high_low']}"
100
- f"\t{'\t' if len(d['high_low']) < 33 else ''}"
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
@@ -35,6 +35,3 @@ def main_cli():
35
35
  keep_open=args.keep_open,
36
36
  icons=args.icons
37
37
  )
38
-
39
- if __name__ == "__main__":
40
- main_cli()
@@ -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:{self.acronym}, color={self.color})"
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
- parts = data.split('\n')
53
- title = parts[0].strip()
54
- aqi = int(parts[1].strip())
55
- category = parts[2].strip() if len(parts) > 2 else None
56
- description = parts[3].strip() if len(parts) > 3 else None
57
- acronym = ''.join(word[0].strip().upper() for word in title.split())
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
- return title, aqi, category, description, acronym
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
- try:
65
- title, aqi, category, description, acronym = AirQualityIndex._extract_aqi(data)
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
- try:
73
- title, aqi, category, description, acronym = AirQualityIndex._extract_aqi(aqi_data)
74
- color = Color.from_string(color_data)
75
- return cls(title, aqi, category, description, acronym, color)
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 > 0:
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)
@@ -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
- match = re.search(color_pattern, string_value)
28
- color = f"#{match.group(1)}"
29
- hex_color = color.lstrip('#')
30
- r, g, b = int(hex_color[:2], 16), int(hex_color[2:4], 16), int(hex_color[4:], 16)
31
-
32
- return cls(r, g, b)
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"#{self.red:02x}{self.green:02x}{self.blue:02x}"
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
- @staticmethod
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 HealthActivities(category_name, title, description)
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
- elif self.index and self.of:
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
- try:
16
- # 'Air Quality Index\n27\nGood\nAir quality is considered satisfactory, and air pollution poses little or no risk.\nSee Details\nInfo'
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
- # 'stroke-width:5;stroke-dasharray:10.021680564951442 172.78759594743863;stroke:#00E838'
20
- color_data = weather_data("section[data-testid='AirQualityModule'] svg[data-testid='DonutChart'] circle:nth-of-type(2)").attr("style")
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
- air_quality_index = AirQualityIndex.aqi_color_from_string(aqi_data,color_data)
21
+ air_quality_index = AirQualityIndex.aqi_color_from_string(aqi_data,color_data)
23
22
 
24
- self.logger.debug(f"Extracted AQI data: {air_quality_index}")
23
+ self.logger.debug(f"Extracted AQI data: {air_quality_index}")
25
24
 
26
- return air_quality_index
27
- except Exception as e:
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: weathergrabber
3
- Version: 0.0.8b3
3
+ Version: 0.0.8b5
4
4
  Summary: A grabber for weather.com data with various output formats.
5
5
  Author-email: Carlos Anselmo Mendes Junior <cjuniorfox@gmail.com>
6
6
  License: MIT
@@ -1,33 +1,33 @@
1
- weathergrabber/__init__.py,sha256=2c_1aaXKTGnxemfZCivqkLJ47cjGkGv2mVYbNx0Bp9k,218
2
- weathergrabber/__main__.py,sha256=K10wQv3-LSRD_FRLHWphdSs3OAcuzIb4sQaKmj7Fql0,105
3
- weathergrabber/cli.py,sha256=kinuJc4B6HMIzKRlUHDFVnML4OrJsEJpeGiFjxoJfpQ,2133
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=7Ih0DwRyEfaYM4tfCMHhyHo-ti97u-OmZ36ANwEAu5I,5953
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=wRvqT63ubb8Zz0YxeJM_mhOiJE0USK4Y5NquFf_V1qw,6136
11
- weathergrabber/domain/air_quality_index.py,sha256=eH1glUdedtbRCZMcw5_zB5ybJQUcyY-EBMxL8vVJ6zA,2791
12
- weathergrabber/domain/city_location.py,sha256=GHzFMvOhks7iQkWgR0mS-L21uAb_tlNycvfrdY-itzc,2362
13
- weathergrabber/domain/color.py,sha256=dkWZnQ2BjXUV8qTfZnmNGng_cqKtKuDdekYw4R2NJ9U,1080
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=wCG82-lBfrnIwxptgnMZt-fXHJsBnIl4YLpoeFOmC48,1490
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=unHTHWKXrYNyRrUbRqI-7KsXWUSYPnd7PeL23-cyiew,2074
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=QskzzUcvvbnPP6HAcGk9LhQk09NKCFpe3YlunwlVaM0,1512
30
- weathergrabber/domain/weather_icon_enum.py,sha256=oY-V6qIHjJjUE0baTkrECFwL0VSe4IYte-aR53zl_ew,3901
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=IT3S9zZmThdqPtJDBF_G8LDUNlwUYoBh49z_WUlB-tk,1285
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.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,,
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,,