123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- """
- Hook wrapper "result" utilities.
- """
- import sys
- def _raise_wrapfail(wrap_controller, msg):
- co = wrap_controller.gi_code
- raise RuntimeError(
- "wrap_controller at %r %s:%d %s"
- % (co.co_name, co.co_filename, co.co_firstlineno, msg)
- )
- class HookCallError(Exception):
- """Hook was called wrongly."""
- class _Result:
- def __init__(self, result, excinfo):
- self._result = result
- self._excinfo = excinfo
- @property
- def excinfo(self):
- return self._excinfo
- @classmethod
- def from_call(cls, func):
- __tracebackhide__ = True
- result = excinfo = None
- try:
- result = func()
- except BaseException:
- excinfo = sys.exc_info()
- return cls(result, excinfo)
- def force_result(self, result):
- """Force the result(s) to ``result``.
- If the hook was marked as a ``firstresult`` a single value should
- be set otherwise set a (modified) list of results. Any exceptions
- found during invocation will be deleted.
- """
- self._result = result
- self._excinfo = None
- def get_result(self):
- """Get the result(s) for this hook call.
- If the hook was marked as a ``firstresult`` only a single value
- will be returned otherwise a list of results.
- """
- __tracebackhide__ = True
- if self._excinfo is None:
- return self._result
- else:
- ex = self._excinfo
- raise ex[1].with_traceback(ex[2])
|