... bus_task.cancel()
>>> asyncio.run(test_bus())
BusPlugin 'Bus Test' configured.
-Log: {'sender': '', 'bus event': 'registered', 'client': 'Bus Test'}
-Log: {'sender': '', 'bus event': 'registered', 'client': 'Test'}
+Log: {'sender': '', 'event': 'registered', 'client': 'Bus Test', \
+'sends': [{'event': "<class 'str'>"}], 'receives': [{'target': 'Bus Test'}]}
+Log: {'sender': '', 'event': 'registered', 'client': 'Test', \
+'sends': [{}], 'receives': [{}]}
Log: {'sender': 'Test', 'target': '', 'command': 'get clients'}
Log: {'sender': '', 'client': 'Bus Test', \
'sends': [{'event': "<class 'str'>"}], 'receives': [{'target': 'Bus Test'}]}
Sending messages.
Message not allowed for sender Client 1!
{'sender': 'Client 1', 'k1': 42}
-Logger: {'sender': '', 'bus event': 'registered', 'client': 'Logger'}
-Logger: {'sender': '', 'bus event': 'registered', 'client': 'Client 1'}
+Logger: {'sender': '', 'event': 'registered', 'client': 'Logger', \
+'sends': [], 'receives': [{}]}
+Logger: {'sender': '', 'event': 'registered', 'client': 'Client 1', \
+'sends': [{'k1': "<class 'str'>"}], 'receives': [{'target': 'Client 1'}]}
Logger: {'sender': 'Client 1', 'k1': 'Test'}
Logger: {'sender': '', 'target': 'Client 1'}
Client 1: {'sender': '', 'target': 'Client 1'}
... callback_for_receiver('Client 2'))
The bus itself is addressed by the empty string. It sends messages for
- each registration and deregestration of a client with a key 'bus event'
- and a value of 'registered' or 'unregistered', and a key 'client' with
- the client's name as value.
+ each registration and deregestration of a client with a key 'event' and
+ a value of 'registered' or 'unregistered', and a key 'client' with the
+ client's name as value.
Clients can send to the bus with the send function. Each message has to
declare a sender. The send templates of that sender are checked for a
{'sender': 'Client 1', 'k1': 42}
Message not allowed for sender Client 1!
{'sender': 'Client 1', 'k2': 42}
- Logger: {'sender': '', 'bus event': 'registered', 'client': 'Logger'}
- Logger: {'sender': '', 'bus event': 'registered', 'client': 'Client 1'}
- Logger: {'sender': '', 'bus event': 'registered', 'client': 'Client 2'}
+ Logger: {'sender': '', 'event': 'registered', 'client': 'Logger', \
+'sends': [], 'receives': [{}]}
+ Logger: {'sender': '', 'event': 'registered', 'client': 'Client 1', \
+'sends': [{'k1': "<class 'str'>"}], 'receives': [{'target': 'Client 1'}]}
+ Logger: {'sender': '', 'event': 'registered', 'client': 'Client 2', \
+'sends': [{}], 'receives': [{'target': 'Client 2'}]}
Logger: {'sender': 'Client 1', 'k1': 'Test'}
Logger: {'sender': 'Client 2', 'target': 'Client 1'}
Client 1: {'sender': 'Client 2', 'target': 'Client 1'}
self._recv_reg: MessageTemplateRegistry = MessageTemplateRegistry()
self._callbacks: dict[str, MessageCallback] = {}
- def register(self, name: str,
+ def register(self, client: str,
sends: Iterable[Message],
receives: Iterable[Message],
callback: MessageCallback) -> None:
... callback)
>>> asyncio.run(main())
"""
- if name in self._callbacks:
- print(f"Client '{name}' already registered at message bus!")
+ if client in self._callbacks:
+ print(f"Client '{client}' already registered at message bus!")
return
for template in sends:
- self._send_reg.insert(template, name)
+ self._send_reg.insert(template, client)
+ sends = self._send_reg.get_templates(client)
for template in receives:
- self._recv_reg.insert(template, name)
- self._callbacks[name] = callback
- self._queue.put_nowait({'sender': '',
- 'bus event': 'registered',
- 'client': name})
-
- def unregister(self, name: str) -> None:
+ self._recv_reg.insert(template, client)
+ receives = self._recv_reg.get_templates(client)
+ self._callbacks[client] = callback
+ event = {'sender': '', 'event': 'registered', 'client': client,
+ 'sends': sends, 'receives': receives}
+ self._queue.put_nowait(event)
+
+ def unregister(self, client: str) -> None:
"""Unregister a client from the message bus.
>>> async def callback(message):
... bus.unregister('Client 1')
>>> asyncio.run(main())
"""
- self._send_reg.delete(name)
- self._recv_reg.delete(name)
- if name in self._callbacks:
- del self._callbacks[name]
- self._queue.put_nowait({'sender': '',
- 'bus event': 'unregistered',
- 'client': name})
+ self._send_reg.delete(client)
+ self._recv_reg.delete(client)
+ if client in self._callbacks:
+ del self._callbacks[client]
+ event = {'sender': '', 'event': 'unregistered', 'client': client}
+ self._queue.put_nowait(event)
async def run(self) -> None:
"""Run the message bus forever.
Nachrichten stattfindet.
```
-Debug Logger: {'sender': '', 'bus event': 'registered', 'client': 'Example State'}
-Debug Logger: {'sender': '', 'bus event': 'registered', 'client': 'WaitCheck'}
-Debug Logger: {'sender': '', 'bus event': 'registered', 'client': 'TriggerStateCheck'}
-Debug Logger: {'sender': '', 'bus event': 'registered', 'client': 'TriggerWaitCheck'}
-Debug Logger: {'sender': '', 'bus event': 'registered', 'client': 'WaitOn'}
-Debug Logger: {'sender': '', 'bus event': 'registered', 'client': 'TriggerStateOnOff'}
-Debug Logger: {'sender': '', 'bus event': 'registered', 'client': 'TriggerWaitOnOff'}
-Debug Logger: {'sender': '', 'bus event': 'registered', 'client': 'WaitOff'}
-Debug Logger: {'sender': '', 'bus event': 'registered', 'client': 'TriggerStateOffOn'}
-Debug Logger: {'sender': '', 'bus event': 'registered', 'client': 'TriggerWaitOffOn'}
-Debug Logger: {'sender': '', 'bus event': 'registered', 'client': 'Test Procedure'}
-Debug Logger: {'sender': '', 'bus event': 'registered', 'client': 'Debug Logger'}
-Debug Logger: {'sender': '', 'bus event': 'registered', 'client': 'State Change Logger'}
+Debug Logger: {'sender': '', 'event': 'registered', 'client': 'Example State',
+ 'sends': [{'sender': 'Example State', 'state': "<class 'bool'>"}],
+ 'receives': [{'target': 'Example State', 'command': 'get state'},
+ {'target': 'Example State', 'command': 'set state',
+ 'state': "<class 'bool'>"}]}
+Debug Logger: {'sender': '', 'event': 'registered', 'client': 'WaitCheck',
+ 'sends': [{'event': 'finished'}],
+ 'receives': [{'target': 'WaitCheck', 'command': 'wait'}]}
+Debug Logger: {'sender': '', 'event': 'registered', 'client': 'TriggerStateCheck',
+ 'sends': [{'target': 'Example State', 'command': 'get state'}],
+ 'receives': [{'sender': 'WaitCheck', 'event': 'finished'}]}
+Debug Logger: {'sender': '', 'event': 'registered', 'client': 'TriggerWaitCheck',
+ 'sends': [{'target': 'WaitCheck', 'command': 'wait'}],
+ 'receives': [{'sender': 'WaitCheck', 'event': 'finished'}]}
+Debug Logger: {'sender': '', 'event': 'registered', 'client': 'WaitOn',
+ 'sends': [{'event': 'finished'}],
+ 'receives': [{'target': 'WaitOn', 'command': 'wait'}]}
+Debug Logger: {'sender': '', 'event': 'registered', 'client': 'TriggerStateOnOff',
+ 'sends': [{'target': 'Example State', 'command': 'set state', 'state': False}],
+ 'receives': [{'sender': 'WaitOn', 'event': 'finished'}]}
+Debug Logger: {'sender': '', 'event': 'registered', 'client': 'TriggerWaitOnOff',
+ 'sends': [{'target': 'WaitOff', 'command': 'wait'}],
+ 'receives': [{'sender': 'WaitOn', 'event': 'finished'}]}
+Debug Logger: {'sender': '', 'event': 'registered', 'client': 'WaitOff',
+ 'sends': [{'event': 'finished'}],
+ 'receives': [{'target': 'WaitOff', 'command': 'wait'}]}
+Debug Logger: {'sender': '', 'event': 'registered', 'client': 'TriggerStateOffOn',
+ 'sends': [{'target': 'Example State', 'command': 'set state', 'state': True}],
+ 'receives': [{'sender': 'WaitOff', 'event': 'finished'}]}
+Debug Logger: {'sender': '', 'event': 'registered', 'client': 'TriggerWaitOffOn',
+ 'sends': [{'target': 'WaitOn', 'command': 'wait'}],
+ 'receives': [{'sender': 'WaitOff', 'event': 'finished'}]}
+Debug Logger: {'sender': '', 'event': 'registered', 'client': 'Test Procedure',
+ 'sends': [{'event': 'started'}, {'event': 'stopped'},
+ {'target': 'WaitCheck', 'command': 'wait'},
+ {'target': 'WaitOff', 'command': 'wait'},
+ {'target': 'Test Procedure', 'command': 'execute'}],
+ 'receives': [{'target': 'Test Procedure', 'command': 'execute'}]}
+Debug Logger: {'sender': '', 'event': 'registered', 'client': 'Debug Logger',
+ 'sends': [], 'receives': [{}]}
+Debug Logger: {'sender': '', 'event': 'registered', 'client': 'State Change Logger',
+ 'sends': [], 'receives': [{'sender': 'Example State', 'changed': True}]}
```
Die Instanz `Debug Logger` zeigt uns alle im System verschickten
Nachrichten an. Zunächst meldet der Nachrichten-Bus selbst alle