juham-visualcrossing 0.0.1__tar.gz → 0.0.2__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (21) hide show
  1. {juham_visualcrossing-0.0.1/juham_visualcrossing.egg-info → juham_visualcrossing-0.0.2}/PKG-INFO +2 -2
  2. juham_visualcrossing-0.0.2/juham_visualcrossing/py.typed +1 -0
  3. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/juham_visualcrossing/visualcrossing.py +48 -33
  4. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2/juham_visualcrossing.egg-info}/PKG-INFO +2 -2
  5. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/juham_visualcrossing.egg-info/SOURCES.txt +1 -0
  6. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/juham_visualcrossing.egg-info/requires.txt +1 -1
  7. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/pyproject.toml +3 -3
  8. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/tests/test_visualcrossing.py +1 -1
  9. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/MANIFEST.in +0 -0
  10. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/docs/source/CHANGELOG.rst +0 -0
  11. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/docs/source/CONTRIBUTING.rst +0 -0
  12. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/docs/source/LICENSE.rst +0 -0
  13. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/docs/source/README.rst +0 -0
  14. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/juham_visualcrossing/__init__.py +0 -0
  15. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/juham_visualcrossing.egg-info/dependency_links.txt +0 -0
  16. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/juham_visualcrossing.egg-info/entry_points.txt +0 -0
  17. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/juham_visualcrossing.egg-info/top_level.txt +0 -0
  18. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/setup.cfg +0 -0
  19. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/tests/__init__.py +0 -0
  20. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/tests/__pycache__/__init__.cpython-312.pyc +0 -0
  21. {juham_visualcrossing-0.0.1 → juham_visualcrossing-0.0.2}/tests/__pycache__/test_visualcrossing.cpython-312.pyc +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: juham_visualcrossing
3
- Version: 0.0.1
3
+ Version: 0.0.2
4
4
  Summary: A Weather forecast plugin extending `juham` applications
5
5
  Author-email: J Meskanen <juham.api@gmail.com>
6
6
  Maintainer-email: "J. Meskanen" <juham.api@gmail.com>
@@ -40,7 +40,7 @@ Classifier: License :: OSI Approved :: MIT License
40
40
  Classifier: Programming Language :: Python :: 3.8
41
41
  Requires-Python: >=3.8
42
42
  Description-Content-Type: text/markdown
43
- Requires-Dist: juham>=0.0.7
43
+ Requires-Dist: juham>=0.0.12
44
44
  Requires-Dist: pytz>=2024.1
45
45
  Requires-Dist: importlib-metadata
46
46
  Provides-Extra: dev
@@ -1,8 +1,9 @@
1
1
  from datetime import datetime, timedelta, timezone
2
2
  import json
3
+ from typing import Any, Dict, Optional, cast
4
+ from typing_extensions import override # for python 3.9 compatibility
3
5
 
4
- from typing import Any
5
- from juham.base import Base
6
+ from juham.base import Base, MqttMsg, JMqtt
6
7
  from juham.web import RCloud, RCloudThread
7
8
 
8
9
 
@@ -11,13 +12,13 @@ class VisualCrossingThread(RCloudThread):
11
12
  site."""
12
13
 
13
14
  # class attributes
14
- _forecast_topic = ""
15
- _base_url = ""
16
- _api_key = ""
17
- _location = ""
15
+ _forecast_topic: str = ""
16
+ _base_url: str = ""
17
+ _api_key: str = ""
18
+ _location: str = ""
18
19
  _interval: float = 12 * 3600
19
20
 
20
- def __init__(self, client=None):
21
+ def __init__(self, client: Optional[JMqtt] = None):
21
22
  """Construct with the given mqtt client. Acquires data from the visual
22
23
  crossing web service and publishes the forecast data to
23
24
  forecast_topic.
@@ -26,13 +27,14 @@ class VisualCrossingThread(RCloudThread):
26
27
  client (object, optional): MQTT client. Defaults to None.
