changeset 2:c6fd04e07db0

refactor light.py
author drewp@bigasterisk.com
date Sun, 28 Jan 2024 15:44:10 -0800
parents 42a494b8ee1a
children c04563fc8616
files light.py light_bridge.py
diffstat 2 files changed, 57 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/light.py	Sun Jan 28 15:44:10 2024 -0800
@@ -0,0 +1,53 @@
+
+import asyncio
+import logging
+from dataclasses import dataclass
+
+log = logging.getLogger('light')
+
+class Color(str):
+
+    def to_js(self):
+        return self
+
+
+@dataclass
+class Light:
+    name: str
+    address: str
+    online: bool
+    colorRequest: Color
+    colorMessage: dict
+    colorCurrent: Color
+    latencyMs: float
+
+    def to_js(self):
+        return {
+            'light': {
+                'name': self.name,
+                'address': self.address,
+                'online': self.online,
+                'colorRequest': self.colorRequest.to_js(),
+                'colorMessage': self.colorMessage,
+                'colorCurrent': self.colorCurrent.to_js(),
+                'latencyMs': self.latencyMs,
+            }
+        }
+
+
+class Lights:
+    _d: dict[str, Light] = {}
+
+    def add(self, d: Light):
+        self._d[d.name] = d
+
+    def byName(self, name: str) -> Light:
+        return self._d[name]
+
+    async def changes(self):  # yields None on any data change
+        while True:
+            yield None
+            await asyncio.sleep(1)
+
+    def to_js(self):
+        return {'lights': [d.to_js() for d in sorted(self._d.values(), key=lambda r: r.name)]}
--- a/light_bridge.py	Sun Jan 28 15:43:54 2024 -0800
+++ b/light_bridge.py	Sun Jan 28 15:44:10 2024 -0800
@@ -1,23 +1,23 @@
 """
 replaces a lot of mqtt_to_rdf and rdf_to_mqtt
 """
-import asyncio
-from dataclasses import dataclass
-from functools import partial
 import json
 import logging
+from functools import partial
 import time
 
 import background_loop
 from patchablegraph import PatchableGraph
 from patchablegraph.handler import GraphEvents, StaticGraph
 from rdflib import Namespace
+from sse_starlette.sse import EventSourceResponse
 from starlette.applications import Starlette
 from starlette.requests import Request
 from starlette.responses import JSONResponse
 from starlette.routing import Route
 from starlette_exporter import PrometheusMiddleware, handle_metrics
-from sse_starlette.sse import EventSourceResponse
+
+from light import Color, Light, Lights
 
 EX = Namespace('http://example.com/')
 
@@ -25,54 +25,6 @@
 log = logging.getLogger()
 
 
-class Color(str):
-
-    def to_js(self):
-        return self
-
-
-@dataclass
-class Light:
-    name: str
-    address: str
-    online: bool
-    colorRequest: Color
-    colorMessage: dict
-    colorCurrent: Color
-    latencyMs: float
-
-    def to_js(self):
-        return {
-            'light': {
-                'name': self.name,
-                'address': self.address,
-                'online': self.online,
-                'colorRequest': self.colorRequest.to_js(),
-                'colorMessage': self.colorMessage,
-                'colorCurrent': self.colorCurrent.to_js(),
-                'latencyMs': self.latencyMs,
-            }
-        }
-
-
-class Lights:
-    _d: dict[str, Light] = {}
-
-    def add(self, d: Light):
-        self._d[d.name] = d
-
-    def byName(self, name: str) -> Light:
-        return self._d[name]
-
-    async def changes(self):  # yields None on any data change
-        while True:
-            yield None
-            await asyncio.sleep(1)
-
-    def to_js(self):
-        return {'lights': [d.to_js() for d in sorted(self._d.values(), key=lambda r: r.name)]}
-
-
 async def output(lights: Lights, request: Request) -> JSONResponse:
     light = lights.byName(request.query_params['light'])
     return JSONResponse(light.to_js())
@@ -82,7 +34,6 @@
 
     async def g():
         async for ping in lights.changes():
-            await asyncio.sleep(1)
             yield json.dumps({'now': time.time()} | lights.to_js())
 
     return EventSourceResponse(g())