ophyd-async 0.8.0a5__py3-none-any.whl → 0.9.0a1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. ophyd_async/_version.py +2 -2
  2. ophyd_async/core/__init__.py +4 -26
  3. ophyd_async/core/_detector.py +9 -9
  4. ophyd_async/core/_device.py +27 -8
  5. ophyd_async/core/_protocol.py +0 -28
  6. ophyd_async/core/_signal.py +111 -136
  7. ophyd_async/core/_table.py +9 -4
  8. ophyd_async/core/_utils.py +11 -2
  9. ophyd_async/epics/adaravis/_aravis_controller.py +8 -8
  10. ophyd_async/epics/adaravis/_aravis_io.py +4 -4
  11. ophyd_async/epics/adcore/_core_io.py +21 -21
  12. ophyd_async/epics/adcore/_core_logic.py +6 -3
  13. ophyd_async/epics/adcore/_hdf_writer.py +6 -3
  14. ophyd_async/epics/adcore/_single_trigger.py +1 -1
  15. ophyd_async/epics/adcore/_utils.py +35 -35
  16. ophyd_async/epics/adkinetix/_kinetix_controller.py +7 -7
  17. ophyd_async/epics/adkinetix/_kinetix_io.py +7 -7
  18. ophyd_async/epics/adpilatus/_pilatus.py +3 -3
  19. ophyd_async/epics/adpilatus/_pilatus_controller.py +4 -4
  20. ophyd_async/epics/adpilatus/_pilatus_io.py +5 -5
  21. ophyd_async/epics/adsimdetector/_sim_controller.py +2 -2
  22. ophyd_async/epics/advimba/_vimba_controller.py +14 -14
  23. ophyd_async/epics/advimba/_vimba_io.py +23 -23
  24. ophyd_async/epics/core/_p4p.py +19 -0
  25. ophyd_async/epics/core/_pvi_connector.py +4 -2
  26. ophyd_async/epics/core/_signal.py +9 -2
  27. ophyd_async/epics/core/_util.py +9 -0
  28. ophyd_async/epics/demo/_mover.py +2 -2
  29. ophyd_async/epics/demo/_sensor.py +2 -2
  30. ophyd_async/epics/eiger/_eiger_controller.py +10 -5
  31. ophyd_async/epics/eiger/_eiger_io.py +3 -3
  32. ophyd_async/epics/motor.py +8 -5
  33. ophyd_async/epics/testing/__init__.py +24 -0
  34. ophyd_async/epics/testing/_example_ioc.py +107 -0
  35. ophyd_async/epics/testing/_utils.py +78 -0
  36. ophyd_async/epics/testing/test_records.db +158 -0
  37. ophyd_async/epics/testing/test_records_pva.db +177 -0
  38. ophyd_async/fastcs/core.py +2 -2
  39. ophyd_async/fastcs/panda/_block.py +9 -9
  40. ophyd_async/fastcs/panda/_control.py +2 -2
  41. ophyd_async/fastcs/panda/_hdf_panda.py +4 -1
  42. ophyd_async/fastcs/panda/_trigger.py +7 -7
  43. ophyd_async/plan_stubs/_fly.py +1 -1
  44. ophyd_async/sim/demo/_sim_motor.py +34 -32
  45. ophyd_async/tango/__init__.py +0 -43
  46. ophyd_async/tango/{signal → core}/__init__.py +7 -2
  47. ophyd_async/tango/{base_devices → core}/_base_device.py +38 -64
  48. ophyd_async/tango/{signal → core}/_signal.py +13 -3
  49. ophyd_async/tango/{base_devices → core}/_tango_readable.py +3 -4
  50. ophyd_async/tango/{signal → core}/_tango_transport.py +1 -1
  51. ophyd_async/tango/demo/_counter.py +6 -7
  52. ophyd_async/tango/demo/_mover.py +8 -7
  53. ophyd_async/testing/__init__.py +33 -0
  54. ophyd_async/testing/_assert.py +128 -0
  55. ophyd_async/{core → testing}/_mock_signal_utils.py +12 -8
  56. ophyd_async/testing/_wait_for_pending.py +22 -0
  57. {ophyd_async-0.8.0a5.dist-info → ophyd_async-0.9.0a1.dist-info}/METADATA +49 -47
  58. ophyd_async-0.9.0a1.dist-info/RECORD +119 -0
  59. {ophyd_async-0.8.0a5.dist-info → ophyd_async-0.9.0a1.dist-info}/WHEEL +1 -1
  60. ophyd_async/tango/base_devices/__init__.py +0 -4
  61. ophyd_async-0.8.0a5.dist-info/RECORD +0 -112
  62. {ophyd_async-0.8.0a5.dist-info → ophyd_async-0.9.0a1.dist-info}/LICENSE +0 -0
  63. {ophyd_async-0.8.0a5.dist-info → ophyd_async-0.9.0a1.dist-info}/entry_points.txt +0 -0
  64. {ophyd_async-0.8.0a5.dist-info → ophyd_async-0.9.0a1.dist-info}/top_level.txt +0 -0
@@ -189,7 +189,7 @@ class AttributeProxy(TangoProxy):
189
189
  raise TimeoutError(f"{self._name} attr put failed: Timeout") from te
190
190
  except DevFailed as de:
191
191
  raise RuntimeError(
192
- f"{self._name} device" f" failure: {de.args[0].desc}"
192
+ f"{self._name} device failure: {de.args[0].desc}"
193
193
  ) from de
194
194
 
195
195
  else:
@@ -2,18 +2,17 @@ from typing import Annotated as A
2
2
 
3
3
  from ophyd_async.core import DEFAULT_TIMEOUT, AsyncStatus, SignalR, SignalRW, SignalX
