From ad60da4a38d8c0cc664d65a5d811fe6478040988 Mon Sep 17 00:00:00 2001 From: Vitali Graf Date: Fri, 10 Apr 2026 21:17:05 +0200 Subject: [PATCH] feat: add create_tray() factory with platform dispatch Co-Authored-By: Claude Sonnet 4.6 --- tests/test_tray.py | 26 ++++++++++++++++++++++++++ whisper_local/tray/__init__.py | 21 ++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/tests/test_tray.py b/tests/test_tray.py index ab93aeb..454293d 100644 --- a/tests/test_tray.py +++ b/tests/test_tray.py @@ -242,3 +242,29 @@ class TestSettingsDialog: if captured_save_fn: captured_save_fn[0]() assert len(saved_configs) == 1 + + +class TestCreateTray: + @pytest.mark.skipif(sys.platform != "win32", reason="Win32TrayApp nur auf Windows") + def test_returns_win32_tray_on_windows(self): + from unittest.mock import MagicMock + from whisper_local.tray import create_tray + from whisper_local.tray._tray import Win32TrayApp + + tray = create_tray(on_settings=MagicMock(), on_quit=MagicMock()) + assert isinstance(tray, Win32TrayApp) + + @pytest.mark.skipif(sys.platform == "win32", reason="NoOpTray nur auf nicht-Windows") + def test_returns_noop_tray_on_non_windows(self): + from unittest.mock import MagicMock + from whisper_local.tray import create_tray + from whisper_local.tray._tray import NoOpTray + + tray = create_tray(on_settings=MagicMock(), on_quit=MagicMock()) + assert isinstance(tray, NoOpTray) + + def test_appstate_exported_from_package(self): + from whisper_local.tray import AppState + assert AppState.WAITING is not None + assert AppState.RECORDING is not None + assert AppState.TRANSCRIBING is not None diff --git a/whisper_local/tray/__init__.py b/whisper_local/tray/__init__.py index 55a8d9f..3e7be64 100644 --- a/whisper_local/tray/__init__.py +++ b/whisper_local/tray/__init__.py @@ -1 +1,20 @@ -"""Tray-Package — wird in späteren Tasks befüllt.""" +"""Tray-Package — plattformspezifische Tray-App.""" + +import sys +from typing import Callable + +from whisper_local.tray._tray import AppState, NoOpTray + + +def create_tray( + on_settings: Callable[[], None], + on_quit: Callable[[], None], +) -> "Win32TrayApp | NoOpTray": + """Gibt den plattformspezifischen Tray zurück.""" + if sys.platform == "win32": + from whisper_local.tray._tray import Win32TrayApp + return Win32TrayApp(on_settings=on_settings, on_quit=on_quit) + return NoOpTray() + + +__all__ = ["create_tray", "AppState"]