-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathtraceback.py
60 lines (40 loc) · 1.73 KB
/
traceback.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
"""Process tracebacks."""
from pathlib import Path
import _pytask
import pluggy
_PLUGGY_DIRECTORY = Path(pluggy.__file__).parent
_PYTASK_DIRECTORY = Path(_pytask.__file__).parent
def remove_traceback_from_exc_info(exc_info):
"""Remove traceback from exception."""
return (*exc_info[:2], None)
def remove_internal_traceback_frames_from_exc_info(exc_info):
"""Remove internal traceback frames from exception info.
If a non-internal traceback frame is found, return the traceback from the first
occurrence downwards.
"""
if exc_info is not None:
filtered_traceback = _filter_internal_traceback_frames(exc_info[2])
exc_info = (*exc_info[:2], filtered_traceback)
return exc_info
def _is_internal_or_hidden_traceback_frame(frame):
"""Returns ``True`` if traceback frame belongs to internal packages or is hidden.
Internal packages are ``_pytask`` and ``pluggy``. A hidden frame is indicated by a
local variable called ``__tracebackhide__ = True``.
"""
is_hidden = frame.tb_frame.f_locals.get("__tracebackhide__", False)
if is_hidden:
return True
path = Path(frame.tb_frame.f_code.co_filename)
return any(root in path.parents for root in [_PLUGGY_DIRECTORY, _PYTASK_DIRECTORY])
def _filter_internal_traceback_frames(frame):
"""Filter internal traceback frames from traceback.
If the first external frame is visited, return the frame. Else return ``None``.
"""
for frame in _yield_traceback_frames(frame):
if frame is None or not _is_internal_or_hidden_traceback_frame(frame):
break
return frame
def _yield_traceback_frames(frame):
"""Yield traceback frames."""
yield frame
yield from _yield_traceback_frames(frame.tb_next)