4
4
  from ophyd_async.core import StandardReadableFormat as Format
5
- from ophyd_async.tango import TangoReadable, tango_polling
5
+ from ophyd_async.tango.core import TangoPolling, TangoReadable
6
6
 
7
7
 
8
- # Enable device level polling, useful for servers that do not support events
9
- # Polling for individual signal can be enabled with a dict
10
- @tango_polling({"counts": (1.0, 0.1, 0.1), "sample_time": (0.1, 0.1, 0.1)})
11
8
  class TangoCounter(TangoReadable):
12
9
  # Enter the name and type of the signals you want to use
13
- # If type is None or Signal, the type will be inferred from the Tango device
14
- counts: A[SignalR[int], Format.HINTED_SIGNAL]
15
- sample_time: A[SignalRW[float], Format.CONFIG_SIGNAL]
10
+ # If the server doesn't support events, the TangoPolling annotation gives
11
+ # the parameters for ophyd to poll instead
12
+ counts: A[SignalR[int], Format.HINTED_SIGNAL, TangoPolling(1.0, 0.1, 0.1)]
13
+ sample_time: A[SignalRW[float], Format.CONFIG_SIGNAL, TangoPolling(0.1, 0.1, 0.1)]
16
14
  start: SignalX
15
+ # If a tango name clashes with a bluesky verb, add a trailing underscore
17
16
  reset_: SignalX
18
17
 
19
18
  @AsyncStatus.wrap
@@ -1,4 +1,5 @@
1
1
  import asyncio
2
+ from typing import Annotated as A
2
3
 
3
4
  from bluesky.protocols import Movable, Stoppable
4
5
 
@@ -16,18 +17,18 @@ from ophyd_async.core import (
16
17
  wait_for_value,
17
18
  )
18
19
  from ophyd_async.core import StandardReadableFormat as Format
19
- from ophyd_async.tango import TangoReadable, tango_polling
20
+ from ophyd_async.tango.core import TangoPolling, TangoReadable
20
21
  from tango import DevState
21
22
 
22
23
 
23
- # Enable device level polling, useful for servers that do not support events
24
- @tango_polling((0.1, 0.1, 0.1))
25
24
  class TangoMover(TangoReadable, Movable, Stoppable):
26
25
  # Enter the name and type of the signals you want to use
27
- # If type is None or Signal, the type will be inferred from the Tango device
28
- position: SignalRW[float]
29
- velocity: SignalRW[float]
30
- state: SignalR[DevState]
26
+ # If the server doesn't support events, the TangoPolling annotation gives
27
+ # the parameters for ophyd to poll instead
28
+ position: A[SignalRW[float], TangoPolling(0.1, 0.1, 0.1)]
29
+ velocity: A[SignalRW[float], TangoPolling(0.1, 0.1, 0.1)]
30
+ state: A[SignalR[DevState], TangoPolling(0.1)]
31
+ # If a tango name clashes with a bluesky verb, add a trailing underscore
31
32
  stop_: SignalX
32
33
 
33
34
  def __init__(self, trl: str | None = "", name=""):
