summaryrefslogtreecommitdiff
path: root/src/blinker
diff options
context:
space:
mode:
authorPhil Jones <philip.graham.jones@googlemail.com>2023-01-23 23:00:32 +0000
committerGitHub <noreply@github.com>2023-01-24 00:00:32 +0100
commitd06b2416ea43c535b907b7d0a2b72fff3b2f3a0f (patch)
tree566da903678855496ab9d691f229edc2bf89c917 /src/blinker
parent9c2f289f024e7aac20bf3dbdebfc4ec279df3458 (diff)
downloadblinker-d06b2416ea43c535b907b7d0a2b72fff3b2f3a0f.tar.gz
Added `muted` context manager for temproary switching signal off (#84)
This is useful whilst testing to remove a signal's affects. Co-authored-by: Michael Elovskikh <wronglink@yandex-team.ru>
Diffstat (limited to 'src/blinker')
-rw-r--r--src/blinker/base.py26
1 files changed, 22 insertions, 4 deletions
diff --git a/src/blinker/base.py b/src/blinker/base.py
index 2b87cb9..f80750c 100644
--- a/src/blinker/base.py
+++ b/src/blinker/base.py
@@ -82,6 +82,7 @@ class Signal:
#: of the mapping is useful as an extremely efficient check to see if
#: any receivers are connected to the signal.
self.receivers = {}
+ self.is_muted = False
self._by_receiver = defaultdict(set)
self._by_sender = defaultdict(set)
self._weak_senders = {}
@@ -209,6 +210,19 @@ class Signal:
else:
self.disconnect(receiver)
+ @contextmanager
+ def muted(self):
+ """Context manager for temporarily disabling signal.
+ Useful for test purposes.
+ """
+ self.is_muted = True
+ try:
+ yield None
+ except Exception as e:
+ raise e
+ finally:
+ self.is_muted = False
+
def temporarily_connected_to(self, receiver, sender=ANY):
"""An alias for :meth:`connected_to`.
@@ -259,10 +273,14 @@ class Signal:
)
else:
sender = sender[0]
- return [
- (receiver, receiver(sender, **kwargs))
- for receiver in self.receivers_for(sender)
- ]
+
+ if self.is_muted:
+ return []
+ else:
+ return [
+ (receiver, receiver(sender, **kwargs))
+ for receiver in self.receivers_for(sender)
+ ]
def has_receivers_for(self, sender):
"""True if there is probably a receiver for *sender*.