From 2fb451e0ba1a4551c5d27f4e2b5f6cd6e6a7cb07 Mon Sep 17 00:00:00 2001 From: Abhishek Chadha Date: Sun, 26 Jul 2026 16:38:33 +0530 Subject: [PATCH] Display version in cli and tui --- src/secretsync/__init__.py | 2 +- src/secretsync/cli.py | 7 +++++++ src/secretsync/tui/app.py | 2 ++ tests/unit/test_cli.py | 8 ++++++++ tests/unit/test_tui_pilot.py | 6 ++++++ 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/secretsync/__init__.py b/src/secretsync/__init__.py index 80c33cd..9b16b80 100644 --- a/src/secretsync/__init__.py +++ b/src/secretsync/__init__.py @@ -3,6 +3,6 @@ from importlib.metadata import PackageNotFoundError, version try: - __version__ = version("secretsync") + __version__ = version("secretsync-cli") except PackageNotFoundError: # editable / source tree without install metadata __version__ = "0.0.0" diff --git a/src/secretsync/cli.py b/src/secretsync/cli.py index 3bf7563..04787a5 100644 --- a/src/secretsync/cli.py +++ b/src/secretsync/cli.py @@ -11,6 +11,7 @@ import click from loguru import logger +from secretsync import __version__ from secretsync.application.apply import run_apply from secretsync.application.health import ( HealthReport, @@ -344,6 +345,12 @@ def connectors_cmd(ctx: AppContext) -> None: raise SystemExit(EXIT_OK) +@cli.command("version") +def version_cmd() -> None: + """Display the installed SecretSync CLI version.""" + click.echo(__version__) + + def main() -> None: cli(prog_name="secretsync") diff --git a/src/secretsync/tui/app.py b/src/secretsync/tui/app.py index 6cdc078..909a4de 100644 --- a/src/secretsync/tui/app.py +++ b/src/secretsync/tui/app.py @@ -7,6 +7,7 @@ from textual.app import App from textual.binding import Binding +from secretsync import __version__ from secretsync.application.apply import ApplyReport from secretsync.application.services import AppServices from secretsync.domain.models import Plan @@ -18,6 +19,7 @@ class SecretSyncApp(App[ApplyReport | None]): CSS_PATH = "secretsync.tcss" TITLE = "SecretSync" + SUB_TITLE = f"v{__version__}" BINDINGS = [ Binding("q", "quit_app", "Quit", show=True), Binding("r", "reload", "Reload", show=True), diff --git a/tests/unit/test_cli.py b/tests/unit/test_cli.py index 0ae3103..56b1291 100644 --- a/tests/unit/test_cli.py +++ b/tests/unit/test_cli.py @@ -1,6 +1,7 @@ from __future__ import annotations import json +from importlib.metadata import version from click.testing import CliRunner @@ -22,6 +23,13 @@ def test_help() -> None: assert "plan" in result.output +def test_version() -> None: + runner = CliRunner() + result = runner.invoke(cli, ["version"]) + assert result.exit_code == 0 + assert result.output == f"{version('secretsync-cli')}\n" + + def test_validate_cli_ok() -> None: runner = CliRunner() result = runner.invoke( diff --git a/tests/unit/test_tui_pilot.py b/tests/unit/test_tui_pilot.py index fdeed4a..48cd757 100644 --- a/tests/unit/test_tui_pilot.py +++ b/tests/unit/test_tui_pilot.py @@ -5,6 +5,7 @@ import pytest +from secretsync import __version__ from secretsync.application.services import create_services from secretsync.presentation.json import apply_to_dict, render_apply_json from secretsync.tui.app import SecretSyncApp @@ -33,6 +34,11 @@ def _screen_text(app: SecretSyncApp) -> str: return "\n".join(parts) +def test_tui_shows_package_version_in_subtitle() -> None: + expected = f"v{__version__}" + assert expected == SecretSyncApp.SUB_TITLE + + @pytest.mark.asyncio async def test_pilot_config_plan_confirm_navigation() -> None: services = create_services(FAKE_ENV)