Exemplo 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(sd.has_key(safeRef(t.x)))
             self.assertTrue(safeRef(t.x) in sd)
         else:
             self.assertTrue(sd.has_key(safeRef(t)))
             self.assertTrue(safeRef(t) in sd)
Exemplo n.º 2
0
    def __init__(self, stepid, qt_widget, onEntryCallback=None, validateCallback=None, onExitCallback=None):
        self.initialize(stepid)
        self.qt_widget = qt_widget

        if onEntryCallback:
            self.weak_onEntryCallback = saferef.safeRef(onEntryCallback)

        if validateCallback:
            self.weak_validateCallback = saferef.safeRef(validateCallback)

        if onExitCallback:
            self.weak_onExitCallback = saferef.safeRef(onExitCallback)
Exemplo n.º 3
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(sd.has_key(safeRef(t.x)))
             self.assertTrue(safeRef(t.x) in sd)
         else:
             self.assertTrue(sd.has_key(safeRef(t)))
             self.assertTrue(safeRef(t) in sd)
Exemplo n.º 4
0
    def subscribe(self, message, receiver):
        assert callable(receiver)

        if message.topic not in self._receivers:
            self._receivers[message.topic] = []

        self._receivers[message.topic].append(safeRef(receiver, self._receiver_deleted))
Exemplo n.º 5
0
    def __init__(self,
                 stepid,
                 qt_widget,
                 onEntryCallback=None,
                 validateCallback=None,
                 onExitCallback=None):
        self.initialize(stepid)
        self.qt_widget = qt_widget

        if onEntryCallback:
            self.weak_onEntryCallback = saferef.safeRef(onEntryCallback)

        if validateCallback:
            self.weak_validateCallback = saferef.safeRef(validateCallback)

        if onExitCallback:
            self.weak_onExitCallback = saferef.safeRef(onExitCallback)
Exemplo n.º 6
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
Exemplo n.º 7
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
Exemplo n.º 8
0
def disconnect(receiver, signal=Any, sender=Any, weak=True):
    """Disconnect receiver from sender for signal

    receiver -- the registered receiver to disconnect
    signal -- the registered signal to disconnect
    sender -- the registered sender to disconnect
    weak -- the weakref state to disconnect

    disconnect reverses the process of connect,
    the semantics for the individual elements are
    logically equivalent to a tuple of
    (receiver, signal, sender, weak) used as a key
    to be deleted from the internal routing tables.
    (The actual process is slightly more complex
    but the semantics are basically the same).

    Note:
        Using disconnect is not required to cleanup
        routing when an object is deleted, the framework
        will remove routes for deleted objects
        automatically.  It's only necessary to disconnect
        if you want to stop routing to a live object.
        
    returns None, may raise DispatcherTypeError or
        DispatcherKeyError
    """
    if signal is None:
        raise errors.DispatcherTypeError(
            'Signal cannot be None (receiver=%r sender=%r)'%( receiver,sender)
        )
    orig = receiver
    if weak: receiver = saferef.safeRef(receiver)
    senderkey = id(sender)
    try:
        signals = connections[senderkey]
        receivers = signals[signal]
    except KeyError:
        raise errors.DispatcherKeyError(
            """No receivers found for signal %r from sender %r""" %(
                signal,
                sender
            )
        )
    try:
        # also removes from receivers
        _removeOldBackRefs(senderkey, signal, receiver, receivers)
        disconnected.add(orig)
    except ValueError:
        raise errors.DispatcherKeyError(
            """No connection to receiver %s for signal %s from sender %s""" %(
                receiver,
                signal,
                sender
            )
        )
    _cleanupConnections(senderkey, signal)
Exemplo n.º 9
0
 def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):
     """
      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.
     """
     
     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)
         
     self.lock.acquire()
     
     try:
         for r_key, _ in self.receivers:
             if r_key == lookup_key:
                 break
         else:
             self.receivers.append((lookup_key, receiver))
     finally:
         self.lock.release()
Exemplo n.º 10
0
    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):
        """Connect receiver to sender for signal

        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.

        returns None
        """
        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)

        for r_key, _ in self.receivers:
            if r_key == lookup_key:
                break
        else:
            self.receivers.append((lookup_key, receiver))
Exemplo n.º 11
0
    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):
        """Connect receiver to sender for signal
    
        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.

        returns None
        """

        # If DEBUG is on, check that we got a good receiver
        if 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 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)

        for r_key, _ in self.receivers:
            if r_key == lookup_key:
                break
        else:
            self.receivers.append((lookup_key, receiver))
Exemplo n.º 12
0
Arquivo: signal.py Projeto: m64/PEG
    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):
        """Connect receiver to sender for signal
    
        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.

        returns None
        """
        
        # If DEBUG is on, check that we got a good receiver
        if 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 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)

        for r_key, _ in self.receivers:
            if r_key == lookup_key:
                break
        else:
            self.receivers.append((lookup_key, receiver))
