49 lines
1.1 KiB
Python
49 lines
1.1 KiB
Python
|
from __future__ import annotations
|
||
|
|
||
|
import contextlib
|
||
|
import inspect
|
||
|
import os
|
||
|
|
||
|
|
||
|
@contextlib.contextmanager
|
||
|
def rewrite_exception(old_name: str, new_name: str):
|
||
|
"""
|
||
|
Rewrite the message of an exception.
|
||
|
"""
|
||
|
try:
|
||
|
yield
|
||
|
except Exception as err:
|
||
|
if not err.args:
|
||
|
raise
|
||
|
msg = str(err.args[0])
|
||
|
msg = msg.replace(old_name, new_name)
|
||
|
args: tuple[str, ...] = (msg,)
|
||
|
if len(err.args) > 1:
|
||
|
args = args + err.args[1:]
|
||
|
err.args = args
|
||
|
raise
|
||
|
|
||
|
|
||
|
def find_stack_level() -> int:
|
||
|
"""
|
||
|
Find the first place in the stack that is not inside pandas
|
||
|
(tests notwithstanding).
|
||
|
"""
|
||
|
|
||
|
import pandas as pd
|
||
|
|
||
|
pkg_dir = os.path.dirname(pd.__file__)
|
||
|
test_dir = os.path.join(pkg_dir, "tests")
|
||
|
|
||
|
# https://stackoverflow.com/questions/17407119/python-inspect-stack-is-slow
|
||
|
frame = inspect.currentframe()
|
||
|
n = 0
|
||
|
while frame:
|
||
|
fname = inspect.getfile(frame)
|
||
|
if fname.startswith(pkg_dir) and not fname.startswith(test_dir):
|
||
|
frame = frame.f_back
|
||
|
n += 1
|
||
|
else:
|
||
|
break
|
||
|
return n
|