@@ -0,0 +1,33 @@
1
+ from ._assert import (
2
+ assert_configuration,
3
+ assert_emitted,
4
+ assert_reading,
5
+ assert_value,
6
+ )
7
+ from ._mock_signal_utils import (
8
+ callback_on_mock_put,
9
+ get_mock,
10
+ get_mock_put,
11
+ mock_puts_blocked,
12
+ reset_mock_put_calls,
13
+ set_mock_put_proceeds,
14
+ set_mock_value,
15
+ set_mock_values,
16
+ )
17
+ from ._wait_for_pending import wait_for_pending_wakeups
18
+
19
+ __all__ = [
20
+ "assert_configuration",
21
+ "assert_emitted",
22
+ "assert_reading",
23
+ "assert_value",
24
+ "callback_on_mock_put",
25
+ "get_mock",
26
+ "get_mock_put",
27
+ "mock_puts_blocked",
28
+ "reset_mock_put_calls",
29
+ "set_mock_put_proceeds",
30
+ "set_mock_value",
31
+ "set_mock_values",
32
+ "wait_for_pending_wakeups",
33
+ ]
@@ -0,0 +1,128 @@
1
+ from collections.abc import Mapping
2
+ from typing import Any
3
+
4
+ from bluesky.protocols import Reading
5
+
6
+ from ophyd_async.core import AsyncConfigurable, AsyncReadable, SignalDatatypeT, SignalR
7
+
8
+
9
+ def _generate_assert_error_msg(name: str, expected_result, actual_result) -> str:
10
+ WARNING = "\033[93m"
11
+ FAIL = "\033[91m"
12
+ ENDC = "\033[0m"
13
+ return (
14
+ f"Expected {WARNING}{name}{ENDC} to produce"
15
+ + f"\n{FAIL}{expected_result}{ENDC}"
16
+ + f"\nbut actually got \n{FAIL}{actual_result}{ENDC}"
17
+ )
18
+
19
+
20
+ async def assert_value(signal: SignalR[SignalDatatypeT], value: Any) -> None:
21
+ """Assert a signal's value and compare it an expected signal.
22
+
23
+ Parameters
24
+ ----------
25
+ signal:
26
+ signal with get_value.
27
+ value:
28
+ The expected value from the signal.
29
+
30
+ Notes
31
+ -----
32
+ Example usage::
33
+ await assert_value(signal, value)
34
+
35
+ """
36
+ actual_value = await signal.get_value()
37
+ assert actual_value == value, _generate_assert_error_msg(
38
+ name=signal.name,
39
+ expected_result=value,
40
+ actual_result=actual_value,
41
+ )
42
+
43
+
44
+ async def assert_reading(
45
+ readable: AsyncReadable, expected_reading: Mapping[str, Reading]
46
+ ) -> None:
47
+ """Assert readings from readable.
48
+
49
+ Parameters
50
+ ----------
51
+ readable:
52
+ Callable with readable.read function that generate readings.
53
+
54
+ reading:
55
+ The expected readings from the readable.
56
+
57
+ Notes
58
+ -----
59
+ Example usage::
60
+ await assert_reading(readable, reading)
61
+
62
+ """
63
+ actual_reading = await readable.read()
64
+ assert expected_reading == actual_reading, _generate_assert_error_msg(
65
+ name=readable.name,
66
+ expected_result=expected_reading,
67
+ actual_result=actual_reading,
68
+ )
69
+
70
+
71
+ async def assert_configuration(
72
+ configurable: AsyncConfigurable,
73
+ configuration: Mapping[str, Reading],
74
+ ) -> None:
75
+ """Assert readings from Configurable.
76
+
77
+ Parameters
78
+ ----------
79
+ configurable:
80
+ Configurable with Configurable.read function that generate readings.
81
+
82
+ configuration:
83
+ The expected readings from configurable.
84
+
85
+ Notes
86
+ -----
87
+ Example usage::
88
+ await assert_configuration(configurable configuration)
89
+
90
+ """
91
+ actual_configurable = await configurable.read_configuration()
92
+ assert configuration == actual_configurable, _generate_assert_error_msg(
93
+ name=configurable.name,
94
+ expected_result=configuration,
95
+ actual_result=actual_configurable,
96
+ )
97
+
98
+
99
+ def assert_emitted(docs: Mapping[str, list[dict]], **numbers: int):
100
+ """Assert emitted document generated by running a Bluesky plan
101
+
102
+ Parameters
103
+ ----------
104
+ Doc:
105
+ A dictionary
106
+
107
+ numbers:
108
+ expected emission in kwarg from
109
+
110
+ Notes
111
+ -----
112
+ Example usage::
113
+ docs = defaultdict(list)
114
+ RE.subscribe(lambda name, doc: docs[name].append(doc))
115
+ RE(my_plan())
116
+ assert_emitted(docs, start=1, descriptor=1, event=1, stop=1)
117
+ """
118
+ assert list(docs) == list(numbers), _generate_assert_error_msg(
119
+ name="documents",
120
+ expected_result=list(numbers),
121
+ actual_result=list(docs),
122
+ )
123
+ actual_numbers = {name: len(d) for name, d in docs.items()}
124
+ assert actual_numbers == numbers, _generate_assert_error_msg(
125
+ name="emitted",
126
+ expected_result=numbers,
127
+ actual_result=actual_numbers,
128
+ )
@@ -1,12 +1,16 @@
1
1
  from collections.abc import Awaitable, Callable, Iterable
2
- from contextlib import asynccontextmanager, contextmanager
2
+ from contextlib import contextmanager
3
3
  from unittest.mock import AsyncMock, Mock
4
4
 
5
- from ._device import Device
6
- from ._mock_signal_backend import MockSignalBackend
7
- from ._signal import Signal, SignalConnector, SignalR
8
- from ._soft_signal_backend import SignalDatatypeT
9
- from ._utils import LazyMock
5
+ from ophyd_async.core import (
6
+ Device,
7
+ LazyMock,
8
+ MockSignalBackend,
9
+ Signal,
10
+ SignalConnector,
11
+ SignalDatatypeT,
12
+ SignalR,
13
+ )
10
14
 
11
15
 
12
16
  def get_mock(device: Device | Signal) -> Mock:
@@ -40,8 +44,8 @@ def set_mock_put_proceeds(signal: Signal, proceeds: bool):
40
44
  backend.put_proceeds.clear()
41
45
 
42
46
 
43
- @asynccontextmanager
44
- async def mock_puts_blocked(*signals: Signal):
47
+ @contextmanager
48
+ def mock_puts_blocked(*signals: Signal):
45
49
  for signal in signals:
46
50
  set_mock_put_proceeds(signal, False)
47
51
  yield
@@ -0,0 +1,22 @@
1
+ import asyncio
2
+
3
+
4
+ async def wait_for_pending_wakeups(max_yields=20, raise_if_exceeded=True):
5
+ """Allow any ready asyncio tasks to be woken up.
6
+
7
+ Used in:
8
+
9
+ - Tests to allow tasks like ``set()`` to start so that signal
10
+ puts can be tested
11
+ - `observe_value` to allow it to be wrapped in `asyncio.wait_for`
12
+ with a timeout
13
+ """
14
+ loop = asyncio.get_event_loop()
15
+ # If anything has called loop.call_soon or is scheduled a wakeup
16
+ # then let it run
17
+ for _ in range(max_yields):
18
+ await asyncio.sleep(0)
19
+ if not loop._ready: # type: ignore # noqa: SLF001
20
+ return
21
+ if raise_if_exceeded:
22
+ raise RuntimeError(f"Tasks still scheduling wakeups after {max_yields} yields")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ophyd-async
3
- Version: 0.8.0a5
3
+ Version: 0.9.0a1
4
4
  Summary: Asynchronous Bluesky hardware abstraction code, compatible with control systems like EPICS and Tango
5
5
  Author-email: Tom Cobb <tom.cobb@diamond.ac.uk>
6
6
  License: BSD 3-Clause License
@@ -37,65 +37,67 @@ Classifier: Development Status :: 3 - Alpha
37
37
  Classifier: License :: OSI Approved :: BSD License
38
38
  Classifier: Programming Language :: Python :: 3.10
