diff --git a/9_Firmware/9_3_GUI/test_v7.py b/9_Firmware/9_3_GUI/test_v7.py index 0fcb98d..bb54e48 100644 --- a/9_Firmware/9_3_GUI/test_v7.py +++ b/9_Firmware/9_3_GUI/test_v7.py @@ -264,6 +264,15 @@ class TestUSBPacketParser(unittest.TestCase): # Test: v7.workers — polar_to_geographic # ============================================================================= +def _pyqt6_available(): + try: + import PyQt6.QtCore # noqa: F401 + return True + except ImportError: + return False + + +@unittest.skipUnless(_pyqt6_available(), "PyQt6 not installed") class TestPolarToGeographic(unittest.TestCase): def test_north_bearing(self): from v7.workers import polar_to_geographic @@ -326,12 +335,16 @@ class TestV7Init(unittest.TestCase): def test_key_exports(self): import v7 + # Core exports (no PyQt6 required) for name in ["RadarTarget", "RadarSettings", "GPSData", "ProcessingConfig", "FT2232HConnection", - "RadarProtocol", "RadarProcessor", - "RadarDataWorker", "RadarMapWidget", - "RadarDashboard"]: + "RadarProtocol", "RadarProcessor"]: self.assertTrue(hasattr(v7, name), f"v7 missing export: {name}") + # PyQt6-dependent exports — only present when PyQt6 is installed + if _pyqt6_available(): + for name in ["RadarDataWorker", "RadarMapWidget", + "RadarDashboard"]: + self.assertTrue(hasattr(v7, name), f"v7 missing export: {name}") # ============================================================================= diff --git a/9_Firmware/9_3_GUI/v7/__init__.py b/9_Firmware/9_3_GUI/v7/__init__.py index c5e5112..175da91 100644 --- a/9_Firmware/9_3_GUI/v7/__init__.py +++ b/9_Firmware/9_3_GUI/v7/__init__.py @@ -42,25 +42,27 @@ from .processing import ( apply_pitch_correction, ) -# Workers and simulator -from .workers import ( - RadarDataWorker, - GPSDataWorker, - TargetSimulator, - polar_to_geographic, -) +# Workers, map widget, and dashboard require PyQt6 — import lazily so that +# tests/CI environments without PyQt6 can still access models/hardware/processing. +try: + from .workers import ( + RadarDataWorker, + GPSDataWorker, + TargetSimulator, + polar_to_geographic, + ) -# Map widget -from .map_widget import ( - MapBridge, - RadarMapWidget, -) + from .map_widget import ( + MapBridge, + RadarMapWidget, + ) -# Main dashboard -from .dashboard import ( - RadarDashboard, - RangeDopplerCanvas, -) + from .dashboard import ( + RadarDashboard, + RangeDopplerCanvas, + ) +except ImportError: # PyQt6 not installed (e.g. CI headless runner) + pass __all__ = [ # noqa: RUF022 # models