From 3c3ea4444d61946d6a8c898d6d2790c12f4dd646 Mon Sep 17 00:00:00 2001 From: Ralph Mayola Date: Sun, 23 Aug 2026 18:13:12 +0200 Subject: [PATCH] Deplace l'overlay Cocoa derriere le contrat Overlay, sans le modifier Co-Authored-By: Claude Opus 5 --- app.py | 4 ++-- interface/__init__.py | 11 +++++++++++ interface/cocoa/__init__.py | 0 pulse_window.py => interface/cocoa/overlay.py | 0 tests/test_interface.py | 16 ++++++++++++++++ 5 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 interface/__init__.py create mode 100644 interface/cocoa/__init__.py rename pulse_window.py => interface/cocoa/overlay.py (100%) create mode 100644 tests/test_interface.py diff --git a/app.py b/app.py index 20d2d89..00c43e0 100644 --- a/app.py +++ b/app.py @@ -30,7 +30,7 @@ from pynput import keyboard from controller import ZonzaController from core import CONFIG, validate_config -from pulse_window import PulseWindow +from interface import classe_overlay_pour from systeme import choisir_systeme _STATE_TITLES = { @@ -49,7 +49,7 @@ class ZonzaApp(NSObject): return None self._item = None self._sounds_item = None - self.pulse = PulseWindow.alloc().init() + self.pulse = classe_overlay_pour().alloc().init() self.controller = ZonzaController( CONFIG, self.pulse, on_state=self._set_state, run_on_main=AppHelper.callAfter, diff --git a/interface/__init__.py b/interface/__init__.py new file mode 100644 index 0000000..5f6ca76 --- /dev/null +++ b/interface/__init__.py @@ -0,0 +1,11 @@ +"""Choisit l'implĂ©mentation d'overlay selon la plateforme.""" +import sys + + +def classe_overlay_pour(plateforme=None): + """Rend la CLASSE d'overlay (pas une instance : Cocoa exige `alloc().init()`).""" + plateforme = plateforme or sys.platform + if plateforme.startswith("darwin"): + from interface.cocoa.overlay import PulseWindow + return PulseWindow + raise NotImplementedError(f"Aucune interface pour : {plateforme}") diff --git a/interface/cocoa/__init__.py b/interface/cocoa/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pulse_window.py b/interface/cocoa/overlay.py similarity index 100% rename from pulse_window.py rename to interface/cocoa/overlay.py diff --git a/tests/test_interface.py b/tests/test_interface.py new file mode 100644 index 0000000..9f40b79 --- /dev/null +++ b/tests/test_interface.py @@ -0,0 +1,16 @@ +"""La fabrique rend un overlay conforme au contrat, sans ouvrir de fenĂȘtre.""" +import pytest + +from interface import classe_overlay_pour + + +def test_l_overlay_macos_declare_tout_le_contrat(): + classe = classe_overlay_pour("darwin") + for methode in ("show", "hide", "set_level", "set_status", "rearmer_garde"): + assert callable(getattr(classe, methode, None)), f"{methode} manque" + + +def test_une_plateforme_inconnue_est_refusee_clairement(): + with pytest.raises(NotImplementedError) as e: + classe_overlay_pour("haiku-os") + assert "haiku-os" in str(e.value)