From d06b2416ea43c535b907b7d0a2b72fff3b2f3a0f Mon Sep 17 00:00:00 2001 From: Phil Jones Date: Mon, 23 Jan 2023 23:00:32 +0000 Subject: 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 --- src/blinker/base.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'src/blinker') 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*. -- cgit v1.2.1