Ejemplo n.º 1
0
 def __set__( self, client, value, notify=1 ):
     """Set an event value"""
     method = getattr( client, 'on_%s'%(self.name,), None)
     if method is not None:
         robustapply.robustApply(
             method, value, event=self,
         )
     # now set as a normal property...
     client.__dict__[self.name] = value
     # and then send event letting world know...
     if notify:
         dispatcher.send( ('set',self), client, value=value)
Ejemplo n.º 2
0
 def __set__( self, client, value, notify=1 ):
     """Set an event value"""
     method = getattr( client, 'on_%s'%(self.name,), None)
     if method is not None:
         robustapply.robustApply(
             method, value, event=self,
         )
     # now set as a normal property...
     client.__dict__[self.name] = value
     # and then send event letting world know...
     if notify:
         dispatcher.send( ('set',self), client, value=value)
Ejemplo n.º 3
0
def send_catch_log(signal=Any, sender=Anonymous, *arguments, **named):
    """Like pydispatcher.robust.sendRobust but it also logs errors and returns
    Failures instead of exceptions.
    """
    dont_log = named.pop("dont_log", _IgnoredException)
    spider = named.get("spider", None)
    responses = []
    for receiver in liveReceivers(getAllReceivers(sender, signal)):
        try:
            response = robustApply(receiver, signal=signal, sender=sender, *arguments, **named)
            if isinstance(response, Deferred):
                logger.error(
                    "Cannot return deferreds from signal handler: %(receiver)s",
                    {"receiver": receiver},
                    extra={"spider": spider},
                )
        except dont_log:
            result = Failure()
        except Exception:
            result = Failure()
            logger.error(
                "Error caught on signal handler: %(receiver)s",
                {"receiver": receiver},
                exc_info=True,
                extra={"spider": spider},
            )
        else:
            result = response
        responses.append((receiver, result))
    return responses
Ejemplo n.º 4
0
def send_catch_log(signal=Any, sender=Anonymous, *arguments, **named):
    """Like pydispatcher.robust.sendRobust but it also logs errors and returns
    Failures instead of exceptions.
    """
    dont_log = (named.pop('dont_log', _IgnoredException), StopDownload)
    spider = named.get('spider', None)
    responses = []
    for receiver in liveReceivers(getAllReceivers(sender, signal)):
        try:
            response = robustApply(receiver,
                                   signal=signal,
                                   sender=sender,
                                   *arguments,
                                   **named)
            if isinstance(response, Deferred):
                logger.error(
                    "Cannot return deferreds from signal handler: %(receiver)s",
                    {'receiver': receiver},
                    extra={'spider': spider})
        except dont_log:
            result = Failure()
        except Exception:
            result = Failure()
            logger.error("Error caught on signal handler: %(receiver)s",
                         {'receiver': receiver},
                         exc_info=True,
                         extra={'spider': spider})
        else:
            result = response
        responses.append((receiver, result))
    return responses
Ejemplo n.º 5
0
 def _wrapper(*args, **kwds):
     try:
         return robustApply(fun, *args, **kwds)
     except Exception, e:
         if debug:
             traceback.print_exc()
         if not silent:
             raise WarningErr(str(e))
Ejemplo n.º 6
0
def sendRobust(
    signal=Any, 
    sender=Anonymous, 
    *arguments, **named
):
    """Send signal from sender to all connected receivers catching errors
    
    signal -- (hashable) signal value, see connect for details

    sender -- the sender of the signal
    
        if Any, only receivers registered for Any will receive
        the message.

        if Anonymous, only receivers registered to receive
        messages from Anonymous or Any will receive the message

        Otherwise can be any python object (normally one
        registered with a connect if you actually want
        something to occur).

    arguments -- positional arguments which will be passed to
        *all* receivers. Note that this may raise TypeErrors
        if the receivers do not allow the particular arguments.
        Note also that arguments are applied before named
        arguments, so they should be used with care.

    named -- named arguments which will be filtered according
        to the parameters of the receivers to only provide those
        acceptable to the receiver.

    Return a list of tuple pairs [(receiver, response), ... ]

    if any receiver raises an error (specifically any subclass of Exception),
    the error instance is returned as the result for that receiver.
    """
    # Call each receiver with whatever arguments it can accept.
    # Return a list of tuple pairs [(receiver, response), ... ].
    responses = []
    for receiver in liveReceivers(getAllReceivers(sender, signal)):
        try:
            response = robustApply(
                receiver,
                signal=signal,
                sender=sender,
                *arguments,
                **named
            )
        except Exception as err:
            responses.append((receiver, err))
        else:
            responses.append((receiver, response))
    return responses
