ophyd-async 0.9.0a1__tar.gz → 0.9.0a2__tar.gz

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 (292) hide show
  1. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.github/pages/make_switcher.py +1 -1
  2. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.gitignore +3 -1
  3. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/PKG-INFO +2 -2
  4. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/examples/epics_demo.py +7 -7
  5. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/examples/tango_demo.py +5 -5
  6. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/explanations/decisions/0009-procedural-vs-declarative-devices.md +1 -1
  7. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/explanations/event-loop-choice.rst +8 -8
  8. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/how-to/compound-devices.rst +2 -2
  9. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/how-to/make-a-simple-device.rst +4 -4
  10. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/how-to/write-tests-for-devices.rst +6 -6
  11. ophyd_async-0.9.0a2/docs/images/set_and_wait_for_other_value.svg +2 -0
  12. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/tutorials/using-existing-devices.rst +2 -2
  13. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/pyproject.toml +19 -41
  14. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/_version.py +1 -1
  15. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/core/__init__.py +13 -20
  16. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/core/_detector.py +61 -37
  17. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/core/_device.py +102 -80
  18. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/core/_device_filler.py +17 -8
  19. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/core/_flyer.py +2 -2
  20. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/core/_readable.py +30 -23
  21. ophyd_async-0.9.0a2/src/ophyd_async/core/_settings.py +104 -0
  22. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/core/_signal.py +55 -17
  23. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/core/_signal_backend.py +4 -1
  24. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/core/_soft_signal_backend.py +2 -1
  25. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/core/_table.py +18 -10
  26. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/core/_utils.py +5 -3
  27. ophyd_async-0.9.0a2/src/ophyd_async/core/_yaml_settings.py +64 -0
  28. ophyd_async-0.9.0a2/src/ophyd_async/epics/adandor/__init__.py +9 -0
  29. ophyd_async-0.9.0a2/src/ophyd_async/epics/adandor/_andor.py +45 -0
  30. ophyd_async-0.9.0a2/src/ophyd_async/epics/adandor/_andor_controller.py +49 -0
  31. ophyd_async-0.9.0a2/src/ophyd_async/epics/adandor/_andor_io.py +36 -0
  32. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/adaravis/__init__.py +3 -1
  33. ophyd_async-0.9.0a2/src/ophyd_async/epics/adaravis/_aravis.py +47 -0
  34. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/adaravis/_aravis_controller.py +13 -22
  35. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/adcore/__init__.py +15 -8
  36. ophyd_async-0.9.0a2/src/ophyd_async/epics/adcore/_core_detector.py +41 -0
  37. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/adcore/_core_io.py +35 -10
  38. ophyd_async-0.9.0a2/src/ophyd_async/epics/adcore/_core_logic.py +121 -0
  39. ophyd_async-0.9.0a2/src/ophyd_async/epics/adcore/_core_writer.py +219 -0
  40. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/adcore/_hdf_writer.py +38 -62
  41. ophyd_async-0.9.0a2/src/ophyd_async/epics/adcore/_jpeg_writer.py +26 -0
  42. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/adcore/_single_trigger.py +4 -3
  43. ophyd_async-0.9.0a2/src/ophyd_async/epics/adcore/_tiff_writer.py +26 -0
  44. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/adcore/_utils.py +2 -1
  45. ophyd_async-0.9.0a2/src/ophyd_async/epics/adkinetix/_kinetix.py +49 -0
  46. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/adkinetix/_kinetix_controller.py +9 -21
  47. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/adpilatus/__init__.py +2 -2
  48. ophyd_async-0.9.0a2/src/ophyd_async/epics/adpilatus/_pilatus.py +46 -0
  49. ophyd_async-0.9.0a2/src/ophyd_async/epics/adpilatus/_pilatus_controller.py +101 -0
  50. ophyd_async-0.9.0a2/src/ophyd_async/epics/adsimdetector/__init__.py +7 -0
  51. ophyd_async-0.9.0a2/src/ophyd_async/epics/adsimdetector/_sim.py +51 -0
  52. ophyd_async-0.9.0a2/src/ophyd_async/epics/advimba/_vimba.py +43 -0
  53. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/advimba/_vimba_controller.py +10 -24
  54. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/core/_aioca.py +31 -14
  55. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/core/_p4p.py +40 -16
  56. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/core/_util.py +1 -1
  57. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/motor.py +18 -10
  58. ophyd_async-0.9.0a2/src/ophyd_async/epics/sim/_ioc.py +29 -0
  59. {ophyd_async-0.9.0a1/src/ophyd_async/epics/demo → ophyd_async-0.9.0a2/src/ophyd_async/epics/sim}/_mover.py +10 -4
  60. ophyd_async-0.9.0a2/src/ophyd_async/epics/testing/__init__.py +24 -0
  61. ophyd_async-0.9.0a2/src/ophyd_async/epics/testing/_example_ioc.py +90 -0
  62. ophyd_async-0.9.0a2/src/ophyd_async/epics/testing/_utils.py +50 -0
  63. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/testing/test_records.db +8 -0
  64. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/fastcs/panda/__init__.py +0 -2
  65. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/fastcs/panda/_control.py +7 -2
  66. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/fastcs/panda/_hdf_panda.py +3 -1
  67. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/fastcs/panda/_table.py +4 -1
  68. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/plan_stubs/__init__.py +14 -0
  69. ophyd_async-0.9.0a2/src/ophyd_async/plan_stubs/_ensure_connected.py +27 -0
  70. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/plan_stubs/_fly.py +1 -1
  71. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/plan_stubs/_nd_attributes.py +7 -5
  72. ophyd_async-0.9.0a2/src/ophyd_async/plan_stubs/_panda.py +13 -0
  73. ophyd_async-0.9.0a2/src/ophyd_async/plan_stubs/_settings.py +125 -0
  74. ophyd_async-0.9.0a2/src/ophyd_async/plan_stubs/_wait_for_awaitable.py +13 -0
  75. {ophyd_async-0.9.0a1/src/ophyd_async/sim/demo → ophyd_async-0.9.0a2/src/ophyd_async/sim}/_pattern_detector/_pattern_detector_controller.py +9 -2
  76. {ophyd_async-0.9.0a1/src/ophyd_async/sim/demo → ophyd_async-0.9.0a2/src/ophyd_async/sim}/_pattern_detector/_pattern_generator.py +13 -6
  77. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/tango/core/_signal.py +3 -1
  78. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/tango/core/_tango_transport.py +12 -14
  79. {ophyd_async-0.9.0a1/src/ophyd_async/tango/demo → ophyd_async-0.9.0a2/src/ophyd_async/tango/sim}/_mover.py +5 -2
  80. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/testing/__init__.py +19 -0
  81. ophyd_async-0.9.0a2/src/ophyd_async/testing/__pytest_assert_rewrite.py +4 -0
  82. ophyd_async-0.9.0a2/src/ophyd_async/testing/_assert.py +176 -0
  83. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/testing/_mock_signal_utils.py +3 -3
  84. ophyd_async-0.9.0a2/src/ophyd_async/testing/_one_of_everything.py +126 -0
  85. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async.egg-info/PKG-INFO +2 -2
  86. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async.egg-info/SOURCES.txt +43 -29
  87. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/system_tests/epics/eiger/test_eiger_system.py +3 -3
  88. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/conftest.py +41 -2
  89. ophyd_async-0.9.0a1/tests/core/test_device_collector.py → ophyd_async-0.9.0a2/tests/core/test_auto_init_devices.py +26 -16
  90. ophyd_async-0.9.0a2/tests/core/test_detector.py +120 -0
  91. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/core/test_device.py +28 -4
  92. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/core/test_flyer.py +9 -9
  93. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/core/test_mock_signal_backend.py +3 -5
  94. ophyd_async-0.9.0a2/tests/core/test_protocol.py +18 -0
  95. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/core/test_readable.py +22 -3
  96. ophyd_async-0.9.0a2/tests/core/test_signal.py +903 -0
  97. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/core/test_soft_signal_backend.py +17 -1
  98. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/core/test_table.py +20 -0
  99. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/core/test_utils.py +7 -7
  100. ophyd_async-0.9.0a2/tests/epics/adandor/test_andor.py +123 -0
  101. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/epics/adaravis/test_aravis.py +33 -38
  102. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/epics/adcore/test_drivers.py +28 -31
  103. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/epics/adcore/test_scans.py +25 -16
  104. ophyd_async-0.9.0a2/tests/epics/adcore/test_single_trigger.py +60 -0
  105. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/epics/adcore/test_writers.py +48 -15
  106. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/epics/adkinetix/test_kinetix.py +14 -13
  107. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/epics/adpilatus/test_pilatus.py +35 -28
  108. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/epics/adsimdetector/test_sim.py +59 -38
  109. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/epics/advimba/test_vimba.py +28 -24
  110. ophyd_async-0.9.0a2/tests/epics/conftest.py +69 -0
  111. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/epics/eiger/test_eiger_controller.py +2 -2
  112. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/epics/eiger/test_eiger_detector.py +3 -3
  113. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/epics/eiger/test_odin_io.py +2 -2
  114. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/epics/pvi/test_pvi.py +2 -2
  115. ophyd_async-0.9.0a2/tests/epics/signal/test_signals.py +724 -0
  116. ophyd_async-0.9.0a2/tests/epics/signal/test_yaml_save_ca.yaml +22 -0
  117. ophyd_async-0.9.0a2/tests/epics/signal/test_yaml_save_pva.yaml +41 -0
  118. ophyd_async-0.9.0a1/tests/epics/demo/test_demo.py → ophyd_async-0.9.0a2/tests/epics/sim/test_epics_sim.py +44 -37
  119. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/epics/test_motor.py +37 -9
  120. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/fastcs/panda/test_hdf_panda.py +5 -5
  121. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/fastcs/panda/test_panda_connect.py +2 -2
  122. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/fastcs/panda/test_panda_control.py +3 -3
  123. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/fastcs/panda/test_panda_utils.py +16 -14
  124. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/fastcs/panda/test_seq_table.py +1 -2
  125. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/fastcs/panda/test_trigger.py +2 -2
  126. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/fastcs/panda/test_writer.py +4 -4
  127. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/plan_stubs/test_fly.py +10 -8
  128. ophyd_async-0.9.0a2/tests/plan_stubs/test_settings.py +95 -0
  129. ophyd_async-0.9.0a2/tests/plan_stubs/test_setup.py +25 -0
  130. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/sim/conftest.py +1 -1
  131. ophyd_async-0.9.0a2/tests/sim/test_pattern_generator.py +67 -0
  132. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/sim/test_sim_detector.py +22 -7
  133. {ophyd_async-0.9.0a1/tests/sim/demo → ophyd_async-0.9.0a2/tests/sim}/test_sim_motor.py +6 -6
  134. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/sim/test_sim_writer.py +3 -3
  135. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/sim/test_streaming_plan.py +2 -2
  136. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/tango/test_base_device.py +11 -11
  137. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/tango/test_tango_transport.py +4 -0
  138. ophyd_async-0.9.0a2/tests/test_data/test_yaml_save.yaml +119 -0
  139. ophyd_async-0.9.0a1/docs/images/set_and_wait_for_other_value.svg +0 -10
  140. ophyd_async-0.9.0a1/src/ophyd_async/core/_device_save_loader.py +0 -274
  141. ophyd_async-0.9.0a1/src/ophyd_async/epics/adaravis/_aravis.py +0 -61
  142. ophyd_async-0.9.0a1/src/ophyd_async/epics/adcore/_core_logic.py +0 -109
  143. ophyd_async-0.9.0a1/src/ophyd_async/epics/adkinetix/_kinetix.py +0 -44
  144. ophyd_async-0.9.0a1/src/ophyd_async/epics/adpilatus/_pilatus.py +0 -58
  145. ophyd_async-0.9.0a1/src/ophyd_async/epics/adpilatus/_pilatus_controller.py +0 -79
  146. ophyd_async-0.9.0a1/src/ophyd_async/epics/adsimdetector/__init__.py +0 -7
  147. ophyd_async-0.9.0a1/src/ophyd_async/epics/adsimdetector/_sim.py +0 -35
  148. ophyd_async-0.9.0a1/src/ophyd_async/epics/adsimdetector/_sim_controller.py +0 -51
  149. ophyd_async-0.9.0a1/src/ophyd_async/epics/advimba/_vimba.py +0 -43
  150. ophyd_async-0.9.0a1/src/ophyd_async/epics/testing/__init__.py +0 -24
  151. ophyd_async-0.9.0a1/src/ophyd_async/epics/testing/_example_ioc.py +0 -107
  152. ophyd_async-0.9.0a1/src/ophyd_async/epics/testing/_utils.py +0 -78
  153. ophyd_async-0.9.0a1/src/ophyd_async/fastcs/panda/_utils.py +0 -16
  154. ophyd_async-0.9.0a1/src/ophyd_async/plan_stubs/_ensure_connected.py +0 -33
  155. ophyd_async-0.9.0a1/src/ophyd_async/tango/__init__.py +0 -0
  156. ophyd_async-0.9.0a1/src/ophyd_async/testing/_assert.py +0 -128
  157. ophyd_async-0.9.0a1/src/ophyd_async.egg-info/entry_points.txt +0 -2
  158. ophyd_async-0.9.0a1/tests/core/test_device_save_loader.py +0 -322
  159. ophyd_async-0.9.0a1/tests/core/test_protocol.py +0 -33
  160. ophyd_async-0.9.0a1/tests/core/test_signal.py +0 -378
  161. ophyd_async-0.9.0a1/tests/epics/adcore/test_single_trigger.py +0 -52
  162. ophyd_async-0.9.0a1/tests/epics/conftest.py +0 -58
  163. ophyd_async-0.9.0a1/tests/epics/signal/test_signals.py +0 -995
  164. ophyd_async-0.9.0a1/tests/sim/__init__.py +0 -0
  165. ophyd_async-0.9.0a1/tests/sim/demo/__init__.py +0 -0
  166. ophyd_async-0.9.0a1/tests/sim/test_pattern_generator.py +0 -34
  167. ophyd_async-0.9.0a1/tests/test_data/test_yaml_save.yml +0 -42
  168. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.codecov.yml +0 -0
  169. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.copier-answers.yml +0 -0
  170. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.devcontainer/devcontainer.json +0 -0
  171. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.git-blame-ignore-revs +0 -0
  172. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.github/CONTRIBUTING.md +0 -0
  173. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  174. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.github/ISSUE_TEMPLATE/issue.md +0 -0
  175. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -0
  176. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.github/actions/install_requirements/action.yml +0 -0
  177. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.github/dependabot.yml +0 -0
  178. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.github/pages/index.html +0 -0
  179. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.github/workflows/_check.yml +0 -0
  180. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.github/workflows/_dist.yml +0 -0
  181. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.github/workflows/_docs.yml +0 -0
  182. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.github/workflows/_pypi.yml +0 -0
  183. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.github/workflows/_release.yml +0 -0
  184. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.github/workflows/_test.yml +0 -0
  185. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.github/workflows/_tox.yml +0 -0
  186. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.github/workflows/ci.yml +0 -0
  187. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.github/workflows/periodic.yml +0 -0
  188. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/.pre-commit-config.yaml +0 -0
  189. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/Dockerfile +0 -0
  190. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/LICENSE +0 -0
  191. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/README.md +0 -0
  192. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/_api.rst +0 -0
  193. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/_templates/custom-module-template.rst +0 -0
  194. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/conf.py +0 -0
  195. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/examples/foo_detector.py +0 -0
  196. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
  197. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
  198. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/explanations/decisions/0003-ophyd-async-migration.rst +0 -0
  199. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/explanations/decisions/0004-repository-structure.rst +0 -0
  200. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/explanations/decisions/0005-respect-black-line-length.rst +0 -0
  201. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/explanations/decisions/0006-procedural-device-definitions.rst +0 -0
  202. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/explanations/decisions/0007-subpackage-structure.md +0 -0
  203. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/explanations/decisions/0008-signal-types.md +0 -0
  204. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/explanations/decisions/COPYME +0 -0
  205. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/explanations/decisions.md +0 -0
  206. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/explanations/design-goals.rst +0 -0
  207. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/explanations/flyscanning.rst +0 -0
  208. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/explanations.md +0 -0
  209. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/genindex.rst +0 -0
  210. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/how-to/choose-interfaces-for-devices.md +0 -0
  211. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/how-to/contribute.md +0 -0
  212. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/how-to/make-a-standard-detector.rst +0 -0
  213. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/how-to/use_set_and_wait_for_other_value.md +0 -0
  214. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/how-to.md +0 -0
  215. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/images/ophyd-async-logo.svg +0 -0
  216. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/images/ophyd-favicon.svg +0 -0
  217. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/index.md +0 -0
  218. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/reference.md +0 -0
  219. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/tutorials/installation.md +0 -0
  220. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/docs/tutorials.md +0 -0
  221. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/setup.cfg +0 -0
  222. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/__init__.py +0 -0
  223. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/__main__.py +0 -0
  224. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/core/_hdf_dataset.py +0 -0
  225. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/core/_log.py +0 -0
  226. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/core/_mock_signal_backend.py +0 -0
  227. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/core/_protocol.py +0 -0
  228. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/core/_providers.py +0 -0
  229. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/core/_status.py +0 -0
  230. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/__init__.py +0 -0
  231. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/adaravis/_aravis_io.py +0 -0
  232. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/adkinetix/__init__.py +0 -0
  233. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/adkinetix/_kinetix_io.py +0 -0
  234. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/adpilatus/_pilatus_io.py +0 -0
  235. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/advimba/__init__.py +0 -0
  236. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/advimba/_vimba_io.py +0 -0
  237. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/core/__init__.py +0 -0
  238. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/core/_epics_connector.py +0 -0
  239. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/core/_epics_device.py +0 -0
  240. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/core/_pvi_connector.py +0 -0
  241. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/core/_signal.py +0 -0
  242. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/eiger/__init__.py +0 -0
  243. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/eiger/_eiger.py +0 -0
  244. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/eiger/_eiger_controller.py +0 -0
  245. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/eiger/_eiger_io.py +0 -0
  246. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/eiger/_odin_io.py +0 -0
  247. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/signal.py +0 -0
  248. {ophyd_async-0.9.0a1/src/ophyd_async/epics/demo → ophyd_async-0.9.0a2/src/ophyd_async/epics/sim}/__init__.py +0 -0
  249. {ophyd_async-0.9.0a1/src/ophyd_async/epics/demo → ophyd_async-0.9.0a2/src/ophyd_async/epics/sim}/_sensor.py +0 -0
  250. {ophyd_async-0.9.0a1/src/ophyd_async/epics/demo → ophyd_async-0.9.0a2/src/ophyd_async/epics/sim}/mover.db +0 -0
  251. {ophyd_async-0.9.0a1/src/ophyd_async/epics/demo → ophyd_async-0.9.0a2/src/ophyd_async/epics/sim}/sensor.db +0 -0
  252. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/epics/testing/test_records_pva.db +0 -0
  253. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/fastcs/__init__.py +0 -0
  254. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/fastcs/core.py +0 -0
  255. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/fastcs/odin/__init__.py +0 -0
  256. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/fastcs/panda/_block.py +0 -0
  257. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/fastcs/panda/_trigger.py +0 -0
  258. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/fastcs/panda/_writer.py +0 -0
  259. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/py.typed +0 -0
  260. {ophyd_async-0.9.0a1/src/ophyd_async/sim/demo → ophyd_async-0.9.0a2/src/ophyd_async/sim}/__init__.py +0 -0
  261. {ophyd_async-0.9.0a1/src/ophyd_async/sim/demo → ophyd_async-0.9.0a2/src/ophyd_async/sim}/_pattern_detector/__init__.py +0 -0
  262. {ophyd_async-0.9.0a1/src/ophyd_async/sim/demo → ophyd_async-0.9.0a2/src/ophyd_async/sim}/_pattern_detector/_pattern_detector.py +0 -0
  263. {ophyd_async-0.9.0a1/src/ophyd_async/sim/demo → ophyd_async-0.9.0a2/src/ophyd_async/sim}/_pattern_detector/_pattern_detector_writer.py +0 -0
  264. {ophyd_async-0.9.0a1/src/ophyd_async/sim/demo → ophyd_async-0.9.0a2/src/ophyd_async/sim}/_sim_motor.py +0 -0
  265. {ophyd_async-0.9.0a1/src/ophyd_async/sim → ophyd_async-0.9.0a2/src/ophyd_async/tango}/__init__.py +0 -0
  266. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/tango/core/__init__.py +0 -0
  267. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/tango/core/_base_device.py +0 -0
  268. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/tango/core/_tango_readable.py +0 -0
  269. {ophyd_async-0.9.0a1/src/ophyd_async/tango/demo → ophyd_async-0.9.0a2/src/ophyd_async/tango/sim}/__init__.py +0 -0
  270. {ophyd_async-0.9.0a1/src/ophyd_async/tango/demo → ophyd_async-0.9.0a2/src/ophyd_async/tango/sim}/_counter.py +0 -0
  271. {ophyd_async-0.9.0a1/src/ophyd_async/tango/demo → ophyd_async-0.9.0a2/src/ophyd_async/tango/sim}/_detector.py +0 -0
  272. {ophyd_async-0.9.0a1/src/ophyd_async/tango/demo → ophyd_async-0.9.0a2/src/ophyd_async/tango/sim}/_tango/__init__.py +0 -0
  273. {ophyd_async-0.9.0a1/src/ophyd_async/tango/demo → ophyd_async-0.9.0a2/src/ophyd_async/tango/sim}/_tango/_servers.py +0 -0
  274. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async/testing/_wait_for_pending.py +0 -0
  275. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async.egg-info/dependency_links.txt +0 -0
  276. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async.egg-info/requires.txt +0 -0
  277. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/src/ophyd_async.egg-info/top_level.txt +0 -0
  278. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/system_tests/epics/eiger/README.md +0 -0
  279. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/system_tests/epics/eiger/start_iocs_and_run_tests.sh +0 -0
  280. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/core/test_log.py +0 -0
  281. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/core/test_observe.py +0 -0
  282. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/core/test_providers.py +0 -0
  283. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/core/test_status.py +0 -0
  284. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/core/test_subset_enum.py +0 -0
  285. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/core/test_watchable_async_status.py +0 -0
  286. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/epics/signal/test_common.py +0 -0
  287. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/epics/test_areadetector_subclass_naming.py +0 -0
  288. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/fastcs/panda/db/panda.db +0 -0
  289. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/plan_stubs/test_ensure_connected.py +0 -0
  290. {ophyd_async-0.9.0a1/src/ophyd_async/sim/testing → ophyd_async-0.9.0a2/tests/sim}/__init__.py +0 -0
  291. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/tango/test_tango_signals.py +0 -0
  292. {ophyd_async-0.9.0a1 → ophyd_async-0.9.0a2}/tests/test_cli.py +0 -0
