From 61b2b7ae44dc53ff316a68cad1009f4d57d303a7 Mon Sep 17 00:00:00 2001 From: hyyz17200 Date: Fri, 8 May 2026 02:34:40 +0800 Subject: [PATCH] Show version number --- a1_swap_mod_packer/__init__.py | 3 ++- a1_swap_mod_packer/cli.py | 8 ++++++-- a1_swap_mod_packer/gui.py | 4 ++-- tests/test_version.py | 28 ++++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 tests/test_version.py diff --git a/a1_swap_mod_packer/__init__.py b/a1_swap_mod_packer/__init__.py index 6c84513..50fc328 100644 --- a/a1_swap_mod_packer/__init__.py +++ b/a1_swap_mod_packer/__init__.py @@ -1,2 +1,3 @@ -__version__ = "0.4.0" APP_NAME = "A1 Swap Mod Packer" +__version__ = "0.4.0" +APP_TITLE = f"{APP_NAME} v{__version__}" diff --git a/a1_swap_mod_packer/cli.py b/a1_swap_mod_packer/cli.py index 495289f..05fc44c 100644 --- a/a1_swap_mod_packer/cli.py +++ b/a1_swap_mod_packer/cli.py @@ -4,7 +4,7 @@ import argparse import sys from pathlib import Path -from . import APP_NAME +from . import APP_NAME, APP_TITLE, __version__ from .core import ( BuildOptions, PlateJob, @@ -70,7 +70,11 @@ def list_swap_gcode_command(args: argparse.Namespace) -> int: def create_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser(prog="a1-swap-mod-packer", description="Pack repeated Bambu A1 SwapMod plates into one 3MF job.") + parser = argparse.ArgumentParser( + prog="a1-swap-mod-packer", + description=f"{APP_TITLE} - Pack repeated Bambu A1 SwapMod plates into one 3MF job.", + ) + parser.add_argument("--version", action="version", version=f"{APP_NAME} {__version__}") subparsers = parser.add_subparsers(dest="command", required=True) build = subparsers.add_parser("build", help="Build a packed 3MF file.") diff --git a/a1_swap_mod_packer/gui.py b/a1_swap_mod_packer/gui.py index dbfcff9..6ce0c24 100644 --- a/a1_swap_mod_packer/gui.py +++ b/a1_swap_mod_packer/gui.py @@ -43,7 +43,7 @@ try: except ImportError as exc: # pragma: no cover raise SystemExit("PySide6 is required to run the GUI. Install it with: pip install PySide6") from exc -from . import APP_NAME +from . import APP_NAME, APP_TITLE from .core import ( BuildOptions, PlateJob, @@ -265,7 +265,7 @@ class DropTableWidget(QTableWidget): class MainWindow(QMainWindow): def __init__(self) -> None: super().__init__() - self.setWindowTitle(APP_NAME) + self.setWindowTitle(APP_TITLE) self.resize(960, 860) self.setAcceptDrops(True) self._updating_table = False diff --git a/tests/test_version.py b/tests/test_version.py new file mode 100644 index 0000000..0332fce --- /dev/null +++ b/tests/test_version.py @@ -0,0 +1,28 @@ +from __future__ import annotations + +import contextlib +import io +import unittest + +from a1_swap_mod_packer import APP_NAME, APP_TITLE, __version__ +from a1_swap_mod_packer.cli import create_parser + + +class VersionDisplayTest(unittest.TestCase): + def test_app_title_uses_shared_version(self) -> None: + self.assertEqual(APP_TITLE, f"{APP_NAME} v{__version__}") + + def test_cli_help_and_version_use_shared_version(self) -> None: + parser = create_parser() + self.assertIn(APP_TITLE, parser.format_help()) + + stdout = io.StringIO() + with self.assertRaises(SystemExit) as caught, contextlib.redirect_stdout(stdout): + parser.parse_args(["--version"]) + + self.assertEqual(caught.exception.code, 0) + self.assertEqual(stdout.getvalue().strip(), f"{APP_NAME} {__version__}") + + +if __name__ == "__main__": + unittest.main()