27
28
  """
28
29
  super().__init__(client)
29
- self.mqtt_client = client
30
+ self.mqtt_client: Optional[JMqtt] = client
30
31
 
32
+ @override
31
33
  def update_interval(self) -> float:
32
34
  return self._interval
33
35
 
34
- # @override
35
- def make_url(self) -> str:
36
+ @override
37
+ def make_weburl(self) -> str:
36
38
  if not self._api_key:
37
39
  self.error("Uninitialized api_key {self.get_class_id()}: {self._api_key}")
38
40
  return ""
@@ -63,8 +65,8 @@ class VisualCrossingThread(RCloudThread):
63
65
  self._api_key = api_key
64
66
  self._location = location
65
67
 
66
- # @override
67
- def process_data(self, data: Any):
68
+ @override
69
+ def process_data(self, data: Any) -> None:
68
70
  self.info("VisualCrossing process_data()")
69
71
  data = data.json()
70
72
  forecast = []
@@ -112,24 +114,35 @@ class VisualCrossing(RCloud):
112
114
  update_interval.
113
115
  """
114
116
 
115
- workerThreadId = VisualCrossingThread.get_class_id()
116
- forecast_topic = Base.mqtt_root_topic + "/forecast"
117
- base_url = "https://weather.visualcrossing.com/VisualCrossingWebServices/rest/services/timeline/"
118
- update_interval = 12 * 3600
119
- api_key = "SE9W7EHP775N7NDNW8ANM2MZN"
120
- location = "lahti,finland"
117
+ workerThreadId: str = VisualCrossingThread.get_class_id()
118
+ base_url: str = (
119
+ "https://weather.visualcrossing.com/VisualCrossingWebServices/rest/services/timeline/"
120
+ )
121
+ update_interval: float = 12 * 3600
122
+ api_key: str = "SE9W7EHP775N7NDNW8ANM2MZN"
123
+ location: str = "lahti,finland"
121
124
 
122
- def __init__(self, name="visualcrossing"):
125
+ def __init__(self, name="visualcrossing") -> None:
126
+ """Constructs VisualCrossing automation object for acquiring and publishing
127
+ forecast data.
128
+
129
+ Args:
130
+ name (str, optional): name of the object. Defaults to "visualcrossing".
131
+ """
123
132
  super().__init__(name)
124
- self.debug(f"VisualCrossing created")
133
+ self.worker: Optional[VisualCrossingThread] = None
134
+ self.forecast_topic: str = self.make_topic_name("forecast")
135
+ self.debug(f"VisualCrossing with name {name} created")
125
136
 
126
- def on_connect(self, client, userdata, flags, rc):
137
+ @override
138
+ def on_connect(self, client: object, userdata: Any, flags: int, rc: int) -> None:
127
139
  super().on_connect(client, userdata, flags, rc)
128
140
  if rc == 0:
129
141
  self.subscribe(self.forecast_topic)
130
142
  self.debug(f"VisualCrossing subscribed to topic {self.forecast_topic}")
131
143
 
132
- def on_message(self, client, userdata, msg):
144
+ @override
145
+ def on_message(self, client: object, userdata: Any, msg: MqttMsg) -> None:
133
146
  if msg.topic == self.forecast_topic:
134
147
  em = json.loads(msg.payload.decode())
135
148
  self.on_forecast(em)