39
39
  Classifier: Programming Language :: Python :: 3.11
40
+ Classifier: Programming Language :: Python :: 3.12
40
41
  Requires-Python: >=3.10
41
42
  Description-Content-Type: text/markdown
42
43
  License-File: LICENSE
43
- Requires-Dist: networkx >=2.0
44
+ Requires-Dist: networkx>=2.0
44
45
  Requires-Dist: numpy
45
46
  Requires-Dist: packaging
46
47
  Requires-Dist: pint
47
- Requires-Dist: bluesky >=1.13
48
- Requires-Dist: event-model >=1.22.1
49
- Requires-Dist: p4p >=4.2.0a3
48
+ Requires-Dist: bluesky>=1.13
49
+ Requires-Dist: event-model>=1.22.1
50
+ Requires-Dist: p4p>=4.2.0a3
50
51
  Requires-Dist: pyyaml
51
52
  Requires-Dist: colorlog
52
- Requires-Dist: pydantic >=2.0
53
+ Requires-Dist: pydantic>=2.0
53
54
  Requires-Dist: pydantic-numpy
54
55
  Provides-Extra: ca
55
- Requires-Dist: aioca >=1.6 ; extra == 'ca'
56
- Provides-Extra: dev
57
- Requires-Dist: ophyd-async[pva] ; extra == 'dev'
58
- Requires-Dist: ophyd-async[sim] ; extra == 'dev'
59
- Requires-Dist: ophyd-async[ca] ; extra == 'dev'
60
- Requires-Dist: ophyd-async[tango] ; extra == 'dev'
61
- Requires-Dist: inflection ; extra == 'dev'
62
- Requires-Dist: ipython ; extra == 'dev'
63
- Requires-Dist: ipywidgets ; extra == 'dev'
64
- Requires-Dist: matplotlib ; extra == 'dev'
65
- Requires-Dist: myst-parser ; extra == 'dev'
66
- Requires-Dist: numpydoc ; extra == 'dev'
67
- Requires-Dist: ophyd ; extra == 'dev'
68
- Requires-Dist: pickleshare ; extra == 'dev'
69
- Requires-Dist: pipdeptree ; extra == 'dev'
70
- Requires-Dist: pre-commit ; extra == 'dev'
71
- Requires-Dist: pydata-sphinx-theme >=0.12 ; extra == 'dev'
72
- Requires-Dist: pyepics >=3.4.2 ; extra == 'dev'
73
- Requires-Dist: pyright ; extra == 'dev'
74
- Requires-Dist: pyside6 ==6.7.0 ; extra == 'dev'
75
- Requires-Dist: pytest ; extra == 'dev'
76
- Requires-Dist: pytest-asyncio ; extra == 'dev'
77
- Requires-Dist: pytest-cov ; extra == 'dev'
78
- Requires-Dist: pytest-faulthandler ; extra == 'dev'
79
- Requires-Dist: pytest-forked ; extra == 'dev'
80
- Requires-Dist: pytest-rerunfailures ; extra == 'dev'
81
- Requires-Dist: pytest-timeout ; extra == 'dev'
82
- Requires-Dist: ruff ; extra == 'dev'
83
- Requires-Dist: sphinx <7.4.0 ; extra == 'dev'
84
- Requires-Dist: sphinx-autobuild ; extra == 'dev'
85
- Requires-Dist: autodoc-pydantic ; extra == 'dev'
86
- Requires-Dist: sphinxcontrib-mermaid ; extra == 'dev'
87
- Requires-Dist: sphinx-copybutton ; extra == 'dev'
88
- Requires-Dist: sphinx-design ; extra == 'dev'
89
- Requires-Dist: super-state-machine ; extra == 'dev'
90
- Requires-Dist: tox-direct ; extra == 'dev'
91
- Requires-Dist: types-mock ; extra == 'dev'
92
- Requires-Dist: types-pyyaml ; extra == 'dev'
56
+ Requires-Dist: aioca>=1.6; extra == "ca"
93
57
  Provides-Extra: pva
94
- Requires-Dist: p4p ; extra == 'pva'
58
+ Requires-Dist: p4p; extra == "pva"
95
59
  Provides-Extra: sim
96
- Requires-Dist: h5py ; extra == 'sim'
60
+ Requires-Dist: h5py; extra == "sim"
97
61
  Provides-Extra: tango
