Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/circuits/core/components.py b/circuits/core/components.py
- --- a/circuits/core/components.py
- +++ b/circuits/core/components.py
- @@ -145,6 +145,11 @@
- if hasattr(self, "init") and isinstance(self.init, Callable):
- self.init(*args, **kwargs)
- +
- + @handler("prepare_unregister_complete", channel=self)
- + def _on_prepare_unregister_complete(self, e, value):
- + self._do_prepare_unregister_complete(e, value)
- + self.addHandler(_on_prepare_unregister_complete)
- def register(self, parent):
- """
- @@ -214,8 +219,7 @@
- def unregister_pending(self):
- return getattr(self, "_unregister_pending", False)
- - @handler("prepare_unregister_complete")
- - def _on_prepare_unregister_complete(self, e, value):
- + def _do_prepare_unregister_complete(self, e, value):
- # Remove component from tree now
- delattr(self, "_unregister_pending")
- self.fire(Unregistered(self, self.parent))
- diff --git a/circuits/core/handlers.py b/circuits/core/handlers.py
- --- a/circuits/core/handlers.py
- +++ b/circuits/core/handlers.py
- @@ -104,7 +104,10 @@
- def reprhandler(handler):
- format = "<%s[%s.%s] (%s.%s)>"
- - channel = handler.channel or "*"
- + channel = handler.channel if handler.channel is not None else "*"
- + from circuits.core.manager import Manager
- + if isinstance(channel, Manager):
- + channel = "<instance of " + channel.__class__.__name__ + ">"
- names = ".".join(handler.names)
- type = "filter" if handler.filter else "listener"
- diff --git a/circuits/core/manager.py b/circuits/core/manager.py
- --- a/circuits/core/manager.py
- +++ b/circuits/core/manager.py
- @@ -46,6 +46,15 @@
- self.value = value
- +class Dummy(object):
- +
- + channel = None
- +
- +
- +_dummy = Dummy()
- +del Dummy
- +
- +
- class Manager(object):
- """
- The manager class has two roles. As a base class for component
- @@ -96,7 +105,6 @@
- """
- _currently_handling = None
- - traverse_children_handlers = True
- """
- The event currently being handled.
- """
- @@ -233,35 +241,34 @@
- return getpid() if self.__process is None else self.__process.pid
- def getHandlers(self, event, channel, **kwargs):
- - channel_is_instance = isinstance(channel, Manager)
- -
- name = event.name
- handlers = set()
- - handlers_chain = [self._handlers.get("*", set())]
- + handlers_chain = [self._handlers.get("*", [])]
- - if not channel_is_instance or channel == self:
- - if name in self._handlers:
- - handlers_chain.append(self._handlers[name])
- + handlers_chain.append(self._handlers.get(name, []))
- for _handler in chain(*handlers_chain):
- - if _handler.channel:
- - handler_channel = _handler.channel
- - elif hasattr(_handler, "__self__"):
- - handler_channel = getattr(_handler.__self__, "channel", None)
- - else:
- - handler_channel = None
- + handler_channel = _handler.channel
- + if handler_channel is None:
- + handler_channel = getattr(
- + getattr(
- + _handler, "im_self", getattr(
- + _handler, "__self__", _dummy
- + )
- + ),
- + "channel", None
- + )
- if channel == "*" or handler_channel in ("*", channel,) \
- - or channel_is_instance:
- + or channel is self:
- handlers.add(_handler)
- if not kwargs.get("exclude_globals", False):
- handlers.update(self._globals)
- - if self.traverse_children_handlers:
- - for c in self.components.copy():
- - handlers.update(c.getHandlers(event, channel, **kwargs))
- + for c in self.components.copy():
- + handlers.update(c.getHandlers(event, channel, **kwargs))
- return handlers
- diff --git a/tests/tools/test_tools.py b/tests/tools/test_tools.py
- --- a/tests/tools/test_tools.py
- +++ b/tests/tools/test_tools.py
- @@ -62,7 +62,7 @@
- foo; 1
- <listener[*.foo] (A.foo)>
- prepare_unregister_complete; 1
- - <listener[*.prepare_unregister_complete] (A._on_prepare_unregister_complete)>
- + <listener[<instance of A>.prepare_unregister_complete] (A._on_prepare_unregister_complete)>
- """
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement