diff --git a/news/544.bugfix.md b/news/544.bugfix.md new file mode 100644 index 00000000..9f81d5ce --- /dev/null +++ b/news/544.bugfix.md @@ -0,0 +1 @@ +Fixed the progress bar remaining-time placeholder to account for uncompleted steps. diff --git a/src/cleo/ui/progress_bar.py b/src/cleo/ui/progress_bar.py index 44b87100..7675c7e1 100644 --- a/src/cleo/ui/progress_bar.py +++ b/src/cleo/ui/progress_bar.py @@ -377,7 +377,7 @@ def _formatter_remaining(self) -> str: remaining = 0 else: remaining = round( - (time.time() - self._start_time) / self._step * (self._max - self._max) + (time.time() - self._start_time) / self._step * (self._max - self._step) ) return format_time(remaining) diff --git a/tests/ui/test_progress_bar.py b/tests/ui/test_progress_bar.py index 75842195..77dcc0ff 100644 --- a/tests/ui/test_progress_bar.py +++ b/tests/ui/test_progress_bar.py @@ -1,6 +1,7 @@ from __future__ import annotations from typing import TYPE_CHECKING +from unittest.mock import patch import pytest @@ -225,6 +226,15 @@ def test_percent(ansi_io: BufferedIO) -> None: assert expected == ansi_io.fetch_error() +def test_remaining_time_uses_uncompleted_steps(ansi_io: BufferedIO) -> None: + with patch("cleo.ui.progress_bar.time.time", return_value=10): + bar = ProgressBar(ansi_io, max=10, min_seconds_between_redraws=0) + bar._start_time = 0 + bar._step = 2 + + assert bar._formatter_remaining() == "40 secs" + + def test_overwrite_with_shorter_line(ansi_io: BufferedIO) -> None: bar = ProgressBar(ansi_io, 50, 0) bar.set_format(" %current%/%max% [%bar%] %percent:3s%%")