Browse Source

Signal.connect can now be used as a decorator :happy:

Ask Solem 13 years ago
parent
commit
f63a3068ef
1 changed files with 26 additions and 13 deletions
  1. 26 13
      celery/utils/dispatch/signal.py

+ 26 - 13
celery/utils/dispatch/signal.py

@@ -41,7 +41,7 @@ class Signal(object):
             providing_args = []
         self.providing_args = set(providing_args)
 
-    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):
+    def connect(self, *args, **kwargs):
         """Connect receiver to sender for signal.
 
         :param receiver: A function or an instance method which is to
@@ -71,20 +71,33 @@ class Signal(object):
             string, though it may be anything hashable.
 
         """
-        if dispatch_uid:
-            lookup_key = (dispatch_uid, _make_id(sender))
-        else:
-            lookup_key = (_make_id(receiver), _make_id(sender))
+        def _handle_options(sender=None, weak=True, dispatch_uid=None):
 
-        if weak:
-            receiver = saferef.safe_ref(receiver,
-                                        on_delete=self._remove_receiver)
+            def _connect_signal(fun):
+                receiver = fun
 
-        for r_key, _ in self.receivers:
-            if r_key == lookup_key:
-                break
-        else:
-            self.receivers.append((lookup_key, receiver))
+                if dispatch_uid:
+                    lookup_key = (dispatch_uid, _make_id(sender))
+                else:
+                    lookup_key = (_make_id(receiver), _make_id(sender))
+
+                if weak:
+                    receiver = saferef.safe_ref(receiver,
+                                                on_delete=self._remove_receiver)
+
+                for r_key, _ in self.receivers:
+                    if r_key == lookup_key:
+                        break
+                else:
+                    self.receivers.append((lookup_key, receiver))
+
+                return fun
+
+            return _connect_signal
+
+        if args and callable(args[0]):
+            return _handle_options(*args[1:], **kwargs)(args[0])
+        return _handle_options(*args, **kwargs)
 
     def disconnect(self, receiver=None, sender=None, weak=True,
             dispatch_uid=None):