Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 17 additions & 13 deletions src/bridge_python_sdk/BridgeApi.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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")

Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -811,4 +815,4 @@ def quiltify_rgbd(self, window_handle: Window,
depthiness, depth_cutoff, focus,
inp, out
):
raise RuntimeError("quiltify_rgbd failed")
raise RuntimeError("quiltify_rgbd failed")
70 changes: 70 additions & 0 deletions tests/test_imports.py
Original file line number Diff line number Diff line change
@@ -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()