diff --git a/pyproject.toml b/pyproject.toml index d0c07c7..031e557 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,6 +9,7 @@ dependencies = [ "joblib==1.5.1", "mistletoe==1.4.0", "requests==2.32.4", + "rich>=14.2.0", "tqdm==4.67.1", ] diff --git a/src/build.py b/src/build.py index de00c10..171d62c 100644 --- a/src/build.py +++ b/src/build.py @@ -5,6 +5,7 @@ import shutil from jinja2 import Environment, FileSystemLoader from joblib import Memory from mistletoe import Document +from rich.progress import BarColumn, Progress, TaskProgressColumn, TextColumn, TimeRemainingColumn from tqdm import tqdm from renderer.fifty_ohm_html_renderer import FiftyOhmHtmlRenderer @@ -271,15 +272,36 @@ class Build: edition_name = book["title"] self.__build_book_index(book) self.__build_slide_index(book) - for number, chapter in enumerate(tqdm(chapters, desc=f"Build Edition: {edition}"), 1): - next_chapter = chapters[number] if number < len(chapters) else None - self.__build_chapter(edition, edition_name, number, chapter, next_chapter) - self.__build_chapter_slidedeck(edition, chapter, chapter["sections"], next_chapter) - for i, section in enumerate(chapter["sections"], 1): - tqdm.write(f"Rendering section {section['title']}") - next_section = chapter["sections"][i] if i < len(chapter["sections"]) else None - self.__build_section(edition, edition_name, section, i, chapter, next_section, next_chapter) + with Progress( + TaskProgressColumn(), + BarColumn(), + TimeRemainingColumn(), + TextColumn("[progress.description]{task.description}"), + transient=True, + ) as progress: + for number, chapter in enumerate( + progress.track(chapters, description=f"Building edition {edition}"), 1 + ): + next_chapter = chapters[number] if number < len(chapters) else None + self.__build_chapter(edition, edition_name, number, chapter, next_chapter) + self.__build_chapter_slidedeck(edition, chapter, chapter["sections"], next_chapter) + + with Progress( + TaskProgressColumn(), + BarColumn(), + TimeRemainingColumn(), + TextColumn("[progress.description]{task.description}"), + transient=True, + ) as section_progress: + for i, section in enumerate( + section_progress.track( + chapter["sections"], description=f"Rendering chapter {chapter['title']}" + ), + 1, + ): + next_section = chapter["sections"][i] if i < len(chapter["sections"]) else None + self.__build_section(edition, edition_name, section, i, chapter, next_section, next_chapter) def build_assets(self): self.config.p_build.mkdir(exist_ok=True) diff --git a/uv.lock b/uv.lock index cd25e42..542d60c 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.12" [[package]] @@ -11,6 +11,7 @@ dependencies = [ { name = "joblib" }, { name = "mistletoe" }, { name = "requests" }, + { name = "rich" }, { name = "tqdm" }, ] @@ -28,6 +29,7 @@ requires-dist = [ { name = "joblib", specifier = "==1.5.1" }, { name = "mistletoe", specifier = "==1.4.0" }, { name = "requests", specifier = "==2.32.4" }, + { name = "rich", specifier = ">=14.2.0" }, { name = "tqdm", specifier = "==4.67.1" }, ] @@ -173,6 +175,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7d/4f/1195bbac8e0c2acc5f740661631d8d750dc38d4a32b23ee5df3cde6f4e0d/joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a", size = 307746, upload-time = "2025-05-23T12:04:35.124Z" }, ] +[[package]] +name = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, +] + [[package]] name = "markupsafe" version = "3.0.2" @@ -211,6 +225,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, ] +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + [[package]] name = "mistletoe" version = "1.4.0" @@ -292,6 +315,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" }, ] +[[package]] +name = "rich" +version = "14.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" }, +] + [[package]] name = "ruff" version = "0.12.2"