"""
Custom spinner class
"""
from typing import Optional
from halo import Halo
from click import echo
[docs]class Spinner:
"""
A custom spinner class that makes use of `halo` and `click`
Parameters
----------
text : str
spinner : str
Attributes
----------
interactive : bool
True if the `Spinner` instance is interactive
text : str
The text currently in the spinner
"""
def __init__(self, text: str, spinner: str, interactive: bool = True) -> None:
self.interactive = interactive
self._text = text
if self.interactive:
self._spinner = Halo(text=self._text, spinner=spinner)
else:
self._spinner = None
@property
def text(self) -> str:
""" The text in the spinner """
return self._text
@text.setter
def text(self, text: str) -> None:
self._text = text
if self.interactive:
self._spinner.text = self._text
else:
echo(self._text)
[docs] def start(self) -> None:
""" Start the spinner """
if self.interactive:
self._spinner.start()
[docs] def succeed(self, text: Optional[str] = None) -> None:
""" Display text on success """
if text:
self._text = text
if self.interactive:
self._spinner.succeed(self.text)
else:
echo(self.text)
[docs] def fail(self, text: Optional[str] = None) -> None:
""" Display text on failure """
if text:
self._text = text
if self.interactive:
self._spinner.fail(self.text)
else:
echo(self.text)
[docs] def stop(self) -> None:
""" Stop the spinner """
if self.interactive:
self._spinner.stop()
self._text = ""