@@ -33,7 +33,7 @@ def get_versions(ref: str, add: str | None) -> list[str]:
33
33
  builds = set(get_branch_contents(ref))
34
34
  except CalledProcessError:
35
35
  builds = set()
36
- logging.warning(f"Cannot get {ref} contents")
36
+ logging.warning(f"Cannot get {ref} contents") # noqa: LOG015
37
37
 
38
38
  # Add and remove from the list of builds
39
39
  if add:
@@ -87,6 +87,8 @@ docs/savefig
87
87
  # generated version number
88
88
  ophyd_async/_version.py
89
89
 
90
-
91
90
  # ruff cache
92
91
  .ruff_cache/
92
+
93
+ # import linter cache
94
+ .import_linter_cache/
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: ophyd-async
3
- Version: 0.9.0a1
3
+ Version: 0.9.0a2
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
@@ -7,8 +7,8 @@ from bluesky.plans import grid_scan # noqa
7
7
  from bluesky.utils import ProgressBarManager, register_transform
8
8
  from ophyd import Component, Device, EpicsSignal, EpicsSignalRO
9
9
 
10
- from ophyd_async.core import DeviceCollector
11
- from ophyd_async.epics import demo
10
+ from ophyd_async.core import init_devices
11
+ from ophyd_async.epics import sim
12
12
 
