|
7 | 7 | import subprocess |
8 | 8 | import sys |
9 | 9 | import textwrap |
| 10 | +import time |
10 | 11 | from argparse import ArgumentParser, RawDescriptionHelpFormatter, _HelpAction |
11 | 12 | from typing import TYPE_CHECKING |
12 | 13 |
|
@@ -318,6 +319,16 @@ def highlight_row(condition: bool, xs: list[str]) -> list[str]: |
318 | 319 | return xs |
319 | 320 |
|
320 | 321 |
|
| 322 | +def _format_duration(seconds: float) -> str: |
| 323 | + if seconds < 60: |
| 324 | + return f'{seconds}s' |
| 325 | + minutes, secs = divmod(seconds, 60) |
| 326 | + if minutes < 60: |
| 327 | + return f'{int(minutes)}m {secs:.0f}s' |
| 328 | + hours, mins = divmod(minutes, 60) |
| 329 | + return f'{int(hours)}h {int(mins)}m' |
| 330 | + |
| 331 | + |
321 | 332 | def list_package( |
322 | 333 | package_name: str, |
323 | 334 | show_inputs: bool, |
@@ -496,6 +507,7 @@ def install_package( |
496 | 507 | 'has_overrides': len(package_overrides) > 0 if package_overrides else False, |
497 | 508 | }, |
498 | 509 | ) |
| 510 | + install_start_time = time.monotonic() |
499 | 511 |
|
500 | 512 | if not overrides and package.uri in pinned_package_cache: |
501 | 513 | rich.print(f" ⌛ Fetching cached version of '[green]{package_name.pretty_name}[/]' ...") |
@@ -541,19 +553,22 @@ def install_package( |
541 | 553 | display_version = None |
542 | 554 | display_version = f' ({display_version})' if display_version is not None else '' |
543 | 555 |
|
| 556 | + duration_seconds = round(time.monotonic() - install_start_time, 1) |
544 | 557 | emit_event( |
545 | 558 | 'kup_install_complete', |
546 | 559 | { |
547 | 560 | 'package': package_name.base, |
548 | 561 | 'version': package_version or 'latest', |
549 | 562 | 'was_update': verb == 'updated', |
550 | 563 | 'from_cache': package.uri in pinned_package_cache and not overrides, |
| 564 | + 'duration_seconds': duration_seconds, |
551 | 565 | }, |
552 | 566 | ) |
553 | 567 |
|
554 | 568 | rich.print( |
555 | 569 | f" ✅ Successfully {verb} '[green]{package_name.base}[/]' version [blue]{package.uri}{display_version}[/]." |
556 | 570 | ) |
| 571 | + rich.print(f' ⏱️ Elapsed time [green]{_format_duration(duration_seconds)}[/].') |
557 | 572 |
|
558 | 573 |
|
559 | 574 | def uninstall_package(package_name: str) -> None: |
|
0 commit comments