From 47fe6d1e8fc689dfd8183043179c5b1c73b336aa Mon Sep 17 00:00:00 2001 From: fedoraBee <9395414+fedoraBee@users.noreply.github.com> Date: Thu, 23 Jul 2026 13:00:33 +0200 Subject: [PATCH 1/4] feat: add automated terminal screenshot generator and update documentation - Add scripts/maintainer/generate-screenshot.py to render flatpak-automatic -s with ASCII banner and vibrant terminal colors - Configure tbump.toml to automatically regenerate status screenshot during releases - Embed terminal status screenshot prominently in README.md - Document screenshot maintainer script in MAINTAINERS.md and docs/development.md --- MAINTAINERS.md | 6 +- README.md | 6 + assets/status-screenshot.png | Bin 0 -> 109457 bytes config/templates/default_mail_success.md | 3 +- docs/development.md | 14 ++ scripts/maintainer/generate-screenshot.py | 174 ++++++++++++++++++++++ tbump.toml | 4 + 7 files changed, 204 insertions(+), 3 deletions(-) create mode 100644 assets/status-screenshot.png create mode 100755 scripts/maintainer/generate-screenshot.py diff --git a/MAINTAINERS.md b/MAINTAINERS.md index f2e937d8..8b0fff79 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -90,8 +90,10 @@ When you are ready to cut a new release, follow these steps to generate the tbump X.Y.Z --no-push ``` - _Note: `tbump` will automatically trigger the `before_commit` hook, run - `update-package-metadata.py`, generate the changelog and bundle everything + _Note: `tbump` will automatically trigger the `before_commit` hooks to + regenerate the status screenshot + (`scripts/maintainer/generate-screenshot.py`), run + `update-package-metadata.py`, generate the changelog, and bundle everything into a single release commit and local tag._ 💡 **Tip for Release Candidates:** You can safely use standard SemVer tags diff --git a/README.md b/README.md index 639dafdf..5c9a49d9 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,12 @@ updates. It features Snapper-integrated atomic rollbacks, multi-channel alerting user-level execution. Designed for reliability and ease of use, it ensures your Flatpak environment remains current and resilient. + + +
Flatpak Automatic
+System Status Overview
+ + ## ✨ Features - **Automated Flatpak Updates:** Keep your flatpak applications up-to-date diff --git a/assets/status-screenshot.png b/assets/status-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..26a685675f0bd7d3f28e29fb05cf3522e1481d57 GIT binary patch literal 109457 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 None: + """Crop white outer margins from generated screenshot.""" + im = Image.open(image_path) + im_rgb = im.convert("RGB") + bg = Image.new("RGB", im_rgb.size, (255, 255, 255)) + diff = ImageChops.difference(im_rgb, bg) + bbox = diff.getbbox() + if bbox: + cropped = im.crop(bbox) + cropped.save(image_path) + + +def convert_svg_to_png(svg_path: Path, output_png: Path) -> None: + """Convert SVG to PNG using Google Chrome/Chromium if available, falling back to cairosvg.""" + chrome_bin = shutil.which("google-chrome") or shutil.which("chromium") + + if chrome_bin: + temp_png = svg_path.parent / "temp_chrome.png" + cmd = [ + chrome_bin, + "--headless", + "--disable-gpu", + "--hide-scrollbars", + f"--screenshot={temp_png}", + "--window-size=1000,800", + str(svg_path), + ] + subprocess.run( + cmd, + check=True, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + + if temp_png.exists(): + crop_margins(temp_png) + shutil.move(temp_png, output_png) + return + + # Fallback to cairosvg + import cairosvg + + svg_data = svg_path.read_text(encoding="utf-8") + svg_data = re.sub( + r"font-family:\s*([^;]+);", + r"font-family: \1, 'Noto Color Emoji', 'Noto Emoji', 'Segoe UI Emoji', 'Apple Color Emoji', 'Symbola', monospace;", + svg_data, + ) + cairosvg.svg2png( + bytestring=svg_data.encode("utf-8"), + write_to=str(output_png), + ) + + +def generate_screenshot() -> None: + """Run status command as root (or fallback), capture terminal output with ASCII header banner, and export to PNG image.""" + script_path = Path(__file__).resolve() + repo_root = script_path.parent.parent.parent + assets_dir = repo_root / "assets" + assets_dir.mkdir(parents=True, exist_ok=True) + output_png = assets_dir / "status-screenshot.png" + temp_svg = assets_dir / "temp_status.svg" + + src_dir = str(repo_root / "src") + if src_dir not in sys.path: + sys.path.insert(0, src_dir) + + from flatpak_automatic.cli import banner + + cli_script = repo_root / "src" / "flatpak-automatic.py" + + output_text = None + + # Try non-interactive sudo first, then interactive sudo, then non-root execution + attempts = [ + ["sudo", "-n", sys.executable, str(cli_script), "-s"], + ["sudo", sys.executable, str(cli_script), "-s"], + [sys.executable, str(cli_script), "-s"], + ] + + if os.geteuid() == 0: + attempts.insert(0, [sys.executable, str(cli_script), "-s"]) + + for cmd in attempts: + try: + result = subprocess.run( + cmd, + cwd=repo_root, + capture_output=True, + text=True, + check=True, + timeout=5, + ) + output_text = result.stdout.strip() + if output_text: + break + except Exception: + continue + + if not output_text: + # Ultimate fallback + result = subprocess.run( + [sys.executable, str(cli_script), "-s"], + cwd=repo_root, + capture_output=True, + text=True, + check=True, + ) + output_text = result.stdout.strip() + + banner_text = banner() + full_output = f"{banner_text}\n{output_text}" + + console = Console(record=True, width=100) + rich_text = Text.from_ansi(full_output) + console.print(rich_text) + + svg_data = console.export_svg( + title="flatpak-automatic -s", theme=VIBRANT_TERMINAL_THEME + ) + temp_svg.write_text(svg_data, encoding="utf-8") + + convert_svg_to_png(temp_svg, output_png) + + if temp_svg.exists(): + temp_svg.unlink() + + print(f"Successfully generated screenshot at: {output_png}") + + +if __name__ == "__main__": + generate_screenshot() diff --git a/tbump.toml b/tbump.toml index 939887f0..53797280 100644 --- a/tbump.toml +++ b/tbump.toml @@ -24,6 +24,10 @@ tag_template = "v{new_version}" name = "Generate Changelogs and Package Metadata" cmd = "python3 scripts/build/update-package-metadata.py --version {new_version} --generate-changelog" +[[before_commit]] +name = "Generate Terminal Status Screenshot" +cmd = "python3 scripts/maintainer/generate-screenshot.py" + # Pre-run hooks to ensure everything is formatted before tbump tries to commit. # This prevents failures where hooks modify files during the git commit step. [[before_commit]] From 386defe1aa9462753ec013565e514825e4d1d96b Mon Sep 17 00:00:00 2001 From: fedoraBee <9395414+fedoraBee@users.noreply.github.com> Date: Thu, 23 Jul 2026 13:35:16 +0200 Subject: [PATCH 2/4] feat: Add verbose status mode (-V/--verbose) for detailed Flatpak table overview --- README.md | 3 +- docs/flatpak-automatic.1 | 5 +- src/flatpak_automatic/__main__.py | 4 +- src/flatpak_automatic/cli.py | 6 +++ src/flatpak_automatic/core.py | 85 ++++++++++++++++++++++++------- tests/test_core_status.py | 35 +++++++++++++ tests/test_main_cli.py | 7 +++ 7 files changed, 124 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 5c9a49d9..434d48cd 100644 --- a/README.md +++ b/README.md @@ -160,7 +160,7 @@ first run). To trigger an update manually or use the advanced CLI: ```text -usage: flatpak-automatic [-h] [-d] [-t] [-f] [-s] [-l] [-a] [-c] [-r] +usage: flatpak-automatic [-h] [-d] [-t] [-f] [-s] [-V] [-l] [-a] [-c] [-r] [--desktop-mode] [-e] [-x] Flatpak Automatic - Advanced Update Automation @@ -171,6 +171,7 @@ options: -t, --test-notify Send a test notification to configured endpoints and exit. -f, --force Force the update process, ignoring safeguards. -s, --status Display system monitoring overview and exit. + -V, --verbose Enable verbose output (e.g. detailed status view with -s/--status). -l, --history Display recent update history from journalctl and exit. -a, --apply-schedule Apply systemd timer overrides based on config settings. -c, --check-config Validate and print the current configuration, then exit. diff --git a/docs/flatpak-automatic.1 b/docs/flatpak-automatic.1 index d7e69698..bf41547c 100644 --- a/docs/flatpak-automatic.1 +++ b/docs/flatpak-automatic.1 @@ -4,7 +4,7 @@ flatpak-automatic \- Secure, systemd-native automation for Flatpak updates .SH SYNOPSIS .B flatpak-automatic -[\fB\-d\fR] [\fB\-t\fR] [\fB\-f\fR] [\fB\-s\fR] [\fB\-l\fR] [\fB\-a\fR] [\fB\-c\fR] [\fB\-r\fR] [\fB\-e\fR] [\fB\-x\fR] [\fB\-\-desktop\-mode\fR] +[\fB\-d\fR] [\fB\-t\fR] [\fB\-f\fR] [\fB\-s\fR] [\fB\-V\fR] [\fB\-l\fR] [\fB\-a\fR] [\fB\-c\fR] [\fB\-r\fR] [\fB\-e\fR] [\fB\-x\fR] [\fB\-\-desktop\-mode\fR] .SH DESCRIPTION .B flatpak-automatic is a secure, systemd-native automation wrapper for Flatpak updates. It features Snapper-integrated atomic rollbacks, multi-channel alerting (Apprise, Mail, Webhooks, Desktop), and supports both system-wide and rootless user-level execution. Designed for reliability and ease of use, it ensures your Flatpak environment remains current and resilient. @@ -32,6 +32,9 @@ Force the update process, bypassing the minimum delay guard and auto_update poli .BR \-s ", " \-\-status Display a system monitoring overview of configuration and pending updates. .TP +.BR \-V ", " \-\-verbose +Enable verbose output (e.g. detailed status view of installed Flatpaks and runtimes with -s/--status). +.TP .BR \-l ", " \-\-history Display recent execution history from journalctl. .TP diff --git a/src/flatpak_automatic/__main__.py b/src/flatpak_automatic/__main__.py index b0dc36f8..73b488db 100644 --- a/src/flatpak_automatic/__main__.py +++ b/src/flatpak_automatic/__main__.py @@ -160,8 +160,8 @@ def sighup_handler(signum: int, frame: Any) -> None: print() sys.exit(0) - if args.status: - engine.print_status_overview() + if args.status or args.verbose: + engine.print_status_overview(verbose=args.verbose) sys.exit(0) if args.history: diff --git a/src/flatpak_automatic/cli.py b/src/flatpak_automatic/cli.py index 2fa93b58..7aa1d6ec 100644 --- a/src/flatpak_automatic/cli.py +++ b/src/flatpak_automatic/cli.py @@ -51,6 +51,12 @@ def get_parser() -> BrandedArgumentParser: action="store_true", help="Display system monitoring overview and exit.", ) + parser.add_argument( + "-V", + "--verbose", + action="store_true", + help="Enable verbose output (e.g. detailed status view with -s/--status).", + ) parser.add_argument( "-l", "--history", diff --git a/src/flatpak_automatic/core.py b/src/flatpak_automatic/core.py index 5185e7e7..8d516a44 100644 --- a/src/flatpak_automatic/core.py +++ b/src/flatpak_automatic/core.py @@ -91,7 +91,7 @@ def dispatch_test_notifications(self) -> None: update_count=0, ) - def print_status_overview(self) -> None: + def print_status_overview(self, verbose: bool = False) -> None: from .notifiers import APPRISE_AVAILABLE, MailNotifier print( @@ -209,23 +209,74 @@ def print_status_overview(self) -> None: webhook_icon = "🟢" if webhook_avail else "⚪" print(f" Network/Webhook: {webhook_icon} {webhook_status}") - print(f"\n{Colors.OKCYAN}📦 Installed Flatpaks:{Colors.ENDC}") - result = subprocess.run( - ["flatpak", "list", "--app", "--columns=application,version"], - capture_output=True, - text=True, - ) exclusions = self.config.get("exclusions", []) - for line in result.stdout.strip().split("\n"): - if not line: - continue - - # Simple parsing of application ID (first column) - app_id = line.split()[0] - if app_id in exclusions: - print(f" {Colors.WARNING}{line} (Excluded){Colors.ENDC}") - else: - print(f" {line}") + + if verbose: + print( + f"\n{Colors.OKCYAN}📦 Installed Flatpaks & Runtimes (Verbose):{Colors.ENDC}" + ) + result = subprocess.run( + [ + "flatpak", + "list", + "--columns=name,application,version,branch,installation", + ], + capture_output=True, + text=True, + ) + raw_lines = [ + line.split("\t") + for line in result.stdout.strip().split("\n") + if line.strip() + ] + + if raw_lines: + headers = [ + "NAME", + "APPLICATION ID", + "VERSION", + "BRANCH", + "INSTALLATION", + ] + col_widths = [len(h) for h in headers] + for row in raw_lines: + for i in range(min(5, len(row))): + col_widths[i] = max(col_widths[i], len(row[i])) + + header_str = " " + " ".join( + f"{headers[i]:<{col_widths[i]}}" for i in range(5) + ) + print(f"{Colors.BOLD}{Colors.OKCYAN}{header_str}{Colors.ENDC}") + + for row in raw_lines: + padded_row = row + [""] * (5 - len(row)) + app_id = padded_row[1] + formatted_row = " " + " ".join( + f"{padded_row[i]:<{col_widths[i]}}" for i in range(5) + ) + + if app_id in exclusions: + print( + f" {Colors.WARNING}{formatted_row.strip()} (Excluded){Colors.ENDC}" + ) + else: + print(f"{formatted_row}") + else: + print(f"\n{Colors.OKCYAN}📦 Installed Flatpaks:{Colors.ENDC}") + result = subprocess.run( + ["flatpak", "list", "--app", "--columns=application,version"], + capture_output=True, + text=True, + ) + for line in result.stdout.strip().split("\n"): + if not line: + continue + + app_id = line.split()[0] + if app_id in exclusions: + print(f" {Colors.WARNING}{line} (Excluded){Colors.ENDC}") + else: + print(f" {line}") print() # Trailing empty line def run( diff --git a/tests/test_core_status.py b/tests/test_core_status.py index 5c53d0a6..0df13e0f 100644 --- a/tests/test_core_status.py +++ b/tests/test_core_status.py @@ -64,3 +64,38 @@ def test_print_status_timer_disabled(self, mock_run: MagicMock) -> None: call.args[0] if call.args else "" for call in mock_print.call_args_list ] assert any("Disabled / Inactive" in arg for arg in printed_args) + + @patch("subprocess.run") + @patch("flatpak_automatic.notifiers.MailNotifier.is_available") + @patch("flatpak_automatic.notifiers.DesktopNotifier.is_available") + @patch("flatpak_automatic.notifiers.WebhookNotifier.is_available") + def test_print_status_overview_verbose( + self, + mock_wh: MagicMock, + mock_dt: MagicMock, + mock_mail: MagicMock, + mock_run: MagicMock, + ) -> None: + mock_run.side_effect = [ + MagicMock(returncode=1), # is-enabled + MagicMock(returncode=1), # is-active + MagicMock( + stdout="App\torg.test.App\t1.0\tstable\tsystem\n", returncode=0 + ), # flatpak list verbose + ] + mock_mail.return_value = True + mock_dt.return_value = True + mock_wh.return_value = True + + engine = AutomationEngine({"exclusions": ["org.test.App"]}, {}) + with patch("builtins.print") as mock_print: + engine.print_status_overview(verbose=True) + printed_args = [ + call.args[0] if call.args else "" for call in mock_print.call_args_list + ] + assert any( + "📦 Installed Flatpaks & Runtimes (Verbose):" in arg + for arg in printed_args + ) + assert any("APPLICATION ID" in arg for arg in printed_args) + assert any("(Excluded)" in arg for arg in printed_args) diff --git a/tests/test_main_cli.py b/tests/test_main_cli.py index ff66bf7c..407076d6 100644 --- a/tests/test_main_cli.py +++ b/tests/test_main_cli.py @@ -54,6 +54,7 @@ def test_main_status( enable_timer=False, disable_timer=False, status=True, + verbose=False, history=False, test_notify=False, ) @@ -84,6 +85,7 @@ def test_main_enable_timer( enable_timer=True, disable_timer=False, status=False, + verbose=False, history=False, test_notify=False, ) @@ -115,6 +117,7 @@ def test_main_disable_timer( enable_timer=False, disable_timer=True, status=False, + verbose=False, history=False, test_notify=False, ) @@ -146,6 +149,7 @@ def test_main_reload( enable_timer=False, disable_timer=False, status=False, + verbose=False, history=False, test_notify=False, ) @@ -178,6 +182,7 @@ def test_main_history( enable_timer=False, disable_timer=False, status=False, + verbose=False, history=True, test_notify=False, ) @@ -207,6 +212,7 @@ def test_main_test_notify( enable_timer=False, disable_timer=False, status=False, + verbose=False, history=False, test_notify=True, ) @@ -239,6 +245,7 @@ def test_main_apply_schedule( enable_timer=False, disable_timer=False, status=False, + verbose=False, history=False, test_notify=False, ) From cd494cdfba31c2c9f9a4e38e8975bbf3f9252398 Mon Sep 17 00:00:00 2001 From: fedoraBee <9395414+fedoraBee@users.noreply.github.com> Date: Thu, 23 Jul 2026 13:51:16 +0200 Subject: [PATCH 3/4] feat: Add -B/--hide-banner option and cli.hide_banner config setting to hide ASCII header banner --- README.md | 3 +- config/config.default.yaml | 9 ++++ config/config.example.yaml | 8 ++++ config/config.user.default.yaml | 9 ++++ docs/flatpak-automatic.1 | 5 ++- src/flatpak_automatic/__main__.py | 9 ++-- src/flatpak_automatic/cli.py | 6 +++ tests/test_main_cli.py | 71 +++++++++++++++++++++++++++++++ 8 files changed, 115 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 434d48cd..22f6da7f 100644 --- a/README.md +++ b/README.md @@ -160,7 +160,7 @@ first run). To trigger an update manually or use the advanced CLI: ```text -usage: flatpak-automatic [-h] [-d] [-t] [-f] [-s] [-V] [-l] [-a] [-c] [-r] +usage: flatpak-automatic [-h] [-d] [-t] [-f] [-s] [-B] [-V] [-l] [-a] [-c] [-r] [--desktop-mode] [-e] [-x] Flatpak Automatic - Advanced Update Automation @@ -171,6 +171,7 @@ options: -t, --test-notify Send a test notification to configured endpoints and exit. -f, --force Force the update process, ignoring safeguards. -s, --status Display system monitoring overview and exit. + -B, --hide-banner Hide the header ASCII banner upon execution. -V, --verbose Enable verbose output (e.g. detailed status view with -s/--status). -l, --history Display recent update history from journalctl and exit. -a, --apply-schedule Apply systemd timer overrides based on config settings. diff --git a/config/config.default.yaml b/config/config.default.yaml index 095a5e84..0710701c 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -38,6 +38,15 @@ exclusions: [] # Type: string, Default: always auto_notify: always +# ------------------------------------------------------------------------------ +# CLI & Interface Settings +# ------------------------------------------------------------------------------ + +cli: + # Hide the ASCII header banner when executing from terminal. + # Type: boolean, Default: false + hide_banner: false + # ------------------------------------------------------------------------------ # Systemd Timer Schedule # ------------------------------------------------------------------------------ diff --git a/config/config.example.yaml b/config/config.example.yaml index 10ee4483..49dd2f48 100644 --- a/config/config.example.yaml +++ b/config/config.example.yaml @@ -31,6 +31,14 @@ exclusions: # Notification trigger policy: 'always', 'on-change', 'on-failure', or 'never'. auto_notify: always +# ------------------------------------------------------------------------------ +# CLI & Interface Settings +# ------------------------------------------------------------------------------ + +cli: + # Hide the ASCII header banner when executing from terminal. + hide_banner: false + # ------------------------------------------------------------------------------ # Systemd Timer Schedule # ------------------------------------------------------------------------------ diff --git a/config/config.user.default.yaml b/config/config.user.default.yaml index 2af14165..889829e0 100644 --- a/config/config.user.default.yaml +++ b/config/config.user.default.yaml @@ -32,6 +32,15 @@ exclusions: [] # Type: string, Default: always auto_notify: always +# ------------------------------------------------------------------------------ +# CLI & Interface Settings +# ------------------------------------------------------------------------------ + +cli: + # Hide the ASCII header banner when executing from terminal. + # Type: boolean, Default: false + hide_banner: false + # ------------------------------------------------------------------------------ # Systemd Timer Schedule (User Scope) # ------------------------------------------------------------------------------ diff --git a/docs/flatpak-automatic.1 b/docs/flatpak-automatic.1 index bf41547c..058a1061 100644 --- a/docs/flatpak-automatic.1 +++ b/docs/flatpak-automatic.1 @@ -4,7 +4,7 @@ flatpak-automatic \- Secure, systemd-native automation for Flatpak updates .SH SYNOPSIS .B flatpak-automatic -[\fB\-d\fR] [\fB\-t\fR] [\fB\-f\fR] [\fB\-s\fR] [\fB\-V\fR] [\fB\-l\fR] [\fB\-a\fR] [\fB\-c\fR] [\fB\-r\fR] [\fB\-e\fR] [\fB\-x\fR] [\fB\-\-desktop\-mode\fR] +[\fB\-d\fR] [\fB\-t\fR] [\fB\-f\fR] [\fB\-s\fR] [\fB\-B\fR] [\fB\-V\fR] [\fB\-l\fR] [\fB\-a\fR] [\fB\-c\fR] [\fB\-r\fR] [\fB\-e\fR] [\fB\-x\fR] [\fB\-\-desktop\-mode\fR] .SH DESCRIPTION .B flatpak-automatic is a secure, systemd-native automation wrapper for Flatpak updates. It features Snapper-integrated atomic rollbacks, multi-channel alerting (Apprise, Mail, Webhooks, Desktop), and supports both system-wide and rootless user-level execution. Designed for reliability and ease of use, it ensures your Flatpak environment remains current and resilient. @@ -32,6 +32,9 @@ Force the update process, bypassing the minimum delay guard and auto_update poli .BR \-s ", " \-\-status Display a system monitoring overview of configuration and pending updates. .TP +.BR \-B ", " \-\-hide\-banner +Hide the header ASCII banner upon execution. +.TP .BR \-V ", " \-\-verbose Enable verbose output (e.g. detailed status view of installed Flatpaks and runtimes with -s/--status). .TP diff --git a/src/flatpak_automatic/__main__.py b/src/flatpak_automatic/__main__.py index 73b488db..e7b3daf4 100644 --- a/src/flatpak_automatic/__main__.py +++ b/src/flatpak_automatic/__main__.py @@ -21,12 +21,15 @@ def main() -> None: user_scope = os.geteuid() != 0 flatpak_scope = ["--user"] if user_scope else ["--system"] - if sys.stdout.isatty(): - print(banner()) - # 2. Load Configuration & State config = ConfigManager.load() + # Determine if banner should be displayed + hide_banner = args.hide_banner or config.get("cli", {}).get("hide_banner", False) + + if sys.stdout.isatty() and not hide_banner: + print(banner()) + def sighup_handler(signum: int, frame: Any) -> None: logging.info("SIGHUP received. Hot-reloading configuration...") nonlocal config diff --git a/src/flatpak_automatic/cli.py b/src/flatpak_automatic/cli.py index 7aa1d6ec..19c95448 100644 --- a/src/flatpak_automatic/cli.py +++ b/src/flatpak_automatic/cli.py @@ -51,6 +51,12 @@ def get_parser() -> BrandedArgumentParser: action="store_true", help="Display system monitoring overview and exit.", ) + parser.add_argument( + "-B", + "--hide-banner", + action="store_true", + help="Hide the header ASCII banner upon execution.", + ) parser.add_argument( "-V", "--verbose", diff --git a/tests/test_main_cli.py b/tests/test_main_cli.py index 407076d6..622d5570 100644 --- a/tests/test_main_cli.py +++ b/tests/test_main_cli.py @@ -223,6 +223,76 @@ def test_main_test_notify( assert e.value.code == 0 mock_engine.return_value.dispatch_test_notifications.assert_called_once() + @patch("flatpak_automatic.__main__.get_parser") + @patch("flatpak_automatic.__main__.ConfigManager.load") + @patch("flatpak_automatic.__main__.StateManager.load") + @patch("flatpak_automatic.__main__.AutomationEngine") + @patch("sys.stdout.isatty", return_value=True) + @patch("flatpak_automatic.__main__.banner") + def test_main_hide_banner_cli( + self, + mock_banner: MagicMock, + mock_isatty: MagicMock, + mock_engine: MagicMock, + mock_state: MagicMock, + mock_config: MagicMock, + mock_parser: MagicMock, + ) -> None: + args = MagicMock( + check_config=True, + hide_banner=True, + reload=False, + apply_schedule=False, + enable_timer=False, + disable_timer=False, + status=False, + verbose=False, + history=False, + test_notify=False, + ) + mock_parser.return_value.parse_args.return_value = args + mock_config.return_value = {"cli": {"hide_banner": False}} + + with pytest.raises(SystemExit) as e: + main() + assert e.value.code == 0 + mock_banner.assert_not_called() + + @patch("flatpak_automatic.__main__.get_parser") + @patch("flatpak_automatic.__main__.ConfigManager.load") + @patch("flatpak_automatic.__main__.StateManager.load") + @patch("flatpak_automatic.__main__.AutomationEngine") + @patch("sys.stdout.isatty", return_value=True) + @patch("flatpak_automatic.__main__.banner") + def test_main_hide_banner_config( + self, + mock_banner: MagicMock, + mock_isatty: MagicMock, + mock_engine: MagicMock, + mock_state: MagicMock, + mock_config: MagicMock, + mock_parser: MagicMock, + ) -> None: + args = MagicMock( + check_config=True, + hide_banner=False, + reload=False, + apply_schedule=False, + enable_timer=False, + disable_timer=False, + status=False, + verbose=False, + history=False, + test_notify=False, + ) + mock_parser.return_value.parse_args.return_value = args + mock_config.return_value = {"cli": {"hide_banner": True}} + + with pytest.raises(SystemExit) as e: + main() + assert e.value.code == 0 + mock_banner.assert_not_called() + @patch("flatpak_automatic.__main__.get_parser") @patch("flatpak_automatic.__main__.ConfigManager.load") @patch("flatpak_automatic.__main__.StateManager.load") @@ -240,6 +310,7 @@ def test_main_apply_schedule( ) -> None: args = MagicMock( check_config=False, + hide_banner=False, reload=False, apply_schedule=True, enable_timer=False, From 058876f89450c32975d5b86b2f4db7b13a08a936 Mon Sep 17 00:00:00 2001 From: fedoraBee <9395414+fedoraBee@users.noreply.github.com> Date: Thu, 23 Jul 2026 14:11:27 +0200 Subject: [PATCH 4/4] feat: Add -v/--version option to display installed application version --- README.md | 5 +++-- docs/flatpak-automatic.1 | 5 ++++- src/flatpak_automatic/__main__.py | 6 ++++++ src/flatpak_automatic/cli.py | 6 ++++++ tests/test_main_cli.py | 25 ++++++++++++++++++++++++- 5 files changed, 43 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 22f6da7f..e3a75987 100644 --- a/README.md +++ b/README.md @@ -160,8 +160,8 @@ first run). To trigger an update manually or use the advanced CLI: ```text -usage: flatpak-automatic [-h] [-d] [-t] [-f] [-s] [-B] [-V] [-l] [-a] [-c] [-r] - [--desktop-mode] [-e] [-x] +usage: flatpak-automatic [-h] [-d] [-t] [-f] [-s] [-B] [-v] [-V] [-l] [-a] [-c] + [-r] [--desktop-mode] [-e] [-x] Flatpak Automatic - Advanced Update Automation @@ -172,6 +172,7 @@ options: -f, --force Force the update process, ignoring safeguards. -s, --status Display system monitoring overview and exit. -B, --hide-banner Hide the header ASCII banner upon execution. + -v, --version Show application version and exit. -V, --verbose Enable verbose output (e.g. detailed status view with -s/--status). -l, --history Display recent update history from journalctl and exit. -a, --apply-schedule Apply systemd timer overrides based on config settings. diff --git a/docs/flatpak-automatic.1 b/docs/flatpak-automatic.1 index 058a1061..a119e7e4 100644 --- a/docs/flatpak-automatic.1 +++ b/docs/flatpak-automatic.1 @@ -4,7 +4,7 @@ flatpak-automatic \- Secure, systemd-native automation for Flatpak updates .SH SYNOPSIS .B flatpak-automatic -[\fB\-d\fR] [\fB\-t\fR] [\fB\-f\fR] [\fB\-s\fR] [\fB\-B\fR] [\fB\-V\fR] [\fB\-l\fR] [\fB\-a\fR] [\fB\-c\fR] [\fB\-r\fR] [\fB\-e\fR] [\fB\-x\fR] [\fB\-\-desktop\-mode\fR] +[\fB\-d\fR] [\fB\-t\fR] [\fB\-f\fR] [\fB\-s\fR] [\fB\-B\fR] [\fB\-v\fR] [\fB\-V\fR] [\fB\-l\fR] [\fB\-a\fR] [\fB\-c\fR] [\fB\-r\fR] [\fB\-e\fR] [\fB\-x\fR] [\fB\-\-desktop\-mode\fR] .SH DESCRIPTION .B flatpak-automatic is a secure, systemd-native automation wrapper for Flatpak updates. It features Snapper-integrated atomic rollbacks, multi-channel alerting (Apprise, Mail, Webhooks, Desktop), and supports both system-wide and rootless user-level execution. Designed for reliability and ease of use, it ensures your Flatpak environment remains current and resilient. @@ -35,6 +35,9 @@ Display a system monitoring overview of configuration and pending updates. .BR \-B ", " \-\-hide\-banner Hide the header ASCII banner upon execution. .TP +.BR \-v ", " \-\-version +Display the installed application version and exit. +.TP .BR \-V ", " \-\-verbose Enable verbose output (e.g. detailed status view of installed Flatpaks and runtimes with -s/--status). .TP diff --git a/src/flatpak_automatic/__main__.py b/src/flatpak_automatic/__main__.py index e7b3daf4..f9aa188b 100644 --- a/src/flatpak_automatic/__main__.py +++ b/src/flatpak_automatic/__main__.py @@ -4,6 +4,7 @@ import signal import subprocess from typing import Any +from . import __version__ from .cli import get_parser, banner from .config import ConfigManager, StateManager from .core import AutomationEngine @@ -15,6 +16,11 @@ def main() -> None: # 1. Initialize Parser & Logging parser = get_parser() args = parser.parse_args() + + if args.version: + print(f"flatpak-automatic {__version__}") + sys.exit(0) + setup_logging() # Dynamic Flatpak Scope for non-root execution diff --git a/src/flatpak_automatic/cli.py b/src/flatpak_automatic/cli.py index 19c95448..b71af3ff 100644 --- a/src/flatpak_automatic/cli.py +++ b/src/flatpak_automatic/cli.py @@ -57,6 +57,12 @@ def get_parser() -> BrandedArgumentParser: action="store_true", help="Hide the header ASCII banner upon execution.", ) + parser.add_argument( + "-v", + "--version", + action="store_true", + help="Show application version and exit.", + ) parser.add_argument( "-V", "--verbose", diff --git a/tests/test_main_cli.py b/tests/test_main_cli.py index 622d5570..5b99c813 100644 --- a/tests/test_main_cli.py +++ b/tests/test_main_cli.py @@ -15,7 +15,7 @@ def test_main_check_config( mock_config: MagicMock, mock_parser: MagicMock, ) -> None: - args = MagicMock() + args = MagicMock(version=False) args.check_config = True args.reload = False args.apply_schedule = False @@ -49,6 +49,7 @@ def test_main_status( ) -> None: args = MagicMock( check_config=False, + version=False, reload=False, apply_schedule=False, enable_timer=False, @@ -80,6 +81,7 @@ def test_main_enable_timer( ) -> None: args = MagicMock( check_config=False, + version=False, reload=False, apply_schedule=False, enable_timer=True, @@ -112,6 +114,7 @@ def test_main_disable_timer( ) -> None: args = MagicMock( check_config=False, + version=False, reload=False, apply_schedule=False, enable_timer=False, @@ -144,6 +147,7 @@ def test_main_reload( ) -> None: args = MagicMock( check_config=False, + version=False, reload=True, apply_schedule=False, enable_timer=False, @@ -177,6 +181,7 @@ def test_main_history( ) -> None: args = MagicMock( check_config=False, + version=False, reload=False, apply_schedule=False, enable_timer=False, @@ -207,6 +212,7 @@ def test_main_test_notify( ) -> None: args = MagicMock( check_config=False, + version=False, reload=False, apply_schedule=False, enable_timer=False, @@ -293,6 +299,22 @@ def test_main_hide_banner_config( assert e.value.code == 0 mock_banner.assert_not_called() + @patch("flatpak_automatic.__main__.get_parser") + @patch("builtins.print") + def test_main_version( + self, + mock_print: MagicMock, + mock_parser: MagicMock, + ) -> None: + args = MagicMock(version=True) + mock_parser.return_value.parse_args.return_value = args + + with pytest.raises(SystemExit) as e: + main() + assert e.value.code == 0 + mock_print.assert_called_once() + assert "flatpak-automatic" in mock_print.call_args[0][0] + @patch("flatpak_automatic.__main__.get_parser") @patch("flatpak_automatic.__main__.ConfigManager.load") @patch("flatpak_automatic.__main__.StateManager.load") @@ -310,6 +332,7 @@ def test_main_apply_schedule( ) -> None: args = MagicMock( check_config=False, + version=False, hide_banner=False, reload=False, apply_schedule=True,