Skip to content

Commit

Permalink
assert removed from StandardReadable.add_readables
Browse files Browse the repository at this point in the history
- added TypeGaurd to make Pylance happy.
- added TypeError raised test
  • Loading branch information
kivel committed Jan 9, 2025
1 parent a57abfd commit 2969ba5
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 16 deletions.
40 changes: 24 additions & 16 deletions src/ophyd_async/core/_readable.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from collections.abc import Awaitable, Callable, Generator, Sequence
from contextlib import contextmanager
from enum import Enum
from typing import Any, cast
from typing import Any, TypeGuard, cast

from bluesky.protocols import HasHints, Hints, Reading
from event_model import DataKey
Expand Down Expand Up @@ -205,6 +205,14 @@ def add_readables(
`StandardReadableFormat` documentation
"""

def is_signalr(device: Device) -> TypeGuard[SignalR]:
return isinstance(device, SignalR)

def assert_device_is_signalr(device: Device) -> SignalR:
if not is_signalr(device):
raise TypeError(f"{device} is not a SignalR")
return device

for device in devices:
match format:
case StandardReadableFormat.CHILD:
Expand All @@ -219,24 +227,24 @@ def add_readables(
if isinstance(device, HasHints):
self._has_hints += (device,)
case StandardReadableFormat.CONFIG_SIGNAL:
assert isinstance(device, SignalR), f"{device} is not a SignalR"
self._describe_config_funcs += (device.describe,)
self._read_config_funcs += (device.read,)
signalr_device = assert_device_is_signalr(device=device)
self._describe_config_funcs += (signalr_device.describe,)
self._read_config_funcs += (signalr_device.read,)
case StandardReadableFormat.HINTED_SIGNAL:
assert isinstance(device, SignalR), f"{device} is not a SignalR"
self._describe_funcs += (device.describe,)
self._read_funcs += (device.read,)
self._stageables += (device,)
self._has_hints += (_HintsFromName(device),)
signalr_device = assert_device_is_signalr(device=device)
self._describe_funcs += (signalr_device.describe,)
self._read_funcs += (signalr_device.read,)
self._stageables += (signalr_device,)
self._has_hints += (_HintsFromName(signalr_device),)
case StandardReadableFormat.UNCACHED_SIGNAL:
assert isinstance(device, SignalR), f"{device} is not a SignalR"
self._describe_funcs += (device.describe,)
self._read_funcs += (_UncachedRead(device),)
signalr_device = assert_device_is_signalr(device=device)
self._describe_funcs += (signalr_device.describe,)
self._read_funcs += (_UncachedRead(signalr_device),)
case StandardReadableFormat.HINTED_UNCACHED_SIGNAL:
assert isinstance(device, SignalR), f"{device} is not a SignalR"
self._describe_funcs += (device.describe,)
self._read_funcs += (_UncachedRead(device),)
self._has_hints += (_HintsFromName(device),)
signalr_device = assert_device_is_signalr(device=device)
self._describe_funcs += (signalr_device.describe,)
self._read_funcs += (_UncachedRead(signalr_device),)
self._has_hints += (_HintsFromName(signalr_device),)


class _UncachedRead:
Expand Down
19 changes: 19 additions & 0 deletions tests/core/test_readable.py
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,25 @@ def test_standard_readable_add_readables_adds_to_expected_attrs(
assert_sr_has_attrs(sr, expected_attrs)


@pytest.mark.parametrize(
"format",
[
Format.CONFIG_SIGNAL,
Format.HINTED_SIGNAL,
Format.UNCACHED_SIGNAL,
Format.HINTED_UNCACHED_SIGNAL,
],
)
def test_standard_readable_add_readables_raises_signalr_typeerror(format) -> None:
# Mock a Device instance that is not a SignalR
mock_device = MagicMock(spec=Device)
sr = StandardReadable()

# Ensure it raises TypeError
with pytest.raises(TypeError, match=f"{mock_device} is not a SignalR"):
sr.add_readables([mock_device], format=format)


def test_standard_readable_config_signal():
signal_r = MagicMock(spec=SignalR)
sr = StandardReadable()
Expand Down

0 comments on commit 2969ba5

Please sign in to comment.