What's Changed
* Add test for context race condition by DominicOram in https://github.com/bluesky/ophyd-async/pull/600
* New signal typing by coretl in https://github.com/bluesky/ophyd-async/pull/594
* Update copier template to 2.4.0 by coretl in https://github.com/bluesky/ophyd-async/pull/628
* Logo by coretl in https://github.com/bluesky/ophyd-async/pull/629
Breaking changes
pvi structure changes
Structure now read from `.value` rather than `.pvi`. Supported in FastCS. Requires at least PandABlocks-ioc 0.10.0
`StrictEnum` is now requried for all strictly checked `Enums`
python
old
from enum import Enum
class MyEnum(str, Enum):
ONE = "one"
TWO = "two"
new
from ophyd_async.core import StrictEnum
class MyEnum(StrictEnum):
ONE = "one"
TWO = "two"
`SubsetEnum` is now an `Enum` subclass:
python
from ophyd_async.core import SubsetEnum
old
MySubsetEnum = SubsetEnum["one", "two"]
new
class MySubsetEnum(SubsetEnum):
ONE = "one"
TWO = "two"
Use python primitives for scalar types instead of numpy types
python
old
import numpy as np
x = epics_signal_rw(np.int32, "PV")
new
x = epics_signal_rw(int, "PV")
Use `Array1D` for 1D arrays instead of `npt.NDArray`
python
import numpy as np
old
import numpy.typing as npt
x = epics_signal_rw(npt.NDArray[np.int32], "PV")
new
from ophyd_async.core import Array1D
x = epics_signal_rw(Array1D[np.int32], "PV")
Use `Sequence[str]` for arrays of strings instead of `npt.NDArray[np.str_]`
python
import numpy as np
old
import numpy.typing as npt
x = epics_signal_rw(npt.NDArray[np.str_], "PV")
new
from collections.abc import Sequence
x = epics_signal_rw(Sequence[str], "PV")
`MockSignalBackend` requires a real backend
python
old
fake_set_signal = SignalRW(MockSignalBackend(float))
new
fake_set_signal = soft_signal_rw(float)
await fake_set_signal.connect(mock=True)
`get_mock_put` is no longer passed timeout as it is handled in `Signal`
python
old
get_mock_put(driver.capture).assert_called_once_with(Writing.ON, wait=ANY, timeout=ANY)
new
get_mock_put(driver.capture).assert_called_once_with(Writing.ON, wait=ANY)
`super().__init__` required for `Device` subclasses
python
old
class MyDevice(Device):
def __init__(self, name: str = ""):
self.signal, self.backend_put = soft_signal_r_and_setter(int)
new
class MyDevice(Device):
def __init__(self, name: str = ""):
self.signal, self.backend_put = soft_signal_r_and_setter(int)
super().__init__(name=name)
Arbitrary `BaseModel`s not supported, pending use cases for them
The `Table` type has been suitable for everything we have seen so far, if you need an arbitrary `BaseModel` subclass then please make an issue
Child `Device`s set parent on attach, and can't be public children of more than one parent
python
class SourceDevice(Device):
def __init__(self, name: str = ""):
self.signal = soft_signal_rw(int)
super().__init__(name=name)
old
class ReferenceDevice(Device):
def __init__(self, signal: SignalRW[int], name: str = ""):
self.signal = signal
super().__init__(name=name)
def set(self, value) -> AsyncStatus:
return self.signal.set(value + 1)
new
from ophyd_async.core import Reference
class ReferenceDevice(Device):
def __init__(self, signal: SignalRW[int], name: str = ""):
self._signal_ref = Reference(signal)
super().__init__(name=name)
def set(self, value) -> AsyncStatus:
return self._signal_ref().set(value + 1)
**Full Changelog**: https://github.com/bluesky/ophyd-async/compare/v0.7.0...v0.8.0a1