Spaces:
Build error
Build error
"""Helper to show progress bars with `urlretrieve`. | |
Based on https://stackoverflow.com/a/53877507 | |
""" | |
# Copyright (C) 2020 Intel Corporation | |
# | |
# Licensed under the Apache License, Version 2.0 (the "License"); | |
# you may not use this file except in compliance with the License. | |
# You may obtain a copy of the License at | |
# | |
# http://www.apache.org/licenses/LICENSE-2.0 | |
# | |
# Unless required by applicable law or agreed to in writing, | |
# software distributed under the License is distributed on an "AS IS" BASIS, | |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
# See the License for the specific language governing permissions | |
# and limitations under the License. | |
import io | |
from typing import Dict, Iterable, Optional, Union | |
from tqdm import tqdm | |
class DownloadProgressBar(tqdm): | |
"""Create progress bar for urlretrieve. Subclasses `tqdm`. | |
For information about the parameters in constructor, refer to `tqdm`'s documentation. | |
Args: | |
iterable (Optional[Iterable]): Iterable to decorate with a progressbar. | |
Leave blank to manually manage the updates. | |
desc (Optional[str]): Prefix for the progressbar. | |
total (Optional[Union[int, float]]): The number of expected iterations. If unspecified, | |
len(iterable) is used if possible. If float("inf") or as a last | |
resort, only basic progress statistics are displayed | |
(no ETA, no progressbar). | |
If `gui` is True and this parameter needs subsequent updating, | |
specify an initial arbitrary large positive number, | |
e.g. 9e9. | |
leave (Optional[bool]): upon termination of iteration. If `None`, will leave only if `position` is `0`. | |
file (Optional[Union[io.TextIOWrapper, io.StringIO]]): Specifies where to output the progress messages | |
(default: sys.stderr). Uses `file.write(str)` and | |
`file.flush()` methods. For encoding, see | |
`write_bytes`. | |
ncols (Optional[int]): The width of the entire output message. If specified, | |
dynamically resizes the progressbar to stay within this bound. | |
If unspecified, attempts to use environment width. The | |
fallback is a meter width of 10 and no limit for the counter and | |
statistics. If 0, will not print any meter (only stats). | |
mininterval (Optional[float]): Minimum progress display update interval [default: 0.1] seconds. | |
maxinterval (Optional[float]): Maximum progress display update interval [default: 10] seconds. | |
Automatically adjusts `miniters` to correspond to `mininterval` | |
after long display update lag. Only works if `dynamic_miniters` | |
or monitor thread is enabled. | |
miniters (Optional[Union[int, float]]): Minimum progress display update interval, in iterations. | |
If 0 and `dynamic_miniters`, will automatically adjust to equal | |
`mininterval` (more CPU efficient, good for tight loops). | |
If > 0, will skip display of specified number of iterations. | |
Tweak this and `mininterval` to get very efficient loops. | |
If your progress is erratic with both fast and slow iterations | |
(network, skipping items, etc) you should set miniters=1. | |
use_ascii (Optional[Union[bool, str]]): If unspecified or False, use unicode (smooth blocks) to fill | |
the meter. The fallback is to use ASCII characters " 123456789#". | |
disable (Optional[bool]): Whether to disable the entire progressbar wrapper | |
[default: False]. If set to None, disable on non-TTY. | |
unit (Optional[str]): String that will be used to define the unit of each iteration | |
[default: it]. | |
unit_scale (Union[bool, int, float]): If 1 or True, the number of iterations will be reduced/scaled | |
automatically and a metric prefix following the | |
International System of Units standard will be added | |
(kilo, mega, etc.) [default: False]. If any other non-zero | |
number, will scale `total` and `n`. | |
dynamic_ncols (Optional[bool]): If set, constantly alters `ncols` and `nrows` to the | |
environment (allowing for window resizes) [default: False]. | |
smoothing (Optional[float]): Exponential moving average smoothing factor for speed estimates | |
(ignored in GUI mode). Ranges from 0 (average speed) to 1 | |
(current/instantaneous speed) [default: 0.3]. | |
bar_format (Optional[str]): Specify a custom bar string formatting. May impact performance. | |
[default: '{l_bar}{bar}{r_bar}'], where | |
l_bar='{desc}: {percentage:3.0f}%|' and | |
r_bar='| {n_fmt}/{total_fmt} [{elapsed}<{remaining}, ' | |
'{rate_fmt}{postfix}]' | |
Possible vars: l_bar, bar, r_bar, n, n_fmt, total, total_fmt, | |
percentage, elapsed, elapsed_s, ncols, nrows, desc, unit, | |
rate, rate_fmt, rate_noinv, rate_noinv_fmt, | |
rate_inv, rate_inv_fmt, postfix, unit_divisor, | |
remaining, remaining_s, eta. | |
Note that a trailing ": " is automatically removed after {desc} | |
if the latter is empty. | |
initial (Optional[Union[int, float]]): The initial counter value. Useful when restarting a progress | |
bar [default: 0]. If using float, consider specifying `{n:.3f}` | |
or similar in `bar_format`, or specifying `unit_scale`. | |
position (Optional[int]): Specify the line offset to print this bar (starting from 0) | |
Automatic if unspecified. | |
Useful to manage multiple bars at once (eg, from threads). | |
postfix (Optional[Dict]): Specify additional stats to display at the end of the bar. | |
Calls `set_postfix(**postfix)` if possible (dict). | |
unit_divisor (Optional[float]): [default: 1000], ignored unless `unit_scale` is True. | |
write_bytes (Optional[bool]): If (default: None) and `file` is unspecified, | |
bytes will be written in Python 2. If `True` will also write | |
bytes. In all other cases will default to unicode. | |
lock_args (Optional[tuple]): Passed to `refresh` for intermediate output | |
(initialisation, iterating, and updating). | |
nrows (Optional[int]): The screen height. If specified, hides nested bars | |
outside this bound. If unspecified, attempts to use environment height. | |
The fallback is 20. | |
colour (Optional[str]): Bar colour (e.g. 'green', '#00ff00'). | |
delay (Optional[float]): Don't display until [default: 0] seconds have elapsed. | |
gui (Optional[bool]): WARNING: internal parameter - do not use. | |
Use tqdm.gui.tqdm(...) instead. If set, will attempt to use | |
matplotlib animations for a graphical output [default: False]. | |
Example: | |
>>> with DownloadProgressBar(unit='B', unit_scale=True, miniters=1, desc=url.split('/')[-1]) as p_bar: | |
>>> urllib.request.urlretrieve(url, filename=output_path, reporthook=p_bar.update_to) | |
""" | |
def __init__( | |
self, | |
iterable: Optional[Iterable] = None, | |
desc: Optional[str] = None, | |
total: Optional[Union[int, float]] = None, | |
leave: Optional[bool] = True, | |
file: Optional[Union[io.TextIOWrapper, io.StringIO]] = None, | |
ncols: Optional[int] = None, | |
mininterval: Optional[float] = 0.1, | |
maxinterval: Optional[float] = 10.0, | |
miniters: Optional[Union[int, float]] = None, | |
use_ascii: Optional[Union[bool, str]] = None, | |
disable: Optional[bool] = False, | |
unit: Optional[str] = "it", | |
unit_scale: Optional[Union[bool, int, float]] = False, | |
dynamic_ncols: Optional[bool] = False, | |
smoothing: Optional[float] = 0.3, | |
bar_format: Optional[str] = None, | |
initial: Optional[Union[int, float]] = 0, | |
position: Optional[int] = None, | |
postfix: Optional[Dict] = None, | |
unit_divisor: Optional[float] = 1000, | |
write_bytes: Optional[bool] = None, | |
lock_args: Optional[tuple] = None, | |
nrows: Optional[int] = None, | |
colour: Optional[str] = None, | |
delay: Optional[float] = 0, | |
gui: Optional[bool] = False, | |
**kwargs | |
): | |
super().__init__( | |
iterable=iterable, | |
desc=desc, | |
total=total, | |
leave=leave, | |
file=file, | |
ncols=ncols, | |
mininterval=mininterval, | |
maxinterval=maxinterval, | |
miniters=miniters, | |
ascii=use_ascii, | |
disable=disable, | |
unit=unit, | |
unit_scale=unit_scale, | |
dynamic_ncols=dynamic_ncols, | |
smoothing=smoothing, | |
bar_format=bar_format, | |
initial=initial, | |
position=position, | |
postfix=postfix, | |
unit_divisor=unit_divisor, | |
write_bytes=write_bytes, | |
lock_args=lock_args, | |
nrows=nrows, | |
colour=colour, | |
delay=delay, | |
gui=gui, | |
**kwargs | |
) | |
self.total: Optional[Union[int, float]] | |
def update_to(self, chunk_number: int = 1, max_chunk_size: int = 1, total_size=None): | |
"""Progress bar hook for tqdm. | |
The implementor does not have to bother about passing parameters to this as it gets them from urlretrieve. | |
However the context needs a few parameters. Refer to the example. | |
Args: | |
chunk_number (int, optional): The current chunk being processed. Defaults to 1. | |
max_chunk_size (int, optional): Maximum size of each chunk. Defaults to 1. | |
total_size ([type], optional): Total download size. Defaults to None. | |
""" | |
if total_size is not None: | |
self.total = total_size | |
self.update(chunk_number * max_chunk_size - self.n) | |