From 2f344e5bc9b47dba11fb569aa6c5e30b358c24cf Mon Sep 17 00:00:00 2001 From: MaXFeeD Date: Tue, 22 Apr 2025 20:55:30 +0300 Subject: [PATCH] Rewritten progresses in fetch to session, now they uses 1.0 dimensions instead of 100.0, updated tests --- src/icmtoolchain/cli.py | 6 +++--- src/icmtoolchain/fetch.py | 21 +++++++++++---------- src/icmtoolchain/shell.py | 24 ++++++++++++------------ 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/icmtoolchain/cli.py b/src/icmtoolchain/cli.py index c2aea9b..ab4dffc 100644 --- a/src/icmtoolchain/cli.py +++ b/src/icmtoolchain/cli.py @@ -235,8 +235,8 @@ def run_test(): async def update_progress(): texts = ["Downloading your BIOS...", "Comparing BIOS hashes...", "Removing previous BIOS...", "Flashing BIOS..."] while True: - progress.update(progress.percentage + random(), texts[int(progress.percentage / 25)]) - if progress.percentage >= 99: + progress.update(progress.percentage + random() / 100.0, texts[int(progress.percentage * 4)]) + if progress.percentage >= 0.99: progress.update(progress.percentage, "Something went terribly wrong!") progress.style = "class:interrupted" await asyncio.sleep(5) @@ -244,7 +244,7 @@ def run_test(): progress.percentage = 0 else: await asyncio.sleep(0.1) - intermediate_progress.text = texts[int(progress.percentage / 25)] + intermediate_progress.text = texts[int(progress.percentage * 4)] async def main(): app = Application( diff --git a/src/icmtoolchain/fetch.py b/src/icmtoolchain/fetch.py index 7f955d6..18dbfe5 100644 --- a/src/icmtoolchain/fetch.py +++ b/src/icmtoolchain/fetch.py @@ -8,7 +8,7 @@ from urllib.error import URLError from urllib.response import addinfourl from . import GLOBALS -from .shell import warn +from .shell import pretty_print_failure, warn from .utils import ensure_file, name_to_identifier @@ -125,12 +125,13 @@ def create_download_github_repository_request(repository: str, branch: str = "ma def queue_download_request(url: str, data: Optional[bytes] = None, output_path: Optional[str] = None, /, placeholder: Optional[str] = None, timeout: float = 10, seconds_between_requests: float = 0.5, attempts: int = 2): if not placeholder: placeholder = url.rsplit("/", 1)[-1] - # progress = Progress(text=placeholder) - try: - _, fetch = create_download_request(url, data, placeholder=placeholder, timeout=timeout, seconds_between_requests=seconds_between_requests, attempts=attempts) - fetch(output_path, lambda received, size: None) # progress.notify(shell, progress, received / size, f"{placeholder} ({received / size / 1048576:.1f}%)") - # progress.notify(shell, progress, 1, placeholder) - except URLError as exc: - # Shell.notify(shell, f"#{exc.errno}: {exc.strerror}") - # Progress.notify(shell, progress, 1, "Check your network connection!") - pass + from .shell import InteractiveSession, Progress + with InteractiveSession(progress=Progress(text=placeholder)) as session: + try: + _, fetch = create_download_request(url, data, placeholder=placeholder, timeout=timeout, seconds_between_requests=seconds_between_requests, attempts=attempts) + fetch(output_path, lambda received, size: session["progress"].update(received / size, f"{placeholder} ({received / size / 1048576:.1f}%)")) + session["progress"].update(1.0, placeholder) + except URLError as exc: + pretty_print_failure(f"#{exc.errno}: {exc.strerror}") + session["progress"].update(1.0, "Check your network connection!") + session["progress"].style = "class:interrupted" diff --git a/src/icmtoolchain/shell.py b/src/icmtoolchain/shell.py index bb2e69b..19a146e 100644 --- a/src/icmtoolchain/shell.py +++ b/src/icmtoolchain/shell.py @@ -634,11 +634,11 @@ class Progress(UIControl): available_width = width if self.display_states: time_left = self.time_left() - percentage_text = f"{self.percentage:.1f}% " + percentage_text = f"{self.percentage * 100:.1f}% " time_left_text = f" {format_timedelta(time_left) if time_left else 'N/A'}" available_width = available_width - len(percentage_text) - len(time_left_text) - filled_progress_width = int(self.percentage / 100 * available_width) + filled_progress_width = int(self.percentage * available_width) bar_text = self.text.center(available_width) if self.text else " " * available_width if self.display_states: @@ -681,7 +681,7 @@ class Progress(UIControl): ) def update(self, percentage: float, text: Optional[str] = None) -> None: - self.percentage = max(0, min(100, percentage)) + self.percentage = max(0, min(1.0, percentage)) if text is not None: self.text = text @@ -697,7 +697,7 @@ class Progress(UIControl): elif self.done or self.stopped: return timedelta(0) else: - return self.time_elapsed() * (100 - self.percentage) / self.percentage + return self.time_elapsed() * (1.0 - self.percentage) / self.percentage def __pt_container__(self) -> Container: return self.window @@ -877,14 +877,14 @@ def abort(*values: object, sep: Optional[str] = " ", code: int = 255, cause: Opt if __name__ == "__main__": preparing = Progress(intermediate=True) progress = Progress(intermediate=True) - progress2 = Progress("I'm abobus", percentage=100.0) + progress2 = Progress("I'm abobus", percentage=1.0) application = request_application(preparing, progress, progress2) import asyncio async def in_coroutine(): async def update_progress(): - while progress.percentage < 100: - progress.update(progress.percentage + 1.5) - progress2.update(progress.percentage - 1.5) + while progress.percentage < 1.0: + progress.update(progress.percentage + 0.015) + progress2.update(progress.percentage - 0.015) await asyncio.sleep(0.1) application.exit() application.create_background_task(update_progress()) @@ -893,8 +893,8 @@ if __name__ == "__main__": clear_application(preparing, progress, progress2) import time - with InteractiveSession(preparing=Progress(intermediate=True), progress=Progress("I'm aboba"), progress2=Progress("I'm abobus", percentage=100.0)) as session: - while session["progress"].percentage < 100: - session["progress"].update(session["progress"].percentage + 1.5) - session["progress2"].update(session["progress2"].percentage - 1.5) + with InteractiveSession(preparing=Progress(intermediate=True), progress=Progress("I'm aboba"), progress2=Progress("I'm abobus", percentage=1.0)) as session: + while session["progress"].percentage < 1.0: + session["progress"].update(session["progress"].percentage + 0.015) + session["progress2"].update(session["progress2"].percentage - 0.015) time.sleep(0.1)