Spaces:
Runtime error
Runtime error
"""A simple spinner module""" | |
import itertools | |
import sys | |
import threading | |
import time | |
class Spinner: | |
"""A simple spinner class""" | |
def __init__(self, message: str = "Loading...", delay: float = 0.1) -> None: | |
"""Initialize the spinner class | |
Args: | |
message (str): The message to display. | |
delay (float): The delay between each spinner update. | |
""" | |
self.spinner = itertools.cycle(["-", "/", "|", "\\"]) | |
self.delay = delay | |
self.message = message | |
self.running = False | |
self.spinner_thread = None | |
def spin(self) -> None: | |
"""Spin the spinner""" | |
while self.running: | |
sys.stdout.write(f"{next(self.spinner)} {self.message}\r") | |
sys.stdout.flush() | |
time.sleep(self.delay) | |
sys.stdout.write(f"\r{' ' * (len(self.message) + 2)}\r") | |
def __enter__(self): | |
"""Start the spinner""" | |
self.running = True | |
self.spinner_thread = threading.Thread(target=self.spin) | |
self.spinner_thread.start() | |
return self | |
def __exit__(self, exc_type, exc_value, exc_traceback) -> None: | |
"""Stop the spinner | |
Args: | |
exc_type (Exception): The exception type. | |
exc_value (Exception): The exception value. | |
exc_traceback (Exception): The exception traceback. | |
""" | |
self.running = False | |
if self.spinner_thread is not None: | |
self.spinner_thread.join() | |
sys.stdout.write(f"\r{' ' * (len(self.message) + 2)}\r") | |
sys.stdout.flush() | |
def update_message(self, new_message, delay=0.1): | |
"""Update the spinner message | |
Args: | |
new_message (str): New message to display | |
delay: Delay in seconds before updating the message | |
""" | |
time.sleep(delay) | |
sys.stdout.write( | |
f"\r{' ' * (len(self.message) + 2)}\r" | |
) # Clear the current message | |
sys.stdout.flush() | |
self.message = new_message | |