Source code for toasty.progress
# -*- mode: python; coding: utf-8 -*-
# Copyright 2022 the AAS WorldWide Telescope project
# Licensed under the MIT License.
"""Utilities for progress reporting
This module provides an extremely thin wrapper around TQDM that avoids ``\r``
output when stdout is not a terminal, for producing more easily greppable logs.
It also reduces the update frequency to reduce log volume.
"""
__all__ = """
progress_bar
""".split()
from contextlib import contextmanager
import os
import sys
from tqdm import tqdm
NON_TTY_INTERVAL = 30
[docs]
@contextmanager
def progress_bar(total=None, show=None):
"""Create and return a TQDM progress bar.
Parameters
----------
total : int
The total number of items to be processed.
show : bool
Whether the progress bar should actually be shown.
Returns
-------
A ``tqdm`` progress bar instance.
Notes
-----
The progress bar will be customized to be emitted much less frequently when
standard output is not a terminal. It will also print newlines with every
update, which makes log files much easier to review.
Terminal-style output will be used even when standard output is not a
terminal, *if* the environment variable ``JPY_PARENT_PID`` is set. This
variable is set inside Jupyter kernel processes, and in those circumstances
stdout is a pipe but we probably still want to use the terminal-like
progress bar output."""
assert total is not None
assert show is not None
args = dict(
total=total,
disable=not show,
)
log_like_output = not sys.stdout.isatty() and "JPY_PARENT_PID" not in os.environ
if log_like_output:
args["bar_format"] = "{l_bar}{bar}{r_bar}\n"
args["mininterval"] = NON_TTY_INTERVAL
args["maxinterval"] = NON_TTY_INTERVAL
try:
with tqdm(**args) as progress:
yield progress
finally:
if show and not log_like_output:
print()