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.1.tar.gz (47.2 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.1-py3-none-any.whl (47.6 kB view details)

Uploaded Python 3

File details

Details for the file chugchug-0.1.1.tar.gz.

File metadata

  • Download URL: chugchug-0.1.1.tar.gz
  • Upload date:
  • Size: 47.2 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.1.tar.gz
Algorithm Hash digest
SHA256 de0e274536394fd5ffeeef41c58730a49ab49711130b2e4251b05b4087bd692b
MD5 1a141a3e1effef75824d2815e69fd003
BLAKE2b-256 8004f51f51a47e67f0f70120036a96182587477800fa0c02ba3833ee1b340543

See more details on using hashes here.

File details

Details for the file chugchug-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: chugchug-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 47.6 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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e114e32e4b80f0ad2e778fcb26a44add4ed2cb0cd2fd0ff69fda185828452bdb
MD5 598d165378d2907d28e730258fa462a1
BLAKE2b-256 9bb8f30be39474826000037a9e56aa65528a1ec735eff2afb50cbe9f94846882

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