Esempio n. 1
0
 def testShortCircuit(self):
     """Test that creation short-circuits to reuse existing references"""
     sd = {}
     for s in self.ss:
         sd[s] = 1
     for t in self.ts:
         if hasattr(t, 'x'):
             self.assertTrue(safeRef(t.x) in sd)
         else:
             self.assertTrue(safeRef(t) in sd)
Esempio n. 2
0
 def setUp(self):
     ts = []
     ss = []
     for x in xrange(5000):
         t = Test1()
         ts.append(t)
         s = safeRef(t.x, self._closure)
         ss.append(s)
     ts.append(test2)
     ss.append(safeRef(test2, self._closure))
     for x in xrange(30):
         t = Test2()
         ts.append(t)
         s = safeRef(t, self._closure)
         ss.append(s)
     self.ts = ts
     self.ss = ss
     self.closureCount = 0
Esempio n. 3
0
 def testIn(self):
     """Test the "in" operator for safe references (cmp)"""
     for t in self.ts[:50]:
         self.assertTrue(safeRef(t.x) in self.ss)
Esempio n. 4
0
    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):
        """
        Connect receiver to sender for signal.

        Arguments:

            receiver
                A function or an instance method which is to receive signals.
                Receivers must be hashable objects.

                If weak is True, then receiver must be weak-referencable (more
                precisely saferef.safeRef() must be able to create a reference
                to the receiver).

                Receivers must be able to accept keyword arguments.

                If receivers have a dispatch_uid attribute, the receiver will
                not be added if another receiver already exists with that
                dispatch_uid.

            sender
                The sender to which the receiver should respond. Must either be
                of type Signal, or None to receive events from any sender.

            weak
                Whether to use weak references to the receiver. By default, the
                module will attempt to use weak references to the receiver
                objects. If this parameter is false, then strong references will
                be used.

            dispatch_uid
                An identifier used to uniquely identify a particular instance of
                a receiver. This will usually be a string, though it may be
                anything hashable.
        """
        from djangocg.conf import settings

        # If DEBUG is on, check that we got a good receiver
        if settings.DEBUG:
            import inspect
            assert callable(receiver), "Signal receivers must be callable."

            # Check for **kwargs
            # Not all callables are inspectable with getargspec, so we'll
            # try a couple different ways but in the end fall back on assuming
            # it is -- we don't want to prevent registration of valid but weird
            # callables.
            try:
                argspec = inspect.getargspec(receiver)
            except TypeError:
                try:
                    argspec = inspect.getargspec(receiver.__call__)
                except (TypeError, AttributeError):
                    argspec = None
            if argspec:
                assert argspec[2] is not None, \
                    "Signal receivers must accept keyword arguments (**kwargs)."

        if dispatch_uid:
            lookup_key = (dispatch_uid, _make_id(sender))
        else:
            lookup_key = (_make_id(receiver), _make_id(sender))

        if weak:
            receiver = saferef.safeRef(receiver, onDelete=self._remove_receiver)

        with self.lock:
            for r_key, _ in self.receivers:
                if r_key == lookup_key:
                    break
            else:
                self.receivers.append((lookup_key, receiver))