@@ -144,10 +157,13 @@ class VisualCrossing(RCloud):
144
157
  """
145
158
  self.debug(f"VisualCrossing: got mqtt message {em}")
146
159
 
147
- # @override
148
- def run(self):
160
+ @override
161
+ def run(self) -> None:
149
162
  # create, initialize and start the asynchronous thread for acquiring forecast
150
- self.worker = Base.instantiate(VisualCrossing.workerThreadId)
163
+
164
+ self.worker = cast(
165
+ VisualCrossingThread, Base.instantiate(VisualCrossing.workerThreadId)
166
+ )
151
167
  self.worker.init(
152
168
  self.forecast_topic,
153
169
  self.base_url,
@@ -155,14 +171,13 @@ class VisualCrossing(RCloud):
155
171
  self.api_key,
156
172
  self.location,
157
173
  )
158
- self.debug(f"VisualCrossing.run(): base_url is {self.base_url}")
159
- self.debug(f"VisualCrossing.run(): interval is {self.update_interval}")
160
- self.debug(f"VisualCrossing.run(): api_key is {self.api_key}")
161
- self.debug(f"VisualCrossing.run(): location is {self.location}")
174
+ self.debug(
175
+ f"VisualCrossing run: {self.base_url}, {self.update_interval}s, location is {self.location}"
176
+ )
162
177
  super().run()
163
178
 
164
- # @override
165
- def to_dict(self):
179
+ @override
180
+ def to_dict(self) -> dict:
166
181
  data = super().to_dict()
167
182
  data["_visualcrossing"] = {
168
183
  "topic": self.forecast_topic,
@@ -172,8 +187,8 @@ class VisualCrossing(RCloud):
172
187
  }
173
188
  return data
174
189
 
175
- # @override
176
- def from_dict(self, data):
190
+ @override
191
+ def from_dict(self, data) -> None:
177
192
  super().from_dict(data)
178
193
  if "_visualcrossing" in data:
179
194
  for key, value in data["_visualcrossing"].items():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: juham_visualcrossing
3
- Version: 0.0.1
3
+ Version: 0.0.2
4
4
  Summary: A Weather forecast plugin extending `juham` applications
5
5
  Author-email: J Meskanen <juham.api@gmail.com>
6
6
  Maintainer-email: "J. Meskanen" <juham.api@gmail.com>
@@ -40,7 +40,7 @@ Classifier: License :: OSI Approved :: MIT License
40
40
  Classifier: Programming Language :: Python :: 3.8
41
41
  Requires-Python: >=3.8
42
42
  Description-Content-Type: text/markdown
43
- Requires-Dist: juham>=0.0.7
43
+ Requires-Dist: juham>=0.0.12
44
44
  Requires-Dist: pytz>=2024.1
45
45
  Requires-Dist: importlib-metadata
46
46
  Provides-Extra: dev
@@ -7,6 +7,7 @@ docs/source/CONTRIBUTING.rst
7
7
  docs/source/LICENSE.rst
8
8
  docs/source/README.rst
9
9
  juham_visualcrossing/__init__.py
10
+ juham_visualcrossing/py.typed
10
11
  juham_visualcrossing/visualcrossing.py
11
12
  juham_visualcrossing.egg-info/PKG-INFO
12
13
  juham_visualcrossing.egg-info/SOURCES.txt
@@ -1,4 +1,4 @@
1
- juham>=0.0.7
1
+ juham>=0.0.12
2
2
  pytz>=2024.1
3
3
  importlib-metadata
4
4
 
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "juham_visualcrossing"
9
- version = "0.0.1"
9
+ version = "0.0.2"
10
10
  description = "A Weather forecast plugin extending `juham` applications"
11
11
  readme = {file = "docs/source/README.rst", content-type = "text/markdown"}
12
12
  requires-python = ">=3.8"
@@ -28,7 +28,7 @@ classifiers = [
28
28
  ]
29
29
 
30
30
  dependencies = [
31
- "juham >= 0.0.7",
31
+ "juham >= 0.0.12",
32
32
  "pytz >= 2024.1",
33
33
  "importlib-metadata"
34
34
  ]
@@ -53,5 +53,5 @@ visualcrossing_plugin = "juham_visualcrossing:VisualCrossing"
53
53
 
54
54
 
55
55
  [tool.mypy]
56
- files = ["juham_visualcrossing/"]
56
+ files = ["juham_visualcrossing"]
57
57
  ignore_missing_imports = true
@@ -1,6 +1,6 @@
1
1
  import unittest
2
2
 
3
- from juham_visualcrossing import VisualCrossing
3
+ from juham_visualcrossing.visualcrossing import VisualCrossing
4
4
 
5
5
 
6
6
  class TestVisualCrossing(unittest.TestCase):