From 56eb2fa3234ba9e98232a8173df44c8efaef29c8 Mon Sep 17 00:00:00 2001 From: alxdncn Date: Tue, 23 Jun 2026 17:05:38 -0400 Subject: [PATCH] Fix BridgeApi package imports and wrapper smoke tests --- src/bridge_python_sdk/BridgeApi.py | 30 +++++++------ tests/test_imports.py | 70 ++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 13 deletions(-) create mode 100644 tests/test_imports.py diff --git a/src/bridge_python_sdk/BridgeApi.py b/src/bridge_python_sdk/BridgeApi.py index d49e878..83584d8 100644 --- a/src/bridge_python_sdk/BridgeApi.py +++ b/src/bridge_python_sdk/BridgeApi.py @@ -20,7 +20,11 @@ from typing import Any, Dict, List, Optional, Tuple import importlib.resources as ir import subprocess -from BridgeDataTypes import Window, PixelFormats, LKGCalibration, DefaultQuiltSettings + +if __package__: + from .BridgeDataTypes import Window, PixelFormats, LKGCalibration, DefaultQuiltSettings +else: # Allow legacy direct execution from src/bridge_python_sdk. + from BridgeDataTypes import Window, PixelFormats, LKGCalibration, DefaultQuiltSettings _MIN_BRIDGE_VERSION = "2.6.0" _BRIDGE_VERSION = "2.6.2" @@ -568,7 +572,7 @@ def get_tilt(self, window_handle: Window) -> float: def get_display_aspect(self, window_handle: Window) -> float: a = c_float() - if self._get_display_aspect(window_handle, byref(a)): + if self._get_displayaspect(window_handle, byref(a)): return a.value raise RuntimeError("get_displayaspect failed") @@ -687,16 +691,16 @@ def get_calibration_for_display(self, display_index: int) -> LKGCalibration: return cal # and then one‐liner wrappers for the rest of the “for_display” calls: - def get_invview_for_display(self, idx): return self._scalar_call(self._get_invview_for_display, idx, c_int32) - def get_ri_for_display(self, idx): return self._scalar_call(self._get_ri_for_display, idx, c_int32) - def get_bi_for_display(self, idx): return self._scalar_call(self._get_bi_for_display, idx, c_int32) - def get_tilt_for_display(self, idx): return self._scalar_call(self._get_tilt_for_display, idx, c_float) - def get_display_aspect_for_display(self, idx): return self._scalar_call(self._get_displayaspect_for_display, idx, c_float) - def get_fringe_for_display(self, idx): return self._scalar_call(self._get_fringe_for_display, idx, c_float) - def get_subp_for_display(self, idx): return self._scalar_call(self._get_subp_for_display, idx, c_float) - def get_viewcone_for_display(self, idx): return self._scalar_call(self._get_viewcone_for_display, idx, c_float) - def get_center_for_display(self, idx): return self._scalar_call(self._get_center_for_display, idx, c_float) - def get_pitch_for_display(self, idx): return self._scalar_call(self._get_pitch_for_display, idx, c_float) + def get_invview_for_display(self, idx): return self._scalar_call(self._get_invview_for_display, idx, c_int32, self.debug) + def get_ri_for_display(self, idx): return self._scalar_call(self._get_ri_for_display, idx, c_int32, self.debug) + def get_bi_for_display(self, idx): return self._scalar_call(self._get_bi_for_display, idx, c_int32, self.debug) + def get_tilt_for_display(self, idx): return self._scalar_call(self._get_tilt_for_display, idx, c_float, self.debug) + def get_display_aspect_for_display(self, idx): return self._scalar_call(self._get_displayaspect_for_display, idx, c_float, self.debug) + def get_fringe_for_display(self, idx): return self._scalar_call(self._get_fringe_for_display, idx, c_float, self.debug) + def get_subp_for_display(self, idx): return self._scalar_call(self._get_subp_for_display, idx, c_float, self.debug) + def get_viewcone_for_display(self, idx): return self._scalar_call(self._get_viewcone_for_display, idx, c_float, self.debug) + def get_center_for_display(self, idx): return self._scalar_call(self._get_center_for_display, idx, c_float, self.debug) + def get_pitch_for_display(self, idx): return self._scalar_call(self._get_pitch_for_display, idx, c_float, self.debug) def get_default_quilt_settings_for_display( self, idx ) -> DefaultQuiltSettings: @@ -811,4 +815,4 @@ def quiltify_rgbd(self, window_handle: Window, depthiness, depth_cutoff, focus, inp, out ): - raise RuntimeError("quiltify_rgbd failed") \ No newline at end of file + raise RuntimeError("quiltify_rgbd failed") diff --git a/tests/test_imports.py b/tests/test_imports.py new file mode 100644 index 0000000..76cba58 --- /dev/null +++ b/tests/test_imports.py @@ -0,0 +1,70 @@ +import importlib +import sys +import unittest +from pathlib import Path + + +def import_bridge_api_from_src(): + src_path = str(Path(__file__).resolve().parents[1] / "src") + sys.path.insert(0, src_path) + try: + return importlib.import_module("bridge_python_sdk.BridgeApi") + finally: + sys.path.remove(src_path) + + +class PackageImportTests(unittest.TestCase): + def test_bridge_api_imports_from_package_layout(self): + src_path = str(Path(__file__).resolve().parents[1] / "src") + sys.path.insert(0, src_path) + try: + module = importlib.import_module("bridge_python_sdk.BridgeApi") + finally: + sys.path.remove(src_path) + + self.assertTrue(hasattr(module, "BridgeAPI")) + + def test_bridge_api_imports_from_legacy_module_layout(self): + package_path = str(Path(__file__).resolve().parents[1] / "src" / "bridge_python_sdk") + sys.path.insert(0, package_path) + try: + module = importlib.import_module("BridgeApi") + finally: + sys.path.remove(package_path) + sys.modules.pop("BridgeApi", None) + + self.assertTrue(hasattr(module, "BridgeAPI")) + + +class BridgeApiWrapperTests(unittest.TestCase): + def test_get_display_aspect_uses_bound_native_name(self): + module = import_bridge_api_from_src() + api = object.__new__(module.BridgeAPI) + + def get_displayaspect(_window_handle, out): + out._obj.value = 0.75 + return True + + api._get_displayaspect = get_displayaspect + + self.assertAlmostEqual(api.get_display_aspect(123), 0.75) + + def test_for_display_scalar_wrappers_pass_debug_flag(self): + module = import_bridge_api_from_src() + api = object.__new__(module.BridgeAPI) + api.debug = False + calls = [] + + def get_pitch_for_display(display_index, out): + calls.append(display_index) + out._obj.value = 52.5 + return True + + api._get_pitch_for_display = get_pitch_for_display + + self.assertAlmostEqual(api.get_pitch_for_display(42), 52.5) + self.assertEqual(calls, [42]) + + +if __name__ == "__main__": + unittest.main()