98
- Requires-Dist: pytango >=10.0.0 ; extra == 'tango'
62
+ Requires-Dist: pytango>=10.0.0; extra == "tango"
63
+ Provides-Extra: dev
64
+ Requires-Dist: ophyd_async[pva]; extra == "dev"
65
+ Requires-Dist: ophyd_async[sim]; extra == "dev"
66
+ Requires-Dist: ophyd_async[ca]; extra == "dev"
67
+ Requires-Dist: ophyd_async[tango]; extra == "dev"
68
+ Requires-Dist: inflection; extra == "dev"
69
+ Requires-Dist: ipython; extra == "dev"
70
+ Requires-Dist: ipywidgets; extra == "dev"
71
+ Requires-Dist: import-linter; extra == "dev"
72
+ Requires-Dist: matplotlib; extra == "dev"
73
+ Requires-Dist: myst-parser; extra == "dev"
74
+ Requires-Dist: numpydoc; extra == "dev"
75
+ Requires-Dist: ophyd; extra == "dev"
76
+ Requires-Dist: pickleshare; extra == "dev"
77
+ Requires-Dist: pipdeptree; extra == "dev"
78
+ Requires-Dist: pre-commit; extra == "dev"
79
+ Requires-Dist: pydata-sphinx-theme>=0.12; extra == "dev"
80
+ Requires-Dist: pyepics>=3.4.2; extra == "dev"
81
+ Requires-Dist: pyright; extra == "dev"
82
+ Requires-Dist: pyside6==6.7.0; extra == "dev"
83
+ Requires-Dist: pytest; extra == "dev"
84
+ Requires-Dist: pytest-asyncio; extra == "dev"
85
+ Requires-Dist: pytest-cov; extra == "dev"
86
+ Requires-Dist: pytest-faulthandler; extra == "dev"
87
+ Requires-Dist: pytest-forked; extra == "dev"
88
+ Requires-Dist: pytest-rerunfailures; extra == "dev"
89
+ Requires-Dist: pytest-timeout; extra == "dev"
90
+ Requires-Dist: ruff; extra == "dev"
91
+ Requires-Dist: sphinx<7.4.0; extra == "dev"
92
+ Requires-Dist: sphinx-autobuild; extra == "dev"
93
+ Requires-Dist: autodoc-pydantic; extra == "dev"
94
+ Requires-Dist: sphinxcontrib-mermaid; extra == "dev"
95
+ Requires-Dist: sphinx-copybutton; extra == "dev"
96
+ Requires-Dist: sphinx-design; extra == "dev"
97
+ Requires-Dist: super_state_machine; extra == "dev"
98
+ Requires-Dist: tox-direct; extra == "dev"
99
+ Requires-Dist: types-mock; extra == "dev"
100
+ Requires-Dist: types-pyyaml; extra == "dev"
99
101
 
