From 994f980f27555378f1917f8f7c2f764f7396e297 Mon Sep 17 00:00:00 2001 From: Quratulain-bilal Date: Tue, 4 Aug 2026 02:16:38 +0500 Subject: [PATCH 1/2] fix: log progress tracker refresh errors instead of silently swallowing The bare 'except Exception: pass' in StepTracker._maybe_refresh() completely hid rendering bugs in the Rich progress display. Now logs at DEBUG level with full traceback for diagnostics. --- src/specify_cli/_console.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/specify_cli/_console.py b/src/specify_cli/_console.py index 8d1216387f..0e448780ad 100644 --- a/src/specify_cli/_console.py +++ b/src/specify_cli/_console.py @@ -7,6 +7,7 @@ """ from __future__ import annotations +import logging import sys from collections.abc import Callable @@ -21,6 +22,8 @@ from rich.tree import Tree from typer.core import TyperGroup +logger = logging.getLogger(__name__) + BANNER = """ ███████╗██████╗ ███████╗ ██████╗██╗███████╗██╗ ██╗ ██╔════╝██╔══██╗██╔════╝██╔════╝██║██╔════╝╚██╗ ██╔╝ @@ -85,7 +88,7 @@ def _maybe_refresh(self): try: self._refresh_cb() except Exception: - pass + logger.debug("Progress tracker refresh failed", exc_info=True) def render(self): tree = Tree(f"[cyan]{self.title}[/cyan]", guide_style="grey50") From e7b10677f0081eb33f679cf1d1c88e2faad05026 Mon Sep 17 00:00:00 2001 From: Quratulain-bilal Date: Wed, 5 Aug 2026 15:17:29 +0500 Subject: [PATCH 2/2] test: add regression test for StepTracker refresh error logging - Test that _maybe_refresh logs exceptions instead of silently swallowing - Verify diagnostic message and traceback are recorded in DEBUG logs - Confirm tracker update completes normally despite refresh callback failure Requested by Copilot in PR #3975 --- tests/test_console_imports.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/test_console_imports.py b/tests/test_console_imports.py index 2ae328732e..9ecb49cf3b 100644 --- a/tests/test_console_imports.py +++ b/tests/test_console_imports.py @@ -1,9 +1,12 @@ """Regression guard: console symbols must remain importable from specify_cli.""" +import logging + from specify_cli import ( console, StepTracker, select_with_arrows, ) +from specify_cli._console import logger as console_logger def test_console_symbols_importable(): @@ -39,3 +42,21 @@ def test_select_with_arrows_raises_on_empty_options(): import pytest with pytest.raises(ValueError, match="at least one option"): select_with_arrows({}) + + +def test_step_tracker_refresh_error_is_logged(caplog): + """Regression: _maybe_refresh must log exceptions instead of silently swallowing.""" + tracker = StepTracker("test") + + def failing_refresh(): + raise RuntimeError("simulated refresh failure") + + tracker.attach_refresh(failing_refresh) + tracker.add("step1", "Step One") + + with caplog.at_level(logging.DEBUG, logger=console_logger.name): + tracker.complete("step1", "done") + + assert "Progress tracker refresh failed" in caplog.text + assert "RuntimeError: simulated refresh failure" in caplog.text + assert tracker.steps[0]["status"] == "done"