janet/janet/__init__.py

52 lines
1.3 KiB
Python
Raw Permalink Normal View History

2021-02-26 16:46:54 +01:00
import abc
2021-02-13 14:54:45 +01:00
import logging
from dataclasses import dataclass
from typing import Any, Callable, Optional, Sequence
2021-02-13 14:54:45 +01:00
2021-02-14 17:31:28 +01:00
logger = logging.getLogger('janet')
@dataclass
class Device:
identifiers: Sequence[str]
2021-02-14 17:31:28 +01:00
available: bool
name: str
manufacturer: Optional[str] = None
model: Optional[str] = None
sw_version: Optional[str] = None
2021-02-13 14:54:45 +01:00
kind: Optional[str] = None
class Channel:
def __init__(self):
self._listeners = set()
2021-02-13 14:54:45 +01:00
2021-02-14 17:31:28 +01:00
def put(self, source: Device, entity: Any) -> None:
2021-02-13 14:54:45 +01:00
remove = set()
2021-02-26 16:46:54 +01:00
for listener in self._listeners:
2021-02-13 14:54:45 +01:00
try:
2021-02-26 16:46:54 +01:00
if listener(source, entity):
remove.add(listener)
2021-02-25 12:10:07 +01:00
except IOError as ex:
2021-02-25 12:11:38 +01:00
logger.warning(f'Listener raised {ex}, removing', exc_info=ex)
2021-02-26 16:46:54 +01:00
remove.add(listener)
2021-02-13 14:54:45 +01:00
except Exception as ex:
2021-02-26 16:46:54 +01:00
logger.error(f'Listener raised fatal exception {ex}, removing',
exc_info=ex)
remove.add(listener)
2021-02-25 12:10:07 +01:00
2021-02-13 14:54:45 +01:00
self._listeners ^= remove
2021-02-14 17:31:28 +01:00
def listen(self, listener: Callable[[Device, Any], None]) -> None:
2021-02-13 14:54:45 +01:00
self._listeners.add(listener)
2021-02-26 16:46:54 +01:00
class Publisher(abc.ABC):
@abc.abstractmethod
def publish(self,
device: Device,
entity: Any,
setter: Optional[Callable] = None):
pass