Zero Spinner 🌀
A minimal, dependency-free spinner for Python CLI applications with rich customization options.
Features
- 🌈 Rich Color Options - 16 standard colors, RGB support, and special color cycles (rainbow, unicorn)
- 🎨 Unicode & ASCII Support - Automatically falls back to ASCII in incompatible terminals
- 🔄 Context Manager - Clean, Pythonic usage with automatic cleanup
- 🎯 Multiple End States - Success, failure, warning, and info completion states
- 🛠️ Highly Customizable - Prefix, suffix, indent, and custom symbols
- 🤖 CI Aware - Automatically disables in CI environments
- 🪶 Zero Dependencies - Lightweight with no external dependencies
- ⚡ Thread Safe - Non-blocking animation using threading
Installation
Install from PyPI using pip:
pip install zero-spinner
Or using uv:
uv add zero-spinner
Or using poetry
poetry add zero-spinner
Quick Start
from yeeti.zero_spinner import spinner
# Basic usage
spin = spinner('Loading...').start()
# ... do work ...
spin.succeed()
# Context manager (recommended)
with spinner('Processing'):
# ... do work ...
pass
Detailed Usage
Basic Spinner
from yeeti.zero_spinner import spinner
# Simple spinner
with spinner('Loading data...'):
# Your code here
import time
time.sleep(2)
Custom Colors
# Standard colors
with spinner('Processing...', color='red'):
# ... work ...
pass
# RGB colors
with spinner('RGB spinner...', color='rgb(255,105,180)'):
# ... work ...
pass
# Special color cycles
spin = spinner('Rainbow effect...')
spin.color = spin._colors.rainbow # or rainbow_bright, rainbow_rgb, unicorn, unicorn_rgb
spin.start()
# ... work ...
spin.succeed()
Completion States
from yeeti.zero_spinner import spinner
spin = spinner('Processing...').start()
try:
# ... work that might fail ...
spin.succeed('Process completed successfully!')
except Exception as e:
spin.fail(f'Process failed: {str(e)}')
# Other states
spin = spinner('Checking...').start()
spin.warn('This is just a warning')
# or
spin.info('For your information')
Customization Options
# All customization options
with spinner(
text='Main text',
prefix_text='[INFO] ',
suffix_text=' (processing)',
color='magenta',
hide_cursor=True,
indent=2,
stream=sys.stdout, # defaults to stdout
disabled=False # set to True to disable
):
# ... work ...
pass
Context Manager Behavior
The spinner automatically ends with success if no exception occurs:
# Automatically succeeds
with spinner('Task 1'):
# ... work ...
pass
# Automatically fails
with spinner('Task 2'):
raise Exception('Something went wrong!')
API Reference
spinner() Function
Creates and returns a new Spinner instance.
spinner(
text='',
prefix_text='',
suffix_text='',
color='cyan',
hide_cursor=True,
indent=0,
stream=None,
disabled=False,
spinner=None,
symbols=None,
colors=None
) -> Spinner
Parameters:
text(str): Main text displayed next to spinnerprefix_text(str): Text before spinnersuffix_text(str): Text after spinner and main textcolor(str): Spinner color (standard name or 'rgb(r,g,b)')hide_cursor(bool): Hide terminal cursor while spinningindent(int): Number of spaces to indentstream(TextIO): Output stream (defaults to stdout)disabled(bool): Disable spinner (useful for testing)spinner(SpinnerDefinition): Custom spinner frames/intervalsymbols(Symbols): Custom completion symbolscolors(Colors): Custom color definitions
Spinner Class
Methods
start(text=None)- Start spinningstop()- Stop spinningsucceed(text=None)- Stop with success symbolfail(text=None)- Stop with failure symbolwarn(text=None)- Stop with warning symbolinfo(text=None)- Stop with info symbolend(symbol, color=None, text=None)- Stop with custom symbol
Properties
text(str): Main textcolor(str): Current color
Color Options
Standard colors:
black,red,green,yellow,blue,magenta,cyan,whitebright_black,bright_red,bright_green,bright_yellow,bright_blue,bright_magenta,bright_cyan,bright_white
Special color cycles:
random- Randomly selected colorrainbow- Standard rainbow colorsrainbow_bright- Bright rainbow colorsrainbow_rgb- Smooth RGB rainbowunicorn- Unicorn-themed colorsunicorn_rgb- Smooth RGB unicorn colors
RGB colors: rgb(255,0,0) (red) format
Symbols
Completion symbols automatically adapt to terminal capabilities:
- Success: ✔ (+ in ASCII mode)
- Failure: ✗ (X in ASCII mode)
- Warning: ⚠ (! in ASCII mode)
- Info: ℹ (i in ASCII mode)
Advanced Examples
Custom Spinner Animation
from yeeti.zero_spinner import spinner, SpinnerDefinition
custom_spinner = SpinnerDefinition()
custom_spinner.frames = ['-', '=', '≡', '=', '-', ' ']
custom_spinner.interval = 100 # ms
# or simply
# custom_spinner = SpinnerDefinition(['-', '=', '≡', '=', '-', ' '], 100)
with spinner('Custom animation...', spinner=custom_spinner):
# ... work ...
pass
Progress Updates
spin = spinner('Processing items...').start()
for i, item in enumerate(items):
spin.text = f'Processing items... ({i+1}/{len(items)})'
# Process item
time.sleep(0.1)
spin.succeed('All items processed!')
Multiple Spinners
WARNING Currently not working!
# Nested spinners
with spinner('Main process') as spin:
with spinner('Subprocess 1', indent=2) as sub1:
# ... work ...
sub1.succeed()
with spinner('Subprocess 2', indent=2) as sub2:
# ... work ...
sub2.succeed()
spin.succeed()
Compatibility
Zero Spinner works in:
- Unix terminals (Linux, macOS)
- Windows Command Prompt and PowerShell
- IDE terminals (VS Code, PyCharm, etc.)
- SSH sessions
- CI environments (automatically disabled)
The library automatically detects Unicode support and falls back to ASCII characters when needed.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
License
Distributed under the MIT License. See LICENSE for more information.
Author
© 2025 Yeeti
Metadata
Release files for zero-spinner 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| zero_spinner-0.1.1.tar.gz | 16.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| zero_spinner-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 31.9 kB
Release files / zero_spinner-0.1.1.tar.gz
| Download URL | zero_spinner-0.1.1.tar.gz |
|---|---|
| Size | 16.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d243fd47ec6d4ed44156262f3f75c44c20b2ff476418bc2a8365b5fb531d57d0
|
|
BLAKE2b-256 checksum How to use checksums |
7f4494f96fbe2bd76dd529ffabaaab449d2d8a522596c3001c625226507a2b48
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.16 {"installer":{"name":"uv","version":"0.9.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / zero_spinner-0.1.1-py3-none-any.whl
| Download URL | zero_spinner-0.1.1-py3-none-any.whl |
|---|---|
| Size | 14.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e97ef406fba0e02ca5795c2e452018e1b3f314f398a6b8d5795aeaa4e03b2463
|
|
BLAKE2b-256 checksum How to use checksums |
1cbfede004dc77edea573848cb17a9cfeca9b56160a190cfae1a06dcb478a4da
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.16 {"installer":{"name":"uv","version":"0.9.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|