13
13
  # Create a run engine, with plotting, progressbar and transform
14
14
  RE = RunEngine({}, call_returns_result=True)
@@ -19,7 +19,7 @@ plt.ion()
19
19
  register_transform("RE", prefix="<")
20
20
 
21
21
  # Start IOC with demo pvs in subprocess
22
- pv_prefix = demo.start_ioc_subprocess()
22
+ pv_prefix = sim.start_ioc_subprocess()
23
23
 
24
24
 
25
25
  # Create ophyd devices
@@ -31,7 +31,7 @@ class OldSensor(Device):
31
31
  det_old = OldSensor(pv_prefix, name="det_old")
32
32
 
33
33
  # Create ophyd-async devices
34
- with DeviceCollector():
35
- det = demo.Sensor(pv_prefix)
36
- det_group = demo.SensorGroup(pv_prefix)
37
- samp = demo.SampleStage(pv_prefix)
34
+ with init_devices():
35
+ det = sim.Sensor(pv_prefix)
36
+ det_group = sim.SensorGroup(pv_prefix)
37
+ samp = sim.SampleStage(pv_prefix)
@@ -4,7 +4,7 @@ import bluesky.plan_stubs as bps
4
4
  import bluesky.plans as bp
5
5
  from bluesky import RunEngine