Ejemplo n.º 7
0
def send(signal=Any,
         sender=Anonymous,
         *arguments,
         **named):  # 这就是发送信号的意思了,还能返回结果,操了
    """Send signal from sender to all connected receivers.
    
    signal -- (hashable) signal value, see connect for details

    sender -- the sender of the signal
    
        if Any, only receivers registered for Any will receive
        the message.

        if Anonymous, only receivers registered to receive
        messages from Anonymous or Any will receive the message

        Otherwise can be any python object (normally one
        registered with a connect if you actually want
        something to occur).

    arguments -- positional arguments which will be passed to
        *all* receivers. Note that this may raise TypeErrors
        if the receivers do not allow the particular arguments.
        Note also that arguments are applied before named
        arguments, so they should be used with care.

    named -- named arguments which will be filtered according
        to the parameters of the receivers to only provide those
        acceptable to the receiver.

    Return a list of tuple pairs [(receiver, response), ... ]

    if any receiver raises an error, the error propagates back
    through send, terminating the dispatch loop, so it is quite
    possible to not have all receivers called if a raises an
    error.
    """
    # Call each receiver with whatever arguments it can accept.
    # Return a list of tuple pairs [(receiver, response), ... ].
    responses = []
    for receiver in liveReceivers(getAllReceivers(sender, signal)):
        response = robustapply.robustApply(receiver,
                                           signal=signal,
                                           sender=sender,
                                           *arguments,
                                           **named)
        responses.append((receiver, response))  # 以元组的形式绑在一起咯
    return responses
Ejemplo n.º 8
0
	def send(self, signal=Any, sender=Anonymous, *arguments, **named):
		"""Send signal from sender to all connected receivers.
		
		signal -- (hashable) signal value, see connect for details

		sender -- the sender of the signal
		
			if Any, only receivers registered for Any will receive
			the message.

			if Anonymous, only receivers registered to receive
			messages from Anonymous or Any will receive the message

			Otherwise can be any python object (normally one
			registered with a connect if you actually want
			something to occur).

		arguments -- positional arguments which will be passed to
			*all* receivers. Note that this may raise TypeErrors
			if the receivers do not allow the particular arguments.
			Note also that arguments are applied before named
			arguments, so they should be used with care.

		named -- named arguments which will be filtered according
			to the parameters of the receivers to only provide those
			acceptable to the receiver.

		Return a list of tuple pairs [(receiver, response), ... ]

		if any receiver raises an error, the error propagates back
		through send, terminating the dispatch loop, so it is quite
		possible to not have all receivers called if a raises an
		error.
		"""
		# Call each receiver with whatever arguments it can accept.
		# Return a list of tuple pairs [(receiver, response), ... ].
		responses = []
		for receiver in self.liveReceivers(self.getAllReceivers(sender, signal)):
			response = robustapply.robustApply(
				receiver,
				signal=signal,
				sender=sender,
				*arguments,
				**named
			)
			if response:
				responses.append((receiver, response))
		return responses
Ejemplo n.º 9
0
def sendRobust(signal=Any, sender=Anonymous, *arguments, **named):
    """Send signal from sender to all connected receivers catching errors
	
	signal -- (hashable) signal value, see connect for details

	sender -- the sender of the signal
	
		if Any, only receivers registered for Any will receive
		the message.

		if Anonymous, only receivers registered to receive
		messages from Anonymous or Any will receive the message

		Otherwise can be any python object (normally one
		registered with a connect if you actually want
		something to occur).

	arguments -- positional arguments which will be passed to
		*all* receivers. Note that this may raise TypeErrors
		if the receivers do not allow the particular arguments.
		Note also that arguments are applied before named
		arguments, so they should be used with care.

	named -- named arguments which will be filtered according
		to the parameters of the receivers to only provide those
		acceptable to the receiver.

	Return a list of tuple pairs [(receiver, response), ... ]

	if any receiver raises an error (specifically any subclass of Exception),
	the error instance is returned as the result for that receiver.
	"""
    # Call each receiver with whatever arguments it can accept.
    # Return a list of tuple pairs [(receiver, response), ... ].
    responses = []
    for receiver in liveReceivers(getAllReceivers(sender, signal)):
        try:
            response = robustApply(receiver,
                                   signal=signal,
                                   sender=sender,
                                   *arguments,
                                   **named)
        except Exception as err:
            responses.append((receiver, err))
        else:
            responses.append((receiver, response))
    return responses
Ejemplo n.º 10
0
def sendExact(signal=Any, sender=Anonymous, *arguments, **named):
    """Send signal only to those receivers registered for exact message

	sendExact allows for avoiding Any/Anonymous registered
	handlers, sending only to those receivers explicitly
	registered for a particular signal on a particular
	sender.
	"""
    responses = []
    for receiver in liveReceivers(getReceivers(sender, signal)):
        response = robustapply.robustApply(receiver,
                                           signal=signal,
                                           sender=sender,
                                           *arguments,
                                           **named)
        responses.append((receiver, response))
    return responses
Ejemplo n.º 11
0
def sendExact( signal=Any, sender=Anonymous, *arguments, **named ):
	"""Send signal only to those receivers registered for exact message

	sendExact allows for avoiding Any/Anonymous registered
	handlers, sending only to those receivers explicitly
	registered for a particular signal on a particular
	sender.
	"""
	responses = []
	for receiver in liveReceivers(getReceivers(sender, signal)):
		response = robustapply.robustApply(
			receiver,
			signal=signal,
			sender=sender,
			*arguments,
			**named
		)
		responses.append((receiver, response))
	return responses