61 lines
1.5 KiB
Python
61 lines
1.5 KiB
Python
"""
|
|
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])
|