6
6
 
7
- from ophyd_async.tango.demo import (
7
+ from ophyd_async.tango.sim import (
8
8
  DemoCounter,
9
9
  DemoMover,
10
10
  TangoDetector,
@@ -14,11 +14,11 @@ from tango.test_context import MultiDeviceTestContext
14
14
  content = (
15
15
  {
16
16
  "class": DemoMover,
17
- "devices": [{"name": "demo/motor/1"}],
17
+ "devices": [{"name": "sim/motor/1"}],
18
18
  },
19
19
  {
20
20
  "class": DemoCounter,
21
- "devices": [{"name": "demo/counter/1"}, {"name": "demo/counter/2"}],
21
+ "devices": [{"name": "sim/counter/1"}, {"name": "sim/counter/2"}],
22
22
  },
23
23
  )
24
24
 
@@ -30,8 +30,8 @@ async def main():
30
30
  detector = TangoDetector(
31
31
  trl="",
32
32
  name="detector",
33
- counters_kwargs={"prefix": "demo/counter/", "count": 2},
34
- mover_kwargs={"trl": "demo/motor/1"},
33
+ counters_kwargs={"prefix": "sim/counter/", "count": 2},
34
+ mover_kwargs={"trl": "sim/motor/1"},
35
35
  )
36
36
  await detector.connect()
37
37
 
@@ -62,7 +62,7 @@ The two approaches now look like:
62
62
 
63
63
  ```python
64
64
  class Sensor(StandardReadable, EpicsDevice):
65
- """A demo sensor that produces a scalar value based on X and Y Movers"""
65
+ """A sim sensor that produces a scalar value based on X and Y Movers"""
66
66
 
67
67
  value: A[SignalR[float], PvSuffix("Value"), Format.HINTED_SIGNAL]
68
68
  mode: A[SignalRW[EnergyMode], PvSuffix("Mode"), Format.CONFIG_SIGNAL]
@@ -1,7 +1,7 @@
1
1
  Device Collector Event-Loop Choice
2
2
  ----------------------------------
3
3
 
4
- In a sync context, the ophyd-async :python:`DeviceCollector` requires the bluesky event-loop
4
+ In a sync context, the ophyd-async :python:`init_devices` requires the bluesky event-loop
5
5
  to connect to devices. In an async context, it does not.
6
6
 
7
7
  Sync Context
@@ -14,25 +14,25 @@ The following will fail if :python:`RE = RunEngine()` has not been called alread
14
14
 
15
15
  .. code:: python
16
16
 
17
- with DeviceCollector():
17
+ with init_devices():
18
18
  device1 = Device1(prefix)
19
19
  device2 = Device2(prefix)
20
20
  device3 = Device3(prefix)
21
21
 
22
- The :python:`DeviceCollector` connects to devices in the event-loop created in the run-engine.
22
+ The :python:`init_devices` connects to devices in the event-loop created in the run-engine.
23
23
 
24
24
 
25
25
  Async Context
26
26
  =============
27
27
 
28
28
  In an async context device connection is decoupled from the run-engine.
29
- The following attempts connection to all the devices in the :python:`DeviceCollector`
29
+ The following attempts connection to all the devices in the :python:`init_devices`
30
30
  before or after run-engine initialization.
31
31
 
32
32
  .. code:: python
33
33
 
34
34
  async def connection_function() :
35
- async with DeviceCollector():
35
+ async with init_devices():
36
36
  device1 = Device1(prefix)
37
37
  device2 = Device2(prefix)
38
38
  device3 = Device3(prefix)
@@ -43,8 +43,8 @@ The devices will be unable to be used in the run-engine unless they share the sa
43
43
  When the run-engine is initialised it will create a new background event-loop to use if one
44
44
  is not passed in with :python:`RunEngine(loop=loop)`.
45
45
 
46
- If the user wants to use devices in the async :python:`DeviceCollector` within the run-engine
46
+ If the user wants to use devices in the async :python:`init_devices` within the run-engine
47
47
  they can either:
48
48
 
49
- * Run the :python:`DeviceCollector` first and pass the event-loop into the run-engine.
50
- * Initialize the run-engine first and run the :python:`DeviceCollector` using the bluesky event-loop.
49
+ * Run the :python:`init_devices` first and pass the event-loop into the run-engine.
50
+ * Initialize the run-engine first and run the :python:`init_devices` using the bluesky event-loop.
@@ -11,7 +11,7 @@ Assembly
11
11
 
12
12
  Compound assemblies can be used to group Devices into larger logical Devices:
13
13
 
14
- .. literalinclude:: ../../src/ophyd_async/epics/demo/_mover.py
14
+ .. literalinclude:: ../../src/ophyd_async/epics/sim/_mover.py
15
15
  :pyobject: SampleStage
16
16
 
17
17
  This applies prefixes on construction:
@@ -35,7 +35,7 @@ Grouping by Index
35
35
 
36
36
  Sometimes, it makes sense to group devices by number, say an array of sensors:
37
37
 
38
- .. literalinclude:: ../../src/ophyd_async/epics/demo/_sensor.py
38
+ .. literalinclude:: ../../src/ophyd_async/epics/sim/_sensor.py
39
39
  :pyobject: SensorGroup
40
40
 
41
41
  :class:`~ophyd-async.core.DeviceVector` allows writing maintainable, arbitrary-length device groups instead of fixed classes for each possible grouping. A :class:`~ophyd-async.core.DeviceVector` can be accessed via indices, for example: ``my_sensor_group.sensors[2]``. Here ``sensors`` is a dictionary with integer indices rather than a list so that the most semantically sensible indices may be used, the sensor group above may be 1-indexed, for example, because the sensors' datasheet calls them "sensor 1", "sensor 2" etc.
@@ -13,7 +13,7 @@ To make a simple device, you need to subclass from the
13
13
  other suitable Bluesky `Protocols <hardware_interface>` like
14
14
  :external+bluesky:py:class:`bluesky.protocols.Movable`.
15
15
 
16
- The rest of this guide will show examples from ``src/ophyd_async/epics/demo/__init__.py``
16
+ The rest of this guide will show examples from ``src/ophyd_async/epics/sim/__init__.py``
17
17
 
18
18
  Readable
19
19
  --------
@@ -22,7 +22,7 @@ For a simple :external+bluesky:py:class:`bluesky.protocols.Readable` object like
22
22
  define some signals, then tell the superclass which signals should contribute to
23
23
  ``read()`` and ``read_configuration()``:
24
24
 
25
- .. literalinclude:: ../../src/ophyd_async/epics/demo/_sensor.py
25
+ .. literalinclude:: ../../src/ophyd_async/epics/sim/_sensor.py
26
26
  :pyobject: Sensor
27
27
 
28
28
  First some Signals are constructed and stored on the Device. Each one is passed
@@ -54,7 +54,7 @@ Movable
54
54
  For a more complicated device like a `Mover`, you can still use `StandardReadable`
55
55
  and implement some addition protocols:
56
56
 
57
- .. literalinclude:: ../../src/ophyd_async/epics/demo/_mover.py
57
+ .. literalinclude:: ../../src/ophyd_async/epics/sim/_mover.py
58
58
  :pyobject: Mover
59
59
 
60
60
  The ``set()`` method implements :external+bluesky:py:class:`bluesky.protocols.Movable`. This
@@ -71,7 +71,7 @@ Assembly
71
71
 
72
72
  Compound assemblies can be used to group Devices into larger logical Devices:
73
73
 
74
- .. literalinclude:: ../../src/ophyd_async/epics/demo/_mover.py
74
+ .. literalinclude:: ../../src/ophyd_async/epics/sim/_mover.py
75
75
  :pyobject: SampleStage
76
76
 
77
77
  This applies prefixes on construction:
@@ -24,9 +24,9 @@ Async Tests
24
24
  Mock Backend
25
25
  ------------
26
26
 
27
- Ophyd devices initialized with a mock backend behave in a similar way to mocks, without requiring you to mock out all the dependencies and internals. The `DeviceCollector` can initialize any number of devices, and their signals and sub-devices (recursively), with a mock backend.
27
+ Ophyd devices initialized with a mock backend behave in a similar way to mocks, without requiring you to mock out all the dependencies and internals. The `init_devices` can initialize any number of devices, and their signals and sub-devices (recursively), with a mock backend.
28
28
 
29
- .. literalinclude:: ../../tests/epics/demo/test_demo.py
29
+ .. literalinclude:: ../../tests/epics/sim/test_epics_sim.py
30
30
  :pyobject: mock_sensor
31
31
 
32
32
 
@@ -37,26 +37,26 @@ Mock signals behave as simply as possible, holding a sensible default value when
37
37
 
38
38
  In addition this example also utilizes helper functions like ``assert_reading`` and ``assert_value`` to ensure the validity of device readings and values. For more information see: :doc:`API.core<../_api/ophyd_async.core>`
39
39
 
40
- .. literalinclude:: ../../tests/epics/demo/test_demo.py
40
+ .. literalinclude:: ../../tests/epics/sim/test_epics_sim.py
41
41
  :pyobject: test_sensor_reading_shows_value
42
42
 
43
43
 
44
44
  Given that the mock signal holds a ``unittest.mock.Mock`` object you can retrieve this object and assert that the device has been set correctly using ``get_mock_put``. You are also free to use any other behaviour that ``unittest.mock.Mock`` provides, such as in this example which sets the parent of the mock to allow ordering across signals to be asserted:
45
45
 
46
- .. literalinclude:: ../../tests/epics/demo/test_demo.py
46
+ .. literalinclude:: ../../tests/epics/sim/test_epics_sim.py
47
47
  :pyobject: test_retrieve_mock_and_assert
48
48
 
49
49
  There are several other test utility functions:
50
50
 
51
51
  Use ``callback_on_mock_put``, for hooking in logic when a mock value changes (e.g. because someone puts to it). This can be called directly, or used as a context, with the callbacks ending after exit.
52
52
 
53
- .. literalinclude:: ../../tests/epics/demo/test_demo.py
53
+ .. literalinclude:: ../../tests/epics/sim/test_epics_sim.py
54
54
  :pyobject: test_mover_stopped
55
55
 
56
56
 
57
57
  Testing a Device in a Plan with the RunEngine
58
58
  ---------------------------------------------
59
- .. literalinclude:: ../../tests/epics/demo/test_demo.py
59
+ .. literalinclude:: ../../tests/epics/sim/test_epics_sim.py
60
60
  :pyobject: test_sensor_in_plan
61
61
 
62
62
 
@@ -0,0 +1,2 @@
1
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1187.8240472771774 784.5838303364346" width="1187.8240472771774" height="784.5838303364346"><!-- svg-source:excalidraw --><metadata><!-- payload-type:application/vnd.excalidraw+json --><!-- payload-version:2 --><!-- payload-start -->eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1cXGtT28hcdTAwMTL9nl/hYr+uZ6fnPVu1XHUwMDFmeL9cdGAg4LtblLBcdTAwMDU2yI/YMrbZyn+/PVwitmRLSkxQXHUwMDE1cK+VSlx1MDAwMlx1MDAxYUlcdTAwMWVPn3Ome7pH/34qlVbCcddf+bO04o9qXtCs97zhyu/u/KPf6zc7bWxi0e/9zqBXi65shGG3/+dcdTAwMWZ/xHeQWqf1fJdcdTAwMWb4Lb9cdTAwMWT28br/4O+l0r/Rv9jSrLt7d1x1MDAwZvbOzcBcdTAwMWLv8NP9w+1t9dS4236Kbo0umnQmaLb9+OzIdcIoorlQTEkqQVs9bVx1MDAxZLtWLVxilVSBppZyUHzaOmzWw4a7XHUwMDAyXGZRXHUwMDFjrNKUWrBcdTAwMTTiS1x1MDAxYX7zrlx1MDAxMeI1dHrKa99cdTAwMDX+zJl+2Os8+OudoNNzXHUwMDFk/FxyfPcn7uONV3u463VcdTAwMDbt+vSasOe1+12vh+NcdTAwMTFfd9tcZoJKOI6ejmOK47cy91x1MDAxOV8mPZ47n3dcdTAwMTd+6F2j7ffdmMP0bKfr1ZqhXHUwMDFiXHUwMDFioPG3cD3s7tYj8/xcdTAwMTP3qee1/F1nn/YgXGKmp5vtuu+GfsXTM5/Wrn//tIltY8Ox72e+xX33ffdg4NQoSpPDXHUwMDFlXHUwMDAzjKv5k0eddoQ10MBcdTAwMDAsmPiLNftcdTAwMWJcYrIweuqtXHUwMDE39P3YXHUwMDA0rmubXHRcdTAwMDDG33DQrXvPt4DmIC1cYnyskdN2xNvD/NdcdTAwMGY6tYeMT+l2mkl8uyP+qVx1MDAxNCMm+mX68z+/Z16dj8q52z/NPWYl8PrheqfVaob4vY5dn+b731x1MDAwZr1euIZGbLbv5tv8dj2nJbprtdfrXGZcdTAwMWK+l4JcdTAwMDTeN9/2KWHvObLLSnBTvX06OdLXltc26eZVfTRehOxIccKVkpZLXHUwMDEwXFxZk1wiO8LCNTFcdTAwMDaW2Vx1MDAxNNljwE+5XHJKXHUwMDEyI43mXHUwMDFjn1xu2sSQW3J9huvm9Vxcl4ZZq1xmj/lcdTAwMTVzXaZcdTAwMDRgwnWpQSpcdTAwMDGxNVx1MDAwYmK6NlrHXHUwMDAweiumz1xcXU6h8aMzfWdw3FxizvaHrcv7p4PLe749XHUwMDFhfVmM6UC0YtpcdTAwMWGqwf1cdTAwMTBj5lx1MDAxOc+SXGIhXHUwMDEwXHUwMDFhilx1MDAxYamVjFxyOeE6ylx1MDAwNEE7K2NcdTAwMTjKhqKxYzDlPidGUFx1MDAwMdxSfJax2i7Jn0P+1VeTX1xuLVx1MDAwNVozi/vI79yJnlkpuaE2lodi6C9cdTAwMTmjXHRn8a3on4tSd5TTXHUwMDAw/eB6cPxggro9XHUwMDFiqTXjs2FzNVx1MDAxOHVH54voXHUwMDAxgDJESKMkXHUwMDE4I4DyXHUwMDE4XHUwMDBmz1x1MDAxMOdcdTAwMDRcdTAwMDTljGNcdTAwMWNgqY6pM/XzXHSnglx0w1x1MDAwNVPKclx1MDAxNuMw4VxuUMLQXHUwMDAzxFx1MDAwYimCTibmqaVcdTAwMWPMyMHaq+VAS6lcZloq7mAsXHUwMDA3JtdcdTAwMTVcdTAwMDCjMYpcdTAwMDOdsF5BaiCYZuLN1SBcdTAwMTek7kjD84OLQf38er+744l9enmpz8Pg3JfVtVx1MDAwNcXAXHUwMDEyxpSL+5Wwls3FXHUwMDAxSlx1MDAxMMG1Rlx1MDAxOZBMK65jw07UXHUwMDAwuEY/XHUwMDBiXVx1MDAwN0mpQVx1MDAxN0PFT5jKwZwxTMy/pVx1MDAxYcyowfqr1UBYXHSIdpblXHUwMDFjWDF/cqJcdTAwMDZMSJxcdTAwMTk5LTIyYFx1MDAxNKzB2IDFY/VWYpCPUXeUU/D84GrgVeqNzVx1MDAxZF7/utX6Ut7YWq3fXHUwMDFjle/SauC5J87KXHUwMDAxt4pYjUrAmVx1MDAwNvRcdTAwMTBcdTAwMTLepEM4d45cdTAwMDNHt0BKQEmwad/ARVx1MDAxM+hcXEnqllx1MDAxNoRgiVx1MDAwN0zVQCmCkSsqXHUwMDBlSlxuM1bFoFuqwYxcdTAwMWFsvFpcclx1MDAxOLq8Ssgs14Dlilx1MDAwMXqA6FFgSF/0iiBOtWDffkUwXHUwMDFmo+5IofO9i8E8j/3gpjOMx/BcdTAwMDc6MVx1MDAxZdOy1aPu497J9vrZcFx1MDAxZvzbs520ToT+KJyTXHRQhFwiSrimimLIOatcdTAwMTJlMFx1MDAwNJ1LXHUwMDEzSYhCXHUwMDE3i6Z1wrr1xYzAgS1cdTAwMDOFXHUwMDFjMdjMXHUwMDE2g1ncfF8g4JapZJyfWFx1MDAxZmDzJ6cuXHUwMDAwMPbsvVx1MDAxN816zXVcIlx1MDAwZXlcdTAwMDHrI+C5wfbDUs1cdTAwMGJcdTAwMDI/MeK3nXZYaT5FPaczZ7e8VjNwgy5nXHUwMDFltFx1MDAxYTTv2pFcdTAwMTPs3yawgKNcdTAwMTA28eHT5rDTjVtr+DxcdTAwMGad5l7aMp1e867Z9oKzXHUwMDFmdNJcdTAwMWKEnVO//9zNsDfwk6Pg70yjZcLkXHUwMDBmaDqwNHzcqVx1MDAwZcfXm6u6vXNePeWrtYWmc4zvXHUwMDA0wUlcXIGlXHUwMDE2I0SYJSoznGgppKDAuaIssWI/4akhnEtcZlxyjLMkXlx1MDAxNcMnXvozgijGXHUwMDE4PohKXHUwMDA1XHUwMDE4ji4pnE3hrVfP5+iSXHUwMDE5UEon4TtcdPVzmVxyOJ9RKlx1MDAwNC903Vx1MDAxZnshXHUwMDExM1x0QXmr+TxcdTAwMTej7kij8393Pu96Z9XDrduB199f2zp73LjqXbTsXCLzOY5cdTAwMWHGQFx1MDAxYbVAXHUwMDAws5bPZv6VUYQroVxyM2Ckzcj8u9u1ZlK6RZWZ5Z+pSlxiQ5ihXHUwMDE2/0pEXHUwMDBmzlDxNUuVmFGJ7cUneuDIbGGtykxcdTAwMDWI1NlpXHUwMDFlMPJcdTAwMTCEKjrc10Zp9Utrf5OpvuJm0U6rXHUwMDFi9eXvduZ8XHUwMDBmlnBgXFyjw0KVXHUwMDE1kEhoveH8n9vzYpyAo3p1yK5cdTAwMGY2dqrdx4C1XHUwMDFiI713lOFcdTAwMDRkVfVcdTAwMTiiMPTSqJDS2WiG25IxYlx1MDAxMSnGXCKUXHUwMDE4+lx1MDAwYiluY1x1MDAwMInc5lxcUFxmmVDxM5b3MJxyy0fCKLfIQlx1MDAxNSyTfznc3nt95t9aXGZYXHUwMDE1miqD8jrlXHUwMDE4JHxcdTAwMDDDjVx1MDAwMVF0TK9cXFx1MDAxMVx0TUL6TXyAXFyUuqOcXHUwMDA26Ht3XHUwMDAyfrLCd2Iq/Vx1MDAwYk94Xs/SS3VVXHUwMDE5X9X8/lwiaqBd2Y8xLtBTVCZzyJFcdTAwMWHgKFpFlVx1MDAxMVx1MDAxMlx1MDAwNIbw6XhcdTAwMDDdXHUwMDA0dLMwnlx1MDAxMNrlXGIzKlx1MDAwMUBcdTAwMDGxXHUwMDAyXHUwMDAxylx1MDAwNOMozsvF/jwx2H+9XHUwMDE4oCGNq8bMXG5cYoDmJv9cdTAwMTjGgkZD4Vx1MDAwYnxugjGxU/FWYlDOQ2nUmFx1MDAwNuhcdTAwMDdcdTAwMTeDQ1j1/ftBZet2/CBcdTAwMWFhd9y+3G8uJlx1MDAwNpxQ6rxxXHSIoUSqP1rsl0CEwGGyoGmyPDSu96VEK8M4XHUwMDBlo1x1MDAwNMMzlvrnXGZcdTAwMDGJWoOlXHUwMDE4zIjBQVx1MDAwMTWBnDFU7zTtnanzV1x1MDAwNzCEwGis8GU/JTFcdTAwMWOMIfF25b85IHXHvFAgPj+4XHUwMDE2XFxcdTAwMDSNyv2Td7HfVMdcdTAwMWK1zZOt7mh0tYhcdTAwMTZYYERcdTAwMWFh0EkywpVcdTAwMDXPaoHQxChcdTAwMTffMWGpVlx1MDAxOYk/XHUwMDAy2IBcdTAwMTG+5qhcdTAwMTZuISDLNZBcdTAwMDRtgMDgQkhXdbBUg2w1OHy9XHUwMDFhXGJhjcb4ODNOyF1cdTAwMTkw6DpcdTAwMDNcdTAwMThWuGeguHhcdTAwMGapv1xclEatKXx+cDVYXHIvVoc4f1x1MDAxZldb7ZPH+/2d3aOb3mJqIDBcdTAwMTBwsZ3hjCo2XHUwMDFmJnBcdTAwMTdEoPPktlx1MDAwZliT3lx1MDAxZMBcciNMIPqYlFxiJpGxXHUwMDEzaCYm01bE61xuSy2Y0YKjXHUwMDAyqlx1MDAwMCTXWr20KFxiXWODs2PhXHUwMDFig1x1MDAxMFRKvP12gVxcjLqjnILnXHUwMDA3l4LDLjuiZ8NHM1TlXHUwMDAz8fBwerd7TVx1MDAxN0pcIlqQP4hcdTAwMTIkWIKDZLkrpnRZoZ94XHUwMDA2imeVXHUwMDBic0qsq2HVXHUwMDEw7VGIXHUwMDExt9SCXHUwMDE5Lfj8ei1cdTAwMDBw9W9orlxmLYD88lx1MDAwMFx1MDAxMCCURlx1MDAwYlx1MDAxNVx1MDAxOSe4nIFbwTfvoEQwXHUwMDBmpVHjPD7fu1x1MDAxOPx6XHUwMDBlsex/3Vx0t/nhnq7uhqbSPDg+5seL5Fx1MDAxMHF4XGJFOVx1MDAxNVpcdTAwMGLrXGY7I1x1MDAxM25zhpXMWpeyUZBcdTAwMTCBOIdo8VxuXHUwMDA0pmFCU02zXFyG5e7hXHUwMDFjXTjO1oXsnKFSVKNkZ1x1MDAwNVx1MDAwNkDz64NcXKJcdTAwMTGDP1WkO/A6XHUwMDAxmCRcck/XLkqHXlhr+PXS3+1TP1x1MDAxY/TapYbfS1j/3ZVcdTAwMGIt0OdiXHUwMDEyh1fbtfPxyf3t58HT7nrlZG90vN86XYTQTDJiLDpG0lx1MDAxNYdrSCR2o+IhjozmbkuAxjklWeg7rfGTRC1r/F5C45NcdTAwMTfQWGpKKfqlmTuA8/OA0lVwUFHs0r+rXHUwMDA1clx1MDAwNVx1MDAwNb9cdTAwMTTgJ1P/fWSVXHUwMDE3vGPaZnWyXHUwMDE4nm5Wx/edr5etQy5cdTAwMDJ2trq7a8MhLFa8XHUwMDAzjFxiJiRTOPtcbjNcdTAwMTesa0aJVKCY4NRcdTAwMWGTsZ+PU0OYXHUwMDBiyyZHxtS75GxcdTAwMWVnT1x1MDAxN+ese89cdTAwMDZcdTAwMDcqMzlcdTAwMGI/ekVHtIWN6lwi9+pF9Tr4n3xVae7Qa4bXt53edd9cdTAwMGavv5e/YM//Kp0hXHUwMDBm3jGPXHUwMDE37Hcx1D6RO/f65ubgofbF71x1MDAxZlxmap/LfP1sXHUwMDExamsliOZGaFx0XGJcdTAwMDCQaWZcdTAwMWKDs1x1MDAwMFx1MDAwN2FccqfpXHUwMDE5XHUwMDE4jUxQlVxyn1x1MDAxY0tiL07sylx1MDAwYiZj9GJccjPKZlx1MDAxMjtdrjslNqAuU5Pcu1uUT23Er7175yfELv1V2nLXfzxqp3teXGa5ny79yuOoelC+XHUwMDA3yldcdTAwMGZlY/vOW2jeZorjtK0toP8kuaSz62poPlwiqFx1MDAwMWMsl0InK3WmXHUwMDExM9jlJpqXcfpscU5LbaQrts8qrflBNl1cdTAwMWItXFw+udBt9Uqh/Vx1MDAxNee/lE6fMLrlos3372Fnd7NcdTAwMTiunrY3xGBXXHUwMDFl9PpP7HjfVPf2vcHJXCJcXFx1MDAwNUYp0e7tKVQyKsRcXIG8K6JcdTAwMTUou26/XHKIrFx1MDAwMnlJkMVoR9RlhyqawVrxXHUwMDEy1vo46XP4P2HtxVx1MDAwYmZiJpVcdTAwMDYtWSZt81lrXTWcVoVcdTAwMTbBIGst6OSuql9gLWRSNaFcdTAwMDRvSFUomp9b643zyvaVXHUwMDE4datcdTAwMDftXTa86lxmZMbG9TQ/LXcvp0RyWWqZoGxu8ZlaYo1CS3Anoybj1ZWSPMe/XHUwMDE0g2HDdXz/kp4/peeXxelpLUWFTL5cdTAwMTJcImanyk1EW4raKrgu8sVVxaw8s3fMTvZcbnZ++p7RWvG63UqIo7YySTKuPDb94VpcdTAwMWHOv91Gx8qn79x2UPaj3OS3T9/+XHUwMDBiP9Ji1SJ9<!-- payload-end --></metadata><defs><style class="style-fonts">
2
+ @font-face { font-family: Excalifont; src: url(data:font/woff2;base64,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); }</style></defs><rect x="0" y="0" width="1187.8240472771774" height="784.5838303364346" fill="#ffffff"></rect><g stroke-linecap="round"><g transform="translate(43.84248105120804 302.75444427692025) rotate(0 109.31598350459507 0)"><path d="M-0.45 -0.7 C35.76 -0.86, 180.92 -1.39, 217.58 -1.19 M1.51 1.54 C38.06 1.51, 183.45 0.24, 219.75 -0.28" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(262.4744480603982 302.8253415087969) rotate(0 0 -82.9293667965893)"><path d="M0.64 0.3 C0.59 -27.08, -0.08 -137.51, -0.32 -165.29 M-0.48 -0.59 C-0.72 -28.23, -1.79 -139.66, -1.44 -167.12" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(258.8706526177911 134.14839879518058) rotate(0 332.5798441252804 -1.9202069522244898)"><path d="M-0.18 0.98 C110.67 0.28, 554.82 -2.97, 665.76 -3.76 M-1.73 0.45 C108.95 -0.07, 554.04 -1.71, 665.12 -2.18" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(925.5665064301318 131.8441504525112) rotate(0 1.1521241713346626 80.10711520276767)"><path d="M0.54 0.53 C0.98 27.16, 1.63 133.33, 2.07 159.95 M-0.63 -0.24 C-0.32 26.56, 0.42 134.38, 1 161.35" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(926.3345892110212 293.1415344393678) rotate(0 68.92542750440384 -1.152124171334691)"><path d="M1.09 -0.33 C24.12 -0.33, 115.62 -0.86, 138.29 -1.2 M0.21 -1.54 C23.1 -1.75, 114.33 -2.82, 137.57 -2.74" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(154.08449781789392 67.15748673767692) rotate(0 52.98975332972128 33.34186726364484)"><path d="M-1.06 0.7 C16.59 11.86, 88.97 56.89, 106.91 67.72 M0.58 0.03 C18.07 10.8, 88.85 55.06, 106.45 66.14" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(154.08449781789392 67.15748673767692) rotate(0 52.98975332972128 33.34186726364484)"><path d="M82 60.91 C92.6 64.68, 102.53 66.17, 106.45 66.14 M82 60.91 C86.56 61.38, 93.31 62.59, 106.45 66.14" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(154.08449781789392 67.15748673767692) rotate(0 52.98975332972128 33.34186726364484)"><path d="M91.08 46.42 C98.28 55.67, 104.73 62.72, 106.45 66.14 M91.08 46.42 C93.64 50.1, 98.42 54.45, 106.45 66.14" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g transform="translate(73.11139160618495 10) rotate(0 47.0625 12.5)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">set called</text></g><g stroke-linecap="round"><g transform="translate(931.6644736450401 312.4583673202069) rotate(0 4.167733407955666 192.31112725280877)"><path d="M-0.34 -0.98 C1.13 63.35, 6.73 321.09, 8.05 385.17 M1.68 1.12 C3.03 65.16, 5.56 319.49, 6.94 383.33" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(931.6644736450401 312.4583673202069) rotate(0 4.167733407955666 192.31112725280877)"><path d="M-1.96 359.97 C-1.66 365.01, 2.98 369.66, 6.94 383.33 M-1.96 359.97 C0.77 365.61, 2.46 369.39, 6.94 383.33" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(931.6644736450401 312.4583673202069) rotate(0 4.167733407955666 192.31112725280877)"><path d="M15.14 359.71 C11.41 364.76, 12.02 369.48, 6.94 383.33 M15.14 359.71 C14.41 365.37, 12.64 369.21, 6.94 383.33" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g transform="translate(889.4853986759654 715.0686100052003) rotate(0 66.3862760711362 24.140464025867686)"><text x="0" y="17.014199045431567" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="19.312371220694175px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Set completed</text><text x="0" y="41.15466307129928" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="19.312371220694175px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic"></text></g><g stroke-linecap="round"><g transform="translate(45.723429211048085 551.6184165698157) rotate(0 208.3866703977804 -2.9769524342540308)"><path d="M1.15 -0.09 C70.36 -1.4, 346.52 -5.76, 415.96 -6.64 M0.29 -1.19 C69.83 -1.84, 348.7 -4.42, 418.24 -5.46" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(462.49677000660887 545.6645117013077) rotate(0 -1.190780973701635 -80.97310621170891)"><path d="M-0.62 -0.09 C-1.05 -26.87, -1.53 -134.53, -1.9 -161.39 M1.25 -1.18 C0.65 -28.26, -1.74 -136.22, -2.59 -163.22" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(460.1152080592056 380.14595635678495) rotate(0 105.3841161725918 -1.1907809737016066)"><path d="M0.98 -0.93 C36.1 -1.01, 176.54 -1, 211.51 -1.27 M0.04 1.2 C34.99 0.88, 175.96 -2.39, 210.95 -2.82" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(669.6926594306876 376.57361343568016) rotate(0 0.5953904868507607 82.75927767226133)"><path d="M-0.99 -0.41 C-0.54 27.2, 1.55 136.9, 1.72 164.64 M0.7 -1.68 C1.12 26.16, 0.78 138.12, 1.04 165.72" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(672.0742213780909 542.0921687802029) rotate(0 191.12034627910714 -2.976952434253974)"><path d="M0.95 0.4 C64.42 -0.86, 317.63 -5.42, 381.15 -6.62 M0 -0.44 C63.78 -1.63, 319.76 -4.51, 383.29 -5.43" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(672.1152080592055 548.1907594909206) rotate(0 0.5953904868508175 65.49295355358805)"><path d="M-0.92 1.14 C-0.95 23.33, -0.16 110.39, 0.31 131.92 M0.8 0.7 C1.09 22.66, 2.45 108.52, 2.56 130.29" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(672.1152080592055 548.1907594909206) rotate(0 0.5953904868508175 65.49295355358805)"><path d="M-6.25 106.9 C-1.55 113.53, 1.13 124.19, 2.56 130.29 M-6.25 106.9 C-4.64 113.13, -2.21 118.07, 2.56 130.29" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(672.1152080592055 548.1907594909206) rotate(0 0.5953904868508175 65.49295355358805)"><path d="M10.85 106.7 C9.68 113.27, 6.5 123.99, 2.56 130.29 M10.85 106.7 C8.22 113.14, 6.41 118.12, 2.56 130.29" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g transform="translate(616.1485022952302 694.6568192562175) rotate(0 69.97916412353516 25)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">RBV Matched </text><text x="0" y="42.62" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Return here</text></g><g transform="translate(10 264.6402019077296) rotate(0 47.8125 12.500000000000014)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Set signal</text></g><g transform="translate(869.5323806105109 749.2654514964912) rotate(0 154.14583333333326 12.5)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">wait_for_set_completion= True</text></g><g transform="translate(521.8463297153439 749.5838303364346) rotate(0 160.32291666666663 12.5)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">wait_for_set_completion = False</text></g><g transform="translate(20.535767711378583 514.1120161220821) rotate(0 59.5625 12.5)"><text x="0" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">match signal</text></g><g transform="translate(957.8616550664754 651.6440183607504) rotate(0 7.677083492279053 22.5)"><text x="0" y="31.716" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="36px" fill="#e03131" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">1</text></g><g transform="translate(691.1677036384312 638.6901134922423) rotate(0 12.583333015441895 22.5)"><text x="0" y="31.716" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="36px" fill="#e03131" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">2</text></g></svg>
@@ -41,13 +41,13 @@ that you can mix Ophyd and Ophyd Async devices in the same RunEngine:
41
41
  :start-after: # Create ophyd devices
42
42
  :end-before: # Create ophyd-async devices
43
43
 
44
- Finally we create the Ophyd Async devices imported from the `epics.demo` module:
44
+ Finally we create the Ophyd Async devices imported from the `epics.sim` module:
45
45
 
46
46
  .. literalinclude:: ../examples/epics_demo.py
47
47
  :language: python
48
48
  :start-after: # Create ophyd-async devices
49
49
 
50
- The first thing to note is `with`. This uses a `DeviceCollector` as a context
50
+ The first thing to note is `with`. This uses `init_devices` as a context
51
51
  manager to collect up the top level `Device` instances created in the context,
52
52
  and run the following:
53
53
 
@@ -75,9 +75,6 @@ dev = [
75
75
  "types-pyyaml",
76
76
  ]
77
77
 
78
- [project.scripts]
79
- ophyd-async = "ophyd_async.__main__:main"
80
-
81
78
  [project.urls]
82
79
  GitHub = "https://github.com/bluesky/ophyd-async"
83
80
 
@@ -158,6 +155,11 @@ lint.select = [
158
155
  "UP", # pyupgrade - https://docs.astral.sh/ruff/rules/#pyupgrade-up
159
156
  "SLF", # self - https://docs.astral.sh/ruff/settings/#lintflake8-self
160
157
  "PLC2701", # private import - https://docs.astral.sh/ruff/rules/import-private-name/
158
+ "LOG015", # root logger call - https://docs.astral.sh/ruff/rules/root-logger-call/
159
+ "S101", # assert = https://docs.astral.sh/ruff/rules/assert/
160
+ ]
161
+ lint.ignore = [
162
+ "B901", # Return in a generator is needed for plans
161
163
  ]
162
164
  lint.preview = true # so that preview mode PLC2701 is enabled
163
165
 
@@ -165,54 +167,30 @@ lint.preview = true # so that preview mode PLC2701 is enabled
165
167
  # By default, private member access is allowed in tests
166
168
  # See https://github.com/DiamondLightSource/python-copier-template/issues/154
167
169
  # Remove this line to forbid private member access in tests
168
- "tests/**/*" = ["SLF001"]
170
+ "tests/**/*" = ["SLF001", "S101"]
171
+ "src/ophyd_async/testing/**/*" = ["SLF001", "S101"]
172
+ "system_tests/**/*" = ["SLF001", "S101"]
173
+ "docs/examples/**/*" = ["SLF001", "S101"]
169
174
 
170
175
 
171
176
  [tool.importlinter]
172
177
  root_package = "ophyd_async"
173
178
 
174
179
  [[tool.importlinter.contracts]]
175
- name = "Core is independent"
176
- type = "independence"
177
- modules = "ophyd_async.core"
180
+ name = "All runtime modules are in layers"
181
+ type = "layers"
182
+ containers = ["ophyd_async"]
183
+ layers = ["plan_stubs", "fastcs", "epics | tango | sim", "core"]
184
+ exhaustive = true
185
+ exhaustive_ignores = ["testing", "_version", "__main__"]
178
186
 
179
187
  [[tool.importlinter.contracts]]
180
- name = "Epics depends only on core"
188
+ name = "Testing and sim modules are not used at runtime"
181
189
  type = "forbidden"
182
- source_modules = "ophyd_async.epics"
183
- forbidden_modules = [
184
- "ophyd_async.fastcs",
190
+ forbidden_modules = ["ophyd_async.testing", "ophyd_async.sim"]
191
+ source_modules = [
185
192
  "ophyd_async.plan_stubs",
186
- "ophyd_async.sim",
187
- "ophyd_async.tango",
188
- ]
189
-
190
- [[tool.importlinter.contracts]]
191
- name = "tango depends only on core"
192
- type = "forbidden"
193
- source_modules = "ophyd_async.tango"
194
- forbidden_modules = [
193
+ "ophyd_async.fast.*",
195
194
  "ophyd_async.epics",
196
- "ophyd_async.fastcs",
197
- "ophyd_async.plan_stubs",
198
- "ophyd_async.sim",
199
- ]
200
-
201
-
202
- [[tool.importlinter.contracts]]
203
- name = "sim depends only on core"
204
- type = "forbidden"
205
- source_modules = "ophyd_async.sim"
206
- forbidden_modules = [
207
- "ophyd_async.epics",
208
- "ophyd_async.fastcs",
209
- "ophyd_async.plan_stubs",
210
195
  "ophyd_async.tango",
211
196
  ]
212
-
213
-
214
- [[tool.importlinter.contracts]]
215
- name = "Fastcs depends only on core, epics, tango"
216
- type = "forbidden"
217
- source_modules = "ophyd_async.fastcs"
218
- forbidden_modules = ["ophyd_async.plan_stubs", "ophyd_async.sim"]
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.9.0a1'
15
+ __version__ = version = '0.9.0a2'
16
16
  __version_tuple__ = version_tuple = (0, 9, 0)
@@ -1,22 +1,13 @@
1
1
  from ._detector import (
2
2
  DetectorController,
3
+ DetectorControllerT,
3
4
  DetectorTrigger,
4
5
  DetectorWriter,
5
6
  StandardDetector,
6
7
  TriggerInfo,
7
8
  )
8
- from ._device import Device, DeviceCollector, DeviceConnector, DeviceVector
9
+ from ._device import Device, DeviceConnector, DeviceVector, init_devices
9
10
  from ._device_filler import DeviceFiller
10
- from ._device_save_loader import (
11
- all_at_once,
12
- get_signal_values,
13
- load_device,
14
- load_from_yaml,
15
- save_device,
16
- save_to_yaml,
17
- set_signal_values,
18
- walk_rw_signals,
19
- )
20
11
  from ._flyer import FlyerController, StandardFlyer
21
12
  from ._hdf_dataset import HDFDataset, HDFFile
22
13
  from ._log import config_ophyd_async_logging
@@ -41,6 +32,7 @@ from ._readable import (
41
32
  StandardReadable,
42
33
  StandardReadableFormat,
43
34
  )
35
+ from ._settings import Settings, SettingsProvider
44
36
  from ._signal import (
45
37
  Signal,
46
38
  SignalConnector,
@@ -55,9 +47,11 @@ from ._signal import (
55
47
  soft_signal_r_and_setter,
56
48
  soft_signal_rw,
57
49
  wait_for_value,
50
+ walk_rw_signals,
58
51
  )
59
52
  from ._signal_backend import (
60
53
  Array1D,
54
+ DTypeScalar_co,
61
55
  SignalBackend,
62
56
  SignalDatatype,
63
57
  SignalDatatypeT,
@@ -84,26 +78,20 @@ from ._utils import (
84
78
  in_micros,
85
79
  wait_for_connection,
86
80
  )
81
+ from ._yaml_settings import YamlSettingsProvider
87
82
 
88
83
  __all__ = [
89
84
  "DetectorController",
85
+ "DetectorControllerT",
90
86
  "DetectorTrigger",
91
87
  "DetectorWriter",
92
88
  "StandardDetector",
93
89
  "TriggerInfo",
94
90
  "Device",
95
91
  "DeviceConnector",
96
- "DeviceCollector",
92
+ "init_devices",
97
93
  "DeviceVector",
98
94
  "DeviceFiller",
99
- "all_at_once",
100
- "get_signal_values",
101
- "load_device",
102
- "load_from_yaml",
103
- "save_device",
104
- "save_to_yaml",
105
- "set_signal_values",
106
- "walk_rw_signals",
107
95
  "StandardFlyer",
108
96
  "FlyerController",
109
97
  "HDFDataset",
@@ -128,6 +116,8 @@ __all__ = [
128
116
  "HintedSignal",
129
117
  "StandardReadable",
130
118
  "StandardReadableFormat",
119
+ "Settings",
120
+ "SettingsProvider",
131
121
  "Signal",
132
122
  "SignalConnector",
133
123
  "SignalR",
@@ -141,7 +131,9 @@ __all__ = [
141
131
  "soft_signal_r_and_setter",
142
132
  "soft_signal_rw",
143
133
  "wait_for_value",
134
+ "walk_rw_signals",
144
135
  "Array1D",
136
+ "DTypeScalar_co",
145
137
  "SignalBackend",
146
138
  "make_datakey",
147
139
  "StrictEnum",
@@ -168,4 +160,5 @@ __all__ = [
168
160
  "in_micros",
169
161
  "wait_for_connection",
170
162
  "completed_status",
163
+ "YamlSettingsProvider",
171
164
  ]