From 8b881649d85c167aa9f9d2a82996fb6960127882 Mon Sep 17 00:00:00 2001 From: geetanunakani Date: Tue, 26 May 2026 20:37:11 +0530 Subject: [PATCH 1/2] Create progress.py feat: add reusable progress bar utility --- src/oss_dev/cli/progress.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/oss_dev/cli/progress.py diff --git a/src/oss_dev/cli/progress.py b/src/oss_dev/cli/progress.py new file mode 100644 index 0000000..0423dbe --- /dev/null +++ b/src/oss_dev/cli/progress.py @@ -0,0 +1,21 @@ +from rich.progress import ( + Progress, + SpinnerColumn, + TextColumn, + TimeElapsedColumn, + BarColumn, +) +from contextlib import contextmanager + + +@contextmanager +def progress_bar(description: str = "Processing..."): + """Reusable progress bar for long-running CLI operations.""" + with Progress( + SpinnerColumn(), + TextColumn("[bold blue]{task.description}"), + BarColumn(), + TimeElapsedColumn(), + ) as progress: + task = progress.add_task(description, total=None) + yield progress, task From ab390af31407a56863427a2e38898cdb6c697631 Mon Sep 17 00:00:00 2001 From: geetanunakani Date: Tue, 26 May 2026 20:44:37 +0530 Subject: [PATCH 2/2] feat: integrate progress bar into discover and analyse commands --- src/oss_dev/cli/app.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/oss_dev/cli/app.py b/src/oss_dev/cli/app.py index efe45fc..a59698e 100644 --- a/src/oss_dev/cli/app.py +++ b/src/oss_dev/cli/app.py @@ -10,6 +10,7 @@ import typer from oss_dev._version import __version__ +from oss_dev.cli.progress import progress_bar app = typer.Typer( name="oss-dev", @@ -39,7 +40,6 @@ def _parse_issue_number(issue_url: str) -> int: "issue_url must be a GitHub issue URL with a positive issue number, " "for example: https://github.com/owner/repo/issues/123" ) - return int(match.group(1)) @@ -59,7 +59,10 @@ def discover_repos( limit: int = typer.Option(10, "--limit", help="Maximum results."), ) -> None: """Discover open source repositories to contribute to.""" - typer.echo("Discovering repositories...") + with progress_bar("Discovering repositories...") as (progress, task): + import time + time.sleep(2) # simulates real work + progress.update(task, description="Repositories discovered!") @discover_app.command("issues") @@ -70,7 +73,10 @@ def discover_issues( limit: int = typer.Option(10, "--limit", help="Maximum results."), ) -> None: """Discover issues to work on.""" - typer.echo("Discovering issues...") + with progress_bar("Discovering issues...") as (progress, task): + import time + time.sleep(2) # simulates real work + progress.update(task, description="Issues discovered!") @issues_app.command("list") @@ -99,7 +105,10 @@ def analyze( output: Optional[Path] = typer.Option(None, "--output", "-o", help="Output file for analysis results."), ) -> None: """Analyze a repository or issue for contribution readiness.""" - typer.echo(f"Analyzing {target}...") + with progress_bar(f"Analyzing {target}...") as (progress, task): + import time + time.sleep(2) # simulates real work + progress.update(task, description="Analysis complete!") @app.command() @@ -141,7 +150,10 @@ def docs( @app.command() def doctor() -> None: """Run system diagnostics to check OSS-Dev setup.""" - typer.echo("Running diagnostics...") + with progress_bar("Running diagnostics...") as (progress, task): + import time + time.sleep(2) # simulates real work + progress.update(task, description="Diagnostics complete!") @app.command()