Advertisement
Guest User

Untitled

a guest
Feb 12th, 2013
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.44 KB | None | 0 0
  1. diff --git a/circuits/core/components.py b/circuits/core/components.py
  2. --- a/circuits/core/components.py
  3. +++ b/circuits/core/components.py
  4. @@ -145,6 +145,11 @@
  5.  
  6. if hasattr(self, "init") and isinstance(self.init, Callable):
  7. self.init(*args, **kwargs)
  8. +
  9. + @handler("prepare_unregister_complete", channel=self)
  10. + def _on_prepare_unregister_complete(self, e, value):
  11. + self._do_prepare_unregister_complete(e, value)
  12. + self.addHandler(_on_prepare_unregister_complete)
  13.  
  14. def register(self, parent):
  15. """
  16. @@ -214,8 +219,7 @@
  17. def unregister_pending(self):
  18. return getattr(self, "_unregister_pending", False)
  19.  
  20. - @handler("prepare_unregister_complete")
  21. - def _on_prepare_unregister_complete(self, e, value):
  22. + def _do_prepare_unregister_complete(self, e, value):
  23. # Remove component from tree now
  24. delattr(self, "_unregister_pending")
  25. self.fire(Unregistered(self, self.parent))
  26. diff --git a/circuits/core/handlers.py b/circuits/core/handlers.py
  27. --- a/circuits/core/handlers.py
  28. +++ b/circuits/core/handlers.py
  29. @@ -104,7 +104,10 @@
  30. def reprhandler(handler):
  31. format = "<%s[%s.%s] (%s.%s)>"
  32.  
  33. - channel = handler.channel or "*"
  34. + channel = handler.channel if handler.channel is not None else "*"
  35. + from circuits.core.manager import Manager
  36. + if isinstance(channel, Manager):
  37. + channel = "<instance of " + channel.__class__.__name__ + ">"
  38. names = ".".join(handler.names)
  39. type = "filter" if handler.filter else "listener"
  40.  
  41. diff --git a/circuits/core/manager.py b/circuits/core/manager.py
  42. --- a/circuits/core/manager.py
  43. +++ b/circuits/core/manager.py
  44. @@ -46,6 +46,15 @@
  45. self.value = value
  46.  
  47.  
  48. +class Dummy(object):
  49. +
  50. + channel = None
  51. +
  52. +
  53. +_dummy = Dummy()
  54. +del Dummy
  55. +
  56. +
  57. class Manager(object):
  58. """
  59. The manager class has two roles. As a base class for component
  60. @@ -96,7 +105,6 @@
  61. """
  62.  
  63. _currently_handling = None
  64. - traverse_children_handlers = True
  65. """
  66. The event currently being handled.
  67. """
  68. @@ -233,35 +241,34 @@
  69. return getpid() if self.__process is None else self.__process.pid
  70.  
  71. def getHandlers(self, event, channel, **kwargs):
  72. - channel_is_instance = isinstance(channel, Manager)
  73. -
  74. name = event.name
  75. handlers = set()
  76.  
  77. - handlers_chain = [self._handlers.get("*", set())]
  78. + handlers_chain = [self._handlers.get("*", [])]
  79.  
  80. - if not channel_is_instance or channel == self:
  81. - if name in self._handlers:
  82. - handlers_chain.append(self._handlers[name])
  83. + handlers_chain.append(self._handlers.get(name, []))
  84.  
  85. for _handler in chain(*handlers_chain):
  86. - if _handler.channel:
  87. - handler_channel = _handler.channel
  88. - elif hasattr(_handler, "__self__"):
  89. - handler_channel = getattr(_handler.__self__, "channel", None)
  90. - else:
  91. - handler_channel = None
  92. + handler_channel = _handler.channel
  93. + if handler_channel is None:
  94. + handler_channel = getattr(
  95. + getattr(
  96. + _handler, "im_self", getattr(
  97. + _handler, "__self__", _dummy
  98. + )
  99. + ),
  100. + "channel", None
  101. + )
  102.  
  103. if channel == "*" or handler_channel in ("*", channel,) \
  104. - or channel_is_instance:
  105. + or channel is self:
  106. handlers.add(_handler)
  107.  
  108. if not kwargs.get("exclude_globals", False):
  109. handlers.update(self._globals)
  110.  
  111. - if self.traverse_children_handlers:
  112. - for c in self.components.copy():
  113. - handlers.update(c.getHandlers(event, channel, **kwargs))
  114. + for c in self.components.copy():
  115. + handlers.update(c.getHandlers(event, channel, **kwargs))
  116.  
  117. return handlers
  118.  
  119. diff --git a/tests/tools/test_tools.py b/tests/tools/test_tools.py
  120. --- a/tests/tools/test_tools.py
  121. +++ b/tests/tools/test_tools.py
  122. @@ -62,7 +62,7 @@
  123. foo; 1
  124. <listener[*.foo] (A.foo)>
  125. prepare_unregister_complete; 1
  126. - <listener[*.prepare_unregister_complete] (A._on_prepare_unregister_complete)>
  127. + <listener[<instance of A>.prepare_unregister_complete] (A._on_prepare_unregister_complete)>
  128. """
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement