Next-generation progress bars — event-driven, multiprocessing-safe, pipeline-aware
Project description
🚂 chugchug
Next-generation progress bars for Python. Event-driven, multiprocessing-safe, pipeline-aware.
Zero dependencies. Beautiful gradients. Smart ETA. Just works.
Why chugchug?
| Feature | tqdm | Rich | chugchug 🚂 |
|---|---|---|---|
| Zero dependencies | yes | no | yes |
| Event-driven architecture | no | no | yes |
| Multiprocessing (spawn-safe) | no | no | yes |
| Pipeline/DAG progress | no | no | yes |
| "Why is it slow?" diagnostics | no | no | yes |
| Beautiful gradient bars | no | yes | yes |
| Smart ETA (regression + ensemble) | no | no | yes |
| ML metrics (loss, lr, auto-colored) | no | no | yes |
| Notebook support (HTML/CSS bars) | partial | yes | yes |
| JSON/LOG/TTY output modes | partial | no | yes |
| Smart generator wrapping | no | no | yes |
| tqdm drop-in compatible | - | no | yes |
🚀 Install
pip install chugchug
🚂 Quick Start
from chugchug import chug
for item in chug(range(100), desc="Working"):
process(item)
That's it. One import, one line. Gradient bar, smart ETA, speed tracking — all automatic.
🎨 Gradients
14 built-in gradient presets:
chug(data, gradient="ocean") # blue → cyan (default)
chug(data, gradient="fire") # red → gold
chug(data, gradient="rainbow") # full spectrum
chug(data, gradient="aurora") # northern lights
chug(data, gradient="candy") # pink → purple → cyan → green
chug(data, gradient="neon") # magenta → cyan → yellow
# + forest, purple, cyber, mono, heatmap, sunset, matrix, ice
Custom gradients:
from chugchug import register_gradient, register_multi_gradient
register_gradient("coral", (255, 94, 77), (255, 195, 113))
register_multi_gradient("vaporwave", [
(255, 0, 128), (128, 0, 255), (0, 200, 255), (0, 255, 180),
])
🧠 ML Training
from chugchug import Chug
b = Chug(total=num_steps, desc="Training", gradient="fire", unit="step")
for step in range(num_steps):
loss, acc = train_step()
b.set_metrics(loss=f"{loss:.4f}", acc=f"{acc:.1%}")
b.update()
b.close()
Metrics like loss auto-color green when improving, red when worsening.
🔄 tqdm Drop-in
# Before
from tqdm import tqdm
# After — just change the import
from chugchug.compat import tqdm, trange
🪄 Smart Generators
tqdm shows 0it [00:00, ?it/s] for map(), enumerate(), generator expressions. chugchug extracts the total automatically:
chug(map(fn, data)) # detects total from data
chug(enumerate(data)) # works too
chug(x**2 for x in data) # even generator expressions
📓 Notebooks
Auto-detected in Jupyter — renders as HTML/CSS gradient bars:
for item in chug(range(100), desc="Training"):
process(item)
Or force it: chug(data, output="notebook").
🏗️ Pipelines
from chugchug._pipeline import Pipeline
pipe = Pipeline("ETL")
pipe.add_stage("extract", total=1000, desc="Extracting")
pipe.add_stage("transform", total=1000, depends_on=["extract"])
pipe.add_stage("load", total=1000, depends_on=["transform"])
with pipe:
# stages run with progress tracking, bottleneck detection
...
⚡ Multiprocessing
Spawn-safe. No shared memory. Just works.
from chugchug._mp import MPContext
from concurrent.futures import ProcessPoolExecutor
with MPContext() as ctx:
with ProcessPoolExecutor(max_workers=4) as pool:
for i in range(4):
t = ctx.tracker(f"worker-{i}", total=100)
pool.submit(work, t)
🔍 Diagnostics
for item in Chug(range(10000), desc="Analysis", diagnostics=True):
process(item)
# [chugchug diagnostic] CPU-BOUND: Consider multiprocessing...
📊 Output Modes
chug(data, output="tty") # terminal with gradients (default)
chug(data, output="notebook") # HTML/CSS bars for Jupyter
chug(data, output="json") # structured JSON lines for CI/CD
chug(data, output="log") # human-readable log lines
chug(data, output="silent") # tracking only, no output
🏛️ Architecture
chugchug separates tracking from rendering:
- Trackers produce
ProgressEventobjects (immutable, picklable) - Registry dispatches events to handlers (lock-free hot path)
- Handlers render output (TTY, Notebook, JSON, LOG, custom)
CLI
cat urls.txt | python -m chugchug pipe --desc "Downloading"
python -m chugchug watch progress.jsonl
python -m chugchug replay recording.jsonl --speed 2.0
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file chugchug-0.1.2.tar.gz.
File metadata
- Download URL: chugchug-0.1.2.tar.gz
- Upload date:
- Size: 48.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b086e4c0f673a744037226388cff66051b7765094c742195c7dc2871e4728c29
|
|
| MD5 |
887064b7f2ae2cd4f65c8cef2b698f1f
|
|
| BLAKE2b-256 |
de7f1b79752818a3cd5b72278315da15db74de21f78027736a968535b208052b
|
File details
Details for the file chugchug-0.1.2-py3-none-any.whl.
File metadata
- Download URL: chugchug-0.1.2-py3-none-any.whl
- Upload date:
- Size: 48.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e00c20a3daa114bf2fc9949512d476de70743ab2b9a01492c4b5a3cba7c074e5
|
|
| MD5 |
7f02eba8137ca9a60200931fadfa3c14
|
|
| BLAKE2b-256 |
ca60777c815bbd9fa87aa49bb28ed27df9d0e86a8298d5f5f09c8ae891499bc9
|