forked from rc/aircox
- Writes tests for aircox streamer application; - Add test utilities in aircox Co-authored-by: bkfox <thomas bkfox net> Reviewed-on: rc/aircox#110
This commit is contained in:
62
aircox_streamer/controllers/streamers.py
Normal file
62
aircox_streamer/controllers/streamers.py
Normal file
@ -0,0 +1,62 @@
|
||||
from django.utils import timezone as tz
|
||||
|
||||
from aircox.models import Station
|
||||
from .streamer import Streamer
|
||||
|
||||
__all__ = ("Streamers",)
|
||||
|
||||
|
||||
class Streamers:
|
||||
"""Keep multiple streamers in memory, allow fetching informations."""
|
||||
|
||||
streamers = None
|
||||
"""Stations by station id."""
|
||||
streamer_class = Streamer
|
||||
timeout = None
|
||||
"""Timedelta to next update."""
|
||||
next_date = None
|
||||
"""Next update datetime."""
|
||||
|
||||
def __init__(self, timeout=None, streamer_class=streamer_class):
|
||||
self.timeout = timeout or tz.timedelta(seconds=2)
|
||||
|
||||
def reset(self, stations=Station.objects.active()):
|
||||
# FIXME: cf. TODO in aircox.controllers about model updates
|
||||
stations = stations.all()
|
||||
self.streamers = {
|
||||
station.pk: self.streamer_class(station) for station in stations
|
||||
}
|
||||
|
||||
def fetch(self):
|
||||
"""Call streamers fetch if timed-out."""
|
||||
if self.streamers is None:
|
||||
self.reset()
|
||||
|
||||
now = tz.now()
|
||||
if self.next_date is not None and now < self.next_date:
|
||||
return
|
||||
|
||||
for streamer in self.streamers.values():
|
||||
streamer.fetch()
|
||||
self.next_date = now + self.timeout
|
||||
|
||||
def get(self, key, default=None):
|
||||
return self.streamers.get(key, default)
|
||||
|
||||
def values(self):
|
||||
return self.streamers.values()
|
||||
|
||||
def __len__(self):
|
||||
return self.streamers and len(self.streamers) or 0
|
||||
|
||||
def __getitem__(self, key):
|
||||
return self.streamers[key]
|
||||
|
||||
def __contains__(self, key):
|
||||
"""Key can be a Station or a Station id."""
|
||||
if isinstance(key, Station):
|
||||
return key.pk in self.streamers
|
||||
return key in self.streamers
|
||||
|
||||
def __iter__(self):
|
||||
return self.streamers.values() if self.streamers else iter(tuple())
|
Reference in New Issue
Block a user