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)