failed WRONG_FIX wrong_fix · 34 tool calls · 229 s · Textualize/rich
Notes Add support for Exception.__notes__
| # | Tool | Arguments | Result |
|---|---|---|---|
| 1 | run_command | {
"command": "grep -rn \"traceback\" . | grep \"rich\" | head -20"
} | {"status": "ok", "stdout": "./README.cn.md:29:[Rich \u7684 API](https://rich.readthedocs.io/en/latest/) \u8ba9\u5728\u7ec8\u7aef\u8f93\u51fa\u989c\u8272\u548c\ufull{"status": "ok", "stdout": "./README.cn.md:29:[Rich \u7684 API](https://rich.readthedocs.io/en/latest/) \u8ba9\u5728\u7ec8\u7aef\u8f93\u51fa\u989c\u8272\u548c\u6837\u5f0f\u53d8\u5f97\u5f88\u7b80\u5355\u3002\u6b64\u5916\uff0cRich \u8fd8\u53ef\u4ee5\u7ed8\u5236\u6f02\u4eae\u7684\u8868\u683c\u3001\u8fdb\u5ea6\u6761\u3001markdown\u3001\u8bed\u6cd5\u9ad8\u4eae\u7684\u6e90\u4ee3\u7801\u4ee5\u53ca\u6808\u56de\u6eaf\u4fe1\u606f\uff08tracebacks\uff09\u7b49\u2014\u2014\u5f00\u7bb1\u5373\u7528\u3002\n./README.cn.md:402:Rich \u53ef\u4ee5\u6e32\u67d3\u51fa\u6f02\u4eae\u7684[\u6808\u56de\u6eaf\u4fe1\u606f](https://rich.readthedocs.io/en/latest/traceback.html)\uff0c\u5b83\u6bd4\u6807\u51c6\u7684 Python \u683c\u5f0f\u66f4\u5bb9\u6613\u9605\u8bfb\uff0c\u4e14\u80fd\u663e\u793a\u66f4\u591a\u7684\u4ee3\u7801\u3002\u60a8\u53ef\u4ee5\u5c06 Rich \u8bbe\u7f6e\u4e3a\u9ed8\u8ba4\u7684\u6808\u56de\u6eaf\u5904\u7406\u7a0b\u5e8f\uff0c\u8fd9\u6837\u6240\u6709\u672a\u6355\u83b7\u7684\u5f02\u5e38\u90fd\u5c06\u7531 Rich \u4e3a\u6e32\u67d3\u3002\n./README.cn.md:406:\n./questions/tracebacks_installed.question.md:9:If you are getting Rich tracebacks and you don't want them, then some other piece of software is calling `rich.traceback.install()`.\n./CHANGELOG.md:39:- Rich will display tracebacks with finely grained error locations on python 3.11+ https://github.com/Textualize/rich/pull/3486\n./CHANGELOG.md:200:- Use `Console(stderr=True)` in `rich.traceback.install` to support io redirection.\n./CHANGELOG.md:204:- Fixes traceback failing when a frame filename is unreadable https://github.com/Textualize/rich/issues/2821\n./CHANGELOG.md:244:- Fixed wrong filenames in Jupyter tracebacks https://github.com/Textualize/rich/issues/2271\n./CHANGELOG.md:405:- Python blocks can now opt out from being rendered in tracebacks's frames, by setting a `_rich_traceback_omit = True` in their local scope https://github.com/Textualize/rich/i |
| 2 | run_command | {
"command": "find rich -name \"*traceback*\""
} | {"status": "ok", "stdout": "rich/traceback.py\n", "exit_code": 0}full{"status": "ok", "stdout": "rich/traceback.py\n", "exit_code": 0} |
| 3 | read_file | {
"filepath": "rich/traceback.py",
"start_line": 1,
"end_line": 200
} | {"status": "ok", "filepath": "rich/traceback.py", "content": "import inspect\nimport linecache\nimport os\nimport sys\nfrom dataclasses import dataclass, field\full{"status": "ok", "filepath": "rich/traceback.py", "content": "import inspect\nimport linecache\nimport os\nimport sys\nfrom dataclasses import dataclass, field\nfrom itertools import islice\nfrom traceback import walk_tb\nfrom types import ModuleType, TracebackType\nfrom typing import (\n Any,\n Callable,\n Dict,\n Iterable,\n List,\n Optional,\n Sequence,\n Tuple,\n Type,\n Union,\n)\n\nfrom pygments.lexers import guess_lexer_for_filename\nfrom pygments.token import Comment, Keyword, Name, Number, Operator, String\nfrom pygments.token import Text as TextToken\nfrom pygments.token import Token\nfrom pygments.util import ClassNotFound\n\nfrom . import pretty\nfrom ._loop import loop_last\nfrom .columns import Columns\nfrom .console import Console, ConsoleOptions, ConsoleRenderable, RenderResult, group\nfrom .constrain import Constrain\nfrom .highlighter import RegexHighlighter, ReprHighlighter\nfrom .panel import Panel\nfrom .scope import render_scope\nfrom .style import Style\nfrom .syntax import Syntax\nfrom .text import Text\nfrom .theme import Theme\n\nWINDOWS = sys.platform == \"win32\"\n\nLOCALS_MAX_LENGTH = 10\nLOCALS_MAX_STRING = 80\n\n\ndef install(\n *,\n console: Optional[Console] = None,\n width: Optional[int] = 100,\n code_width: Optional[int] = 88,\n extra_lines: int = 3,\n theme: Optional[str] = None,\n word_wrap: bool = False,\n show_locals: bool = False,\n locals_max_length: int = LOCALS_MAX_LENGTH,\n locals_max_string: int = LOCALS_MAX_STRING,\n locals_hide_dunder: bool = True,\n locals_hide_sunder: Optional[bool] = None,\n indent_guides: bool = True,\n suppress: Iterable[Union[str, ModuleType]] = (),\n max_frames: int = 100,\n) -> Callable[[Type[BaseException], BaseException, Optional[TracebackType]], Any]:\n \"\"\"Install a rich traceback handler.\n\n Once installed, any tracebacks will be printed with syntax highlighting and rich formatting.\n\n\n Args:\n c |
| 4 | read_file | {
"end_line": 600,
"filepath": "rich/traceback.py",
"start_line": 151
} | {"status": "ok", "filepath": "rich/traceback.py", "content": " tb = tb.tb_next\n\n excepthook(exc_tuple[0], exc_tuple[1], tb)\n tb_data = {} # clear data upon ufull{"status": "ok", "filepath": "rich/traceback.py", "content": " tb = tb.tb_next\n\n excepthook(exc_tuple[0], exc_tuple[1], tb)\n tb_data = {} # clear data upon usage\n\n # replace _showtraceback instead of showtraceback to allow ipython features such as debugging to work\n # this is also what the ipython docs recommends to modify when subclassing InteractiveShell\n ip._showtraceback = ipy_display_traceback\n # add wrapper to capture tb_data\n ip.showtraceback = ipy_show_traceback\n ip.showsyntaxerror = lambda *args, **kwargs: ipy_display_traceback(\n *args, is_syntax=True, **kwargs\n )\n\n try: # pragma: no cover\n # if within ipython, use customized traceback\n ip = get_ipython() # type: ignore[name-defined]\n ipy_excepthook_closure(ip)\n return sys.excepthook\n except Exception:\n # otherwise use default system hook\n old_excepthook = sys.excepthook\n sys.excepthook = excepthook\n return old_excepthook\n\n\n@dataclass\nclass Frame:\n filename: str\n lineno: int\n name: str\n line: str = \"\"\n locals: Optional[Dict[str, pretty.Node]] = None\n last_instruction: Optional[Tuple[Tuple[int, int], Tuple[int, int]]] = None\n\n\n@dataclass\nclass _SyntaxError:\n offset: int\n filename: str\n line: str\n lineno: int\n msg: str\n\n\n@dataclass\nclass Stack:\n exc_type: str\n exc_value: str\n syntax_error: Optional[_SyntaxError] = None\n is_cause: bool = False\n frames: List[Frame] = field(default_factory=list)\n\n\n@dataclass\nclass Trace:\n stacks: List[Stack]\n\n\nclass PathHighlighter(RegexHighlighter):\n highlights = [r\"(?P<dim>.*/)(?P<bold>.+)\"]\n\n\nclass Traceback:\n \"\"\"A Console renderable that renders a traceback.\n\n Args:\n trace (Trace, optional): A `Trace` object produced from `extract`. Defaults to None, which uses\n the |
| 5 | read_file | {
"end_line": 500,
"filepath": "rich/traceback.py",
"start_line": 301
} | {"status": "ok", "filepath": "rich/traceback.py", "content": " exc_type: Type[Any],\n exc_value: BaseException,\n traceback: Optional[TracebackType],\n *,\n widfull{"status": "ok", "filepath": "rich/traceback.py", "content": " exc_type: Type[Any],\n exc_value: BaseException,\n traceback: Optional[TracebackType],\n *,\n width: Optional[int] = 100,\n code_width: Optional[int] = 88,\n extra_lines: int = 3,\n theme: Optional[str] = None,\n word_wrap: bool = False,\n show_locals: bool = False,\n locals_max_length: int = LOCALS_MAX_LENGTH,\n locals_max_string: int = LOCALS_MAX_STRING,\n locals_hide_dunder: bool = True,\n locals_hide_sunder: bool = False,\n indent_guides: bool = True,\n suppress: Iterable[Union[str, ModuleType]] = (),\n max_frames: int = 100,\n ) -> \"Traceback\":\n \"\"\"Create a traceback from exception info\n\n Args:\n exc_type (Type[BaseException]): Exception type.\n exc_value (BaseException): Exception value.\n traceback (TracebackType): Python Traceback object.\n width (Optional[int], optional): Number of characters used to traceback. Defaults to 100.\n code_width (Optional[int], optional): Number of code characters used to traceback. Defaults to 88.\n extra_lines (int, optional): Additional lines of code to render. Defaults to 3.\n theme (str, optional): Override pygments theme used in traceback.\n word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False.\n show_locals (bool, optional): Enable display of local variables. Defaults to False.\n indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True.\n locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.\n Defaults to 10.\n locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80.\n locals_hide_dunder |
| 6 | read_file | {
"end_line": 797,
"filepath": "rich/traceback.py",
"start_line": 451
} | {"status": "ok", "filepath": "rich/traceback.py", "content": " if sys.version_info >= (3, 11):\n instruction_index = frame_summary.f_lasti // 2\n instruction_pofull{"status": "ok", "filepath": "rich/traceback.py", "content": " if sys.version_info >= (3, 11):\n instruction_index = frame_summary.f_lasti // 2\n instruction_position = next(\n islice(\n frame_summary.f_code.co_positions(),\n instruction_index,\n instruction_index + 1,\n )\n )\n (\n start_line,\n end_line,\n start_column,\n end_column,\n ) = instruction_position\n if (\n start_line is not None\n and end_line is not None\n and start_column is not None\n and end_column is not None\n ):\n last_instruction = (\n (start_line, start_column),\n (end_line, end_column),\n )\n\n if filename and not filename.startswith(\"<\"):\n if not os.path.isabs(filename):\n filename = os.path.join(_IMPORT_CWD, filename)\n if frame_summary.f_locals.get(\"_rich_traceback_omit\", False):\n continue\n\n frame = Frame(\n filename=filename or \"?\",\n lineno=line_no,\n name=frame_summary.f_code.co_name,\n locals=(\n {\n key: pretty.traverse(\n value,\n max_length=locals_max_length,\n max_string=locals_max_string,\n )\n for key, value in get_locals(frame_summary.f_locals.item |
| 7 | read_file | {
"end_line": 797,
"filepath": "rich/traceback.py",
"start_line": 601
} | {"status": "ok", "filepath": "rich/traceback.py", "content": " )\n else:\n yield Text.from_markup(\n \"\\n[i]During handling of the above exception, another excfull{"status": "ok", "filepath": "rich/traceback.py", "content": " )\n else:\n yield Text.from_markup(\n \"\\n[i]During handling of the above exception, another exception occurred:\\n\",\n )\n\n @group()\n def _render_syntax_error(self, syntax_error: _SyntaxError) -> RenderResult:\n highlighter = ReprHighlighter()\n path_highlighter = PathHighlighter()\n if syntax_error.filename != \"<stdin>\":\n if os.path.exists(syntax_error.filename):\n text = Text.assemble(\n (f\" {syntax_error.filename}\", \"pygments.string\"),\n (\":\", \"pygments.text\"),\n (str(syntax_error.lineno), \"pygments.number\"),\n style=\"pygments.text\",\n )\n yield path_highlighter(text)\n syntax_error_text = highlighter(syntax_error.line.rstrip())\n syntax_error_text.no_wrap = True\n offset = min(syntax_error.offset - 1, len(syntax_error_text))\n syntax_error_text.stylize(\"bold underline\", offset, offset)\n syntax_error_text += Text.from_markup(\n \"\\n\" + \" \" * offset + \"[traceback.offset]\u25b2[/]\",\n style=\"pygments.text\",\n )\n yield syntax_error_text\n\n @classmethod\n def _guess_lexer(cls, filename: str, code: str) -> str:\n ext = os.path.splitext(filename)[-1]\n if not ext:\n # No extension, look at first line to see if it is a hashbang\n # Note, this is an educated guess and not a guarantee\n # If it fails, the only downside is that the code is highlighted strangely\n new_line_index = code.index(\"\\n\")\n first_line = code[:new_line_index] if new_line_index != -1 else code\n if first_line.startswith(\"#!\") and \"python\" in first_line.lower():\n return \"python\"\ |
| 8 | read_file | {
"filepath": "rich/traceback.py",
"start_line": 170,
"end_line": 210
} | {"status": "ok", "filepath": "rich/traceback.py", "content": " except Exception:\n # otherwise use default system hook\n old_excepthook = sys.excepthook\n sys.efull{"status": "ok", "filepath": "rich/traceback.py", "content": " except Exception:\n # otherwise use default system hook\n old_excepthook = sys.excepthook\n sys.excepthook = excepthook\n return old_excepthook\n\n\n@dataclass\nclass Frame:\n filename: str\n lineno: int\n name: str\n line: str = \"\"\n locals: Optional[Dict[str, pretty.Node]] = None\n last_instruction: Optional[Tuple[Tuple[int, int], Tuple[int, int]]] = None\n\n\n@dataclass\nclass _SyntaxError:\n offset: int\n filename: str\n line: str\n lineno: int\n msg: str\n\n\n@dataclass\nclass Stack:\n exc_type: str\n exc_value: str\n syntax_error: Optional[_SyntaxError] = None\n is_cause: bool = False\n frames: List[Frame] = field(default_factory=list)\n\n\n@dataclass\nclass Trace:\n stacks: List[Stack]\n\n\nclass PathHighlighter(RegexHighlighter):\n", "start_line": 170, "end_line": 210, "total_lines": 797, "is_truncated": false} |
| 9 | edit_file | {
"filepath": "rich/traceback.py",
"new_string": "@dataclass\\nclass Stack:\\n exc_type: str\\n exc_value: str\\n notes: Optional[str] = None\\n syntax_error: Optional[_SyntaxError] = None\\n is_cause: bool = False\\n frames: List[Frame] = field(default_factory=list)\\n",
"old_string": "@dataclass\\nclass Stack:\\n exc_type: str\\n exc_value: str\\n syntax_error: Optional[_SyntaxError] = None\\n is_cause: bool = False\\n frames: List[Frame] = field(default_factory=list)\\n"
} | {"status": "error", "error_type": "FileEditError", "error_message": "old_string not found in file (tried exact, flexible and regex matching)"}full{"status": "error", "error_type": "FileEditError", "error_message": "old_string not found in file (tried exact, flexible and regex matching)"} |
| 10 | read_file | {
"end_line": 200,
"filepath": "rich/traceback.py",
"start_line": 190
} | {"status": "ok", "filepath": "rich/traceback.py", "content": " filename: str\n line: str\n lineno: int\n msg: str\n\n\n@dataclass\nclass Stack:\n exc_type: str\full{"status": "ok", "filepath": "rich/traceback.py", "content": " filename: str\n line: str\n lineno: int\n msg: str\n\n\n@dataclass\nclass Stack:\n exc_type: str\n exc_value: str\n syntax_error: Optional[_SyntaxError] = None\n", "start_line": 190, "end_line": 200, "total_lines": 797, "is_truncated": false} |
| 11 | read_file | {
"end_line": 205,
"filepath": "rich/traceback.py",
"start_line": 195
} | {"status": "ok", "filepath": "rich/traceback.py", "content": "\n@dataclass\nclass Stack:\n exc_type: str\n exc_value: str\n syntax_error: Optional[_SyntaxError]full{"status": "ok", "filepath": "rich/traceback.py", "content": "\n@dataclass\nclass Stack:\n exc_type: str\n exc_value: str\n syntax_error: Optional[_SyntaxError] = None\n is_cause: bool = False\n frames: List[Frame] = field(default_factory=list)\n\n\n@dataclass\n", "start_line": 195, "end_line": 205, "total_lines": 797, "is_truncated": false} |
| 12 | edit_file | {
"filepath": "rich/traceback.py",
"new_string": "@dataclass\\nclass Stack:\\n exc_type: str\\n exc_value: str\\n notes: Optional[str] = None\\n syntax_error: Optional[_SyntaxError] = None\\n is_cause: bool = False\\n frames: List[Frame] = field(default_factory=list)\\n",
"old_string": "@dataclass\\nclass Stack:\\n exc_type: str\\n exc_value: str\\n syntax_error: Optional[_SyntaxError] = None\\n is_cause: bool = False\\n frames: List[Frame] = field(default_factory=list)\\n"
} | {"status": "error", "error_type": "FileEditError", "error_message": "old_string not found in file (tried exact, flexible and regex matching)"}full{"status": "error", "error_type": "FileEditError", "error_message": "old_string not found in file (tried exact, flexible and regex matching)"} |
| 13 | read_file | {
"end_line": 210,
"filepath": "rich/traceback.py",
"start_line": 190
} | {"status": "ok", "filepath": "rich/traceback.py", "content": " filename: str\n line: str\n lineno: int\n msg: str\n\n\n@dataclass\nclass Stack:\n exc_type: str\full{"status": "ok", "filepath": "rich/traceback.py", "content": " filename: str\n line: str\n lineno: int\n msg: str\n\n\n@dataclass\nclass Stack:\n exc_type: str\n exc_value: str\n syntax_error: Optional[_SyntaxError] = None\n is_cause: bool = False\n frames: List[Frame] = field(default_factory=list)\n\n\n@dataclass\nclass Trace:\n stacks: List[Stack]\n\n\nclass PathHighlighter(RegexHighlighter):\n", "start_line": 190, "end_line": 210, "total_lines": 797, "is_truncated": false} |
| 14 | edit_file | {
"filepath": "rich/traceback.py",
"new_string": "@dataclass\nclass Stack:\n exc_type: str\n exc_value: str\n notes: Optional[str] = None\n syntax_error: Optional[_SyntaxError] = None\n is_cause: bool = False\n frames: List[Frame] = field(default_factory=list)\n",
"old_string": "@dataclass\nclass Stack:\n exc_type: str\n exc_value: str\n syntax_error: Optional[_SyntaxError] = None\n is_cause: bool = False\n frames: List[Frame] = field(default_factory=list)\n"
} | {"status": "ok", "filepath": "rich/traceback.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/traceback.py\n+++ b/rich/traceback.py\n@@ -197,6 +1full{"status": "ok", "filepath": "rich/traceback.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/traceback.py\n+++ b/rich/traceback.py\n@@ -197,6 +197,7 @@\n class Stack:\n exc_type: str\n exc_value: str\n+ notes: Optional[str] = None\n syntax_error: Optional[_SyntaxError] = None\n is_cause: bool = False\n frames: List[Frame] = field(default_factory=list)\n", "is_truncated": false} |
| 15 | read_file | {
"end_line": 360,
"filepath": "rich/traceback.py",
"start_line": 320
} | {"status": "ok", "filepath": "rich/traceback.py", "content": " \"\"\"Create a traceback from exception info\n\n Args:\n exc_type (Type[BaseException]): Exceptiofull{"status": "ok", "filepath": "rich/traceback.py", "content": " \"\"\"Create a traceback from exception info\n\n Args:\n exc_type (Type[BaseException]): Exception type.\n exc_value (BaseException): Exception value.\n traceback (TracebackType): Python Traceback object.\n width (Optional[int], optional): Number of characters used to traceback. Defaults to 100.\n code_width (Optional[int], optional): Number of code characters used to traceback. Defaults to 88.\n extra_lines (int, optional): Additional lines of code to render. Defaults to 3.\n theme (str, optional): Override pygments theme used in traceback.\n word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False.\n show_locals (bool, optional): Enable display of local variables. Defaults to False.\n indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True.\n locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.\n Defaults to 10.\n locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80.\n locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True.\n locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False.\n suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback.\n max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100.\n\n Returns:\n Traceback: A Traceback instance that may be printed.\n \"\"\"\n rich_traceback = cls.extract(\n exc_type,\n exc_value,\n traceback,\n show_locals=show_locals |
| 16 | read_file | {
"end_line": 450,
"filepath": "rich/traceback.py",
"start_line": 360
} | {"status": "ok", "filepath": "rich/traceback.py", "content": " theme=theme,\n word_wrap=word_wrap,\n show_locals=show_locals,\n indent_guides=indent_guides,\n lfull{"status": "ok", "filepath": "rich/traceback.py", "content": " theme=theme,\n word_wrap=word_wrap,\n show_locals=show_locals,\n indent_guides=indent_guides,\n locals_max_length=locals_max_length,\n locals_max_string=locals_max_string,\n locals_hide_dunder=locals_hide_dunder,\n locals_hide_sunder=locals_hide_sunder,\n suppress=suppress,\n max_frames=max_frames,\n )\n\n @classmethod\n def extract(\n cls,\n exc_type: Type[BaseException],\n exc_value: BaseException,\n traceback: Optional[TracebackType],\n *,\n show_locals: bool = False,\n locals_max_length: int = LOCALS_MAX_LENGTH,\n locals_max_string: int = LOCALS_MAX_STRING,\n locals_hide_dunder: bool = True,\n locals_hide_sunder: bool = False,\n ) -> Trace:\n \"\"\"Extract traceback information.\n\n Args:\n exc_type (Type[BaseException]): Exception type.\n exc_value (BaseException): Exception value.\n traceback (TracebackType): Python Traceback object.\n show_locals (bool, optional): Enable display of local variables. Defaults to False.\n locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.\n Defaults to 10.\n locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80.\n locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True.\n locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False.\n\n Returns:\n Trace: A Trace instance which you can use to construct a `Traceback`.\n \"\"\"\n\n stacks: List[Stack] = []\n is_cause = False\n\n from rich import _IMPORT_CWD\n\n |
| 17 | edit_file | {
"filepath": "rich/traceback.py",
"new_string": " while True:\n stack = Stack(\n exc_type=safe_str(exc_type.__name__),\n exc_value=safe_str(exc_value),\n notes=getattr(exc_value, \"__notes__\", None),\n is_cause=is_cause,\n )\n",
"old_string": " while True:\n stack = Stack(\n exc_type=safe_str(exc_type.__name__),\n exc_value=safe_str(exc_value),\n is_cause=is_cause,\n )\n"
} | {"status": "ok", "filepath": "rich/traceback.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/traceback.py\n+++ b/rich/traceback.py\n@@ -415,6 +4full{"status": "ok", "filepath": "rich/traceback.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/traceback.py\n+++ b/rich/traceback.py\n@@ -415,6 +415,7 @@\n stack = Stack(\n exc_type=safe_str(exc_type.__name__),\n exc_value=safe_str(exc_value),\n+ notes=getattr(exc_value, \"__notes__\", None),\n is_cause=is_cause,\n )\n \n", "is_truncated": false} |
| 18 | read_file | {
"end_line": 620,
"filepath": "rich/traceback.py",
"start_line": 550
} | {"status": "ok", "filepath": "rich/traceback.py", "content": " \"repr.bool_false\": token_style(Keyword.Constant),\n \"repr.none\": token_style(Keyword.Constantfull{"status": "ok", "filepath": "rich/traceback.py", "content": " \"repr.bool_false\": token_style(Keyword.Constant),\n \"repr.none\": token_style(Keyword.Constant),\n \"scope.border\": token_style(String.Delimiter),\n \"scope.equals\": token_style(Operator),\n \"scope.key\": token_style(Name),\n \"scope.key.special\": token_style(Name.Constant) + Style(dim=True),\n },\n inherit=False,\n )\n\n highlighter = ReprHighlighter()\n for last, stack in loop_last(reversed(self.trace.stacks)):\n if stack.frames:\n stack_renderable: ConsoleRenderable = Panel(\n self._render_stack(stack),\n title=\"[traceback.title]Traceback [dim](most recent call last)\",\n style=background_style,\n border_style=\"traceback.border\",\n expand=True,\n padding=(0, 1),\n )\n stack_renderable = Constrain(stack_renderable, self.width)\n with console.use_theme(traceback_theme):\n yield stack_renderable\n if stack.syntax_error is not None:\n with console.use_theme(traceback_theme):\n yield Constrain(\n Panel(\n self._render_syntax_error(stack.syntax_error),\n style=background_style,\n border_style=\"traceback.border.syntax_error\",\n expand=True,\n padding=(0, 1),\n width=self.width,\n ),\n self.width,\n )\n yield Text.assemble(\n (f\"{stack.exc_type}: \", \"traceback.exc_type\"),\n highlighter(stack.syntax_error.msg),\n |
| 19 | read_file | {
"end_line": 560,
"filepath": "rich/traceback.py",
"start_line": 530
} | {"status": "ok", "filepath": "rich/traceback.py", "content": "\n def __rich_console__(\n self, console: Console, options: ConsoleOptions\n ) -> RenderResult:\n full{"status": "ok", "filepath": "rich/traceback.py", "content": "\n def __rich_console__(\n self, console: Console, options: ConsoleOptions\n ) -> RenderResult:\n theme = self.theme\n background_style = theme.get_background_style()\n token_style = theme.get_style_for_token\n\n traceback_theme = Theme(\n {\n \"pretty\": token_style(TextToken),\n \"pygments.text\": token_style(Token),\n \"pygments.string\": token_style(String),\n \"pygments.function\": token_style(Name.Function),\n \"pygments.number\": token_style(Number),\n \"repr.indent\": token_style(Comment) + Style(dim=True),\n \"repr.str\": token_style(String),\n \"repr.brace\": token_style(TextToken) + Style(bold=True),\n \"repr.number\": token_style(Number),\n \"repr.bool_true\": token_style(Keyword.Constant),\n \"repr.bool_false\": token_style(Keyword.Constant),\n \"repr.none\": token_style(Keyword.Constant),\n \"scope.border\": token_style(String.Delimiter),\n \"scope.equals\": token_style(Operator),\n \"scope.key\": token_style(Name),\n \"scope.key.special\": token_style(Name.Constant) + Style(dim=True),\n },\n inherit=False,\n )\n\n highlighter = ReprHighlighter()\n", "start_line": 530, "end_line": 560, "total_lines": 799, "is_truncated": false} |
| 20 | edit_file | {
"filepath": "rich/traceback.py",
"new_string": " \"scope.key\": token_style(Name),\n \"scope.key.special\": token_style(Name.Constant) + Style(dim=True),\n \"traceback.note\": Style(italic=True),\n },\n inherit=False,\n",
"old_string": " \"scope.key\": token_style(Name),\n \"scope.key.special\": token_style(Name.Constant) + Style(dim=True),\n },\n inherit=False,\n"
} | {"status": "ok", "filepath": "rich/traceback.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/traceback.py\n+++ b/rich/traceback.py\n@@ -553,6 +5full{"status": "ok", "filepath": "rich/traceback.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/traceback.py\n+++ b/rich/traceback.py\n@@ -553,6 +553,7 @@\n \"scope.equals\": token_style(Operator),\n \"scope.key\": token_style(Name),\n \"scope.key.special\": token_style(Name.Constant) + Style(dim=True),\n+ \"traceback.note\": Style(italic=True),\n },\n inherit=False,\n )\n", "is_truncated": false} |
| 21 | edit_file | {
"filepath": "rich/traceback.py",
"new_string": " if stack.syntax_error is not None:\n with console.use_theme(traceback_theme):\n yield Constrain(\n Panel(\n self._render_syntax_error(stack.syntax_error),\n style=background_style,\n border_style=\"traceback.border.syntax_error\",\n expand=True,\n padding=(0, 1),\n width=self.width,\n ),\n self.width,\n )\n yield Text.assemble(\n (f\"{stack.exc_type}: \", \"traceback.exc_type\"),\n highlighter(stack.syntax_error.msg),\n )\n elif stack.exc_value:\n if stack.notes:\n yield Text.assemble(\n (\"\\n\", \"traceback.text\"),\n (\"Note: \", \"traceback.note\"),\n highlighter(stack.notes),\n )\n yield Text.assemble(\n (f\"{stack.exc_type}: \", \"traceback.exc_type\"),\n highlighter(stack.exc_value),\n )\n else:\n yield Text.assemble((f\"{stack.exc_type}\", \"traceback.exc_type\"))\n",
"old_string": " if stack.syntax_error is not None:\n with console.use_theme(traceback_theme):\n yield Constrain(\n Panel(\n self._render_syntax_error(stack.syntax_error),\n style=background_style,\n border_style=\"traceback.border.syntax_error\",\n expand=True,\n padding=(0, 1),\n width=self.width,\n ),\n self.width,\n )\n yield Text.assemble(\n (f\"{stack.exc_type}: \", \"traceback.exc_type\"),\n highlighter(stack.syntax_error.msg),\n )\n elif stack.exc_value:\n yield Text.assemble(\n (f\"{stack.exc_type}: \", \"traceback.exc_type\"),\n highlighter(stack.exc_value),\n )\n else:\n yield Text.assemble((f\"{stack.exc_type}\", \"traceback.exc_type\"))\n"
} | {"status": "ok", "filepath": "rich/traceback.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/traceback.py\n+++ b/rich/traceback.py\n@@ -590,6 +5full{"status": "ok", "filepath": "rich/traceback.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/traceback.py\n+++ b/rich/traceback.py\n@@ -590,6 +590,12 @@\n highlighter(stack.syntax_error.msg),\n )\n elif stack.exc_value:\n+ if stack.notes:\n+ yield Text.assemble(\n+ (\"\\n\", \"traceback.text\"),\n+ (\"Note: \", \"traceback.note\"),\n+ highlighter(stack.notes),\n+ )\n yield Text.assemble(\n (f\"{stack.exc_type}: \", \"traceback.exc_type\"),\n highlighter(stack.exc_value),\n", "is_truncated": false} |
| 22 | write_file | {
"content": "from rich.console import Console\nfrom rich.traceback import Traceback\n\ndef test_exception_notes():\n console = Console(record=True)\n try:\n try:\n raise ValueError(\"Original error\")\n except ValueError as e:\n e.add_note(\"This is a note\")\n raise e\n except Exception:\n tb = Traceback.create(\n exc_type=sys.exc_info()[0],\n exc_value=sys.exc_info()[1],\n traceback=sys.exc_info()[2],\n )\n console.print(tb)\n \n output = console.export_text()\n assert \"Note: This is a note\" in output\n assert \"ValueError: Original error\" in output\n\nif __name__ == \"__main__\":\n import sys\n test_exception_notes()\n print(\"Test passed!\")\n",
"filepath": "/tmp/test_notes.py"
} | {"status": "ok", "filepath": "/tmp/test_notes.py", "size": 737}full{"status": "ok", "filepath": "/tmp/test_notes.py", "size": 737} |
| 23 | run_command | {
"command": "python3 /tmp/test_notes.py"
} | {"status": "error", "error_type": "CommandError", "error_message": "Command failed with exit code 2", "details": {"stdout": "", "stderr": "python3: can't open ffull{"status": "error", "error_type": "CommandError", "error_message": "Command failed with exit code 2", "details": {"stdout": "", "stderr": "python3: can't open file '/tmp/swe_work/eval_submission_analyzer/rich_3676/a/tmp/test_notes.py': [Errno 2] No such file or directory\n", "exit_code": 2}} |
| 24 | run_command | {
"command": "python3 /workspace/tmp/test_notes.py"
} | {"status": "error", "error_type": "CommandError", "error_message": "Command failed with exit code 2", "details": {"stdout": "", "stderr": "python3: can't open ffull{"status": "error", "error_type": "CommandError", "error_message": "Command failed with exit code 2", "details": {"stdout": "", "stderr": "python3: can't open file '/tmp/swe_work/eval_submission_analyzer/rich_3676/a/workspace/tmp/test_notes.py': [Errno 2] No such file or directory\n", "exit_code": 2}} |
| 25 | run_command | {
"command": "ls -R /workspace"
} | {"status": "error", "error_type": "CommandError", "error_message": "Command failed with exit code 2", "details": {"stdout": "", "stderr": "ls: cannot access '/tfull{"status": "error", "error_type": "CommandError", "error_message": "Command failed with exit code 2", "details": {"stdout": "", "stderr": "ls: cannot access '/tmp/swe_work/eval_submission_analyzer/rich_3676/a/workspace': No such file or directory\n", "exit_code": 2}} |
| 26 | run_command | {
"command": "python3 -c \"import sys; from rich.console import Console; from rich.traceback import Traceback; console = Console(record=True); try: try: raise ValueError('Original error'); except ValueError as e: e.add_note('This is a note'); raise e; except Exception: tb = Traceback.create(exc_type=sys.exc_info()[0], exc_value=sys.exc_info()[1], traceback=sys.exc_info()[2]); console.print(tb); output = console.export_text(); print(output); assert 'Note: This is a note' in output; assert 'ValueError: Original error' in output\""
} | {"status": "error", "error_type": "CommandError", "error_message": "Command failed with exit code 1", "details": {"stdout": "", "stderr": " File \"<string>\", lfull{"status": "error", "error_type": "CommandError", "error_message": "Command failed with exit code 1", "details": {"stdout": "", "stderr": " File \"<string>\", line 1\n import sys; from rich.console import Console; from rich.traceback import Traceback; console = Console(record=True); try: try: raise ValueError('Original error'); except ValueError as e: e.add_note('This is a note'); raise e; except Exception: tb = Traceback.create(exc_type=sys.exc_info()[0], exc_value=sys.exc_info()[1], traceback=sys.exc_info()[2]); console.print(tb); output = console.export_text(); print(output); assert 'Note: This is a note' in output; assert 'ValueError: Original error' in output\n ^^^\nSyntaxError: invalid syntax\n", "exit_code": 1}} |
| 27 | run_command | {
"command": "python3 -c \"\nimport sys\nfrom rich.console import Console\nfrom rich.traceback import Traceback\n\nconsole = Console(record=True)\ntry:\n try:\n raise ValueError('Original error')\n except ValueError as e:\n e.add_note('This is a note')\n raise e\nexcept Exception:\n tb = Traceback.create(\n exc_type=sys.exc_info()[0],\n exc_value=sys.exc_info()[1],\n traceback=sys.exc_info()[2],\n )\n console.print(tb)\n\noutput = console.export_text()\nprint(output)\nassert 'Note: This is a note' in output\nassert 'ValueError: Original error' in output\n\""
} | {"status": "error", "error_type": "CommandError", "error_message": "Command failed with exit code 1", "details": {"stdout": "", "stderr": "Traceback (most recenfull{"status": "error", "error_type": "CommandError", "error_message": "Command failed with exit code 1", "details": {"stdout": "", "stderr": "Traceback (most recent call last):\n File \"<string>\", line 12, in <module>\n raise e\n File \"<string>\", line 9, in <module>\n raise ValueError('Original error')\nValueError: Original error\nThis is a note\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"<string>\", line 14, in <module>\n tb = Traceback.create(\n ^^^^^^^^^^^^^^^^\nAttributeError: type object 'Traceback' has no attribute 'create'\n", "exit_code": 1}} |
| 28 | read_file | {
"end_line": 350,
"filepath": "rich/traceback.py",
"start_line": 300
} | {"status": "ok", "filepath": "rich/traceback.py", "content": " def from_exception(\n cls,\n exc_type: Type[Any],\n exc_value: BaseException,\n traceback: Optionfull{"status": "ok", "filepath": "rich/traceback.py", "content": " def from_exception(\n cls,\n exc_type: Type[Any],\n exc_value: BaseException,\n traceback: Optional[TracebackType],\n *,\n width: Optional[int] = 100,\n code_width: Optional[int] = 88,\n extra_lines: int = 3,\n theme: Optional[str] = None,\n word_wrap: bool = False,\n show_locals: bool = False,\n locals_max_length: int = LOCALS_MAX_LENGTH,\n locals_max_string: int = LOCALS_MAX_STRING,\n locals_hide_dunder: bool = True,\n locals_hide_sunder: bool = False,\n indent_guides: bool = True,\n suppress: Iterable[Union[str, ModuleType]] = (),\n max_frames: int = 100,\n ) -> \"Traceback\":\n \"\"\"Create a traceback from exception info\n\n Args:\n exc_type (Type[BaseException]): Exception type.\n exc_value (BaseException): Exception value.\n traceback (TracebackType): Python Traceback object.\n width (Optional[int], optional): Number of characters used to traceback. Defaults to 100.\n code_width (Optional[int], optional): Number of code characters used to traceback. Defaults to 88.\n extra_lines (int, optional): Additional lines of code to render. Defaults to 3.\n theme (str, optional): Override pygments theme used in traceback.\n word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False.\n show_locals (bool, optional): Enable display of local variables. Defaults to False.\n indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True.\n locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.\n Defaults to 10.\n locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults |
| 29 | run_command | {
"command": "python3 -c \"\nimport sys\nfrom rich.console import Console\nfrom rich.traceback import Traceback\n\nconsole = Console(record=True)\ntry:\n try:\n raise ValueError('Original error')\n except ValueError as e:\n e.add_note('This is a note')\n raise e\nexcept Exception:\n tb = Traceback.from_exception(\n exc_type=sys.exc_info()[0],\n exc_value=sys.exc_info()[1],\n traceback=sys.exc_info()[2],\n )\n console.print(tb)\n\noutput = console.export_text()\nprint(output)\nassert 'Note: This is a note' in output\nassert 'ValueError: Original error' in output\n\""
} | {"status": "error", "error_type": "CommandError", "error_message": "Command failed with exit code 1", "details": {"stdout": "", "stderr": "Traceback (most recenfull{"status": "error", "error_type": "CommandError", "error_message": "Command failed with exit code 1", "details": {"stdout": "", "stderr": "Traceback (most recent call last):\n File \"<string>\", line 12, in <module>\n raise e\n File \"<string>\", line 9, in <module>\n raise ValueError('Original error')\nValueError: Original error\nThis is a note\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File \"<string>\", line 19, in <module>\n console.print(tb)\n ~~~~~~~~~~~~~^^^^\n File \"/workspace/rich/console.py\", line 1705, in print\n extend(render(renderable, render_options))\n ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/workspace/rich/console.py\", line 1326, in render\n for render_output in iter_render:\n ^^^^^^^^^^^\n File \"/workspace/rich/traceback.py\", line 597, in __rich_console__\n highlighter(stack.notes),\n ~~~~~~~~~~~^^^^^^^^^^^^^\n File \"/workspace/rich/highlighter.py\", line 37, in __call__\n raise TypeError(f\"str or Text instance required, not {text!r}\")\nTypeError: str or Text instance required, not ['This is a note']\n", "exit_code": 1}} |
| 30 | read_file | {
"end_line": 425,
"filepath": "rich/traceback.py",
"start_line": 410
} | {"status": "ok", "filepath": "rich/traceback.py", "content": " return str(_object)\n except Exception:\n return \"<exception str() failed>\"\n\n while True:\n sfull{"status": "ok", "filepath": "rich/traceback.py", "content": " return str(_object)\n except Exception:\n return \"<exception str() failed>\"\n\n while True:\n stack = Stack(\n exc_type=safe_str(exc_type.__name__),\n exc_value=safe_str(exc_value),\n notes=getattr(exc_value, \"__notes__\", None),\n is_cause=is_cause,\n )\n\n if isinstance(exc_value, SyntaxError):\n stack.syntax_error = _SyntaxError(\n offset=exc_value.offset or 0,\n filename=exc_value.filename or \"?\",\n", "start_line": 410, "end_line": 425, "total_lines": 806, "is_truncated": false} |
| 31 | edit_file | {
"filepath": "rich/traceback.py",
"new_string": " notes=safe_str(getattr(exc_value, \"__notes__\", None)) if getattr(exc_value, \"__notes__\", None) is not None else None,\n",
"old_string": " notes=getattr(exc_value, \"__notes__\", None),\n"
} | {"status": "ok", "filepath": "rich/traceback.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/traceback.py\n+++ b/rich/traceback.py\n@@ -415,7 +4full{"status": "ok", "filepath": "rich/traceback.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/traceback.py\n+++ b/rich/traceback.py\n@@ -415,7 +415,7 @@\n stack = Stack(\n exc_type=safe_str(exc_type.__name__),\n exc_value=safe_str(exc_value),\n- notes=getattr(exc_value, \"__notes__\", None),\n+ notes=safe_str(getattr(exc_value, \"__notes__\", None)) if getattr(exc_value, \"__notes__\", None) is not None else None,\n is_cause=is_cause,\n )\n \n", "is_truncated": false} |
| 32 | run_command | {
"command": "python3 -c \"\nimport sys\nfrom rich.console import Console\nfrom rich.traceback import Traceback\n\nconsole = Console(record=True)\ntry:\n try:\n raise ValueError('Original error')\n except ValueError as e:\n e.add_note('This is a note')\n raise e\nexcept Exception:\n tb = Traceback.from_exception(\n exc_type=sys.exc_info()[0],\n exc_value=sys.exc_info()[1],\n traceback=sys.exc_info()[2],\n )\n console.print(tb)\n\noutput = console.export_text()\nprint(output)\nassert 'Note: This is a note' in output\nassert 'ValueError: Original error' in output\n\""
} | {"status": "error", "error_type": "CommandError", "error_message": "Command failed with exit code 1", "details": {"stdout": "\u256d\u2500\u2500\u2500\u2500\u250full{"status": "error", "error_type": "CommandError", "error_message": "Command failed with exit code 1", "details": {"stdout": "\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Traceback (most recent call last) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 in <module>:12 \u2502\n\u2502 in <module>:9 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\nNote: ['This is a note']\nValueError: Original error\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Traceback (most recent call last) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 in <module>:12 \u2502\n\u2502 in <module>:9 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ |
| 33 | edit_file | {
"filepath": "rich/traceback.py",
"new_string": " notes=safe_str(\"\\n\".join(getattr(exc_value, \"__notes__\", []))) if getattr(exc_value, \"__notes__\", None) else None,\n",
"old_string": " notes=safe_str(getattr(exc_value, \"__notes__\", None)) if getattr(exc_value, \"__notes__\", None) is not None else None,\n"
} | {"status": "ok", "filepath": "rich/traceback.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/traceback.py\n+++ b/rich/traceback.py\n@@ -415,7 +4full{"status": "ok", "filepath": "rich/traceback.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/traceback.py\n+++ b/rich/traceback.py\n@@ -415,7 +415,7 @@\n stack = Stack(\n exc_type=safe_str(exc_type.__name__),\n exc_value=safe_str(exc_value),\n- notes=safe_str(getattr(exc_value, \"__notes__\", None)) if getattr(exc_value, \"__notes__\", None) is not None else None,\n+ notes=safe_str(\"\\n\".join(getattr(exc_value, \"__notes__\", []))) if getattr(exc_value, \"__notes__\", None) else None,\n is_cause=is_cause,\n )\n \n", "is_truncated": false} |
| 34 | run_command | {
"command": "python3 -c \"\nimport sys\nfrom rich.console import Console\nfrom rich.traceback import Traceback\n\nconsole = Console(record=True)\ntry:\n try:\n raise ValueError('Original error')\n except ValueError as e:\n e.add_note('This is a note')\n raise e\nexcept Exception:\n tb = Traceback.from_exception(\n exc_type=sys.exc_info()[0],\n exc_value=sys.exc_info()[1],\n traceback=sys.exc_info()[2],\n )\n console.print(tb)\n\noutput = console.export_text()\nprint(output)\nassert 'Note: This is a note' in output\nassert 'ValueError: Original error' in output\n\""
} | {"status": "ok", "stdout": "\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500full{"status": "ok", "stdout": "\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Traceback (most recent call last) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 in <module>:12 \u2502\n\u2502 in <module>:9 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\n\nNote: This is a note\nValueError: Original error\n\u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Traceback (most recent call last) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\n\u2502 in <module>:12 \u2502\n\u2502 in <module>:9 \u2502\n\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 |
| 35 | submit_patch | [] | {"status": "ok", "patch_size": 2556, "files_changed": 2}full{"status": "ok", "patch_size": 2556, "files_changed": 2} |
diff --git a/rich/traceback.py b/rich/traceback.py
index 3bf5baa7..0a0673a9 100644
--- a/rich/traceback.py
+++ b/rich/traceback.py
@@ -197,6 +197,7 @@ class _SyntaxError:
class Stack:
exc_type: str
exc_value: str
+ notes: Optional[str] = None
syntax_error: Optional[_SyntaxError] = None
is_cause: bool = False
frames: List[Frame] = field(default_factory=list)
@@ -414,6 +415,7 @@ class Traceback:
stack = Stack(
exc_type=safe_str(exc_type.__name__),
exc_value=safe_str(exc_value),
+ notes=safe_str("\n".join(getattr(exc_value, "__notes__", []))) if getattr(exc_value, "__notes__", None) else None,
is_cause=is_cause,
)
@@ -551,6 +553,7 @@ class Traceback:
"scope.equals": token_style(Operator),
"scope.key": token_style(Name),
"scope.key.special": token_style(Name.Constant) + Style(dim=True),
+ "traceback.note": Style(italic=True),
},
inherit=False,
)
@@ -587,6 +590,12 @@ class Traceback:
highlighter(stack.syntax_error.msg),
)
elif stack.exc_value:
+ if stack.notes:
+ yield Text.assemble(
+ ("\n", "traceback.text"),
+ ("Note: ", "traceback.note"),
+ highlighter(stack.notes),
+ )
yield Text.assemble(
(f"{stack.exc_type}: ", "traceback.exc_type"),
highlighter(stack.exc_value),
diff --git a/tmp/test_notes.py b/tmp/test_notes.py
new file mode 100644
index 00000000..0a622201
--- /dev/null
+++ b/tmp/test_notes.py
@@ -0,0 +1,27 @@
+from rich.console import Console
+from rich.traceback import Traceback
+
+def test_exception_notes():
+ console = Console(record=True)
+ try:
+ try:
+ raise ValueError("Original error")
+ except ValueError as e:
+ e.add_note("This is a note")
+ raise e
+ except Exception:
+ tb = Traceback.create(
+ exc_type=sys.exc_info()[0],
+ exc_value=sys.exc_info()[1],
+ traceback=sys.exc_info()[2],
+ )
+ console.print(tb)
+
+ output = console.export_text()
+ assert "Note: This is a note" in output
+ assert "ValueError: Original error" in output
+
+if __name__ == "__main__":
+ import sys
+ test_exception_notes()
+ print("Test passed!")
...................s.F
=================================== FAILURES ===================================
__________________________________ test_notes __________________________________
@pytest.mark.skipif(
sys.version_info.minor < 11, reason="Not supported before Python 3.11"
)
def test_notes() -> None:
"""Check traceback captures __note__."""
try:
> 1 / 0
E ZeroDivisionError: division by zero
E Hello
E World
tests/test_traceback.py:369: ZeroDivisionError
During handling of the above exception, another exception occurred:
@pytest.mark.skipif(
sys.version_info.minor < 11, reason="Not supported before Python 3.11"
)
def test_notes() -> None:
"""Check traceback captures __note__."""
try:
1 / 0
except Exception as error:
error.add_note("Hello")
error.add_note("World")
traceback = Traceback()
> assert traceback.trace.stacks[0].notes == ["Hello", "World"]
E AssertionError: assert 'Hello\nWorld' == ['Hello', 'World']
E + where 'Hello\nWorld' = Stack(exc_type='ZeroDivisionError', exc_value='division by zero', notes='Hello\nWorld', syntax_error=None, is_cause=Fa...sts/test_traceback.py', lineno=369, name='test_notes', line='', locals=None, last_instruction=((373, 20), (373, 31)))]).notes
tests/test_traceback.py:375: AssertionError
!!!!!!!!!!!!!!!!!!!!!!!!!! stopping after 1 failures !!!!!!!!!!!!!!!!!!!!!!!!!!!
1 failed, 20 passed, 1 skipped in 0.90s