codekingpro/portable-devtools
114k
1from types import TracebackType2from typing import Optional, Type3 4from .console import Console, RenderableType5from .jupyter import JupyterMixin6from .live import Live7from .spinner import Spinner8from .style import StyleType9 10 11class Status(JupyterMixin):12 """Displays a status indicator with a 'spinner' animation.13 14 Args:15 status (RenderableType): A status renderable (str or Text typically).16 console (Console, optional): Console instance to use, or None for global console. Defaults to None.17 spinner (str, optional): Name of spinner animation (see python -m rich.spinner). Defaults to "dots".18 spinner_style (StyleType, optional): Style of spinner. Defaults to "status.spinner".19 speed (float, optional): Speed factor for spinner animation. Defaults to 1.0.20 refresh_per_second (float, optional): Number of refreshes per second. Defaults to 12.5.21 """22 23 def __init__(24 self,25 status: RenderableType,26 *,27 console: Optional[Console] = None,28 spinner: str = "dots",29 spinner_style: StyleType = "status.spinner",30 speed: float = 1.0,31 refresh_per_second: float = 12.5,32 ):33 self.status = status34 self.spinner_style = spinner_style35 self.speed = speed36 self._spinner = Spinner(spinner, text=status, style=spinner_style, speed=speed)37 self._live = Live(38 self.renderable,39 console=console,40 refresh_per_second=refresh_per_second,41 transient=True,42 )43 44 @property45 def renderable(self) -> Spinner:46 return self._spinner47 48 @property49 def console(self) -> "Console":50 """Get the Console used by the Status objects."""51 return self._live.console52 53 def update(54 self,55 status: Optional[RenderableType] = None,56 *,57 spinner: Optional[str] = None,58 spinner_style: Optional[StyleType] = None,59 speed: Optional[float] = None,60 ) -> None:61 """Update status.62 63 Args:64 status (Optional[RenderableType], optional): New status renderable or None for no change. Defaults to None.65 spinner (Optional[str], optional): New spinner or None for no change. Defaults to None.66 spinner_style (Optional[StyleType], optional): New spinner style or None for no change. Defaults to None.67 speed (Optional[float], optional): Speed factor for spinner animation or None for no change. Defaults to None.68 """69 if status is not None:70 self.status = status71 if spinner_style is not None:72 self.spinner_style = spinner_style73 if speed is not None:74 self.speed = speed75 if spinner is not None:76 self._spinner = Spinner(77 spinner, text=self.status, style=self.spinner_style, speed=self.speed78 )79 self._live.update(self.renderable, refresh=True)80 else:81 self._spinner.update(82 text=self.status, style=self.spinner_style, speed=self.speed83 )84 85 def start(self) -> None:86 """Start the status animation."""87 self._live.start()88 89 def stop(self) -> None:90 """Stop the spinner animation."""91 self._live.stop()92 93 def __rich__(self) -> RenderableType:94 return self.renderable95 96 def __enter__(self) -> "Status":97 self.start()98 return self99 100 def __exit__(101 self,102 exc_type: Optional[Type[BaseException]],103 exc_val: Optional[BaseException],104 exc_tb: Optional[TracebackType],105 ) -> None:106 self.stop()107 108 109if __name__ == "__main__": # pragma: no cover110 from time import sleep111 112 from .console import Console113 114 console = Console()115 with console.status("[magenta]Covid detector booting up") as status:116 sleep(3)117 console.log("Importing advanced AI")118 sleep(3)119 console.log("Advanced Covid AI Ready")120 sleep(3)121 status.update(status="[bold blue] Scanning for Covid", spinner="earth")122 sleep(3)123 console.log("Found 10,000,000,000 copies of Covid32.exe")124 sleep(3)125 status.update(126 status="[bold red]Moving Covid32.exe to Trash",127 spinner="bouncingBall",128 spinner_style="yellow",129 )130 sleep(5)131 console.print("[bold green]Covid deleted successfully")132 