mirror of https://github.com/eyhc1/rendercv.git
create LiveProgressReporter
This commit is contained in:
parent
382914eee9
commit
0b09a5095b
|
@ -5,26 +5,15 @@ from typing import Annotated
|
|||
import typer
|
||||
from rich.prompt import Prompt
|
||||
import ruamel.yaml
|
||||
from rich.console import Console, Group
|
||||
from rich.panel import Panel
|
||||
from rich.live import Live
|
||||
from rich.progress import (
|
||||
BarColumn,
|
||||
Progress,
|
||||
ProgressColumn,
|
||||
TextColumn,
|
||||
Task,
|
||||
)
|
||||
from rich.text import Text
|
||||
|
||||
|
||||
from .user_communicator import handle_exceptions, welcome, LiveProgress
|
||||
from . import user_communicator as uc
|
||||
from . import data_models as dm
|
||||
from . import renderer as r
|
||||
|
||||
|
||||
app = typer.Typer(
|
||||
callback=welcome(),
|
||||
# callback=uc.print_rendercv_graphics(),
|
||||
help="RenderCV - A LateX CV generator from YAML",
|
||||
rich_markup_mode=( # see https://typer.tiangolo.com/tutorial/commands/help/#rich-markdown
|
||||
"markdown"
|
||||
|
@ -33,7 +22,7 @@ app = typer.Typer(
|
|||
|
||||
|
||||
@app.command(help="Render a YAML input file")
|
||||
@handle_exceptions
|
||||
@uc.handle_exceptions
|
||||
def render(
|
||||
input_file_path: Annotated[
|
||||
pathlib.Path,
|
||||
|
@ -46,50 +35,18 @@ def render(
|
|||
input_file (str): Name of the YAML input file
|
||||
"""
|
||||
output_directory = input_file_path.parent / "rendercv_output"
|
||||
|
||||
number_of_steps = 3
|
||||
|
||||
class TimeElapsedColumn(ProgressColumn):
|
||||
"""Renders time elapsed."""
|
||||
|
||||
def render(self, task: "Task") -> Text:
|
||||
"""Show time elapsed."""
|
||||
elapsed = task.finished_time if task.finished else task.elapsed
|
||||
if elapsed is None:
|
||||
return Text("--.-", style="progress.elapsed")
|
||||
delta = f"{elapsed:.1f} s"
|
||||
return Text(str(delta), style="progress.elapsed")
|
||||
|
||||
step_progress = Progress(TimeElapsedColumn(), TextColumn("{task.description}"))
|
||||
|
||||
# overall progress bar
|
||||
overall_progress = Progress(
|
||||
TimeElapsedColumn(),
|
||||
BarColumn(),
|
||||
TextColumn("{task.description}"),
|
||||
)
|
||||
|
||||
# group of progress bars;
|
||||
# some are always visible, others will disappear when progress is complete
|
||||
group = Group(
|
||||
Panel(Group(step_progress)),
|
||||
overall_progress,
|
||||
)
|
||||
|
||||
overall_task_id = overall_progress.add_task("", total=number_of_steps)
|
||||
|
||||
overall_progress.update(
|
||||
overall_task_id,
|
||||
description=f"[bold #AAAAAA](0 out of 3 steps finished)",
|
||||
)
|
||||
with LiveProgress(
|
||||
step_progress, overall_progress, group, overall_task_id
|
||||
) as progress:
|
||||
with uc.LiveProgressReporter(number_of_steps=3) as progress:
|
||||
progress.start_a_step("Reading the input file")
|
||||
data_model = dm.read_input_file(input_file_path)
|
||||
progress.finish_the_current_step()
|
||||
|
||||
progress.start_a_step("Generating the LaTeX file")
|
||||
latex_file_path = r.generate_latex_file(data_model, output_directory)
|
||||
progress.finish_the_current_step()
|
||||
|
||||
progress.start_a_step("Converting the LaTeX file to PDF")
|
||||
r.latex_to_pdf(latex_file_path)
|
||||
progress.finish_the_current_step()
|
||||
|
||||
|
||||
@app.command(help="Generate a YAML input file to get started.")
|
||||
|
|
|
@ -19,7 +19,7 @@ import pydantic
|
|||
error_console = Console(stderr=True)
|
||||
|
||||
|
||||
def welcome():
|
||||
def print_rendercv_graphics():
|
||||
"""Print a welcome message to the terminal."""
|
||||
print("Welcome to [bold blue]RenderCV[/bold blue]!")
|
||||
print("Documentation: [link=https://sinaatalay.github.io/rendercv/]")
|
||||
|
@ -91,35 +91,43 @@ def handle_exceptions(function: Callable) -> Callable:
|
|||
return wrapper
|
||||
|
||||
|
||||
class TimeElapsedColumn(ProgressColumn):
|
||||
"""Renders time elapsed."""
|
||||
class LiveProgressReporter(Live):
|
||||
def __init__(self, number_of_steps: int):
|
||||
class TimeElapsedColumn(ProgressColumn):
|
||||
def render(self, task: "Task") -> Text:
|
||||
elapsed = task.finished_time if task.finished else task.elapsed
|
||||
if elapsed is None:
|
||||
return Text("--.-", style="progress.elapsed")
|
||||
delta = f"{elapsed:.1f} s"
|
||||
return Text(str(delta), style="progress.elapsed")
|
||||
|
||||
def render(self, task: "Task") -> Text:
|
||||
"""Show time elapsed."""
|
||||
elapsed = task.finished_time if task.finished else task.elapsed
|
||||
if elapsed is None:
|
||||
return Text("--.-", style="progress.elapsed")
|
||||
delta = f"{elapsed:.1f} s"
|
||||
return Text(str(delta), style="progress.elapsed")
|
||||
self.step_progress = Progress(
|
||||
TimeElapsedColumn(), TextColumn("{task.description}")
|
||||
)
|
||||
|
||||
self.overall_progress = Progress(
|
||||
TimeElapsedColumn(),
|
||||
BarColumn(),
|
||||
TextColumn("{task.description}"),
|
||||
)
|
||||
|
||||
class LiveProgress(Live):
|
||||
def __init__(self, step_progress, overall_progress, group, overall_task_id):
|
||||
super().__init__()
|
||||
self.step_progress = step_progress
|
||||
self.overall_progress = overall_progress
|
||||
self.group = group
|
||||
self.group = Group(
|
||||
Panel(Group(self.step_progress)),
|
||||
self.overall_progress,
|
||||
)
|
||||
|
||||
self.overall_task_id = overall_task_id
|
||||
self.number_of_tasks = 3
|
||||
self.overall_task_id = self.overall_progress.add_task("", total=number_of_steps)
|
||||
self.number_of_steps = number_of_steps
|
||||
self.current_step = 0
|
||||
self.overall_progress.update(
|
||||
self.overall_task_id,
|
||||
description=(
|
||||
f"[bold #AAAAAA](0 out of {self.number_of_tasks} steps finished)"
|
||||
f"[bold #AAAAAA](0 out of {self.number_of_steps} steps finished)"
|
||||
),
|
||||
)
|
||||
super().__init__(self.group)
|
||||
|
||||
def __enter__(self) -> "LiveProgress":
|
||||
def __enter__(self) -> "LiveProgressReporter":
|
||||
self.start(refresh=self._renderable is not None)
|
||||
return self
|
||||
|
||||
|
@ -135,6 +143,9 @@ class LiveProgress(Live):
|
|||
self.current_step_id, description=f"{self.current_step_name} has finished."
|
||||
)
|
||||
self.overall_progress.update(self.overall_task_id, advance=1)
|
||||
self.current_step += 1
|
||||
if self.current_step == self.number_of_steps:
|
||||
self.end()
|
||||
|
||||
def end(self):
|
||||
self.overall_progress.update(
|
||||
|
|
Loading…
Reference in New Issue