Add plugin name to registration on bus
authorBenjamin Braatz <bb@bbraatz.eu>
Tue, 9 Mar 2021 17:56:25 +0000 (18:56 +0100)
committerBenjamin Braatz <bb@bbraatz.eu>
Tue, 9 Mar 2021 17:56:25 +0000 (18:56 +0100)
controlpi-plugins/util.py
controlpi/__init__.py
controlpi/messagebus.py

index eb509dc52d31a16be484b94d594e6327b9991cc3..491fa13b187bfff6c316dee01c2b9bb69f0f23d8 100644 (file)
@@ -28,7 +28,7 @@ class Log(BasePlugin):
         print(f"{self._name}: {message}")
 
     def _process_conf(self, conf: PluginConfiguration) -> None:
-        self._bus.register(self._name,
+        self._bus.register(self._name, 'Log',
                            [],
                            conf['filter'],
                            self._log)
@@ -51,7 +51,7 @@ class Init(BasePlugin):
         sends = [template_from_message(message)
                  for message in self._messages]
         sends.extend(receives)
-        self._bus.register(self._name,
+        self._bus.register(self._name, 'Init',
                            sends,
                            receives,
                            self._execute)
@@ -74,7 +74,7 @@ class Wait(BasePlugin):
         receives = [{'target': {'const': self._name},
                      'command': {'const': 'wait'}}]
         sends = [{'event': {'const': 'finished'}}]
-        self._bus.register(self._name,
+        self._bus.register(self._name, 'Wait',
                            sends,
                            receives,
                            self._wait)
@@ -92,7 +92,7 @@ class GenericWait(BasePlugin):
                      'seconds': {'type': 'number'},
                      'id': {'type': 'string'}}]
         sends = [{'id': {'type': 'string'}}]
-        self._bus.register(self._name,
+        self._bus.register(self._name, 'GenericWait',
                            sends,
                            receives,
                            self._wait)
@@ -112,7 +112,7 @@ class Alias(BasePlugin):
     def _process_conf(self, conf: PluginConfiguration) -> None:
         self._from = conf['from']
         self._to = conf['to']
-        self._bus.register(self._name,
+        self._bus.register(self._name, 'Alias',
                            [template_from_message(conf['to'])],
                            [self._from],
                            self._alias)
@@ -144,7 +144,7 @@ class State(BasePlugin):
                     {'target': {'const': self._name},
                      'command': {'const': 'set state'},
                      'new state': {'type': 'boolean'}}]
-        self._bus.register(self._name,
+        self._bus.register(self._name, 'State',
                            sends,
                            receives,
                            self._receive)
index ef0ddd8b52947098593c60297ff8a966c04370b6..d4a6191e44c457440d772723b639be4294ea6400 100644 (file)
@@ -29,7 +29,7 @@ clients:
 ...         print(f"{self._name} received {message}.")
 ...         await self._bus.send({'sender': self._name, 'event': 'Receive'})
 ...     def _process_conf(self, conf):
-...         self._bus.register(self._name,
+...         self._bus.register(self._name, 'BusPlugin',
 ...                            [{'event': {'type': 'string'}}],
 ...                            [{'target': {'const': self._name}}],
 ...                            self.receive)
@@ -45,7 +45,8 @@ when using the system in production:
 >>> async def test_bus_plugin():
 ...     bus = MessageBus()
 ...     p = BusPlugin(bus, 'Bus Test', {})
-...     bus.register('Test', [{}], [{'sender': {'const': 'Bus Test'}}], log)
+...     bus.register('Test', 'TestPlugin',
+...                  [{}], [{'sender': {'const': 'Bus Test'}}], log)
 ...     bus_task = asyncio.create_task(bus.run())
 ...     asyncio.create_task(p.run())
 ...     await bus.send({'sender': 'Test', 'target': 'Bus Test', 'key': 'v'})
@@ -66,7 +67,7 @@ client and its registered send and receive templates:
 >>> async def test_bus():
 ...     bus = MessageBus()
 ...     p = BusPlugin(bus, 'Bus Test', {})
-...     bus.register('Test', [{}], [{}], log)
+...     bus.register('Test', 'TestPlugin', [{}], [{}], log)
 ...     bus_task = asyncio.create_task(bus.run())
 ...     await bus.send({'sender': 'Test', 'target': '',
 ...                     'command': 'get clients'})
@@ -74,17 +75,19 @@ client and its registered send and receive templates:
 ...     bus_task.cancel()
 >>> asyncio.run(test_bus())
 BusPlugin 'Bus Test' configured.
-Log: {'sender': '', 'event': 'registered', 'client': 'Bus Test', \
-'sends': [{'event': {'type': 'string'}}], \
-'receives': [{'target': {'const': 'Bus Test'}}]}
-Log: {'sender': '', 'event': 'registered', 'client': 'Test', \
-'sends': [{}], 'receives': [{}]}
+Log: {'sender': '', 'event': 'registered',\
+ 'client': 'Bus Test', 'plugin': 'BusPlugin',\
+ 'sends': [{'event': {'type': 'string'}}],\
+ 'receives': [{'target': {'const': 'Bus Test'}}]}
+Log: {'sender': '', 'event': 'registered',\
+ 'client': 'Test', 'plugin': 'TestPlugin',\
+ 'sends': [{}], 'receives': [{}]}
 Log: {'sender': 'Test', 'target': '', 'command': 'get clients'}
-Log: {'sender': '', 'client': 'Bus Test', \
-'sends': [{'event': {'type': 'string'}}], \
-'receives': [{'target': {'const': 'Bus Test'}}]}
-Log: {'sender': '', 'client': 'Test', \
-'sends': [{}], 'receives': [{}]}
+Log: {'sender': '', 'client': 'Bus Test', 'plugin': 'BusPlugin',\
+ 'sends': [{'event': {'type': 'string'}}],\
+ 'receives': [{'target': {'const': 'Bus Test'}}]}
+Log: {'sender': '', 'client': 'Test', 'plugin': 'TestPlugin',\
+ 'sends': [{}], 'receives': [{}]}
 
 Often, there will be a one-to-one correspondence between plugin
 instances and message bus clients, a plugin instance will be a message bus
index 219b586a9054f8a9bfdb98ca7d8d1f834b2c67b1..6204cb6a80b3afd0f5d332552de7f04d36866547 100644 (file)
@@ -22,11 +22,11 @@ receiving. An empty list of templates means that the client does not want to
 send or receive any messages, respectively. A list with an empty template
 means that it wants to send arbitrary or receive all messages, respectively:
 >>> async def setup(bus):
-...     bus.register('Logger',
+...     bus.register('Logger', 'Test Plugin',
 ...                  [],
 ...                  [{}],
 ...                  callback_for_receiver('Logger'))
-...     bus.register('Client 1',
+...     bus.register('Client 1', 'Test Plugin',
 ...                  [{'k1': {'type': 'string'}}],
 ...                  [{'target': {'const': 'Client 1'}}],
 ...                  callback_for_receiver('Client 1'))
@@ -67,11 +67,13 @@ have to explicitly cancel the task:
 Sending messages.
 Message not allowed for sender Client 1!
 {'sender': 'Client 1', 'k1': 42}
-Logger: {'sender': '', 'event': 'registered', 'client': 'Logger', \
-'sends': [], 'receives': [{}]}
-Logger: {'sender': '', 'event': 'registered', 'client': 'Client 1', \
-'sends': [{'k1': {'type': 'string'}}], \
-'receives': [{'target': {'const': 'Client 1'}}]}
+Logger: {'sender': '', 'event': 'registered',\
+ 'client': 'Logger', 'plugin': 'Test Plugin',\
+ 'sends': [], 'receives': [{}]}
+Logger: {'sender': '', 'event': 'registered',\
+ 'client': 'Client 1', 'plugin': 'Test Plugin',\
+ 'sends': [{'k1': {'type': 'string'}}],\
+ 'receives': [{'target': {'const': 'Client 1'}}]}
 Logger: {'sender': 'Client 1', 'k1': 'Test'}
 Logger: {'sender': '', 'target': 'Client 1'}
 Client 1: {'sender': '', 'target': 'Client 1'}
@@ -456,15 +458,15 @@ class MessageBus:
     or receive all messages, respectively:
     >>> async def setup(bus):
     ...     print("Setting up.")
-    ...     bus.register('Logger',
+    ...     bus.register('Logger', 'Test Plugin',
     ...                  [],
     ...                  [{}],
     ...                  callback_for_receiver('Logger'))
-    ...     bus.register('Client 1',
+    ...     bus.register('Client 1', 'Test Plugin',
     ...                  [{'k1': {'type': 'string'}}],
     ...                  [{'target': {'const': 'Client 1'}}],
     ...                  callback_for_receiver('Client 1'))
-    ...     bus.register('Client 2',
+    ...     bus.register('Client 2', 'Test Plugin',
     ...                  [{}],
     ...                  [{'target': {'const': 'Client 2'}}],
     ...                  callback_for_receiver('Client 2'))
@@ -521,24 +523,27 @@ class MessageBus:
     {'sender': 'Client 1', 'k1': 42}
     Message not allowed for sender Client 1!
     {'sender': 'Client 1', 'k2': 42}
-    Logger: {'sender': '', 'event': 'registered', 'client': 'Logger', \
-'sends': [], 'receives': [{}]}
-    Logger: {'sender': '', 'event': 'registered', 'client': 'Client 1', \
-'sends': [{'k1': {'type': 'string'}}], \
-'receives': [{'target': {'const': 'Client 1'}}]}
-    Logger: {'sender': '', 'event': 'registered', 'client': 'Client 2', \
-'sends': [{}], 'receives': [{'target': {'const': 'Client 2'}}]}
+    Logger: {'sender': '', 'event': 'registered',\
+ 'client': 'Logger', 'plugin': 'Test Plugin',\
+ 'sends': [], 'receives': [{}]}
+    Logger: {'sender': '', 'event': 'registered',\
+ 'client': 'Client 1', 'plugin': 'Test Plugin',\
+ 'sends': [{'k1': {'type': 'string'}}],\
+ 'receives': [{'target': {'const': 'Client 1'}}]}
+    Logger: {'sender': '', 'event': 'registered',\
+ 'client': 'Client 2', 'plugin': 'Test Plugin',\
+ 'sends': [{}], 'receives': [{'target': {'const': 'Client 2'}}]}
     Logger: {'sender': 'Client 1', 'k1': 'Test'}
     Logger: {'sender': 'Client 2', 'target': 'Client 1'}
     Client 1: {'sender': 'Client 2', 'target': 'Client 1'}
     Logger: {'sender': '', 'target': '', 'command': 'get clients'}
-    Logger: {'sender': '', 'client': 'Logger', \
-'sends': [], 'receives': [{}]}
-    Logger: {'sender': '', 'client': 'Client 1', \
-'sends': [{'k1': {'type': 'string'}}], \
-'receives': [{'target': {'const': 'Client 1'}}]}
-    Logger: {'sender': '', 'client': 'Client 2', \
-'sends': [{}], 'receives': [{'target': {'const': 'Client 2'}}]}
+    Logger: {'sender': '', 'client': 'Logger', 'plugin': 'Test Plugin',\
+ 'sends': [], 'receives': [{}]}
+    Logger: {'sender': '', 'client': 'Client 1', 'plugin': 'Test Plugin',\
+ 'sends': [{'k1': {'type': 'string'}}],\
+ 'receives': [{'target': {'const': 'Client 1'}}]}
+    Logger: {'sender': '', 'client': 'Client 2', 'plugin': 'Test Plugin',\
+ 'sends': [{}], 'receives': [{'target': {'const': 'Client 2'}}]}
     """
 
     def __init__(self) -> None:
@@ -549,11 +554,12 @@ class MessageBus:
         >>> asyncio.run(main())
         """
         self._queue: asyncio.Queue = asyncio.Queue()
+        self._plugins: dict[str, str] = {}
         self._send_reg: MessageTemplateRegistry = MessageTemplateRegistry()
         self._recv_reg: MessageTemplateRegistry = MessageTemplateRegistry()
         self._callbacks: dict[str, MessageCallback] = {}
 
-    def register(self, client: str,
+    def register(self, client: str, plugin: str,
                  sends: Iterable[Message],
                  receives: Iterable[Message],
                  callback: MessageCallback) -> None:
@@ -563,26 +569,27 @@ class MessageBus:
         ...     print(message)
         >>> async def main():
         ...     bus = MessageBus()
-        ...     bus.register('Logger',
+        ...     bus.register('Logger', 'Test Plugin',
         ...                  [],    # send nothing
         ...                  [{}],  # receive everything
         ...                  callback)
-        ...     bus.register('Client 1',
+        ...     bus.register('Client 1', 'Test Plugin',
         ...                  [{'k1': {'type': 'string'}}],
         ...                      # send with key 'k1' and string value
         ...                  [{'target': {'const': 'Client 1'}}],
         ...                      # receive for this client
         ...                  callback)
-        ...     bus.register('Client 2',
+        ...     bus.register('Client 2', 'Test Plugin',
         ...                  [{}],  # send arbitrary
         ...                  [{'target': {'const': 'Client 2'}}],
         ...                      # receive for this client
         ...                  callback)
         >>> asyncio.run(main())
         """
-        if client in self._callbacks:
+        if client in self._plugins:
             print(f"Client '{client}' already registered at message bus!")
             return
+        self._plugins[client] = plugin
         for template in sends:
             self._send_reg.insert(template, client)
         sends = self._send_reg.get_templates(client)
@@ -591,7 +598,7 @@ class MessageBus:
         receives = self._recv_reg.get_templates(client)
         self._callbacks[client] = callback
         event = {'sender': '', 'event': 'registered', 'client': client,
-                 'sends': sends, 'receives': receives}
+                 'plugin': plugin, 'sends': sends, 'receives': receives}
         self._queue.put_nowait(event)
 
     def unregister(self, client: str) -> None:
@@ -601,13 +608,15 @@ class MessageBus:
         ...     print(message)
         >>> async def main():
         ...     bus = MessageBus()
-        ...     bus.register('Client 1',
+        ...     bus.register('Client 1', 'Test Plugin',
         ...                  [{'k1': {'type': 'string'}}],
         ...                  [{'target': {'const': 'Client 1'}}],
         ...                  callback)
         ...     bus.unregister('Client 1')
         >>> asyncio.run(main())
         """
+        if client in self._plugins:
+            del self._plugins[client]
         self._send_reg.delete(client)
         self._recv_reg.delete(client)
         if client in self._callbacks:
@@ -631,11 +640,13 @@ class MessageBus:
                     message['target'] == '' and
                     'command' in message and
                     message['command'] == 'get clients'):
-                for client in self._callbacks:
+                for client in self._plugins:
+                    plugin = self._plugins[client]
                     sends = self._send_reg.get_templates(client)
                     receives = self._recv_reg.get_templates(client)
                     iface = {'sender': '', 'client': client,
-                             'sends': sends, 'receives': receives}
+                             'plugin': plugin, 'sends': sends,
+                             'receives': receives}
                     await self._queue.put(iface)
             for client in self._recv_reg.get(message):
                 asyncio.create_task(self._callbacks[client](message))
@@ -648,11 +659,11 @@ class MessageBus:
         ...     print(f"Got: {message}")
         >>> async def main():
         ...     bus = MessageBus()
-        ...     bus.register('Client 1',
+        ...     bus.register('Client 1', 'Test Plugin',
         ...                  [{'k1': {'type': 'string'}}],
         ...                  [{'target': {'const': 'Client 1'}}],
         ...                  callback)
-        ...     bus.register('Client 2',
+        ...     bus.register('Client 2', 'Test Plugin',
         ...                  [{}],
         ...                  [{'target': {'const': 'Client 2'}}],
         ...                  callback)