|
|
213e69d |
From 607bfb3627c32937ca7e542e462053bbb124ee06 Mon Sep 17 00:00:00 2001
|
|
|
213e69d |
From: Andrew Bauer <zonexpertconsulting@outlook.com>
|
|
|
213e69d |
Date: Thu, 18 Jun 2020 07:49:49 -0500
|
|
|
213e69d |
Subject: [PATCH] move StateChange subclass to signals.py
|
|
|
213e69d |
|
|
|
213e69d |
---
|
|
|
213e69d |
ouimeaux/signals.py | 39 ++++++++++++++++++++++++++-
|
|
|
213e69d |
1 files changed, 26 insertions(+), 1 deletions(-)
|
|
|
213e69d |
|
|
|
213e69d |
diff --git a/ouimeaux/signals.py b/ouimeaux/signals.py
|
|
|
213e69d |
index b421aab..22547d2 100644
|
|
|
213e69d |
--- a/ouimeaux/signals.py
|
|
|
213e69d |
+++ b/ouimeaux/signals.py
|
|
|
213e69d |
@@ -1,4 +1,4 @@
|
|
|
213e69d |
-from pysignals import Signal, StateChange, receiver
|
|
|
213e69d |
+from pysignals import Signal, receiver
|
|
|
213e69d |
|
|
|
213e69d |
# Work around a bug in pysignals when in the interactive interpreter
|
|
|
213e69d |
import sys
|
|
|
213e69d |
@@ -6,6 +6,43 @@
|
|
|
213e69d |
if _main:
|
|
|
213e69d |
_main.__file__ = "__main__.py"
|
|
|
213e69d |
|
|
|
213e69d |
+class StateChange( Signal ):
|
|
|
213e69d |
+
|
|
|
213e69d |
+ def __init__(self, providing_args=None):
|
|
|
213e69d |
+ super(StateChange, self).__init__(providing_args)
|
|
|
213e69d |
+ self.sender_status = {}
|
|
|
213e69d |
+
|
|
|
213e69d |
+ def send(self, sender, **named):
|
|
|
213e69d |
+ """
|
|
|
213e69d |
+ Send signal from sender to all connected receivers *only if* the signal's
|
|
|
213e69d |
+ contents has changed.
|
|
|
213e69d |
+ If any receiver raises an error, the error propagates back through send,
|
|
|
213e69d |
+ terminating the dispatch loop, so it is quite possible to not have all
|
|
|
213e69d |
+ receivers called if a raises an error.
|
|
|
213e69d |
+ Arguments:
|
|
|
213e69d |
+ sender
|
|
|
213e69d |
+ The sender of the signal Either a specific object or None.
|
|
|
213e69d |
+ named
|
|
|
213e69d |
+ Named arguments which will be passed to receivers.
|
|
|
213e69d |
+ Returns a list of tuple pairs [(receiver, response), ... ].
|
|
|
213e69d |
+ """
|
|
|
213e69d |
+ responses = []
|
|
|
213e69d |
+ if not self.receivers:
|
|
|
213e69d |
+ return responses
|
|
|
213e69d |
+
|
|
|
213e69d |
+ sender_id = _make_id(sender)
|
|
|
213e69d |
+ if sender_id not in self.sender_status:
|
|
|
213e69d |
+ self.sender_status[sender_id] = {}
|
|
|
213e69d |
+
|
|
|
213e69d |
+ if self.sender_status[sender_id] == named:
|
|
|
213e69d |
+ return responses
|
|
|
213e69d |
+
|
|
|
213e69d |
+ self.sender_status[sender_id] = named
|
|
|
213e69d |
+
|
|
|
213e69d |
+ for receiver in self._live_receivers(sender_id):
|
|
|
213e69d |
+ response = receiver(signal=self, sender=sender, **named)
|
|
|
213e69d |
+ responses.append((receiver, response))
|
|
|
213e69d |
+ return responses
|
|
|
213e69d |
|
|
|
213e69d |
# Fires when a device responds to a broadcast
|
|
|
213e69d |
discovered = Signal(providing_args=["address", "headers"])
|