resolved RESOLVED PASS · 11 tool calls · 84 s · Textualize/rich
Update progress.py Don't output extraneous blank line when progress display is disabled <!-- Please note that Rich isn't accepting any new features at this point. If a feature can be implemented without modifying the core library, then they should be released as a third-party module. I can accept updates to the core library that make it easier to extend (think hooks). Bugfixes are always welcome of course. Sometimes it is not clear what is a feature and what is a bug fix. If there is any doubt, please open a discussion first. --> <!-- *Are you contributing typo fixes?* If your PR solely consists of typos, at least one must be in the docs to warrant an addition to CONTRIBUTORS.md --> ## Type of changes - [x] Bug fix - [ ] New feature - [ ] Documentation / docstrings - [ ] Tests - [ ] Other ## AI? - [ ] AI was used to generate this PR AI generated PRs may be accepted, but only if @willmcgugan has responded on an issue or discussion. ## Checklist - [x] I've run the latest [black](https://github.com/psf/black) with default args on new code. - [x] I've updated CHANGELOG.md and CONTRIBUTORS.md where appropriate (see note about typos above). - [x] I've added tests for new code. - [x] I accept that @willmcgugan may be pedantic in the code review. ## Description When creating a `Progress` with `disabled=True`, it still outputs a blank line on non interactive consoles. This PR adds an `if not self.disable` to the `stop` function, symmetrically to the `start` function. **Important:** Link to an issue or discussion regarding these changes. https://github.com/Textualize/rich/issues/110
| # | Tool | Arguments | Result |
|---|---|---|---|
| 1 | run_command | {
"command": "grep -rn \"class Progress\" rich | head -20"
} | {"status": "ok", "stdout": "rich/progress_bar.py:18:class ProgressBar(JupyterMixin):\nrich/progress.py:507:class ProgressColumn(ABC):\nrich/progress.py:926:clasfull{"status": "ok", "stdout": "rich/progress_bar.py:18:class ProgressBar(JupyterMixin):\nrich/progress.py:507:class ProgressColumn(ABC):\nrich/progress.py:926:class ProgressSample(NamedTuple):\nrich/progress.py:1061:class Progress(JupyterMixin):\n", "exit_code": 0} |
| 2 | read_file | {
"filepath": "rich/progress.py",
"start_line": 1061
} | {"status": "ok", "filepath": "rich/progress.py", "content": "class Progress(JupyterMixin):\n \"\"\"Renders an auto-updating progress bar(s).\n\n Args:\n consolefull{"status": "ok", "filepath": "rich/progress.py", "content": "class Progress(JupyterMixin):\n \"\"\"Renders an auto-updating progress bar(s).\n\n Args:\n console (Console, optional): Optional Console instance. Defaults to an internal Console instance writing to stdout.\n auto_refresh (bool, optional): Enable auto refresh. If disabled, you will need to call `refresh()`.\n refresh_per_second (float, optional): Number of times per second to refresh the progress information. Defaults to 10.\n speed_estimate_period: (float, optional): Period (in seconds) used to calculate the speed estimate. Defaults to 30.\n transient: (bool, optional): Clear the progress on exit. Defaults to False.\n redirect_stdout: (bool, optional): Enable redirection of stdout, so ``print`` may be used. Defaults to True.\n redirect_stderr: (bool, optional): Enable redirection of stderr. Defaults to True.\n get_time: (Callable, optional): A callable that gets the current time, or None to use Console.get_time. Defaults to None.\n disable (bool, optional): Disable progress display. Defaults to False\n expand (bool, optional): Expand tasks table to fit width. Defaults to False.\n \"\"\"\n\n def __init__(\n self,\n *columns: Union[str, ProgressColumn],\n console: Optional[Console] = None,\n auto_refresh: bool = True,\n refresh_per_second: float = 10,\n speed_estimate_period: float = 30.0,\n transient: bool = False,\n redirect_stdout: bool = True,\n redirect_stderr: bool = True,\n get_time: Optional[GetTimeCallable] = None,\n disable: bool = False,\n expand: bool = False,\n ) -> None:\n assert refresh_per_second > 0, \"refresh_per_second must be > 0\"\n self._lock = RLock()\n self.columns = columns or self.get_default_columns()\n self.speed_estimate_period = speed_estimate_period\n\n self.disable = disable |
| 3 | read_file | {
"filepath": "rich/progress.py",
"start_line": 1150,
"end_line": 1165
} | {"status": "ok", "filepath": "rich/progress.py", "content": " \"\"\"Get a list of Task instances.\"\"\"\n with self._lock:\n return list(self._tasks.values())\nfull{"status": "ok", "filepath": "rich/progress.py", "content": " \"\"\"Get a list of Task instances.\"\"\"\n with self._lock:\n return list(self._tasks.values())\n\n @property\n def task_ids(self) -> List[TaskID]:\n \"\"\"A list of task IDs.\"\"\"\n with self._lock:\n return list(self._tasks.keys())\n\n @property\n def finished(self) -> bool:\n \"\"\"Check if all tasks have been completed.\"\"\"\n with self._lock:\n if not self._tasks:\n return True\n", "start_line": 1150, "end_line": 1165, "total_lines": 1715, "is_truncated": false} |
| 4 | read_file | {
"end_line": 1180,
"filepath": "rich/progress.py",
"start_line": 1166
} | {"status": "ok", "filepath": "rich/progress.py", "content": " return all(task.finished for task in self._tasks.values())\n\n def start(self) -> None:\n \"\"\"Stfull{"status": "ok", "filepath": "rich/progress.py", "content": " return all(task.finished for task in self._tasks.values())\n\n def start(self) -> None:\n \"\"\"Start the progress display.\"\"\"\n if not self.disable:\n self.live.start(refresh=True)\n\n def stop(self) -> None:\n \"\"\"Stop the progress display.\"\"\"\n self.live.stop()\n if not self.console.is_interactive and not self.console.is_jupyter:\n self.console.print()\n\n def __enter__(self) -> Self:\n self.start()\n", "start_line": 1166, "end_line": 1180, "total_lines": 1715, "is_truncated": false} |
| 5 | edit_file | {
"filepath": "rich/progress.py",
"new_string": " def stop(self) -> None:\n \\\"\\\"\\\"Stop the progress display.\\\"\\\"\\\"\n if not self.disable:\n self.live.stop()\n if not self.console.is_interactive and not self.console.is_jupyter:\n self.console.print()",
"old_string": " def stop(self) -> None:\n \\\"\\\"\\\"Stop the progress display.\\\"\\\"\\\"\n self.live.stop()\n if not self.console.is_interactive and not self.console.is_jupyter:\n self.console.print()"
} | {"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)"} |
| 6 | read_file | {
"end_line": 1180,
"filepath": "rich/progress.py",
"start_line": 1166
} | {"status": "ok", "filepath": "rich/progress.py", "content": " return all(task.finished for task in self._tasks.values())\n\n def start(self) -> None:\n \"\"\"Stfull{"status": "ok", "filepath": "rich/progress.py", "content": " return all(task.finished for task in self._tasks.values())\n\n def start(self) -> None:\n \"\"\"Start the progress display.\"\"\"\n if not self.disable:\n self.live.start(refresh=True)\n\n def stop(self) -> None:\n \"\"\"Stop the progress display.\"\"\"\n self.live.stop()\n if not self.console.is_interactive and not self.console.is_jupyter:\n self.console.print()\n\n def __enter__(self) -> Self:\n self.start()\n", "start_line": 1166, "end_line": 1180, "total_lines": 1715, "is_truncated": false} |
| 7 | edit_file | {
"filepath": "rich/progress.py",
"new_string": " def stop(self) -> None:\n \\\"\\\"\\\"Stop the progress display.\\\"\\\"\\\"\n if not self.disable:\n self.live.stop()\n if not self.console.is_interactive and not self.console.is_jupyter:\n self.console.print()",
"old_string": " def stop(self) -> None:\n \\\"\\\"\\\"Stop the progress display.\\\"\\\"\\\"\n self.live.stop()\n if not self.console.is_interactive and not self.console.is_jupyter:\n self.console.print()"
} | {"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)"} |
| 8 | read_file | {
"end_line": 1180,
"filepath": "rich/progress.py",
"start_line": 1173
} | {"status": "ok", "filepath": "rich/progress.py", "content": " def stop(self) -> None:\n \"\"\"Stop the progress display.\"\"\"\n self.live.stop()\n if not self.full{"status": "ok", "filepath": "rich/progress.py", "content": " def stop(self) -> None:\n \"\"\"Stop the progress display.\"\"\"\n self.live.stop()\n if not self.console.is_interactive and not self.console.is_jupyter:\n self.console.print()\n\n def __enter__(self) -> Self:\n self.start()\n", "start_line": 1173, "end_line": 1180, "total_lines": 1715, "is_truncated": false} |
| 9 | edit_file | {
"filepath": "rich/progress.py",
"new_string": " def stop(self) -> None:\n \\\"\\\"\\\"Stop the progress display.\\\"\\\"\\\"\n if not self.disable:\n self.live.stop()\n if not self.console.is_interactive and not self.console.is_jupyter:\n self.console.print()",
"old_string": " def stop(self) -> None:\n \\\"\\\"\\\"Stop the progress display.\\\"\\\"\\\"\n self.live.stop()\n if not self.console.is_interactive and not self.console.is_jupyter:\n self.console.print()"
} | {"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 | run_command | {
"command": "cat -A rich/progress.py | sed -n '1173,1180p'"
} | {"status": "ok", "stdout": " def stop(self) -> None:$\n \"\"\"Stop the progress display.\"\"\"$\n self.live.stop()$\n if not self.console.is_interactive and notfull{"status": "ok", "stdout": " def stop(self) -> None:$\n \"\"\"Stop the progress display.\"\"\"$\n self.live.stop()$\n if not self.console.is_interactive and not self.console.is_jupyter:$\n self.console.print()$\n$\n def __enter__(self) -> Self:$\n self.start()$\n", "exit_code": 0} |
| 11 | edit_file | {
"filepath": "rich/progress.py",
"new_string": " def stop(self) -> None:\n \"\"\"Stop the progress display.\"\"\"\n if not self.disable:\n self.live.stop()\n if not self.console.is_interactive and not self.console.is_jupyter:\n self.console.print()",
"old_string": " def stop(self) -> None:\n \"\"\"Stop the progress display.\"\"\"\n self.live.stop()\n if not self.console.is_interactive and not self.console.is_jupyter:\n self.console.print()"
} | {"status": "ok", "filepath": "rich/progress.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/progress.py\n+++ b/rich/progress.py\n@@ -1172,9 +117full{"status": "ok", "filepath": "rich/progress.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/rich/progress.py\n+++ b/rich/progress.py\n@@ -1172,9 +1172,10 @@\n \n def stop(self) -> None:\n \"\"\"Stop the progress display.\"\"\"\n- self.live.stop()\n- if not self.console.is_interactive and not self.console.is_jupyter:\n- self.console.print()\n+ if not self.disable:\n+ self.live.stop()\n+ if not self.console.is_interactive and not self.console.is_jupyter:\n+ self.console.print()\n \n def __enter__(self) -> Self:\n self.start()\n", "is_truncated": false} |
| 12 | submit_patch | [] | {"status": "ok", "patch_size": 627, "files_changed": 1}full{"status": "ok", "patch_size": 627, "files_changed": 1} |
diff --git a/rich/progress.py b/rich/progress.py
index 421e1411..f55b981e 100644
--- a/rich/progress.py
+++ b/rich/progress.py
@@ -1172,9 +1172,10 @@ class Progress(JupyterMixin):
def stop(self) -> None:
"""Stop the progress display."""
- self.live.stop()
- if not self.console.is_interactive and not self.console.is_jupyter:
- self.console.print()
+ if not self.disable:
+ self.live.stop()
+ if not self.console.is_interactive and not self.console.is_jupyter:
+ self.console.print()
def __enter__(self) -> Self:
self.start()
....................................... [100%] 39 passed in 0.54s