1 | # Our copy of mypy/mypyc/crash.py, patched to write to stderr
|
2 |
|
3 | from typing import Iterator
|
4 |
|
5 | MYPY = False
|
6 | if MYPY:
|
7 | from typing import NoReturn
|
8 |
|
9 | import sys
|
10 | import traceback
|
11 | from contextlib import contextmanager
|
12 |
|
13 |
|
14 | @contextmanager
|
15 | def catch_errors(module_path: str, line: int) -> Iterator[None]:
|
16 | try:
|
17 | yield
|
18 | except Exception:
|
19 | crash_report(module_path, line)
|
20 |
|
21 |
|
22 | def crash_report(module_path: str, line: int) -> 'NoReturn':
|
23 | # Adapted from report_internal_error in mypy
|
24 | err = sys.exc_info()[1]
|
25 | tb = traceback.extract_stack()[:-4]
|
26 | # Excise all the traceback from the test runner
|
27 | for i, x in enumerate(tb):
|
28 | if x.name == 'pytest_runtest_call':
|
29 | tb = tb[i + 1:]
|
30 | break
|
31 | tb2 = traceback.extract_tb(sys.exc_info()[2])[1:]
|
32 | print('Traceback (most recent call last):', file=sys.stderr)
|
33 | for s in traceback.format_list(tb + tb2):
|
34 | print(s.rstrip('\n'), file=sys.stderr)
|
35 | print('{}:{}: {}: {}'.format(module_path, line,
|
36 | type(err).__name__, err),
|
37 | file=sys.stderr)
|
38 | raise SystemExit(2)
|