Autogenerated type safety parameterisation of all methods

This commit is contained in:
Ian Renton
2026-09-20 20:02:19 +01:00
parent 6037e742cc
commit 324dd1414b
132 changed files with 1228 additions and 706 deletions
+18 -14
View File
@@ -1,11 +1,15 @@
from __future__ import annotations
import logging
from datetime import datetime
from threading import Event, Lock, Thread
from typing import Any
import pytz
from requests_sse import EventSource, InvalidStatusCodeError
from core.constants import HTTP_HEADERS
from data.spot import Spot
from providers.spot.spot_provider import SpotProvider
logger = logging.getLogger(__name__)
@@ -14,23 +18,23 @@ logger = logging.getLogger(__name__)
class SSESpotProvider(SpotProvider):
"""Spot provider using Server-Sent Events."""
def __init__(self, name, provider_config, url):
def __init__(self, name: str, provider_config: dict[str, Any], url: str) -> None:
super().__init__(name, provider_config)
self._url = url
self._thread = None
self._last_event_id = None
self._stop_event = Event()
self._event_source_lock = Lock()
self._event_source = None
self._url: str = url
self._thread: Thread | None = None
self._last_event_id: str | None = None
self._stop_event: Event = Event()
self._event_source_lock: Lock = Lock()
self._event_source: EventSource | None = None
def start(self):
def start(self) -> None:
logger.info(f"Set up SSE connection to {self.name} spot API.")
self._stop_event.clear()
self._thread = Thread(target=self._run, name=f"SSESpotProvider-{self.name}")
self._thread.daemon = True
self._thread.start()
def stop(self):
def stop(self) -> None:
self._stop_event.set()
with self._event_source_lock:
@@ -46,17 +50,17 @@ class SSESpotProvider(SpotProvider):
if self._thread.is_alive():
logger.warning(f"{self.name} SSE worker thread did not exit on time and will be killed.")
def _on_open(self):
def _on_open(self) -> None:
self.status = "Waiting for Data"
def _on_error(self):
def _on_error(self) -> None:
self.status = "Connecting"
def _set_event_source(self, event_source):
def _set_event_source(self, event_source: EventSource | None) -> None:
with self._event_source_lock:
self._event_source = event_source
def _run(self):
def _run(self) -> None:
while not self._stop_event.is_set():
try:
logger.debug(f"Connecting to {self.name} spot API...")
@@ -102,7 +106,7 @@ class SSESpotProvider(SpotProvider):
self.status = "Disconnected"
self._stop_event.wait(timeout=5) # Wait before trying to reconnect
def _sse_message_to_spot(self, message_data):
def _sse_message_to_spot(self, message_data: str) -> Spot | None:
"""Convert an SSE message received from the API into a spot. The whole message data is provided here so the subclass
implementations can handle the message as JSON, XML, text, whatever the API actually provides."""