Skip to main content

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.

chugchug demo

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 ProgressEvent objects (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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

chugchug-0.1.2.tar.gz (48.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

chugchug-0.1.2-py3-none-any.whl (48.0 kB view details)

Uploaded Python 3

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

Hashes for chugchug-0.1.2.tar.gz
Algorithm Hash digest
SHA256 b086e4c0f673a744037226388cff66051b7765094c742195c7dc2871e4728c29
MD5 887064b7f2ae2cd4f65c8cef2b698f1f
BLAKE2b-256 de7f1b79752818a3cd5b72278315da15db74de21f78027736a968535b208052b

See more details on using hashes here.

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

Hashes for chugchug-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 e00c20a3daa114bf2fc9949512d476de70743ab2b9a01492c4b5a3cba7c074e5
MD5 7f02eba8137ca9a60200931fadfa3c14
BLAKE2b-256 ca60777c815bbd9fa87aa49bb28ed27df9d0e86a8298d5f5f09c8ae891499bc9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page