Exemplo n.º 13
0
def connect(receiver, signal=Any, sender=Any, weak=True):
    """Connect receiver to sender for signal

	receiver -- a callable Python object which is to receive
		messages/signals/events.  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 are fairly flexible in their specification,
		as the machinery in the robustApply module takes care
		of most of the details regarding figuring out appropriate
		subsets of the sent arguments to apply to a given
		receiver.

		Note:
			if receiver is itself a weak reference (a callable),
			it will be de-referenced by the system's machinery,
			so *generally* weak references are not suitable as
			receivers, though some use might be found for the
			facility whereby a higher-level library passes in
			pre-weakrefed receiver references.

	signal -- the signal to which the receiver should respond
	
		if Any, receiver will receive any signal from the
		indicated sender (which might also be Any, but is not
		necessarily Any).
		
		Otherwise must be a hashable Python object other than
		None (DispatcherError raised on None).
		
	sender -- the sender to which the receiver should respond
	
		if Any, receiver will receive the indicated signals
		from any sender.
		
		if Anonymous, receiver will only receive indicated
		signals from send/sendExact which do not specify a
		sender, or specify Anonymous explicitly as the sender.

		Otherwise can be any python object.
		
	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.

	returns None, may raise DispatcherTypeError
	"""
    if signal is None:
        raise errors.DispatcherTypeError("Signal cannot be None (receiver=%r sender=%r)" % (receiver, sender))
    if weak:
        receiver = saferef.safeRef(receiver, onDelete=_removeReceiver)
    senderkey = id(sender)
    if connections.has_key(senderkey):
        signals = connections[senderkey]
    else:
        connections[senderkey] = signals = {}
        # Keep track of senders for cleanup.
        # Is Anonymous something we want to clean up?
    if sender not in (None, Anonymous, Any):

        def remove(object, senderkey=senderkey):
            _removeSender(senderkey=senderkey)
            # Skip objects that can not be weakly referenced, which means
            # they won't be automatically cleaned up, but that's too bad.

        try:
            weakSender = weakref.ref(sender, remove)
            senders[senderkey] = weakSender
        except:
            pass

    receiverID = id(receiver)
    # get current set, remove any current references to
    # this receiver in the set, including back-references
    if signals.has_key(signal):
        receivers = signals[signal]
        _removeOldBackRefs(senderkey, signal, receiver, receivers)
    else:
        receivers = signals[signal] = []
    try:
        current = sendersBack.get(receiverID)
        if current is None:
            sendersBack[receiverID] = current = []
        if senderkey not in current:
            current.append(senderkey)
    except:
        pass

    receivers.append(receiver)
Exemplo n.º 14
0
def connect(receiver, signal=Any, sender=Any, weak=True, expiry=-1, priority=LOWEST_PRIORITY):
    """Connect receiver to sender for signal

    receiver -- a callable Python object which is to receive
        messages/signals/events.  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 are fairly flexible in their specification,
        as the machinery in the robustApply module takes care
        of most of the details regarding figuring out appropriate
        subsets of the sent arguments to apply to a given
        receiver.

        Note:
            if receiver is itself a weak reference (a callable),
            it will be de-referenced by the system's machinery,
            so *generally* weak references are not suitable as
            receivers, though some use might be found for the
            facility whereby a higher-level library passes in
            pre-weakrefed receiver references.

    signal -- the signal to which the receiver should respond
    
        if Any, receiver will receive any signal from the
        indicated sender (which might also be Any, but is not
        necessarily Any).
        
        Otherwise must be a hashable Python object other than
        None (DispatcherError raised on None).
        
    sender -- the sender to which the receiver should respond
    
        if Any, receiver will receive the indicated signals
        from any sender.
        
        if Anonymous, receiver will only receive indicated
        signals from send/sendExact which do not specify a
        sender, or specify Anonymous explicitly as the sender.

        Otherwise can be any python object.
        
    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.

    returns None, may raise DispatcherTypeError
    """
    if signal is None:
        raise errors.DispatcherTypeError(
            'Signal cannot be None (receiver=%r sender=%r)'%( receiver,sender)
        )
    if weak:
        receiver = saferef.safeRef(receiver, onDelete=_removeReceiver)
    senderkey = id(sender)
    if connections.has_key(senderkey):
        signals = connections[senderkey]
    else:
        connections[senderkey] = signals = {}
    # Keep track of senders for cleanup.
    # Is Anonymous something we want to clean up?
    if sender not in (None, Anonymous, Any):
        def remove(object, senderkey=senderkey):
            _removeSender(senderkey=senderkey)
        # Skip objects that can not be weakly referenced, which means
        # they won't be automatically cleaned up, but that's too bad.
        try:
            weakSender = weakref.ref(sender, remove)
            senders[senderkey] = weakSender
        except:
            pass
        
    receiverID = id(receiver)
    # get current set, remove any current references to
    # this receiver in the set, including back-references
    if signals.has_key(signal):
        receivers = signals[signal]
        _removeOldBackRefs(senderkey, signal, receiver, receivers)
    else:
        receivers = signals[signal] = []
    try:
        current = sendersBack.get( receiverID )
        if current is None:
            sendersBack[ receiverID ] = current = []
        if senderkey not in current:
            current.append(senderkey)
    except:
        pass

    connection_info[receiver] = _ConnectionData(priority, expiry, sender, signal, weak)
    receivers.append(receiver)
Exemplo n.º 15
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)
Exemplo n.º 16
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)