diff --git a/masque/ports.py b/masque/ports.py index 323050f..e745880 100644 --- a/masque/ports.py +++ b/masque/ports.py @@ -273,6 +273,12 @@ class PortList(metaclass=ABCMeta): else: # noqa: RET505 return {k: self.ports[k] for k in key} + def measure_travel(self, src: str, dst: str) -> tuple[NDArray[numpy.float64], float | None]: + """ + Convenience wrapper for measuring travel between two named ports. + """ + return self[src].measure_travel(self[dst]) + def __contains__(self, key: str) -> NoReturn: raise NotImplementedError('PortsList.__contains__ is left unimplemented. Use `key in container.ports` instead.') diff --git a/masque/test/test_ports.py b/masque/test/test_ports.py index fa19bab..6d24879 100644 --- a/masque/test/test_ports.py +++ b/masque/test/test_ports.py @@ -47,6 +47,29 @@ def test_port_measure_travel() -> None: assert rotation == pi +def test_port_list_measure_travel() -> None: + class MyPorts(PortList): + def __init__(self) -> None: + self._ports = { + "A": Port((0, 0), 0), + "B": Port((10, 5), pi), + } + + @property + def ports(self) -> dict[str, Port]: + return self._ports + + @ports.setter + def ports(self, val: dict[str, Port]) -> None: + self._ports = val + + pl = MyPorts() + (travel, jog), rotation = pl.measure_travel("A", "B") + assert travel == 10 + assert jog == 5 + assert rotation == pi + + def test_port_describe_any_rotation() -> None: p = Port((0, 0), None) assert p.describe() == "pos=(0, 0), rot=any"