|
1 | 1 | import inspect
|
2 | 2 | import warnings
|
3 |
| -from .callers import _multicall, HookCallError, _Result, _legacymulticall |
| 3 | +from .callers import ( |
| 4 | + _multicall, _itercall, HookCallError, _Result, _legacymulticall) |
4 | 5 |
|
5 | 6 | __version__ = '0.5.3.dev'
|
6 | 7 |
|
@@ -209,6 +210,8 @@ def __init__(self, project_name, implprefix=None):
|
209 | 210 | self._plugin_distinfo = []
|
210 | 211 | self.trace = _TagTracer().get("pluginmanage")
|
211 | 212 | self.hook = _HookRelay(self.trace.root.get("hook"))
|
| 213 | + # alternative set of lazily executed hook calls |
| 214 | + self.ihook = _HookRelay(self.trace.root.get("hook")) |
212 | 215 | self._implprefix = implprefix
|
213 | 216 | self._inner_hookexec = lambda hook, methods, kwargs: \
|
214 | 217 | hook.multicall(
|
@@ -247,7 +250,9 @@ def register(self, plugin, name=None):
|
247 | 250 | hook = getattr(self.hook, name, None)
|
248 | 251 | if hook is None:
|
249 | 252 | hook = _HookCaller(name, self._hookexec)
|
| 253 | + ihook = _HookCaller(name, self._hookexec, iterate=True) |
250 | 254 | setattr(self.hook, name, hook)
|
| 255 | + setattr(self.ihook, name, ihook) |
251 | 256 | elif hook.has_spec():
|
252 | 257 | self._verify_hook(hook, hookimpl)
|
253 | 258 | hook._maybe_apply_history(hookimpl)
|
@@ -528,14 +533,15 @@ def __init__(self, trace):
|
528 | 533 |
|
529 | 534 |
|
530 | 535 | class _HookCaller(object):
|
531 |
| - def __init__(self, name, hook_execute, specmodule_or_class=None, spec_opts=None): |
| 536 | + def __init__(self, name, hook_execute, specmodule_or_class=None, spec_opts=None, |
| 537 | + iterate=False): |
532 | 538 | self.name = name
|
533 | 539 | self._wrappers = []
|
534 | 540 | self._nonwrappers = []
|
535 | 541 | self._hookexec = hook_execute
|
536 | 542 | self.argnames = None
|
537 | 543 | self.kwargnames = None
|
538 |
| - self.multicall = _multicall |
| 544 | + self.multicall = _multicall if not iterate else _itercall |
539 | 545 | if specmodule_or_class is not None:
|
540 | 546 | assert spec_opts is not None
|
541 | 547 | self.set_specification(specmodule_or_class, spec_opts)
|
|
0 commit comments