Spaces:
Running
Running
""" | |
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 | |
def excinfo(self): | |
return self._excinfo | |
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]) | |