failed WRONG_FIX UNSUBMITTED wrong_fix_unsubmitted(budget) · 33 tool calls · 306 s · Textualize/rich
perf: reduce Console and RichHandler import time by deferring unused imports ## E2E Results | Import | master | This PR | Speedup | |---|---|---|---| | `from rich.console import Console` | 78.1ms | 52.2ms | **1.50x faster** | | `from rich.logging import RichHandler` | 99.4ms | 56.9ms | **1.75x faster** | | `import rich` | 18.2ms | 18.3ms | (already lean) | ## Summary Defer module-level imports that are only needed in specific code paths, move annotation-only imports to `TYPE_CHECKING`, and remove dead code: | File | Change | Savings | |---|---|---| | `logging.py` | Defer `Traceback` to `emit()` (only when `rich_tracebacks=True`) | ~20ms | | `logging.py` | `from __future__ import annotations` + `TYPE_CHECKING` for `Console`, `ConsoleRenderable`, `Highlighter`, `FormatTimeCallable` | ~6ms | | `logging.py` | Replace `pathlib.Path` → `os.path.basename` (also a minor runtime win) | ~4-5ms | | `console.py` | Eliminate `import inspect`; replace `isclass` → `isinstance(x, type)`, `currentframe` → `sys._getframe` | ~10ms | | `console.py` | Defer `pretty` to `Console.print()` | ~3-5ms | | `console.py` | Defer `scope` to `Console.log()` (only when `log_locals=True`) | ~3-5ms | | `console.py` | Defer `getpass` to `Console.input()` (only when `password=True`) | ~2ms | | `console.py` | Defer `html.escape` and `zlib` to export methods | ~2.3ms | | `console.py` | Remove dead `_svg_hash` function (unused since 113997ac, fixes latent NameError) | cleanup | | `segment.py` | Remove dead `logging` import (`getLogger` assigned but never used) | ~2-3ms | | `theme.py` | Defer `configparser` to `Theme.from_file()` | ~1.5ms | | `syntax.py` | Move `Console`, `ConsoleOptions`, `JustifyMethod`, `RenderResult` to `TYPE_CHECKING` | eliminates console.py from syntax import chain | | `protocol.py` | Replace `from inspect import isclass` → `isinstance(x, type)` | prepares for dataclasses removal | | `repr.py` | Defer `import inspect` to `auto_rich_repr()` | prepares for dataclasses removal | All deferred imports are still available at runtime — they're loaded when the code path that needs them is actually hit. The `TYPE_CHECKING` imports are annotation-only and never needed at runtime (files use `from __future__ import annotations`). ## Benchmarks Environment: Standard_D2s_v5 (non-burstable), CPython 3.13.13, hyperfine --min-runs 30 ### Per-module breakdown (this PR) | Module | Time | |---|---| | `import rich` | 18.2ms | | `Console` | 52.5ms | | `RichHandler` | 56.4ms | | `Syntax` | 64.7ms | | `Traceback` | 92.5ms | | `Markdown` | 103.0ms | ## Motivation pip vendors Rich, and `Console`/`RichHandler` are imported on every `pip` invocation. These savings directly improve startup time for pip and every other tool that imports Rich. ## Testing - `pytest tests/` — 952 passed, 25 skipped - `mypy -p rich --no-incremental` — no issues - `black --check` — passes ## Disclosure This PR was developed with AI assistance (codeflash-agent). Benchmarked in a controlled environment (dedicated non-burstable Azure VM). All tests verified across multiple Python implementations.
| # | Tool | Arguments | Result |
|---|---|---|---|
| 1 | run_command | {
"command": "ls -R rich | grep -E \"logging.py|console.py|segment.py|theme.py|syntax.py|protocol.py|repr.py\""
} | {"status": "ok", "stdout": "_win32_console.py\nconsole.py\nlogging.py\nprotocol.py\nrepr.py\nsegment.py\nsyntax.py\nterminal_theme.py\ntheme.py\n", "stderr": ""full{"status": "ok", "stdout": "_win32_console.py\nconsole.py\nlogging.py\nprotocol.py\nrepr.py\nsegment.py\nsyntax.py\nterminal_theme.py\ntheme.py\n", "stderr": "", "exit_code": 0} |
| 2 | run_command | {
"command": "cat rich/logging.py"
} | {"status": "ok", "stdout": "import logging\nfrom datetime import datetime\nfrom logging import Handler, LogRecord\nfrom pathlib import Path\nfrom types import Mfull{"status": "ok", "stdout": "import logging\nfrom datetime import datetime\nfrom logging import Handler, LogRecord\nfrom pathlib import Path\nfrom types import ModuleType\nfrom typing import ClassVar, Iterable, List, Optional, Type, Union\n\nfrom rich._null_file import NullFile\n\nfrom . import get_console\nfrom ._log_render import FormatTimeCallable, LogRender\nfrom .console import Console, ConsoleRenderable\nfrom .highlighter import Highlighter, ReprHighlighter\nfrom .text import Text\nfrom .traceback import Traceback\n\n\nclass RichHandler(Handler):\n \"\"\"A logging handler that renders output with Rich. The time / level / message and file are displayed in columns.\n The level is color coded, and the message is syntax highlighted.\n\n Note:\n Be careful when enabling console markup in log messages if you have configured logging for libraries not\n under your control. If a dependency writes messages containing square brackets, it may not produce the intended output.\n\n Args:\n level (Union[int, str], optional): Log level. Defaults to logging.NOTSET.\n console (:class:`~rich.console.Console`, optional): Optional console instance to write logs.\n Default will use a global console instance writing to stdout.\n show_time (bool, optional): Show a column for the time. Defaults to True.\n omit_repeated_times (bool, optional): Omit repetition of the same time. Defaults to True.\n show_level (bool, optional): Show a column for the level. Defaults to True.\n show_path (bool, optional): Show the path to the original log call. Defaults to True.\n enable_link_path (bool, optional): Enable terminal link of path column to file. Defaults to True.\n highlighter (Highlighter, optional): Highlighter to style log messages, or None to use ReprHighlighter. Defaults to None.\n markup (bool, optional): Enable console markup in log messages. Defaults to False.\n rich_tracebacks (boo |
| 3 | run_command | {
"command": "cat rich/logging.py | tail -n +100"
} | {"status": "ok", "stdout": " level_width=None,\n )\n self.enable_link_path = enable_link_path\n self.markup = markup\n self.rich_tracebacks = rich_tracebacks\n full{"status": "ok", "stdout": " level_width=None,\n )\n self.enable_link_path = enable_link_path\n self.markup = markup\n self.rich_tracebacks = rich_tracebacks\n self.tracebacks_width = tracebacks_width\n self.tracebacks_extra_lines = tracebacks_extra_lines\n self.tracebacks_theme = tracebacks_theme\n self.tracebacks_word_wrap = tracebacks_word_wrap\n self.tracebacks_show_locals = tracebacks_show_locals\n self.tracebacks_suppress = tracebacks_suppress\n self.tracebacks_max_frames = tracebacks_max_frames\n self.tracebacks_code_width = tracebacks_code_width\n self.locals_max_length = locals_max_length\n self.locals_max_string = locals_max_string\n self.keywords = keywords\n\n def get_level_text(self, record: LogRecord) -> Text:\n \"\"\"Get the level name from the record.\n\n Args:\n record (LogRecord): LogRecord instance.\n\n Returns:\n Text: A tuple of the style and level name.\n \"\"\"\n level_name = record.levelname\n level_text = Text.styled(\n level_name.ljust(8), f\"logging.level.{level_name.lower()}\"\n )\n return level_text\n\n def emit(self, record: LogRecord) -> None:\n \"\"\"Invoked by logging.\"\"\"\n message = self.format(record)\n traceback = None\n if (\n self.rich_tracebacks\n and record.exc_info\n and record.exc_info != (None, None, None)\n ):\n exc_type, exc_value, exc_traceback = record.exc_info\n assert exc_type is not None\n assert exc_value is not None\n traceback = Traceback.from_exception(\n exc_type,\n exc_value,\n exc_traceback,\n width=self.tracebacks_width,\n code_width=self.tracebacks_code_width,\n extra_lines=self.tracebacks_extra_line |
| 4 | run_command | {
"command": "cat rich/logging.py | tail -n +200"
} | {"status": "ok", "stdout": " self.keywords = self.KEYWORDS\n\n if self.keywords:\n message_text.highlight_words(self.keywords, \"logging.keyword\")\n\n return mfull{"status": "ok", "stdout": " self.keywords = self.KEYWORDS\n\n if self.keywords:\n message_text.highlight_words(self.keywords, \"logging.keyword\")\n\n return message_text\n\n def render(\n self,\n *,\n record: LogRecord,\n traceback: Optional[Traceback],\n message_renderable: \"ConsoleRenderable\",\n ) -> \"ConsoleRenderable\":\n \"\"\"Render log for display.\n\n Args:\n record (LogRecord): logging Record.\n traceback (Optional[Traceback]): Traceback instance or None for no Traceback.\n message_renderable (ConsoleRenderable): Renderable (typically Text) containing log message contents.\n\n Returns:\n ConsoleRenderable: Renderable to display log.\n \"\"\"\n path = Path(record.pathname).name\n level = self.get_level_text(record)\n time_format = None if self.formatter is None else self.formatter.datefmt\n log_time = datetime.fromtimestamp(record.created)\n\n log_renderable = self._log_render(\n self.console,\n [message_renderable] if not traceback else [message_renderable, traceback],\n log_time=log_time,\n time_format=time_format,\n level=level,\n path=path,\n line_no=record.lineno,\n link_path=record.pathname if self.enable_link_path else None,\n )\n return log_renderable\n\n\nif __name__ == \"__main__\": # pragma: no cover\n from time import sleep\n\n FORMAT = \"%(message)s\"\n # FORMAT = \"%(asctime)-15s - %(levelname)s - %(message)s\"\n logging.basicConfig(\n level=\"NOTSET\",\n format=FORMAT,\n datefmt=\"[%X]\",\n handlers=[RichHandler(rich_tracebacks=True, tracebacks_show_locals=True)],\n )\n log = logging.getLogger(\"rich\")\n\n log.info(\"Server starting...\")\n log.info(\"Listening on http://127.0.0.1:8080\")\n sleep(1)\n\ |
| 5 | run_command | {
"command": "cat rich/console.py"
} | {"status": "ok", "stdout": "import inspect\nimport os\nimport sys\nimport threading\nimport zlib\nfrom abc import ABC, abstractmethod\nfrom dataclasses import dfull{"status": "ok", "stdout": "import inspect\nimport os\nimport sys\nimport threading\nimport zlib\nfrom abc import ABC, abstractmethod\nfrom dataclasses import dataclass, field\nfrom datetime import datetime\nfrom functools import wraps\nfrom getpass import getpass\nfrom html import escape\nfrom inspect import isclass\nfrom itertools import islice\nfrom math import ceil\nfrom time import monotonic\nfrom types import FrameType, ModuleType, TracebackType\nfrom typing import (\n IO,\n TYPE_CHECKING,\n Any,\n Callable,\n Dict,\n Iterable,\n List,\n Literal,\n Mapping,\n NamedTuple,\n Optional,\n Protocol,\n TextIO,\n Tuple,\n Type,\n Union,\n cast,\n runtime_checkable,\n)\n\nfrom rich._null_file import NULL_FILE\n\nfrom . import errors, themes\nfrom ._emoji_replace import _emoji_replace\nfrom ._export_format import CONSOLE_HTML_FORMAT, CONSOLE_SVG_FORMAT\nfrom ._fileno import get_fileno\nfrom ._log_render import FormatTimeCallable, LogRender\nfrom .align import Align, AlignMethod\nfrom .color import ColorSystem, blend_rgb\nfrom .control import Control\nfrom .emoji import EmojiVariant\nfrom .highlighter import NullHighlighter, ReprHighlighter\nfrom .markup import render as render_markup\nfrom .measure import Measurement, measure_renderables\nfrom .pager import Pager, SystemPager\nfrom .pretty import Pretty, is_expandable\nfrom .protocol import rich_cast\nfrom .region import Region\nfrom .scope import render_scope\nfrom .screen import Screen\nfrom .segment import Segment\nfrom .style import Style, StyleType\nfrom .styled import Styled\nfrom .terminal_theme import DEFAULT_TERMINAL_THEME, SVG_EXPORT_THEME, TerminalTheme\nfrom .text import Text, TextType\nfrom .theme import Theme, ThemeStack\n\nif TYPE_CHECKING:\n from ._windows import WindowsConsoleFeatures\n from .live import Live\n from .status import Status\n\nJUPYTER_DEFAULT_COLUMNS = 115\nJUPYTER_DEFAULT_LINES = 100\nWINDOWS = sys.platform == \"win32\"\n\nHi |
| 6 | run_command | {
"command": "cat rich/console.py | grep -n \"def print(\""
} | {"status": "ok", "stdout": "1648: def print(\n", "stderr": "", "exit_code": 0}full{"status": "ok", "stdout": "1648: def print(\n", "stderr": "", "exit_code": 0} |
| 7 | run_command | {
"command": "cat rich/console.py | grep -n \"def log(\""
} | {"status": "ok", "stdout": "1936: def log(\n", "stderr": "", "exit_code": 0}full{"status": "ok", "stdout": "1936: def log(\n", "stderr": "", "exit_code": 0} |
| 8 | run_command | {
"command": "cat rich/console.py | grep -n \"def input(\""
} | {"status": "ok", "stdout": "2143: def input(\n", "stderr": "", "exit_code": 0}full{"status": "ok", "stdout": "2143: def input(\n", "stderr": "", "exit_code": 0} |
| 9 | run_command | {
"command": "cat rich/console.py | grep -n \"def export\""
} | {"status": "ok", "stdout": "2177: def export_text(self, *, clear: bool = True, styles: bool = False) -> str:\n2223: def export_html(\n2329: def export_svg(\n", full{"status": "ok", "stdout": "2177: def export_text(self, *, clear: bool = True, styles: bool = False) -> str:\n2223: def export_html(\n2329: def export_svg(\n", "stderr": "", "exit_code": 0} |
| 10 | run_command | {
"command": "cat rich/console.py | grep -n \"_svg_hash\""
} | {"status": "ok", "stdout": "2619:def _svg_hash(svg_main_code: str) -> str:\n", "stderr": "", "exit_code": 0}full{"status": "ok", "stdout": "2619:def _svg_hash(svg_main_code: str) -> str:\n", "stderr": "", "exit_code": 0} |
| 11 | run_command | {
"command": "cat rich/segment.py"
} | {"status": "ok", "stdout": "from enum import IntEnum\nfrom functools import lru_cache\nfrom itertools import filterfalse\nfrom logging import getLogger\nfrom opfull{"status": "ok", "stdout": "from enum import IntEnum\nfrom functools import lru_cache\nfrom itertools import filterfalse\nfrom logging import getLogger\nfrom operator import attrgetter\nfrom typing import (\n TYPE_CHECKING,\n Dict,\n Iterable,\n List,\n NamedTuple,\n Optional,\n Sequence,\n Tuple,\n Type,\n Union,\n)\n\nfrom .cells import (\n _is_single_cell_widths,\n cached_cell_len,\n cell_len,\n get_character_cell_size,\n set_cell_size,\n)\nfrom .repr import Result, rich_repr\nfrom .style import Style\n\nif TYPE_CHECKING:\n from .console import Console, ConsoleOptions, RenderResult\n\nlog = getLogger(\"rich\")\n\n\nclass ControlType(IntEnum):\n \"\"\"Non-printable control codes which typically translate to ANSI codes.\"\"\"\n\n BELL = 1\n CARRIAGE_RETURN = 2\n HOME = 3\n CLEAR = 4\n SHOW_CURSOR = 5\n HIDE_CURSOR = 6\n ENABLE_ALT_SCREEN = 7\n DISABLE_ALT_SCREEN = 8\n CURSOR_UP = 9\n CURSOR_DOWN = 10\n CURSOR_FORWARD = 11\n CURSOR_BACKWARD = 12\n CURSOR_MOVE_TO_COLUMN = 13\n CURSOR_MOVE_TO = 14\n ERASE_IN_LINE = 15\n SET_WINDOW_TITLE = 16\n\n\nControlCode = Union[\n Tuple[ControlType],\n Tuple[ControlType, Union[int, str]],\n Tuple[ControlType, int, int],\n]\n\n\n@rich_repr()\nclass Segment(NamedTuple):\n \"\"\"A piece of text with associated style. Segments are produced by the Console render process and\n are ultimately converted in to strings to be written to the terminal.\n\n Args:\n text (str): A piece of text.\n style (:class:`~rich.style.Style`, optional): An optional style to apply to the text.\n control (Tuple[ControlCode], optional): Optional sequence of control codes.\n\n Attributes:\n cell_length (int): The cell length of this Segment.\n \"\"\"\n\n text: str\n style: Optional[Style] = None\n control: Optional[Sequence[ControlCode]] = None\n\n @property\n def cell_length(self) -> int:\n |
| 12 | run_command | {
"command": "cat rich/theme.py"
} | {"status": "ok", "stdout": "import configparser\nfrom typing import IO, Dict, List, Mapping, Optional\n\nfrom .default_styles import DEFAULT_STYLES\nfrom .stylefull{"status": "ok", "stdout": "import configparser\nfrom typing import IO, Dict, List, Mapping, Optional\n\nfrom .default_styles import DEFAULT_STYLES\nfrom .style import Style, StyleType\n\n\nclass Theme:\n \"\"\"A container for style information, used by :class:`~rich.console.Console`.\n\n Args:\n styles (Dict[str, Style], optional): A mapping of style names on to styles. Defaults to None for a theme with no styles.\n inherit (bool, optional): Inherit default styles. Defaults to True.\n \"\"\"\n\n styles: Dict[str, Style]\n\n def __init__(\n self, styles: Optional[Mapping[str, StyleType]] = None, inherit: bool = True\n ):\n self.styles = DEFAULT_STYLES.copy() if inherit else {}\n if styles is not None:\n self.styles.update(\n {\n name: style if isinstance(style, Style) else Style.parse(style)\n for name, style in styles.items()\n }\n )\n\n @property\n def config(self) -> str:\n \"\"\"Get contents of a config file for this theme.\"\"\"\n config = \"[styles]\\n\" + \"\\n\".join(\n f\"{name} = {style}\" for name, style in sorted(self.styles.items())\n )\n return config\n\n @classmethod\n def from_file(\n cls, config_file: IO[str], source: Optional[str] = None, inherit: bool = True\n ) -> \"Theme\":\n \"\"\"Load a theme from a text mode file.\n\n Args:\n config_file (IO[str]): An open conf file.\n source (str, optional): The filename of the open file. Defaults to None.\n inherit (bool, optional): Inherit default styles. Defaults to True.\n\n Returns:\n Theme: A New theme instance.\n \"\"\"\n config = configparser.ConfigParser()\n config.read_file(config_file, source=source)\n styles = {name: Style.parse(value) for name, value in config.items(\"styles\")}\n theme = Theme(st |
| 13 | run_command | {
"command": "cat rich/syntax.py"
} | {"status": "ok", "stdout": "from __future__ import annotations\n\nimport os.path\nimport re\nimport sys\nimport textwrap\nfrom abc import ABC, abstractmethod\nffull{"status": "ok", "stdout": "from __future__ import annotations\n\nimport os.path\nimport re\nimport sys\nimport textwrap\nfrom abc import ABC, abstractmethod\nfrom pathlib import Path\nfrom typing import (\n Any,\n Dict,\n Iterable,\n List,\n NamedTuple,\n Optional,\n Sequence,\n Set,\n Tuple,\n Type,\n Union,\n)\n\nfrom pygments.lexer import Lexer\nfrom pygments.lexers import get_lexer_by_name, guess_lexer_for_filename\nfrom pygments.style import Style as PygmentsStyle\nfrom pygments.styles import get_style_by_name\nfrom pygments.token import (\n Comment,\n Error,\n Generic,\n Keyword,\n Name,\n Number,\n Operator,\n String,\n Token,\n Whitespace,\n)\nfrom pygments.util import ClassNotFound\n\nfrom rich.containers import Lines\nfrom rich.padding import Padding, PaddingDimensions\n\nfrom ._loop import loop_first\nfrom .cells import cell_len\nfrom .color import Color, blend_rgb\nfrom .console import Console, ConsoleOptions, JustifyMethod, RenderResult\nfrom .jupyter import JupyterMixin\nfrom .measure import Measurement\nfrom .segment import Segment, Segments\nfrom .style import Style, StyleType\nfrom .text import Text\n\nTokenType = Tuple[str, ...]\n\nWINDOWS = sys.platform == \"win32\"\nDEFAULT_THEME = \"monokai\"\n\n# The following styles are based on https://github.com/pygments/pygments/blob/master/pygments/formatters/terminal.py\n# A few modifications were made\n\nANSI_LIGHT: Dict[TokenType, Style] = {\n Token: Style(),\n Whitespace: Style(color=\"white\"),\n Comment: Style(dim=True),\n Comment.Preproc: Style(color=\"cyan\"),\n Keyword: Style(color=\"blue\"),\n Keyword.Type: Style(color=\"cyan\"),\n Operator.Word: Style(color=\"magenta\"),\n Name.Builtin: Style(color=\"cyan\"),\n Name.Function: Style(color=\"green\"),\n Name.Namespace: Style(color=\"cyan\", underline=True),\n Name.Class: Style(color=\"green\", underline=True),\n Name.Exception: Style(color=\"cyan\") |
| 14 | run_command | {
"command": "cat rich/protocol.py"
} | {"status": "ok", "stdout": "from typing import Any, cast, Set, TYPE_CHECKING\nfrom inspect import isclass\n\nif TYPE_CHECKING:\n from rich.console import Renderfull{"status": "ok", "stdout": "from typing import Any, cast, Set, TYPE_CHECKING\nfrom inspect import isclass\n\nif TYPE_CHECKING:\n from rich.console import RenderableType\n\n_GIBBERISH = \"\"\"aihwerij235234ljsdnp34ksodfipwoe234234jlskjdf\"\"\"\n\n\ndef is_renderable(check_object: Any) -> bool:\n \"\"\"Check if an object may be rendered by Rich.\"\"\"\n return (\n isinstance(check_object, str)\n or hasattr(check_object, \"__rich__\")\n or hasattr(check_object, \"__rich_console__\")\n )\n\n\ndef rich_cast(renderable: object) -> \"RenderableType\":\n \"\"\"Cast an object to a renderable by calling __rich__ if present.\n\n Args:\n renderable (object): A potentially renderable object\n\n Returns:\n object: The result of recursively calling __rich__.\n \"\"\"\n from rich.console import RenderableType\n\n rich_visited_set: Set[type] = set() # Prevent potential infinite loop\n while hasattr(renderable, \"__rich__\") and not isclass(renderable):\n # Detect object which claim to have all the attributes\n if hasattr(renderable, _GIBBERISH):\n return repr(renderable)\n cast_method = getattr(renderable, \"__rich__\")\n renderable = cast_method()\n renderable_type = type(renderable)\n if renderable_type in rich_visited_set:\n break\n rich_visited_set.add(renderable_type)\n\n return cast(RenderableType, renderable)\n", "stderr": "", "exit_code": 0} |
| 15 | run_command | {
"command": "cat rich/repr.py"
} | {"status": "ok", "stdout": "import inspect\nfrom functools import partial\nfrom typing import (\n Any,\n Callable,\n Iterable,\n List,\n Optional,\n Tuple,\n Tyfull{"status": "ok", "stdout": "import inspect\nfrom functools import partial\nfrom typing import (\n Any,\n Callable,\n Iterable,\n List,\n Optional,\n Tuple,\n Type,\n TypeVar,\n Union,\n overload,\n)\n\nT = TypeVar(\"T\")\n\n\nResult = Iterable[Union[Any, Tuple[Any], Tuple[str, Any], Tuple[str, Any, Any]]]\nRichReprResult = Result\n\n\nclass ReprError(Exception):\n \"\"\"An error occurred when attempting to build a repr.\"\"\"\n\n\n@overload\ndef auto(cls: Optional[Type[T]]) -> Type[T]:\n ...\n\n\n@overload\ndef auto(*, angular: bool = False) -> Callable[[Type[T]], Type[T]]:\n ...\n\n\ndef auto(\n cls: Optional[Type[T]] = None, *, angular: Optional[bool] = None\n) -> Union[Type[T], Callable[[Type[T]], Type[T]]]:\n \"\"\"Class decorator to create __repr__ from __rich_repr__\"\"\"\n\n def do_replace(cls: Type[T], angular: Optional[bool] = None) -> Type[T]:\n def auto_repr(self: T) -> str:\n \"\"\"Create repr string from __rich_repr__\"\"\"\n repr_str: List[str] = []\n append = repr_str.append\n\n angular: bool = getattr(self.__rich_repr__, \"angular\", False) # type: ignore[attr-defined]\n for arg in self.__rich_repr__(): # type: ignore[attr-defined]\n if isinstance(arg, tuple):\n if len(arg) == 1:\n append(repr(arg[0]))\n else:\n key, value, *default = arg\n if key is None:\n append(repr(value))\n else:\n if default and default[0] == value:\n continue\n append(f\"{key}={value!r}\")\n else:\n append(repr(arg))\n if angular:\n return f\"<{self.__class__.__name__} {' '.join(repr_str)}>\"\n else:\n return f\"{self.__class__._ |
| 16 | edit_file | {
"filepath": "rich/logging.py",
"new_string": "from __future__ import annotations\n\nimport logging\nfrom datetime import datetime\nfrom logging import Handler, LogRecord\nimport os\nfrom types import ModuleType\nfrom typing import TYPE_CHECKING, ClassVar, Iterable, List, Optional, Type, Union\n\nif TYPE_CHECKING:\n from .console import Console, ConsoleRenderable\n from .highlighter import Highlighter\n from ._log_render import FormatTimeCallable\n\nfrom rich._null_file import NullFile\n\nfrom . import get_console\nfrom ._log_render import LogRender\nfrom .text import Text\nfrom .traceback import Traceback\n",
"old_string": "import logging\nfrom datetime import datetime\nfrom logging import Handler, LogRecord\nfrom pathlib import Path\nfrom types import ModuleType\nfrom typing import ClassVar, Iterable, List, Optional, Type, Union\n\nfrom rich._null_file import NullFile\n\nfrom . import get_console\nfrom ._log_render import FormatTimeCallable, LogRender\nfrom .console import Console, ConsoleRenderable\nfrom .highlighter import Highlighter, ReprHighlighter\nfrom .text import Text\nfrom .traceback import Traceback\n"
} | {"status": "ok", "filepath": "rich/logging.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/logging.py\n+++ b/rich/logging.py\n@@ -1,16 +1,21 @@\full{"status": "ok", "filepath": "rich/logging.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/logging.py\n+++ b/rich/logging.py\n@@ -1,16 +1,21 @@\n+from __future__ import annotations\n+\n import logging\n from datetime import datetime\n from logging import Handler, LogRecord\n-from pathlib import Path\n+import os\n from types import ModuleType\n-from typing import ClassVar, Iterable, List, Optional, Type, Union\n+from typing import TYPE_CHECKING, ClassVar, Iterable, List, Optional, Type, Union\n+\n+if TYPE_CHECKING:\n+ from .console import Console, ConsoleRenderable\n+ from .highlighter import Highlighter\n+ from ._log_render import FormatTimeCallable\n \n from rich._null_file import NullFile\n \n from . import get_console\n-from ._log_render import FormatTimeCallable, LogRender\n-from .console import Console, ConsoleRenderable\n-from .highlighter import Highlighter, ReprHighlighter\n+from ._log_render import LogRender\n from .text import Text\n from .traceback import Traceback\n \n", "is_truncated": false} |
| 17 | edit_file | {
"filepath": "rich/logging.py",
"new_string": " def emit(self, record: LogRecord) -> None:\n \"\"\"Invoked by logging.\"\"\"\n message = self.format(record)\n traceback = None\n if (\n self.rich_tracebacks\n and record.exc_info\n and record.exc_info != (None, None, None)\n ):\n from .traceback import Traceback\n exc_type, exc_value, exc_traceback = record.exc_info\n assert exc_type is not None\n assert exc_value is not None\n traceback = Traceback.from_exception(\n exc_type,\n exc_value,\n exc_traceback,\n width=self.tracebacks_width,\n code_width=self.tracebacks_code_width,\n extra_lines=self.tracebacks_extra_lines,\n theme=self.tracebacks_theme,\n word_wrap=self.tracebacks_word_wrap,\n show_locals=self.tracebacks_show_locals,\n locals_max_length=self.locals_max_length,\n locals_max_string=self.locals_max_string,\n suppress=self.tracebacks_suppress,\n max_frames=self.tracebacks_max_frames,\n )\n message = record.getMessage()\n",
"old_string": " def emit(self, record: LogRecord) -> None:\n \"\"\"Invoked by logging.\"\"\"\n message = self.format(record)\n traceback = None\n if (\n self.rich_tracebacks\n and record.exc_info\n and record.exc_info != (None, None, None)\n ):\n exc_type, exc_value, exc_traceback = record.exc_info\n assert exc_type is not None\n assert exc_value is not None\n traceback = Traceback.from_exception(\n exc_type,\n exc_value,\n exc_traceback,\n width=self.tracebacks_width,\n code_width=self.tracebacks_code_width,\n extra_lines=self.tracebacks_extra_lines,\n theme=self.tracebacks_theme,\n word_wrap=self.tracebacks_word_wrap,\n show_locals=self.tracebacks_show_locals,\n locals_max_length=self.locals_max_length,\n locals_max_string=self.locals_max_string,\n suppress=self.tracebacks_suppress,\n max_frames=self.tracebacks_max_frames,\n )\n message = record.getMessage()\n"
} | {"status": "ok", "filepath": "rich/logging.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/logging.py\n+++ b/rich/logging.py\n@@ -143,6 +143,7 @full{"status": "ok", "filepath": "rich/logging.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/logging.py\n+++ b/rich/logging.py\n@@ -143,6 +143,7 @@\n and record.exc_info\n and record.exc_info != (None, None, None)\n ):\n+ from .traceback import Traceback\n exc_type, exc_value, exc_traceback = record.exc_info\n assert exc_type is not None\n assert exc_value is not None\n", "is_truncated": false} |
| 18 | edit_file | {
"filepath": "rich/logging.py",
"new_string": " def render(\n self,\n *,\n record: LogRecord,\n traceback: Optional[Traceback],\n message_renderable: \"ConsoleRenderable\",\n ) -> \"ConsoleRenderable\":\n \"\"\"Render log for display.\n\n Args:\n record (LogRecord): logging Record.\n traceback (Optional[Traceback]): Traceback instance or None for no Traceback.\n message_renderable (ConsoleRenderable): Renderable (typically Text) containing log message contents.\n\n Returns:\n ConsoleRenderable: Renderable to display log.\n \"\"\"\n path = os.path.basename(record.pathname)\n level = self.get_level_text(record)\n time_format = None if self.formatter is None else self.formatter.datefmt\n log_time = datetime.fromtimestamp(record.created)\n",
"old_string": " def render(\n self,\n *,\n record: LogRecord,\n traceback: Optional[Traceback],\n message_renderable: \"ConsoleRenderable\",\n ) -> \"ConsoleRenderable\":\n \"\"\"Render log for display.\n\n Args:\n record (LogRecord): logging Record.\n traceback (Optional[Traceback]): Traceback instance or None for no Traceback.\n message_renderable (ConsoleRenderable): Renderable (typically Text) containing log message contents.\n\n Returns:\n ConsoleRenderable: Renderable to display log.\n \"\"\"\n path = Path(record.pathname).name\n level = self.get_level_text(record)\n time_format = None if self.formatter is None else self.formatter.datefmt\n log_time = datetime.fromtimestamp(record.created)\n"
} | {"status": "ok", "filepath": "rich/logging.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/logging.py\n+++ b/rich/logging.py\n@@ -227,7 +227,7 @full{"status": "ok", "filepath": "rich/logging.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/logging.py\n+++ b/rich/logging.py\n@@ -227,7 +227,7 @@\n Returns:\n ConsoleRenderable: Renderable to display log.\n \"\"\"\n- path = Path(record.pathname).name\n+ path = os.path.basename(record.pathname)\n level = self.get_level_text(record)\n time_format = None if self.formatter is None else self.formatter.datefmt\n log_time = datetime.fromtimestamp(record.created)\n", "is_truncated": false} |
| 19 | edit_file | {
"filepath": "rich/console.py",
"new_string": "import os\nimport sys\nimport threading\nimport zlib\nfrom abc import ABC, abstractmethod\nfrom dataclasses import dataclass, field\nfrom datetime import datetime\nfrom functools import wraps\nfrom getpass import getpass\nfrom html import escape\nfrom itertools import islice\nfrom math import ceil\nfrom time import monotonic\nfrom types import FrameType, ModuleType, TracebackType\nfrom typing import (\n IO,\n TYPE_CHECKING,\n Any,\n Callable,\n Dict,\n Iterable,\n List,\n Literal,\n Mapping,\n NamedTuple,\n Optional,\n Protocol,\n TextIO,\n Tuple,\n Type,\n Union,\n cast,\n runtime_checkable,\n)\n",
"old_string": "import inspect\nimport os\nimport sys\nimport threading\nimport zlib\nfrom abc import ABC, abstractmethod\nfrom dataclasses import dataclass, field\nfrom datetime import datetime\nfrom functools import wraps\nfrom getpass import getpass\nfrom html import escape\nfrom inspect import isclass\nfrom itertools import islice\nfrom math import ceil\nfrom time import monotonic\nfrom types import FrameType, ModuleType, TracebackType\nfrom typing import (\n IO,\n TYPE_CHECKING,\n Any,\n Callable,\n Dict,\n Iterable,\n List,\n Literal,\n Mapping,\n NamedTuple,\n Optional,\n Protocol,\n TextIO,\n Tuple,\n Type,\n Union,\n cast,\n runtime_checkable,\n)\n"
} | {"status": "ok", "filepath": "rich/console.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/console.py\n+++ b/rich/console.py\n@@ -1,4 +1,3 @@\n-full{"status": "ok", "filepath": "rich/console.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/console.py\n+++ b/rich/console.py\n@@ -1,4 +1,3 @@\n-import inspect\n import os\n import sys\n import threading\n@@ -9,7 +8,6 @@\n from functools import wraps\n from getpass import getpass\n from html import escape\n-from inspect import isclass\n from itertools import islice\n from math import ceil\n from time import monotonic\n", "is_truncated": false} |
| 20 | run_command | {
"command": "grep -rn \"isclass\" rich/console.py"
} | {"status": "ok", "stdout": "1322: if hasattr(renderable, \"__rich_console__\") and not isclass(renderable):\n", "stderr": "", "exit_code": 0}full{"status": "ok", "stdout": "1322: if hasattr(renderable, \"__rich_console__\") and not isclass(renderable):\n", "stderr": "", "exit_code": 0} |
| 21 | edit_file | {
"filepath": "rich/console.py",
"new_string": " if hasattr(renderable, \"__rich_console__\") and not isinstance(renderable, type):\n",
"old_string": " if hasattr(renderable, \"__rich_console__\") and not isclass(renderable):\n"
} | {"status": "ok", "filepath": "rich/console.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/console.py\n+++ b/rich/console.py\n@@ -1319,7 +1319,7full{"status": "ok", "filepath": "rich/console.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/console.py\n+++ b/rich/console.py\n@@ -1319,7 +1319,7 @@\n render_iterable: RenderResult\n \n renderable = rich_cast(renderable)\n- if hasattr(renderable, \"__rich_console__\") and not isclass(renderable):\n+ if hasattr(renderable, \"__rich_console__\") and not isinstance(renderable, type):\n render_iterable = renderable.__rich_console__(self, _options)\n elif isinstance(renderable, str):\n text_renderable = self.render_str(\n", "is_truncated": false} |
| 22 | run_command | {
"command": "grep -rn \"currentframe\" rich/console.py"
} | {"status": "ok", "stdout": "1902: currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe,\n1908: currentframe (Callable[[], Optional[FrameType]]full{"status": "ok", "stdout": "1902: currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe,\n1908: currentframe (Callable[[], Optional[FrameType]], optional): the callable to use to\n1909: retrieve the current frame. Defaults to ``inspect.currentframe``.\n1921: frame = currentframe()\n1923: # Use the faster currentframe where implemented\n", "stderr": "", "exit_code": 0} |
| 23 | edit_file | {
"filepath": "rich/console.py",
"new_string": " def log(\n self,\n message: Any,\n *,\n style: Optional[StyleType] = None,\n highlight: Optional[bool] = None,\n markup: Optional[bool] = None,\n log_locals: bool = False,\n currentframe: Callable[[], Optional[FrameType]] = sys._getframe,\n ) -> None:\n",
"old_string": " def log(\n self,\n message: Any,\n *,\n style: Optional[StyleType] = None,\n highlight: Optional[bool] = None,\n markup: Optional[bool] = None,\n log_locals: bool = False,\n currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe,\n ) -> None:\n"
} | {"status": "error", "error_type": "FileEditError", "error_message": "Failed to replace: old_string not found. Ensure you're not escaping content incorrectly andfull{"status": "error", "error_type": "FileEditError", "error_message": "Failed to replace: old_string not found. Ensure you're not escaping content incorrectly and check whitespace, indentation, and context."} |
| 24 | run_command | {
"command": "cat rich/console.py | sed -n '1930,1945p'"
} | {"status": "ok", "stdout": " # Fallback to the slower stack\n frame_info = inspect.stack()[offset]\n return frame_info.filename, frame_info.lineno, frame_info.ffull{"status": "ok", "stdout": " # Fallback to the slower stack\n frame_info = inspect.stack()[offset]\n return frame_info.filename, frame_info.lineno, frame_info.frame.f_locals\n\n def log(\n self,\n *objects: Any,\n sep: str = \" \",\n end: str = \"\\n\",\n style: Optional[Union[str, Style]] = None,\n justify: Optional[JustifyMethod] = None,\n emoji: Optional[bool] = None,\n markup: Optional[bool] = None,\n highlight: Optional[bool] = None,\n log_locals: bool = False,\n _stack_offset: int = 1,\n", "stderr": "", "exit_code": 0} |
| 25 | run_command | {
"command": "grep -n \"def log(\" rich/console.py"
} | {"status": "ok", "stdout": "1934: def log(\n", "stderr": "", "exit_code": 0}full{"status": "ok", "stdout": "1934: def log(\n", "stderr": "", "exit_code": 0} |
| 26 | run_command | {
"command": "cat rich/console.py | sed -n '1934,1950p'"
} | {"status": "ok", "stdout": " def log(\n self,\n *objects: Any,\n sep: str = \" \",\n end: str = \"\\n\",\n style: Optional[Union[str, Style]] = None,\n justify:full{"status": "ok", "stdout": " def log(\n self,\n *objects: Any,\n sep: str = \" \",\n end: str = \"\\n\",\n style: Optional[Union[str, Style]] = None,\n justify: Optional[JustifyMethod] = None,\n emoji: Optional[bool] = None,\n markup: Optional[bool] = None,\n highlight: Optional[bool] = None,\n log_locals: bool = False,\n _stack_offset: int = 1,\n ) -> None:\n \"\"\"Log rich content to the terminal.\n\n Args:\n objects (positional args): Objects to log to the terminal.\n", "stderr": "", "exit_code": 0} |
| 27 | run_command | {
"command": "grep -n \"currentframe\" rich/console.py"
} | {"status": "ok", "stdout": "1902: currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe,\n1908: currentframe (Callable[[], Optional[FrameType]]full{"status": "ok", "stdout": "1902: currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe,\n1908: currentframe (Callable[[], Optional[FrameType]], optional): the callable to use to\n1909: retrieve the current frame. Defaults to ``inspect.currentframe``.\n1921: frame = currentframe()\n1923: # Use the faster currentframe where implemented\n", "stderr": "", "exit_code": 0} |
| 28 | run_command | {
"command": "cat rich/console.py | sed -n '1880,1925p'"
} | {"status": "ok", "stdout": " theme (str, optional): Override pygments theme used in traceback\n word_wrap (bool, optional): Enable word wrapping of long lines. full{"status": "ok", "stdout": " 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 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 from .traceback import Traceback\n\n traceback = Traceback(\n width=width,\n extra_lines=extra_lines,\n theme=theme,\n word_wrap=word_wrap,\n show_locals=show_locals,\n suppress=suppress,\n max_frames=max_frames,\n )\n self.print(traceback)\n\n @staticmethod\n def _caller_frame_info(\n offset: int,\n currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe,\n ) -> Tuple[str, int, Dict[str, Any]]:\n \"\"\"Get caller frame information.\n\n Args:\n offset (int): the caller offset within the current frame stack.\n currentframe (Callable[[], Optional[FrameType]], optional): the callable to use to\n retrieve the current frame. Defaults to ``inspect.currentframe``.\n\n Returns:\n Tuple[str, int, Dict[str, Any]]: A tuple containing the filename, the line number and\n the dictionary of local variables associated with the caller frame.\n\n Raises:\n RuntimeError: If the stack offset is invalid.\n \"\"\"\n # Ignore the frame of this local helper\n offset += 1\n\n frame = currentframe()\n if frame is not None:\n # Use the faster currentframe where implemented\n while offset and frame is not None:\n frame = frame.f_back\n", " |
| 29 | edit_file | {
"filepath": "rich/console.py",
"new_string": " @staticmethod\n def _caller_frame_info(\n offset: int,\n currentframe: Callable[[], Optional[FrameType]] = sys._getframe,\n ) -> Tuple[str, int, Dict[str, Any]]:\n",
"old_string": " @staticmethod\n def _caller_frame_info(\n offset: int,\n currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe,\n ) -> Tuple[str, int, Dict[str, Any]]:\n"
} | {"status": "ok", "filepath": "rich/console.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/console.py\n+++ b/rich/console.py\n@@ -1899,7 +1899,7full{"status": "ok", "filepath": "rich/console.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/console.py\n+++ b/rich/console.py\n@@ -1899,7 +1899,7 @@\n @staticmethod\n def _caller_frame_info(\n offset: int,\n- currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe,\n+ currentframe: Callable[[], Optional[FrameType]] = sys._getframe,\n ) -> Tuple[str, int, Dict[str, Any]]:\n \"\"\"Get caller frame information.\n \n", "is_truncated": false} |
| 30 | edit_file | {
"filepath": "rich/console.py",
"new_string": " def print(\n self,\n *objects: Any,\n sep: str = \" \",\n end: \"\\n\",\n style: Optional[Union[str, Style]] = None,\n justify: Optional[JustifyMethod] = None,\n emoji: Optional[bool] = None,\n markup: Optional[bool] = None,\n highlight: Optional[bool] = None,\n ) -> None:\n \"\"\"Print rich content to the terminal.\n\n Args:\n objects (positional args): Objects to print to the terminal.\n sep (str, optional): String used to separate objects. Defaults to \" \".\n end (str, optional): String used to end the print. Defaults to \"\\n\".\n style (str, optional): Style to apply to the output. Defaults to None.\n justify (JustifyMethod, optional): Justify value override for renderable. Defaults to None.\n emoji (bool, optional): Enable emoji. Defaults to None.\n markup (bool, optional): Enable markup when rendering strings. Defaults to None.\n highlight (bool, optional): Highlight override for render_str. Defaults to None.\n \"\"\"\n from .pretty import Pretty\n",
"old_string": " def print(\n self,\n *objects: Any,\n sep: str = \" \",\n end: \"\\n\",\n style: Optional[Union[str, Style]] = None,\n justify: Optional[JustifyMethod] = None,\n emoji: Optional[bool] = None,\n markup: Optional[bool] = None,\n highlight: Optional[bool] = None,\n ) -> None:\n \"\"\"Print rich content to the terminal.\n\n Args:\n objects (positional args): Objects to print to the terminal.\n sep (str, optional): String used to separate objects. Defaults to \" \".\n end (str, optional): String used to end the print. Defaults to \"\\n\".\n style (str, optional): Style to apply to the output. Defaults to None.\n justify (JustifyMethod, optional): Justify value override for renderable. Defaults to None.\n emoji (bool, optional): Enable emoji. Defaults to None.\n markup (bool, optional): Enable markup when rendering strings. Defaults to None.\n highlight (bool, optional): Highlight override for render_str. Defaults to None.\n \"\"\"\n"
} | {"status": "error", "error_type": "FileEditError", "error_message": "Failed to replace: old_string not found. Ensure you're not escaping content incorrectly andfull{"status": "error", "error_type": "FileEditError", "error_message": "Failed to replace: old_string not found. Ensure you're not escaping content incorrectly and check whitespace, indentation, and context."} |
| 31 | run_command | {
"command": "cat rich/console.py | sed -n '1648,1670p'"
} | {"status": "ok", "stdout": " *objects: Any,\n sep: str = \" \",\n end: str = \"\\n\",\n style: Optional[Union[str, Style]] = None,\n justify: Optional[JustifyMefull{"status": "ok", "stdout": " *objects: Any,\n sep: str = \" \",\n end: str = \"\\n\",\n style: Optional[Union[str, Style]] = None,\n justify: Optional[JustifyMethod] = None,\n overflow: Optional[OverflowMethod] = None,\n no_wrap: Optional[bool] = None,\n emoji: Optional[bool] = None,\n markup: Optional[bool] = None,\n highlight: Optional[bool] = None,\n width: Optional[int] = None,\n height: Optional[int] = None,\n crop: bool = True,\n soft_wrap: Optional[bool] = None,\n new_line_start: bool = False,\n ) -> None:\n \"\"\"Print to the console.\n\n Args:\n objects (positional args): Objects to log to the terminal.\n sep (str, optional): String to write between print data. Defaults to \" \".\n end (str, optional): String to write at end of print data. Defaults to \"\\\\\\\\n\".\n style (Union[str, Style], optional): A style to apply to output. Defaults to None.\n", "stderr": "", "exit_code": 0} |
| 32 | edit_file | {
"filepath": "rich/console.py",
"new_string": " def print(\n self,\n *objects: Any,\n sep: str = \" \",\n end: str = \"\\n\",\n style: Optional[Union[str, Style]] = None,\n justify: Optional[JustifyMethod] = None,\n overflow: Optional[OverflowMethod] = None,\n no_wrap: Optional[bool] = None,\n emoji: Optional[bool] = None,\n markup: Optional[bool] = None,\n highlight: Optional[bool] = None,\n width: Optional[int] = None,\n height: Optional[int] = None,\n crop: bool = True,\n soft_wrap: Optional[bool] = None,\n new_line_start: bool = False,\n ) -> None:\n \"\"\"Print to the console.\n\n Args:\n objects (positional args): Objects to log to the terminal.\n sep (str, optional): String to write between print data. Defaults to \" \".\n end (str, optional): String to write at end of print data. Defaults to \"\\n\".\n style (Union[str, Style], optional): A style to apply to output. Defaults to None.\n \"\"\"\n from .pretty import Pretty\n",
"old_string": " def print(\n self,\n *objects: Any,\n sep: str = \" \",\n end: str = \"\\n\",\n style: Optional[Union[str, Style]] = None,\n justify: Optional[JustifyMethod] = None,\n overflow: Optional[OverflowMethod] = None,\n no_wrap: Optional[bool] = None,\n emoji: Optional[bool] = None,\n markup: Optional[bool] = None,\n highlight: Optional[bool] = None,\n width: Optional[int] = None,\n height: Optional[int] = None,\n crop: bool = True,\n soft_wrap: Optional[bool] = None,\n new_line_start: bool = False,\n ) -> None:\n \"\"\"Print to the console.\n\n Args:\n objects (positional args): Objects to log to the terminal.\n sep (str, optional): String to write between print data. Defaults to \" \".\n end (str, optional): String to write at end of print data. Defaults to \"\\n\".\n style (Union[str, Style], optional): A style to apply to output. Defaults to None.\n"
} | {"status": "error", "error_type": "FileEditError", "error_message": "Failed to replace: old_string not found. Ensure you're not escaping content incorrectly andfull{"status": "error", "error_type": "FileEditError", "error_message": "Failed to replace: old_string not found. Ensure you're not escaping content incorrectly and check whitespace, indentation, and context."} |
| 33 | run_command | {
"command": "cat rich/console.py | sed -n '1648,1660p'"
} | {"status": "ok", "stdout": " *objects: Any,\n sep: str = \" \",\n end: str = \"\\n\",\n style: Optional[Union[str, Style]] = None,\n justify: Optional[JustifyMefull{"status": "ok", "stdout": " *objects: Any,\n sep: str = \" \",\n end: str = \"\\n\",\n style: Optional[Union[str, Style]] = None,\n justify: Optional[JustifyMethod] = None,\n overflow: Optional[OverflowMethod] = None,\n no_wrap: Optional[bool] = None,\n emoji: Optional[bool] = None,\n markup: Optional[bool] = None,\n highlight: Optional[bool] = None,\n width: Optional[int] = None,\n height: Optional[int] = None,\n crop: bool = True,\n", "stderr": "", "exit_code": 0} |
diff --git a/rich/console.py b/rich/console.py
index ad92d529..8f0eae92 100644
--- a/rich/console.py
+++ b/rich/console.py
@@ -1,4 +1,3 @@
-import inspect
import os
import sys
import threading
@@ -9,7 +8,6 @@ from datetime import datetime
from functools import wraps
from getpass import getpass
from html import escape
-from inspect import isclass
from itertools import islice
from math import ceil
from time import monotonic
@@ -1321,7 +1319,7 @@ class Console:
render_iterable: RenderResult
renderable = rich_cast(renderable)
- if hasattr(renderable, "__rich_console__") and not isclass(renderable):
+ if hasattr(renderable, "__rich_console__") and not isinstance(renderable, type):
render_iterable = renderable.__rich_console__(self, _options)
elif isinstance(renderable, str):
text_renderable = self.render_str(
@@ -1901,7 +1899,7 @@ class Console:
@staticmethod
def _caller_frame_info(
offset: int,
- currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe,
+ currentframe: Callable[[], Optional[FrameType]] = sys._getframe,
) -> Tuple[str, int, Dict[str, Any]]:
"""Get caller frame information.
diff --git a/rich/logging.py b/rich/logging.py
index c3e7a5f6..4575b75e 100644
--- a/rich/logging.py
+++ b/rich/logging.py
@@ -1,16 +1,21 @@
+from __future__ import annotations
+
import logging
from datetime import datetime
from logging import Handler, LogRecord
-from pathlib import Path
+import os
from types import ModuleType
-from typing import ClassVar, Iterable, List, Optional, Type, Union
+from typing import TYPE_CHECKING, ClassVar, Iterable, List, Optional, Type, Union
+
+if TYPE_CHECKING:
+ from .console import Console, ConsoleRenderable
+ from .highlighter import Highlighter
+ from ._log_render import FormatTimeCallable
from rich._null_file import NullFile
from . import get_console
-from ._log_render import FormatTimeCallable, LogRender
-from .console import Console, ConsoleRenderable
-from .highlighter import Highlighter, ReprHighlighter
+from ._log_render import LogRender
from .text import Text
from .traceback import Traceback
@@ -138,6 +143,7 @@ class RichHandler(Handler):
and record.exc_info
and record.exc_info != (None, None, None)
):
+ from .traceback import Traceback
exc_type, exc_value, exc_traceback = record.exc_info
assert exc_type is not None
assert exc_value is not None
@@ -221,7 +227,7 @@ class RichHandler(Handler):
Returns:
ConsoleRenderable: Renderable to display log.
"""
- path = Path(record.pathname).name
+ path = os.path.basename(record.pathname)
level = self.get_level_text(record)
time_format = None if self.formatter is None else self.formatter.datefmt
log_time = datetime.fromtimestamp(record.created)
..........................................F
=================================== FAILURES ===================================
_____________________________ test_input_password ______________________________
prompt = '', stream = None
def unix_getpass(prompt='Password: ', stream=None):
"""Prompt for a password, with echo turned off.
Args:
prompt: Written on stream to ask for the input. Default: 'Password: '
stream: A writable file object to display the prompt. Defaults to
the tty. If no tty is available defaults to sys.stderr.
Returns:
The seKr3t input.
Raises:
EOFError: If our input tty or stdin was closed.
GetPassWarning: When we were unable to turn echo off on the input.
Always restores terminal settings before returning.
"""
passwd = None
with contextlib.ExitStack() as stack:
try:
# Always try reading and writing directly on the tty first.
> fd = os.open('/dev/tty', os.O_RDWR|os.O_NOCTTY)
E OSError: [Errno 6] No such device or address: '/dev/tty'
/root/.local/share/uv/python/cpython-3.13.14-linux-x86_64-gnu/lib/python3.13/getpass.py:47: OSError
During handling of the above exception, another exception occurred:
prompt = '', stream = None
def unix_getpass(prompt='Password: ', stream=None):
"""Prompt for a password, with echo turned off.
Args:
prompt: Written on stream to ask for the input. Default: 'Password: '
stream: A writable file object to display the prompt. Defaults to
the tty. If no tty is available defaults to sys.stderr.
Returns:
The seKr3t input.
Raises:
EOFError: If our input tty or stdin was closed.
GetPassWarning: When we were unable to turn echo off on the input.
Always restores terminal settings before returning.
"""
passwd = None
with contextlib.ExitStack() as stack:
try:
# Always try reading and writing directly on the tty first.
fd = os.open('/dev/tty', os.O_RDWR|os.O_NOCTTY)
tty = io.FileIO(fd, 'w+')
stack.enter_context(tty)
input = io.TextIOWrapper(tty)
stack.enter_context(input)
if not stream:
stream = input
except OSError:
# If that fails, see if stdin can be controlled.
stack.close()
try:
> fd = sys.stdin.fileno()
E io.UnsupportedOperation: redirected stdin is pseudofile, has no fileno()
/root/.local/share/uv/python/cpython-3.13.14-linux-x86_64-gnu/lib/python3.13/getpass.py:58: UnsupportedOperation
During handling of the above exception, another exception occurred:
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x78cbb4566740>
capsys = <_pytest.capture.CaptureFixture object at 0x78cbb4718e10>
def test_input_password(monkeypatch, capsys) -> None:
def fake_input(prompt, stream=None):
console.file.write(prompt)
return "bar"
import getpass
monkeypatch.setattr(getpass, "getpass", fake_input)
console = Console()
> user_input = console.input(prompt="foo:", password=True)
tests/test_console.py:407:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
rich/console.py:2167: in input
result = getpass("", stream=stream)
/root/.local/share/uv/python/cpython-3.13.14-linux-x86_64-gnu/lib/python3.13/getpass.py:61: in unix_getpass
passwd = fallback_getpass(prompt, stream)
/root/.local/share/uv/python/cpython-3.13.14-linux-x86_64-gnu/lib/python3.13/getpass.py:126: in fallback_getpass
return _raw_input(prompt, stream)
/root/.local/share/uv/python/cpython-3.13.14-linux-x86_64-gnu/lib/python3.13/getpass.py:146: in _raw_input
line = input.readline()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <_pytest.capture.DontReadFromInput object at 0x78cbb4775fd0>, size = -1
def read(self, size: int = -1) -> str:
> raise OSError(
"pytest: reading from stdin while output is captured! Consider using `-s`."
)
E OSError: pytest: reading from stdin while output is captured! Consider using `-s`.
/kaggle/tmp/envs/rich/lib/python3.13/site-packages/_pytest/capture.py:209: OSError
----------------------------- Captured stdout call -----------------------------
foo:
----------------------------- Captured stderr call -----------------------------
Warning: Password input may be echoed.
=============================== warnings summary ===============================
test_console.py::test_input_password
/root/.local/share/uv/python/cpython-3.13.14-linux-x86_64-gnu/lib/python3.13/getpass.py:61: GetPassWarning: Can not control echo on the terminal.
passwd = fallback_getpass(prompt, stream)
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
!!!!!!!!!!!!!!!!!!!!!!!!!! stopping after 1 failures !!!!!!!!!!!!!!!!!!!!!!!!!!!
1 failed, 42 passed, 1 warning in 0.45s