Skip to content

Commit 575ed44

Browse files
committed
Migrate progress bars from tqdm to rich.progress
1 parent 441d1e4 commit 575ed44

File tree

3 files changed

+66
-40
lines changed

3 files changed

+66
-40
lines changed

redbot/cogs/downloader/repo_manager.py

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
import discord
3232
from redbot.core import data_manager, commands, Config
33-
from redbot.core.utils._internal_utils import safe_delete
33+
from redbot.core.utils._internal_utils import detailed_progress, safe_delete
3434
from redbot.core.i18n import Translator
3535

3636
from . import errors
@@ -1267,28 +1267,27 @@ async def _restore_from_backup(self) -> None:
12671267
with open(data_manager.cog_data_path(self) / "repos.json") as fp:
12681268
raw_repos = json.load(fp)
12691269

1270-
from tqdm import tqdm
1271-
1272-
progress_bar = tqdm(raw_repos, desc="Downloading repos", unit="repo", dynamic_ncols=True)
1273-
1274-
for repo_data in progress_bar:
1275-
repo_url = repo_data["url"]
1276-
repo_name = repo_data["name"]
1277-
repo_branch = repo_data["branch"]
1278-
try:
1279-
await self.add_repo(repo_url, repo_name, repo_branch)
1280-
except errors.CloningError:
1281-
log.exception(
1282-
"Something went wrong whilst cloning %s (to branch: %s)",
1283-
repo_url,
1284-
repo_branch,
1285-
)
1286-
except OSError:
1287-
log.exception(
1288-
"Something went wrong trying to add repo %s under name %s",
1289-
repo_url,
1290-
repo_name,
1291-
)
1270+
with detailed_progress(unit="repos") as progress:
1271+
task_id = progress.add_task("Adding repos", total=len(raw_repos))
1272+
for idx, repo_data in enumerate(raw_repos):
1273+
repo_url = repo_data["url"]
1274+
repo_name = repo_data["name"]
1275+
repo_branch = repo_data["branch"]
1276+
progress.update(task_id, completed=idx, description=f"Adding {repo_name!r} repo")
1277+
try:
1278+
await self.add_repo(repo_url, repo_name, repo_branch)
1279+
except errors.CloningError:
1280+
log.exception(
1281+
"Something went wrong whilst cloning %s (to branch: %s)",
1282+
repo_url,
1283+
repo_branch,
1284+
)
1285+
except OSError:
1286+
log.exception(
1287+
"Something went wrong trying to add repo %s under name %s",
1288+
repo_url,
1289+
repo_name,
1290+
)
12921291

12931292
from .downloader import Downloader
12941293

redbot/core/utils/_internal_utils.py

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,9 @@
3636
import discord
3737
from packaging.requirements import Requirement
3838
import rapidfuzz
39-
from rich.progress import ProgressColumn
40-
from rich.progress_bar import ProgressBar
39+
import rich.progress
40+
from rich.text import Text
4141
from red_commons.logging import VERBOSE, TRACE
42-
from tqdm import tqdm
4342

4443
from redbot import VersionInfo
4544
from redbot.core import data_manager
@@ -62,6 +61,8 @@
6261
"fetch_latest_red_version_info",
6362
"deprecated_removed",
6463
"RichIndefiniteBarColumn",
64+
"RichSpeedColumn",
65+
"detailed_progress",
6566
"cli_level_to_log_level",
6667
)
6768

@@ -276,9 +277,10 @@ async def create_backup(dest: Path = Path.home()) -> Optional[Path]:
276277
to_backup.append(f)
277278

278279
with tarfile.open(str(backup_fpath), "w:gz") as tar:
279-
progress_bar = tqdm(to_backup, desc="Compressing data", unit=" files", dynamic_ncols=True)
280-
for f in progress_bar:
281-
tar.add(str(f), arcname=str(f.relative_to(data_path)), recursive=False)
280+
with detailed_progress(unit="files") as progress:
281+
progress_tracker = progress.track(to_backup, description="Compressing data")
282+
for f in progress_tracker:
283+
tar.add(str(f), arcname=str(f.relative_to(data_path)), recursive=False)
282284

