From df73491b2b1fdc3ea02df6e563852b0b2498a27d Mon Sep 17 00:00:00 2001 From: Muspi Merol Date: Sun, 18 Aug 2024 23:31:17 +0800 Subject: [PATCH] feat: get cleaner stack trace --- reasonify-headless/reasonify/utils/run.py | 24 ++++++++++++++++++++--- reasonify-headless/version.py | 2 +- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/reasonify-headless/reasonify/utils/run.py b/reasonify-headless/reasonify/utils/run.py index bf4de4e..a486f8a 100644 --- a/reasonify-headless/reasonify/utils/run.py +++ b/reasonify-headless/reasonify/utils/run.py @@ -1,8 +1,9 @@ from contextlib import redirect_stderr, redirect_stdout from functools import cache from io import StringIO +from itertools import count from json import loads -from traceback import format_exception, format_exception_only +from traceback import format_exception, format_exception_only, walk_tb from typing import Callable from promplate import Context @@ -30,7 +31,12 @@ def diff_context(context_in: Context, context_out: Context): return {k: v for k, v in context_out.items() if not k.startswith("__") and (k not in context_in or is_different(context_in[k], v))} +counter = count(1).__next__ + + async def run(source: str): + filename = f"In[{counter()}]" + context = get_context() original_context = context.copy() @@ -43,9 +49,9 @@ async def run(source: str): with redirect_stdout(io), redirect_stderr(io): try: - result = await eval_code_async(source, context) + result = await eval_code_async(source, context, filename=filename) except Exception as e: - io.write("\n".join(format_exception(e))) + io.write(get_clean_traceback(e, filename)) if diff := diff_context(original_context, context): out["global values"] = diff @@ -68,3 +74,15 @@ async def run(source: str): def register[T: Callable](function: T) -> T: get_context()[function.__name__] = function return function + + +def get_clean_traceback(e: BaseException, filename: str): + keep_frames = False + n = 0 + for frame, _ in walk_tb(e.__traceback__): + if keep_frames: + n += 1 + elif frame.f_code.co_filename == filename: + keep_frames = True + n += 1 + return "".join(format_exception(type(e), e, e.__traceback__, -n)) diff --git a/reasonify-headless/version.py b/reasonify-headless/version.py index 485f44a..b3f4756 100644 --- a/reasonify-headless/version.py +++ b/reasonify-headless/version.py @@ -1 +1 @@ -__version__ = "0.1.1" +__version__ = "0.1.2"