100
102
  [![CI](https://github.com/bluesky/ophyd-async/actions/workflows/ci.yml/badge.svg)](https://github.com/bluesky/ophyd-async/actions/workflows/ci.yml)
101
103
  [![Coverage](https://codecov.io/gh/bluesky/ophyd-async/branch/main/graph/badge.svg)](https://codecov.io/gh/bluesky/ophyd-async)
@@ -0,0 +1,119 @@
1
+ ophyd_async/__init__.py,sha256=tEfgj45lRItQ-_u8SRFPM-mpBh3gWvHXr3emhiJJG_M,225
2
+ ophyd_async/__main__.py,sha256=n_U4O9bgm97OuboUB_9eK7eFiwy8BZSgXJ0OzbE0DqU,481
3
+ ophyd_async/_version.py,sha256=fqly1zb7P_f9515NUzRb7AMheEwRLpJkaVG_Pep_nis,413
4
+ ophyd_async/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ ophyd_async/core/__init__.py,sha256=GQCfHqV_nypbNkzzycqq_JxCnIIP1rwBiSB9gBq1EE0,3805
6
+ ophyd_async/core/_detector.py,sha256=Zyrc5dMSmOM4bC_tOXHFfWtXnTtEQGkrAN6kydvUIFw,14307
7
+ ophyd_async/core/_device.py,sha256=oIC-P6Lu6MDAdB_bHPzuT-ox8gTBAcjRNRNEh89IABk,13000
8
+ ophyd_async/core/_device_filler.py,sha256=Nw-DUyuXYpvt4mmCAQaNVA0LFBBaPK84ubZo3bR39Ak,11407
9
+ ophyd_async/core/_device_save_loader.py,sha256=OViN9_LWNOLuajzrHDKYEqd5I47u5npQACdGceKcIGY,8375
10
+ ophyd_async/core/_flyer.py,sha256=us5z6MNGCvIfgPDTmFTxNERSP37g0WVRkRD0Z2JiMgM,1701
11
+ ophyd_async/core/_hdf_dataset.py,sha256=wW_OL8OYLGOsE01ny3hGaapOrxK7BzhWTxKgz8CIXK0,2492
12
+ ophyd_async/core/_log.py,sha256=UbL9AtnHVUg7r9LofzgmuKEtBESy03usCp7ejmDltG4,3679
13
+ ophyd_async/core/_mock_signal_backend.py,sha256=8Upnz6QrSigeDXemjZ-jB4sV2yIPUzid-6GOfTZ-7Io,2805
14
+ ophyd_async/core/_protocol.py,sha256=0pwF_EUu7LZjr-Hg6LKy6B1-5y4gpsU81JsPiNI5g_s,3317
15
+ ophyd_async/core/_providers.py,sha256=ff9ZT5-PZ6rhTTdE-q8w9l_k9DuZqLWLebsKZLeJ0Ds,7112
16
+ ophyd_async/core/_readable.py,sha256=7FxqxhAT1wBQqOEivgnY731zA9QoK1Tt-ZGcH7GBOXM,10623
17
+ ophyd_async/core/_signal.py,sha256=KCIJongFllgRBRJxN1EjsmYR17qTu_wBm-b1OrdhT2w,20558
18
+ ophyd_async/core/_signal_backend.py,sha256=YWPgLSPbfPnWIUDHvP1ArCVK8zKXJxzzbloqQe_ucCI,5040
19
+ ophyd_async/core/_soft_signal_backend.py,sha256=w9zzD4eoD9SsJpORXNSaFOLJrD6biYBbCSVAybLa_7k,5926
20
+ ophyd_async/core/_status.py,sha256=OUKhblRQ4KU5PDsWbpvYduM7G60JMk1NqeV4eqyPtKc,5131
21
+ ophyd_async/core/_table.py,sha256=tNu396gDGjpX1xUBQXgKI7aiDugaBl2McH_kVZPn_kQ,5535
22
+ ophyd_async/core/_utils.py,sha256=bzgxs1KdB35mkONzpDOg3eH6bVMIbJt49qRY0PrFqi4,9870
23
+ ophyd_async/epics/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ ophyd_async/epics/motor.py,sha256=d5EwfpTmblxuO1H37rzIOTDgNy1OlZmp10FWXOVUQ4o,9076
25
+ ophyd_async/epics/signal.py,sha256=hJCGIIWjRVhjEHkeL1I_oPEaaN7dDFKmm7G7ZmgoTYQ,219
26
+ ophyd_async/epics/adaravis/__init__.py,sha256=u979_9nQTYB0TvDOTXFN4qMrbDP8-xQFfXYMGzLVBo4,207
27
+ ophyd_async/epics/adaravis/_aravis.py,sha256=XBuLQBZYj2tptY39bVzXjl6t-ZpPwqrUOwpR54l-hSo,1952
28
+ ophyd_async/epics/adaravis/_aravis_controller.py,sha256=3zt-BWr-UnM1nguphHhJBNHXgBD6ntzifYXYL2o9VCM,2831
29
+ ophyd_async/epics/adaravis/_aravis_io.py,sha256=_RViDrTDaTutitRbHlJ5VV23X70lvfhyY3DTzgXy6yI,1603
30
+ ophyd_async/epics/adcore/__init__.py,sha256=3wMOyFGaq1X61LqK4iY4pq-m_BjhOgYZD2-mNCAjpzk,1086
31
+ ophyd_async/epics/adcore/_core_io.py,sha256=4yGdsV-uivrJYas07fDFbjNwnqJukB654YneBHGsZJU,6076
32
+ ophyd_async/epics/adcore/_core_logic.py,sha256=2QUWoHc6wJDwFVV81CN0rAOxhgb0SFJNLCeBxKv1Fi4,3632
33
+ ophyd_async/epics/adcore/_hdf_writer.py,sha256=y0K-u3E27a8vJTklvyKrWlzRPNBp1G7DHipUtvUtOWc,7338
34
+ ophyd_async/epics/adcore/_single_trigger.py,sha256=5-s0kgqqrPeNv9gjAB2pNXuxa9oEgwt9KBq58JRta6Y,1208
35
+ ophyd_async/epics/adcore/_utils.py,sha256=qXOT79_CNwtO8BdpHybi4meG3Xq4pqEvWYW-Jjt_elA,3932
36
+ ophyd_async/epics/adkinetix/__init__.py,sha256=cvnwOqbvEENf70eFp6bPGwayP0u14UTIhs3WiZEcF_Q,262
37
+ ophyd_async/epics/adkinetix/_kinetix.py,sha256=JsQVc4d7lRCnVObJlM775hHLfp3rYRSRgOoIyRvrSek,1184
38
+ ophyd_async/epics/adkinetix/_kinetix_controller.py,sha256=R5l7TaPlibeGPY67o18-Ra3i65IVIxRQ_1Zbn8kmi5s,1701
39
+ ophyd_async/epics/adkinetix/_kinetix_io.py,sha256=3zqfmoTCTkhd7kiqD4wiYrnu5EADzzegaCRJFBaZuVk,910
40
+ ophyd_async/epics/adpilatus/__init__.py,sha256=daimScOCCMHR2eb8VbezHOcGOkd6uIRZQiyeTQsaAx4,308
41
+ ophyd_async/epics/adpilatus/_pilatus.py,sha256=hsHYeMbYJiePn3uci-YSUivQRhAaYAgicr3K145HbBA,1751
42
+ ophyd_async/epics/adpilatus/_pilatus_controller.py,sha256=Bef_-2uJe8hTM-VO_xScMCnEB172n7jSmhdUevPtdJY,2676
43
+ ophyd_async/epics/adpilatus/_pilatus_io.py,sha256=Jznmhwidmr_YaUdWXazWFYNQq4wn_sI1dXeo9Zhyf0M,738
44
+ ophyd_async/epics/adsimdetector/__init__.py,sha256=t3crUgTEvVJGI8o6FsfN42k0A-l4v9ZBwXIYtixoE-M,128
45
+ ophyd_async/epics/adsimdetector/_sim.py,sha256=jzsPJdcwdciR2mVPbvg9KhGHWWGNDQwK5TwPcS7_tco,1009
46
+ ophyd_async/epics/adsimdetector/_sim_controller.py,sha256=WXKj5SclfLJ0IywCk81GmFj0ZGMkDnX7jRfatXe1EYo,1677
47
+ ophyd_async/epics/advimba/__init__.py,sha256=l0ElP3Zyff_pzrTRdj9oUO9xigCfmzo3pMVjstlVsJY,320
48
+ ophyd_async/epics/advimba/_vimba.py,sha256=E_RJ0uJQt-RWAY7uFTNkHaOdGYS5sa7ZbRgAe6ngXTA,1125
49
+ ophyd_async/epics/advimba/_vimba_controller.py,sha256=DZNNtYeii1ogFuoW4IV8YYDdNyyt4TwcktMEr4TlJoI,2226
50
+ ophyd_async/epics/advimba/_vimba_io.py,sha256=il-SZSiApx5OUQCYHUGoa0Ywu9pY01DSDvOttU15khQ,1864
51
+ ophyd_async/epics/core/__init__.py,sha256=8NoQxEEc2Ny_L9nrD2fnGSf_2gJr1wCR1LwUeLNcIJo,588
52
+ ophyd_async/epics/core/_aioca.py,sha256=iQWiHWYbMJLa7qeBrCz4_e16Y8A-NYYi6oYNi8oOFVY,11617
53
+ ophyd_async/epics/core/_epics_connector.py,sha256=n1FlQYui8HdobPxaX3VAflrzi2UT7QCe3cFasssmVLw,1789
54
+ ophyd_async/epics/core/_epics_device.py,sha256=kshNiKQhevsL2OZXa-r093L_sQGvGK_0J4PWVLg3Eqw,437
55
+ ophyd_async/epics/core/_p4p.py,sha256=xtN45sJovj_5bo_e6ZUf0A_uIAeMUVgTcYJi-AtzMmw,15518
56
+ ophyd_async/epics/core/_pvi_connector.py,sha256=wi9PiiWtWWE8mlHAfgDd6zKHvXn35E5DaqDvk4k5KD0,3755
57
+ ophyd_async/epics/core/_signal.py,sha256=0_g2dd60tUl1inEY9hUQvWrEka4uvNW8hylrhnB76Q8,4842
58
+ ophyd_async/epics/core/_util.py,sha256=wdwFd6sJoFQo3eGElPzhPaJi3KqLf5Zq_03Hoya7YsE,2079
59
+ ophyd_async/epics/demo/__init__.py,sha256=wCrgemEo-zR4TTvaqCKnQ-AIUHorotV5jhftbq1tXz0,1368
60
+ ophyd_async/epics/demo/_mover.py,sha256=tuAvP8TuyJtHhdSloNol7pBpiBQMcqUtGil52VjpGsE,3666
61
+ ophyd_async/epics/demo/_sensor.py,sha256=VMxsjLV_V3LeLqnSqIsDHVJgpu5SmASV-rlzok_lLws,1040
62
+ ophyd_async/epics/demo/mover.db,sha256=RFz0rxZue689Wh1sWTZwWeFMUrH04ttPq2u5xJH_Fp4,998
63
+ ophyd_async/epics/demo/sensor.db,sha256=AstyG9E0R4KZBz2FZQSrV_QlrfLoU6M2cvYc15Lf548,553
64
+ ophyd_async/epics/eiger/__init__.py,sha256=b3Tt4pVLk23Giyj50R4e94d2MxWDDmNHWhWwNq2jlaw,221
65
+ ophyd_async/epics/eiger/_eiger.py,sha256=hkMsjVwrzDcE1u5BRIQtn8RSR2e0b1JMpDvuIONoNaI,1133
66
+ ophyd_async/epics/eiger/_eiger_controller.py,sha256=ZJGTwSjQam15mtgG4GQ9nPNv_cA-lSLMFgTMkTK79Gg,2343
67
+ ophyd_async/epics/eiger/_eiger_io.py,sha256=qTBT0SebqzlcNXtLQywSoTmAbVC2wl4i0Wn2fbcEISM,1806
68
+ ophyd_async/epics/eiger/_odin_io.py,sha256=3E33ysvMlf8t0bbSVPnzUrvPgUwA7491uoViWpivpf8,4153
69
+ ophyd_async/epics/testing/__init__.py,sha256=terWt7TtNaxk4dCdAGQs-7HM2Z7Vcy34eX6kcngDbi8,498
70
+ ophyd_async/epics/testing/_example_ioc.py,sha256=-GC4mYacZcbLSZMmOj7Kdz08ZrGv9fsYJ4STs3n6ddQ,3481
71
+ ophyd_async/epics/testing/_utils.py,sha256=-D6aKJydhM-n6290DyyKlnwCHFkbQ-j4tu5AD2JjWZ0,2443
72
+ ophyd_async/epics/testing/test_records.db,sha256=25aW0vPe7ScFXI7zE83DfG6StgdrBwCEwDbfK9_hwVw,3198
73
+ ophyd_async/epics/testing/test_records_pva.db,sha256=NyceNGaCZXNYaXjH2VLhvKl8Z-L6dwfE_kYZKqdIcTU,4054
74
+ ophyd_async/fastcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
+ ophyd_async/fastcs/core.py,sha256=MpbRLaPJwmaAuunnIV34oq1AUjT1nfv5ggtgw4I42vY,376
76
+ ophyd_async/fastcs/odin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
+ ophyd_async/fastcs/panda/__init__.py,sha256=_o7n7ckoTM6hTRHpLphpL7r_9sADE59MRNM0gq_ut2o,980
78
+ ophyd_async/fastcs/panda/_block.py,sha256=UZBWos3g4yhxGhX9oB3g_GU7jGGelgoQ2Yt2sm1MPJM,1709
79
+ ophyd_async/fastcs/panda/_control.py,sha256=QIfF5y4nmjhnATeIuBTNTwXfKkNR6D9E7X0RQub0j1k,1021
80
+ ophyd_async/fastcs/panda/_hdf_panda.py,sha256=UnKG8TJugDJGBm8_Grx9EtR07RtEafx1lin-JClujaQ,1172
81
+ ophyd_async/fastcs/panda/_table.py,sha256=5YyAfsl3H7kxH3bDjUKHuH9DyrWQmAn9dv-v0NYzFNo,2289
82
+ ophyd_async/fastcs/panda/_trigger.py,sha256=z9VGb4XPaw3xrOsvTbgpLHbduDbQJB0M4HP3w5YPB_E,3056
83
+ ophyd_async/fastcs/panda/_utils.py,sha256=NdvzdKy0SOG1eCVMQo_nwRXpBo0wyi6lM5Xw3HvssOw,508
84
+ ophyd_async/fastcs/panda/_writer.py,sha256=wDN6uWX1ENofmI3JBXJ7_CGooI7WsZP-JJQrRiSc6sM,6000
85
+ ophyd_async/plan_stubs/__init__.py,sha256=wjpEj_BoBZJ9x2fhUPY6BzWMqyYH96JrBlJvV7frdN4,524
86
+ ophyd_async/plan_stubs/_ensure_connected.py,sha256=uoqfAzghjifdfD_JM860TvMvj9T2Y12nKPvtI5l6zZc,1021
87
+ ophyd_async/plan_stubs/_fly.py,sha256=ZR3oivJuMIQYXTm_QjZaCtnXY21_T8BB3dVqAnp6EHo,6208
88
+ ophyd_async/plan_stubs/_nd_attributes.py,sha256=TVfy3bhnrLFBXZ6b2bREBj0LzEviEGzuGvgWK3I7tII,2198
89
+ ophyd_async/sim/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
+ ophyd_async/sim/demo/__init__.py,sha256=JKWFnHqmFuRRMvvU0aBuclke3OdF0iq89yvHEd4J7Bg,371
91
+ ophyd_async/sim/demo/_sim_motor.py,sha256=gfvhW9TSgolAf5iAk30GviuHh680pT_RcxxTviZCzvk,3997
92
+ ophyd_async/sim/demo/_pattern_detector/__init__.py,sha256=o_dSZDIl_CyS3YPSNKpGiQiR9UaC4cNzZ8_ByEN9dIk,402
93
+ ophyd_async/sim/demo/_pattern_detector/_pattern_detector.py,sha256=R-UbcxHLFfCK9tBryKZN5Dit0IjYeJGP-QKV2ssKFoQ,1275
94
+ ophyd_async/sim/demo/_pattern_detector/_pattern_detector_controller.py,sha256=HqlKNgjd_9pjy6pc74xdJ7JtV1Iko6cNxB2aZReJozw,1999
95
+ ophyd_async/sim/demo/_pattern_detector/_pattern_detector_writer.py,sha256=nQOks4EK1Ax0Ib1pkCrmJPF8Jqr7tPusMnby-HGUnP0,1370
96
+ ophyd_async/sim/demo/_pattern_detector/_pattern_generator.py,sha256=gP0Q1-1p_3KOH7mWZc5m-8OUEx_jb7SAdRXcpleRqX4,7096
97
+ ophyd_async/sim/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
+ ophyd_async/tango/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
+ ophyd_async/tango/core/__init__.py,sha256=pBslTNkIt22-g-CDbG9N7pKLQVJqFe6DYXHFFYJZIo8,905
100
+ ophyd_async/tango/core/_base_device.py,sha256=IN1HF1DOf9W9_FhVlzWyuU58gBFu86rYOD1vDZ_a7Wc,4717
101
+ ophyd_async/tango/core/_signal.py,sha256=5ks0dyzCX66cV9R_CnmM949H1RzNQH3Q1XIUhHQCOaI,6421
102
+ ophyd_async/tango/core/_tango_readable.py,sha256=c6xVH56oBp5o3C3y3PuHA5MftvmjKm20BBvrgsTO260,913
103
+ ophyd_async/tango/core/_tango_transport.py,sha256=6yT-UqE7YyH6OxSisUPvwcEqf29i18jHfse6Ag4JtY0,28986
104
+ ophyd_async/tango/demo/__init__.py,sha256=_j-UicTnckuIBp8PnieFMOMnLFGivnaKdmo9o0hYtzc,256
105
+ ophyd_async/tango/demo/_counter.py,sha256=efBqrFj6ejzDh1aggtPXpn1iub1zB4XocRvHqBEiwcs,1105
106
+ ophyd_async/tango/demo/_detector.py,sha256=0wwk7Y-Dl9QF1YsCIU_BxqI6-PQ40qN_0gknrYBkxsY,1292
107
+ ophyd_async/tango/demo/_mover.py,sha256=c5whb380th1eCThs35ftW1bfNRyYRmcofg7xUp6zvV8,2837
108
+ ophyd_async/tango/demo/_tango/__init__.py,sha256=FfONT7vM49nNo3a1Lv-LcMZO9EHv6bv91yY-RnxIib4,85
109
+ ophyd_async/tango/demo/_tango/_servers.py,sha256=MwkkoZWJQm_cgafCBBXeQfwyAiOgU8cE90_uNfcdcGA,2916
110
+ ophyd_async/testing/__init__.py,sha256=O7PFrKkVoPzhyn6f5xv6Jx6-ZahP6iBUAiqdTpalXng,706
111
+ ophyd_async/testing/_assert.py,sha256=dFiy3GC_pJOTbpxvHZ3Mh357j1XtKZcuW74DlkrpJLE,3372
112
+ ophyd_async/testing/_mock_signal_utils.py,sha256=VbnUQhp0QwBK4nTWirwIWRCl9pVudDj9y_qH2LhkCMc,5210
113
+ ophyd_async/testing/_wait_for_pending.py,sha256=YZAR48n-CW0GsPey3zFRzMJ4byDAr3HvMIoawjmTrHw,732
114
+ ophyd_async-0.9.0a1.dist-info/LICENSE,sha256=pU5shZcsvWgz701EbT7yjFZ8rMvZcWgRH54CRt8ld_c,1517
115
+ ophyd_async-0.9.0a1.dist-info/METADATA,sha256=94_s1cZumUz1BuiXeodSWxW4AhoIf7Wo4tli2ddQDY0,6753
116
+ ophyd_async-0.9.0a1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
117
+ ophyd_async-0.9.0a1.dist-info/entry_points.txt,sha256=O0YNJTEufO0w9BozXi-JurTy2U1_o0ypeCgJLQ727Jk,58
118
+ ophyd_async-0.9.0a1.dist-info/top_level.txt,sha256=-hjorMsv5Rmjo3qrgqhjpal1N6kW5vMxZO3lD4iEaXs,12
119
+ ophyd_async-0.9.0a1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.5.0)
2
+ Generator: setuptools (75.6.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,4 +0,0 @@
1
- from ._base_device import TangoDevice, tango_polling
2
- from ._tango_readable import TangoReadable
3
-
4
- __all__ = ["TangoDevice", "TangoReadable", "tango_polling"]