283285
# add repos backup
284286
repos_data = json.dumps(repo_output, indent=4)
@@ -403,9 +405,9 @@ def deprecated_removed(
403405
)
404406

405407

406-
class RichIndefiniteBarColumn(ProgressColumn):
407-
def render(self, task):
408-
return ProgressBar(
408+
class RichIndefiniteBarColumn(rich.progress.ProgressColumn):
409+
def render(self, task: rich.progress.Task) -> rich.progress.ProgressBar:
410+
return rich.progress.ProgressBar(
409411
pulse=task.completed < task.total,
410412
animation_time=task.get_time(),
411413
width=40,
@@ -414,6 +416,32 @@ def render(self, task):
414416
)
415417

416418

419+
class RichSpeedColumn(rich.progress.ProgressColumn):
420+
def __init__(self, *, unit: str) -> None:
421+
self.unit = unit
422+
super().__init__()
423+
424+
def render(self, task: rich.progress.Task) -> Text:
425+
speed = task.finished_speed or task.speed
426+
if speed is None:
427+
return Text("?", style="progress.data.speed")
428+
return Text(f"{int(speed)} {self.unit}/s", style="progress.data.speed")
429+
430+
431+
def detailed_progress(*, unit: str) -> rich.progress.Progress:
432+
return rich.progress.Progress(
433+
rich.progress.SpinnerColumn(),
434+
rich.progress.TextColumn("[progress.description]{task.description}"),
435+
rich.progress.BarColumn(bar_width=None),
436+
RichSpeedColumn(unit=unit),
437+
rich.progress.TaskProgressColumn(),
438+
rich.progress.TextColumn("eta"),
439+
rich.progress.TimeRemainingColumn(),
440+
rich.progress.TextColumn("elapsed"),
441+
rich.progress.TimeElapsedColumn(),
442+
)
443+
444+
417445
def cli_level_to_log_level(level: int) -> int:
418446
if level == 0:
419447
log_level = logging.INFO

redbot/setup.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@
1717
from typing import Any, Dict, IO, List, Optional, Set, Tuple, Union
1818

1919
import click
20-
from tqdm import tqdm
2120

2221
from redbot.cogs.downloader.repo_manager import RepoManager
2322
from redbot.core._cli import confirm
2423
from redbot.core.utils._internal_utils import (
2524
safe_delete,
2625
create_backup as red_create_backup,
2726
cli_level_to_log_level,
27+
detailed_progress,
2828
)
2929
from redbot.core import config, data_manager
3030
from redbot.core._config import migrate
@@ -466,8 +466,7 @@ def all_tar_members(self) -> List[tarfile.TarInfo]:
466466
def all_tar_member_names(self) -> List[str]:
467467
return [tarinfo.name for tarinfo in self.all_tar_members]
468468

469-
@functools.cached_property
470-
def tar_members_to_extract(self) -> List[tarfile.TarInfo]:
469+
def get_tar_members_to_extract(self) -> List[tarfile.TarInfo]:
471470
ignored_members: Set[str] = {"backup.version", "instance.json"}
472471
if not self.restore_downloader:
473472
ignored_members |= {
@@ -550,11 +549,11 @@ def _ask_for_storage(self) -> None:
550549
self.storage_details = driver_cls.get_config_details()
551550

552551
def extractall(self) -> None:
553-
progress_bar = tqdm(
554-
self.tar_members_to_extract, desc="Extracting data", unit=" files", dynamic_ncols=True
555-
)
556-
# tar.errorlevel == 0 so errors are printed to stderr
557-
self.tar.extractall(path=self.data_path, members=progress_bar)
552+
to_extract = self.get_tar_members_to_extract()
553+
with detailed_progress(unit="files") as progress:
554+
progress_tracker = progress.track(to_extract, description="Extracting data")
555+
# tar.errorlevel == 0 so errors are printed to stderr
556+
self.tar.extractall(path=self.data_path, members=progress_tracker)
558557

559558
def get_basic_config(self, use_json: bool = False) -> dict:
560559
default_dirs = deepcopy(data_manager.basic_config_default)

0 commit comments

Comments
 (0)