ophyd-async 0.3.4a1__tar.gz → 0.5.0__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 (241) hide show
  1. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.github/workflows/_release.yml +1 -1
  2. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.github/workflows/_test.yml +0 -1
  3. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/PKG-INFO +7 -2
  4. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/conf.py +6 -0
  5. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/examples/foo_detector.py +19 -21
  6. ophyd_async-0.5.0/docs/explanations/decisions/0007-subpackage-structure.md +95 -0
  7. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/how-to/compound-devices.rst +2 -2
  8. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/how-to/make-a-simple-device.rst +3 -3
  9. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/how-to/make-a-standard-detector.rst +7 -7
  10. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/reference/api.rst +1 -1
  11. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/pyproject.toml +7 -2
  12. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/src/ophyd_async/_version.py +2 -2
  13. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/src/ophyd_async/core/__init__.py +86 -63
  14. ophyd_async-0.3.4a1/src/ophyd_async/core/detector.py → ophyd_async-0.5.0/src/ophyd_async/core/_detector.py +18 -23
  15. ophyd_async-0.3.4a1/src/ophyd_async/core/device.py → ophyd_async-0.5.0/src/ophyd_async/core/_device.py +19 -7
  16. ophyd_async-0.3.4a1/src/ophyd_async/core/device_save_loader.py → ophyd_async-0.5.0/src/ophyd_async/core/_device_save_loader.py +3 -3
  17. ophyd_async-0.3.4a1/src/ophyd_async/core/flyer.py → ophyd_async-0.5.0/src/ophyd_async/core/_flyer.py +6 -8
  18. ophyd_async-0.5.0/src/ophyd_async/core/_hdf_dataset.py +97 -0
  19. ophyd_async-0.3.4a1/src/ophyd_async/log.py → ophyd_async-0.5.0/src/ophyd_async/core/_log.py +11 -3
  20. ophyd_async-0.3.4a1/src/ophyd_async/core/mock_signal_backend.py → ophyd_async-0.5.0/src/ophyd_async/core/_mock_signal_backend.py +3 -3
  21. ophyd_async-0.3.4a1/src/ophyd_async/core/mock_signal_utils.py → ophyd_async-0.5.0/src/ophyd_async/core/_mock_signal_utils.py +3 -4
  22. ophyd_async-0.3.4a1/src/ophyd_async/protocols.py → ophyd_async-0.5.0/src/ophyd_async/core/_protocol.py +1 -1
  23. ophyd_async-0.5.0/src/ophyd_async/core/_providers.py +230 -0
  24. ophyd_async-0.3.4a1/src/ophyd_async/core/standard_readable.py → ophyd_async-0.5.0/src/ophyd_async/core/_readable.py +6 -16
  25. ophyd_async-0.3.4a1/src/ophyd_async/core/signal.py → ophyd_async-0.5.0/src/ophyd_async/core/_signal.py +39 -16
  26. ophyd_async-0.3.4a1/src/ophyd_async/core/signal_backend.py → ophyd_async-0.5.0/src/ophyd_async/core/_signal_backend.py +4 -13
  27. ophyd_async-0.3.4a1/src/ophyd_async/core/soft_signal_backend.py → ophyd_async-0.5.0/src/ophyd_async/core/_soft_signal_backend.py +24 -18
  28. ophyd_async-0.3.4a1/src/ophyd_async/core/async_status.py → ophyd_async-0.5.0/src/ophyd_async/core/_status.py +3 -11
  29. ophyd_async-0.5.0/src/ophyd_async/epics/adaravis/__init__.py +9 -0
  30. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/aravis.py → ophyd_async-0.5.0/src/ophyd_async/epics/adaravis/_aravis.py +12 -14
  31. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/controllers/aravis_controller.py → ophyd_async-0.5.0/src/ophyd_async/epics/adaravis/_aravis_controller.py +8 -10
  32. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/drivers/aravis_driver.py → ophyd_async-0.5.0/src/ophyd_async/epics/adaravis/_aravis_io.py +6 -3
  33. ophyd_async-0.5.0/src/ophyd_async/epics/adcore/__init__.py +36 -0
  34. ophyd_async-0.5.0/src/ophyd_async/epics/adcore/_core_io.py +114 -0
  35. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/drivers/ad_base.py → ophyd_async-0.5.0/src/ophyd_async/epics/adcore/_core_logic.py +17 -52
  36. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/writers/hdf_writer.py → ophyd_async-0.5.0/src/ophyd_async/epics/adcore/_hdf_writer.py +36 -18
  37. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/single_trigger_det.py → ophyd_async-0.5.0/src/ophyd_async/epics/adcore/_single_trigger.py +5 -6
  38. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/utils.py → ophyd_async-0.5.0/src/ophyd_async/epics/adcore/_utils.py +29 -0
  39. ophyd_async-0.5.0/src/ophyd_async/epics/adkinetix/__init__.py +9 -0
  40. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/kinetix.py → ophyd_async-0.5.0/src/ophyd_async/epics/adkinetix/_kinetix.py +12 -14
  41. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/controllers/kinetix_controller.py → ophyd_async-0.5.0/src/ophyd_async/epics/adkinetix/_kinetix_controller.py +6 -9
  42. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/drivers/kinetix_driver.py → ophyd_async-0.5.0/src/ophyd_async/epics/adkinetix/_kinetix_io.py +5 -4
  43. ophyd_async-0.5.0/src/ophyd_async/epics/adpilatus/__init__.py +11 -0
  44. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/pilatus.py → ophyd_async-0.5.0/src/ophyd_async/epics/adpilatus/_pilatus.py +12 -16
  45. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/controllers/pilatus_controller.py → ophyd_async-0.5.0/src/ophyd_async/epics/adpilatus/_pilatus_controller.py +14 -16
  46. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/drivers/pilatus_driver.py → ophyd_async-0.5.0/src/ophyd_async/epics/adpilatus/_pilatus_io.py +5 -3
  47. ophyd_async-0.5.0/src/ophyd_async/epics/adsimdetector/__init__.py +7 -0
  48. ophyd_async-0.5.0/src/ophyd_async/epics/adsimdetector/_sim.py +34 -0
  49. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/controllers/ad_sim_controller.py → ophyd_async-0.5.0/src/ophyd_async/epics/adsimdetector/_sim_controller.py +8 -14
  50. ophyd_async-0.5.0/src/ophyd_async/epics/advimba/__init__.py +9 -0
  51. ophyd_async-0.5.0/src/ophyd_async/epics/advimba/_vimba.py +43 -0
  52. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/controllers/vimba_controller.py → ophyd_async-0.5.0/src/ophyd_async/epics/advimba/_vimba_controller.py +6 -14
  53. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/drivers/vimba_driver.py → ophyd_async-0.5.0/src/ophyd_async/epics/advimba/_vimba_io.py +5 -4
  54. ophyd_async-0.5.0/src/ophyd_async/epics/demo/__init__.py +54 -0
  55. ophyd_async-0.3.4a1/src/ophyd_async/epics/demo/__init__.py → ophyd_async-0.5.0/src/ophyd_async/epics/demo/_mover.py +6 -86
  56. ophyd_async-0.5.0/src/ophyd_async/epics/demo/_sensor.py +36 -0
  57. ophyd_async-0.5.0/src/ophyd_async/epics/motor.py +228 -0
  58. ophyd_async-0.5.0/src/ophyd_async/epics/pvi/__init__.py +3 -0
  59. ophyd_async-0.3.4a1/src/ophyd_async/epics/pvi/pvi.py → ophyd_async-0.5.0/src/ophyd_async/epics/pvi/_pvi.py +17 -14
  60. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/src/ophyd_async/epics/signal/__init__.py +7 -1
  61. {ophyd_async-0.3.4a1/src/ophyd_async/epics/_backend → ophyd_async-0.5.0/src/ophyd_async/epics/signal}/_aioca.py +6 -2
  62. ophyd_async-0.3.4a1/src/ophyd_async/epics/_backend/common.py → ophyd_async-0.5.0/src/ophyd_async/epics/signal/_common.py +4 -2
  63. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/src/ophyd_async/epics/signal/_epics_transport.py +3 -3
  64. {ophyd_async-0.3.4a1/src/ophyd_async/epics/_backend → ophyd_async-0.5.0/src/ophyd_async/epics/signal}/_p4p.py +53 -4
  65. ophyd_async-0.3.4a1/src/ophyd_async/epics/signal/signal.py → ophyd_async-0.5.0/src/ophyd_async/epics/signal/_signal.py +10 -9
  66. {ophyd_async-0.3.4a1/src/ophyd_async → ophyd_async-0.5.0/src/ophyd_async/fastcs}/panda/__init__.py +28 -9
  67. {ophyd_async-0.3.4a1/src/ophyd_async → ophyd_async-0.5.0/src/ophyd_async/fastcs}/panda/_common_blocks.py +24 -3
  68. {ophyd_async-0.3.4a1/src/ophyd_async → ophyd_async-0.5.0/src/ophyd_async/fastcs}/panda/_hdf_panda.py +6 -9
  69. {ophyd_async-0.3.4a1/src/ophyd_async/panda/writers → ophyd_async-0.5.0/src/ophyd_async/fastcs/panda}/_hdf_writer.py +24 -14
  70. {ophyd_async-0.3.4a1/src/ophyd_async → ophyd_async-0.5.0/src/ophyd_async/fastcs}/panda/_panda_controller.py +2 -1
  71. {ophyd_async-0.3.4a1/src/ophyd_async → ophyd_async-0.5.0/src/ophyd_async/fastcs}/panda/_table.py +20 -18
  72. ophyd_async-0.5.0/src/ophyd_async/fastcs/panda/_trigger.py +90 -0
  73. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/src/ophyd_async/plan_stubs/__init__.py +2 -2
  74. ophyd_async-0.5.0/src/ophyd_async/plan_stubs/_ensure_connected.py +26 -0
  75. ophyd_async-0.3.4a1/src/ophyd_async/plan_stubs/fly.py → ophyd_async-0.5.0/src/ophyd_async/plan_stubs/_fly.py +67 -12
  76. ophyd_async-0.5.0/src/ophyd_async/sim/demo/__init__.py +19 -0
  77. ophyd_async-0.5.0/src/ophyd_async/sim/demo/_pattern_detector/__init__.py +13 -0
  78. ophyd_async-0.5.0/src/ophyd_async/sim/demo/_pattern_detector/_pattern_detector.py +42 -0
  79. ophyd_async-0.3.4a1/src/ophyd_async/sim/sim_pattern_detector_control.py → ophyd_async-0.5.0/src/ophyd_async/sim/demo/_pattern_detector/_pattern_detector_controller.py +6 -7
  80. ophyd_async-0.3.4a1/src/ophyd_async/sim/sim_pattern_detector_writer.py → ophyd_async-0.5.0/src/ophyd_async/sim/demo/_pattern_detector/_pattern_detector_writer.py +12 -8
  81. ophyd_async-0.5.0/src/ophyd_async/sim/demo/_pattern_detector/_pattern_generator.py +211 -0
  82. ophyd_async-0.3.4a1/src/ophyd_async/sim/demo/sim_motor.py → ophyd_async-0.5.0/src/ophyd_async/sim/demo/_sim_motor.py +7 -5
  83. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/src/ophyd_async.egg-info/PKG-INFO +7 -2
  84. ophyd_async-0.5.0/src/ophyd_async.egg-info/SOURCES.txt +204 -0
  85. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/src/ophyd_async.egg-info/requires.txt +6 -1
  86. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/tests/conftest.py +29 -7
  87. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/tests/core/test_device.py +51 -21
  88. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/tests/core/test_device_collector.py +10 -26
  89. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/tests/core/test_device_save_loader.py +4 -4
  90. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/tests/core/test_flyer.py +71 -14
  91. ophyd_async-0.5.0/tests/core/test_log.py +81 -0
  92. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/tests/core/test_mock_signal_backend.py +12 -6
  93. ophyd_async-0.5.0/tests/core/test_protocol.py +35 -0
  94. ophyd_async-0.5.0/tests/core/test_providers.py +85 -0
  95. ophyd_async-0.3.4a1/tests/core/test_standard_readable.py → ophyd_async-0.5.0/tests/core/test_readable.py +13 -5
  96. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/tests/core/test_signal.py +101 -5
  97. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/tests/core/test_soft_signal_backend.py +28 -19
  98. ophyd_async-0.3.4a1/tests/core/test_async_status.py → ophyd_async-0.5.0/tests/core/test_status.py +2 -2
  99. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/tests/core/test_subset_enum.py +5 -3
  100. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/tests/core/test_utils.py +2 -2
  101. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/tests/core/test_watchable_async_status.py +7 -4
  102. ophyd_async-0.5.0/tests/epics/adaravis/test_aravis.py +158 -0
  103. {ophyd_async-0.3.4a1/tests/epics/areadetector → ophyd_async-0.5.0/tests/epics/adcore}/test_drivers.py +23 -20
  104. {ophyd_async-0.3.4a1/tests/epics/areadetector → ophyd_async-0.5.0/tests/epics/adcore}/test_scans.py +18 -19
  105. ophyd_async-0.3.4a1/tests/epics/areadetector/test_single_trigger_det.py → ophyd_async-0.5.0/tests/epics/adcore/test_single_trigger.py +11 -9
  106. ophyd_async-0.3.4a1/tests/epics/areadetector/test_utils.py → ophyd_async-0.5.0/tests/epics/adcore/test_utils_adcore.py +3 -3
  107. {ophyd_async-0.3.4a1/tests/epics/areadetector → ophyd_async-0.5.0/tests/epics/adcore}/test_writers.py +14 -12
  108. ophyd_async-0.5.0/tests/epics/adkinetix/test_kinetix.py +124 -0
  109. ophyd_async-0.5.0/tests/epics/adpilatus/test_pilatus.py +141 -0
  110. ophyd_async-0.5.0/tests/epics/adpilatus/test_pilatus_controller.py +44 -0
  111. ophyd_async-0.5.0/tests/epics/adsimdetector/test_adsim_controller.py +30 -0
  112. ophyd_async-0.3.4a1/tests/epics/demo/test_demo_ad_sim_detector.py → ophyd_async-0.5.0/tests/epics/adsimdetector/test_sim.py +43 -42
  113. ophyd_async-0.5.0/tests/epics/advimba/test_vimba.py +134 -0
  114. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/tests/epics/demo/test_demo.py +4 -1
  115. {ophyd_async-0.3.4a1/tests/epics/_backend → ophyd_async-0.5.0/tests/epics/signal}/test_common.py +1 -1
  116. {ophyd_async-0.3.4a1/tests/epics → ophyd_async-0.5.0/tests/epics/signal}/test_signals.py +48 -12
  117. {ophyd_async-0.3.4a1/tests/epics/motion → ophyd_async-0.5.0/tests/epics}/test_motor.py +133 -3
  118. {ophyd_async-0.3.4a1/tests → ophyd_async-0.5.0/tests/fastcs}/panda/test_hdf_panda.py +40 -20
  119. {ophyd_async-0.3.4a1/tests → ophyd_async-0.5.0/tests/fastcs}/panda/test_panda_connect.py +18 -7
  120. {ophyd_async-0.3.4a1/tests → ophyd_async-0.5.0/tests/fastcs}/panda/test_panda_controller.py +7 -3
  121. {ophyd_async-0.3.4a1/tests → ophyd_async-0.5.0/tests/fastcs}/panda/test_panda_utils.py +24 -10
  122. {ophyd_async-0.3.4a1/tests → ophyd_async-0.5.0/tests/fastcs}/panda/test_table.py +1 -1
  123. ophyd_async-0.5.0/tests/fastcs/panda/test_trigger.py +103 -0
  124. {ophyd_async-0.3.4a1/tests → ophyd_async-0.5.0/tests/fastcs}/panda/test_writer.py +35 -27
  125. ophyd_async-0.5.0/tests/plan_stubs/test_ensure_connected.py +38 -0
  126. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/tests/plan_stubs/test_fly.py +66 -50
  127. ophyd_async-0.5.0/tests/sim/__init__.py +0 -0
  128. ophyd_async-0.5.0/tests/sim/conftest.py +15 -0
  129. ophyd_async-0.5.0/tests/sim/demo/__init__.py +0 -0
  130. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/tests/sim/demo/test_sim_motor.py +2 -2
  131. ophyd_async-0.5.0/tests/sim/test_pattern_generator.py +34 -0
  132. ophyd_async-0.5.0/tests/sim/test_sim_detector.py +54 -0
  133. ophyd_async-0.5.0/tests/sim/test_sim_writer.py +42 -0
  134. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/tests/sim/test_streaming_plan.py +4 -4
  135. ophyd_async-0.3.4a1/src/ophyd_async/core/_providers.py +0 -68
  136. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/__init__.py +0 -23
  137. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/controllers/__init__.py +0 -5
  138. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/drivers/__init__.py +0 -23
  139. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/vimba.py +0 -43
  140. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/writers/__init__.py +0 -5
  141. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/writers/_hdfdataset.py +0 -10
  142. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/writers/_hdffile.py +0 -54
  143. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/writers/nd_file_hdf.py +0 -40
  144. ophyd_async-0.3.4a1/src/ophyd_async/epics/areadetector/writers/nd_plugin.py +0 -38
  145. ophyd_async-0.3.4a1/src/ophyd_async/epics/demo/demo_ad_sim_detector.py +0 -35
  146. ophyd_async-0.3.4a1/src/ophyd_async/epics/motion/__init__.py +0 -3
  147. ophyd_async-0.3.4a1/src/ophyd_async/epics/motion/motor.py +0 -97
  148. ophyd_async-0.3.4a1/src/ophyd_async/epics/pvi/__init__.py +0 -3
  149. ophyd_async-0.3.4a1/src/ophyd_async/panda/_trigger.py +0 -39
  150. ophyd_async-0.3.4a1/src/ophyd_async/panda/writers/__init__.py +0 -3
  151. ophyd_async-0.3.4a1/src/ophyd_async/panda/writers/_panda_hdf_file.py +0 -54
  152. ophyd_async-0.3.4a1/src/ophyd_async/plan_stubs/ensure_connected.py +0 -22
  153. ophyd_async-0.3.4a1/src/ophyd_async/sim/__init__.py +0 -11
  154. ophyd_async-0.3.4a1/src/ophyd_async/sim/demo/__init__.py +0 -3
  155. ophyd_async-0.3.4a1/src/ophyd_async/sim/pattern_generator.py +0 -318
  156. ophyd_async-0.3.4a1/src/ophyd_async/sim/sim_pattern_generator.py +0 -35
  157. ophyd_async-0.3.4a1/src/ophyd_async.egg-info/SOURCES.txt +0 -199
  158. ophyd_async-0.3.4a1/tests/epics/areadetector/test_aravis.py +0 -153
  159. ophyd_async-0.3.4a1/tests/epics/areadetector/test_controllers.py +0 -75
  160. ophyd_async-0.3.4a1/tests/epics/areadetector/test_kinetix.py +0 -125
  161. ophyd_async-0.3.4a1/tests/epics/areadetector/test_pilatus.py +0 -121
  162. ophyd_async-0.3.4a1/tests/epics/areadetector/test_vimba.py +0 -137
  163. ophyd_async-0.3.4a1/tests/panda/test_trigger.py +0 -33
  164. ophyd_async-0.3.4a1/tests/protocols/test_protocols.py +0 -35
  165. ophyd_async-0.3.4a1/tests/sim/conftest.py +0 -15
  166. ophyd_async-0.3.4a1/tests/sim/test_pattern_generator.py +0 -72
  167. ophyd_async-0.3.4a1/tests/sim/test_sim_detector.py +0 -52
  168. ophyd_async-0.3.4a1/tests/sim/test_sim_writer.py +0 -45
  169. ophyd_async-0.3.4a1/tests/test_log.py +0 -88
  170. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.codecov.yml +0 -0
  171. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.copier-answers.yml +0 -0
  172. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.devcontainer/devcontainer.json +0 -0
  173. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.git-blame-ignore-revs +0 -0
  174. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.github/CONTRIBUTING.md +0 -0
  175. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.github/actions/install_requirements/action.yml +0 -0
  176. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.github/dependabot.yml +0 -0
  177. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.github/pages/index.html +0 -0
  178. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.github/pages/make_switcher.py +0 -0
  179. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.github/workflows/_check.yml +0 -0
  180. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.github/workflows/_dist.yml +0 -0
  181. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.github/workflows/_docs.yml +0 -0
  182. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.github/workflows/_pypi.yml +0 -0
  183. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.github/workflows/_tox.yml +0 -0
  184. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.github/workflows/ci.yml +0 -0
  185. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.github/workflows/periodic.yml +0 -0
  186. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.gitignore +0 -0
  187. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.mailmap +0 -0
  188. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/.pre-commit-config.yaml +0 -0
  189. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/Dockerfile +0 -0
  190. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/LICENSE +0 -0
  191. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/README.md +0 -0
  192. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/_templates/README +0 -0
  193. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/_templates/custom-class-template.rst +0 -0
  194. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/_templates/custom-module-template.rst +0 -0
  195. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/examples/epics_demo.py +0 -0
  196. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
  197. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
  198. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/explanations/decisions/0003-ophyd-async-migration.rst +0 -0
  199. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/explanations/decisions/0004-repository-structure.rst +0 -0
  200. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/explanations/decisions/0005-respect-black-line-length.rst +0 -0
  201. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/explanations/decisions/0006-procedural-device-definitions.rst +0 -0
  202. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/explanations/decisions/COPYME +0 -0
  203. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/explanations/decisions.md +0 -0
  204. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/explanations/design-goals.rst +0 -0
  205. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/explanations/event-loop-choice.rst +0 -0
  206. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/explanations/flyscanning.rst +0 -0
  207. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/explanations.md +0 -0
  208. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/genindex.rst +0 -0
  209. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/how-to/choose-interfaces-for-devices.md +0 -0
  210. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/how-to/contribute.md +0 -0
  211. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/how-to/write-tests-for-devices.rst +0 -0
  212. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/how-to.md +0 -0
  213. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/images/bluesky_ophyd_epics_devices_logo.svg +0 -0
  214. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/images/bluesky_ophyd_logo.svg +0 -0
  215. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/images/ophyd_favicon.svg +0 -0
  216. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/index.md +0 -0
  217. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/reference.md +0 -0
  218. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/tutorials/installation.md +0 -0
  219. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/tutorials/using-existing-devices.rst +0 -0
  220. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/docs/tutorials.md +0 -0
  221. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/setup.cfg +0 -0
  222. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/src/ophyd_async/__init__.py +0 -0
  223. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/src/ophyd_async/__main__.py +0 -0
  224. /ophyd_async-0.3.4a1/src/ophyd_async/core/utils.py → /ophyd_async-0.5.0/src/ophyd_async/core/_utils.py +0 -0
  225. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/src/ophyd_async/epics/__init__.py +0 -0
  226. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/src/ophyd_async/epics/demo/mover.db +0 -0
  227. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/src/ophyd_async/epics/demo/sensor.db +0 -0
  228. {ophyd_async-0.3.4a1/src/ophyd_async/epics/_backend → ophyd_async-0.5.0/src/ophyd_async/fastcs}/__init__.py +0 -0
  229. {ophyd_async-0.3.4a1/tests/epics/areadetector → ophyd_async-0.5.0/src/ophyd_async/fastcs/odin}/__init__.py +0 -0
  230. {ophyd_async-0.3.4a1/src/ophyd_async → ophyd_async-0.5.0/src/ophyd_async/fastcs}/panda/_utils.py +0 -0
  231. {ophyd_async-0.3.4a1/tests/epics/motion → ophyd_async-0.5.0/src/ophyd_async/sim}/__init__.py +0 -0
  232. {ophyd_async-0.3.4a1/tests/sim → ophyd_async-0.5.0/src/ophyd_async/sim/testing}/__init__.py +0 -0
  233. {ophyd_async-0.3.4a1/tests/sim/demo → ophyd_async-0.5.0/src/ophyd_async/tango}/__init__.py +0 -0
  234. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/src/ophyd_async.egg-info/dependency_links.txt +0 -0
  235. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/src/ophyd_async.egg-info/entry_points.txt +0 -0
  236. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/src/ophyd_async.egg-info/top_level.txt +0 -0
  237. {ophyd_async-0.3.4a1/tests/epics → ophyd_async-0.5.0/tests/epics/pvi}/test_pvi.py +0 -0
  238. {ophyd_async-0.3.4a1/tests/epics → ophyd_async-0.5.0/tests/epics/signal}/test_records.db +0 -0
  239. {ophyd_async-0.3.4a1/tests → ophyd_async-0.5.0/tests/fastcs}/panda/db/panda.db +0 -0
  240. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/tests/test_cli.py +0 -0
  241. {ophyd_async-0.3.4a1 → ophyd_async-0.5.0}/tests/test_data/test_yaml_save.yml +0 -0
@@ -23,7 +23,7 @@ jobs:
23
23
  - name: Create GitHub Release
24
24
  # We pin to the SHA, not the tag, for security reasons.
25
25
  # https://docs.github.com/en/actions/learn-github-actions/security-hardening-for-github-actions#using-third-party-actions
26
- uses: softprops/action-gh-release@69320dbe05506a9a39fc8ae11030b214ec2d1f87 # v2.0.5
26
+ uses: softprops/action-gh-release@a74c6b72af54cfa997e81df42d94703d6313a2d0 # v2.0.6
27
27
  with:
28
28
  prerelease: ${{ contains(github.ref_name, 'a') || contains(github.ref_name, 'b') || contains(github.ref_name, 'rc') }}
29
29
  files: "*"
@@ -49,7 +49,6 @@ jobs:
49
49
  with:
50
50
  python-version: ${{ inputs.python-version }}
51
51
  pip-install: ".[dev]"
52
-
53
52
  - name: Run tests
54
53
  run: tox -e tests
55
54
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ophyd-async
3
- Version: 0.3.4a1
3
+ Version: 0.5.0
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
@@ -45,10 +45,12 @@ Requires-Dist: numpy<2.0.0
45
45
  Requires-Dist: packaging
46
46
  Requires-Dist: pint
47
47
  Requires-Dist: bluesky>=1.13.0a3
48
- Requires-Dist: event-model<1.21.0
48
+ Requires-Dist: event_model
49
49
  Requires-Dist: p4p
50
50
  Requires-Dist: pyyaml
51
51
  Requires-Dist: colorlog
52
+ Requires-Dist: pydantic>=2.0
53
+ Requires-Dist: pydantic-numpy
52
54
  Provides-Extra: ca
53
55
  Requires-Dist: aioca>=1.6; extra == "ca"
54
56
  Provides-Extra: pva
@@ -81,10 +83,13 @@ Requires-Dist: pytest-faulthandler; extra == "dev"
81
83
  Requires-Dist: pytest-rerunfailures; extra == "dev"
82
84
  Requires-Dist: pytest-timeout; extra == "dev"
83
85
  Requires-Dist: ruff; extra == "dev"
86
+ Requires-Dist: sphinx<7.4.0; extra == "dev"
84
87
  Requires-Dist: sphinx-autobuild; extra == "dev"
88
+ Requires-Dist: autodoc-pydantic; extra == "dev"
85
89
  Requires-Dist: sphinxcontrib-mermaid; extra == "dev"
86
90
  Requires-Dist: sphinx-copybutton; extra == "dev"
87
91
  Requires-Dist: sphinx-design; extra == "dev"
92
+ Requires-Dist: super_state_machine; extra == "dev"
88
93
  Requires-Dist: tox-direct; extra == "dev"
89
94
  Requires-Dist: types-mock; extra == "dev"
90
95
  Requires-Dist: types-pyyaml; extra == "dev"
@@ -34,6 +34,8 @@ else:
34
34
  extensions = [
35
35
  # for diagrams
36
36
  "sphinxcontrib.mermaid",
37
+ # Used for BaseModel autodoc
38
+ "sphinxcontrib.autodoc_pydantic",
37
39
  # Use this for generating API docs
38
40
  "sphinx.ext.autodoc",
39
41
  "sphinx.ext.doctest",
@@ -239,5 +241,9 @@ autodoc_docstring_signature = True
239
241
  # numpydoc config
240
242
  numpydoc_show_class_members = False
241
243
 
244
+ # pydantic models
245
+ autodoc_pydantic_model_show_json = True
246
+ autodoc_pydantic_model_show_config_summary = False
247
+
242
248
  # Where to put Ipython savefigs
243
249
  ipython_savefig_dir = "../build/savefig"
@@ -3,22 +3,20 @@ from typing import Optional
3
3
 
4
4
  from bluesky.protocols import HasHints, Hints
5
5
 
6
- from ophyd_async.core import DirectoryProvider
7
- from ophyd_async.core.async_status import AsyncStatus
8
- from ophyd_async.core.detector import DetectorControl, DetectorTrigger, StandardDetector
9
- from ophyd_async.epics.areadetector.drivers.ad_base import (
10
- ADBase,
11
- ADBaseShapeProvider,
12
- start_acquiring_driver_and_ensure_status,
6
+ from ophyd_async.core import (
7
+ AsyncStatus,
8
+ DetectorControl,
9
+ DetectorTrigger,
10
+ PathProvider,
11
+ StandardDetector,
13
12
  )
14
- from ophyd_async.epics.areadetector.utils import ImageMode, ad_rw, stop_busy_record
15
- from ophyd_async.epics.areadetector.writers.hdf_writer import HDFWriter
16
- from ophyd_async.epics.areadetector.writers.nd_file_hdf import NDFileHDF
13
+ from ophyd_async.epics import adcore
14
+ from ophyd_async.epics.signal import epics_signal_rw_rbv
17
15
 
18
16
 
19
- class FooDriver(ADBase):
17
+ class FooDriver(adcore.ADBaseIO):
20
18
  def __init__(self, prefix: str, name: str = "") -> None:
21
- self.trigger_mode = ad_rw(str, prefix + "TriggerMode")
19
+ self.trigger_mode = epics_signal_rw_rbv(str, prefix + "TriggerMode")
22
20
  super().__init__(prefix, name)
23
21
 
24
22
 
@@ -38,40 +36,40 @@ class FooController(DetectorControl):
38
36
  ) -> AsyncStatus:
39
37
  await asyncio.gather(
40
38
  self._drv.num_images.set(num),
41
- self._drv.image_mode.set(ImageMode.multiple),
39
+ self._drv.image_mode.set(adcore.ImageMode.multiple),
42
40
  self._drv.trigger_mode.set(f"FOO{trigger}"),
43
41
  )
44
42
  if exposure is not None:
45
43
  await self._drv.acquire_time.set(exposure)
46
- return await start_acquiring_driver_and_ensure_status(self._drv)
44
+ return await adcore.start_acquiring_driver_and_ensure_status(self._drv)
47
45
 
48
46
  async def disarm(self):
49
- await stop_busy_record(self._drv.acquire, False, timeout=1)
47
+ await adcore.stop_busy_record(self._drv.acquire, False, timeout=1)
50
48
 
51
49
 
52
50
  class FooDetector(StandardDetector, HasHints):
53
51
  _controller: FooController
54
- _writer: HDFWriter
52
+ _writer: adcore.ADHDFWriter
55
53
 
56
54
  def __init__(
57
55
  self,
58
56
  prefix: str,
59
- directory_provider: DirectoryProvider,
57
+ path_provider: PathProvider,
60
58
  drv_suffix="cam1:",
61
59
  hdf_suffix="HDF1:",
62
60
  name="",
63
61
  ):
64
62
  # Must be children to pick up connect
65
63
  self.drv = FooDriver(prefix + drv_suffix)
66
- self.hdf = NDFileHDF(prefix + hdf_suffix)
64
+ self.hdf = adcore.NDFileHDFIO(prefix + hdf_suffix)
67
65
 
68
66
  super().__init__(
69
67
  FooController(self.drv),
70
- HDFWriter(
68
+ adcore.ADHDFWriter(
71
69
  self.hdf,
72
- directory_provider,
70
+ path_provider,
73
71
  lambda: self.name,
74
- ADBaseShapeProvider(self.drv),
72
+ adcore.ADBaseShapeProvider(self.drv),
75
73
  ),
76
74
  config_sigs=(self.drv.acquire_time,),
77
75
  name=name,
@@ -0,0 +1,95 @@
1
+ # 7. Sub-package Structure
2
+
3
+ Date: 2024-04-22
4
+
5
+ ## Status
6
+
7
+ Accepted
8
+
9
+ ## Context
10
+
11
+ [](./0004-repository-structure) proposed a top level repository structure. This builds upon it, suggesting a top level structure divided into:
12
+
13
+ - `ophyd_async.core`: Core classes like `Device`, `Signal` and `AsyncStatus`
14
+ - `ophyd_async.epics`: Epics specific signals and devices
15
+ - `ophyd_async.tango`: Tango specific signals and devices
16
+ - `ophyd_async.fastcs`: FastCS (EPICS or Tango) devices like PandA
17
+ - `ophyd_async.planstubs`: Plan stubs for various flyscan functionality
18
+ - `ophyd_async.sim`: Simulated devices for demos and tests
19
+
20
+ This ADR proposes a public sub-package structure. The internal private structure should be flat, but can change according to the number of classes in a public package.
21
+
22
+ ## Decision
23
+
24
+ ### core
25
+
26
+ There will be a flat public namespace under core, with contents reimported from an underscore prefixed python files, e.g.:
27
+
28
+ - `_status.py` for `AsyncStatus`, `WatchableAsyncStatus`, etc.
29
+ - `_protocol.py` for `AsyncReadable`, `AsyncStageable`, etc.
30
+ - `_device.py` for `Device`, `DeviceVector`, etc.
31
+ - `_signal.py` for `Signal`, `SignalBackend`, `observe_signal`, etc.
32
+ - `_mock.py` for `MockSignalBackend`, `get_mock_put`, etc.
33
+ - `_readable.py` for `StandardReadable`, `ConfigSignal`, `HintedSignal`, etc.
34
+ - `_detector.py` for `StandardDetector`, `DetectorWriter`, `DetectorControl`, `TriggerInfo`, etc.
35
+ - `_flyer.py` for `StandardFlyer`, `FlyerControl`, etc.
36
+
37
+ There are some renames that will be required, e.g. `HardwareTriggeredFlyable` -> `StandardFlyer`
38
+
39
+ ### epics
40
+
41
+ Epics modules consist of 2 sorts of classes:
42
+ - `IO` classes, which are `Device` subclasses containing `Signals` that map as closely as possible to the EPICS template hierarchy. Their name matches the EPICS template with the suffix `IO`.
43
+ - `Control` and `Writer` classes that plug into `StandardDetector` and `StandardFlyer` telling them which logic to use during various bluesky verbs.
44
+
45
+ There should be an additional level of packages that correspond to the epics support module, and contain classes that map to the EPICS database and logic classes e.g.:
46
+
47
+ - `epics.signal`: containing `epics_signal_rw`, `CaSignalBackend`, etc.
48
+ - `epics.adcore`: containing `ADDriverIO`, `NDFileHdfIO`, `ADHdfWriter` etc.
49
+ - `epics.adpilatus`: containing `ADPilatusIO`, `PilatusControl` etc.
50
+
51
+ The name of the module is the EPICS module lowercased with dashes and other special characters converted to underscores.
52
+
53
+ They can be imported from modules:
54
+
55
+ ```python
56
+ from ophyd_async.epics import adcore, adpilatus
57
+
58
+ drv = adpilatus.ADPilatusIO(prefix + "DRV:")
59
+ hdf = adcore.NDFileHDFIO(prefix + "HDF:")
60
+ ```
61
+
62
+ The structure is left to an individual module's size. For instance `motor` will probably be a single `motor.py`, while `ADCore` will likely be an `ADCore/` directory with `_io.py`, `_writer.py`, `_control.py`.
63
+
64
+ Detector modules should include a reference `StandardDetector` subclass, but without making any site specific decisions about PV naming.
65
+
66
+ ### tango
67
+
68
+ This has not been created at the time of writing, but it is envisioned that it will follow the EPICS structure where it makes sense.
69
+
70
+ ### fastcs
71
+
72
+ There will be one subpackage for each FastCS Device. At the time of writing there are none of these, but PandA and Odin will shortly be converted to FastCS, so it makes sense to make:
73
+
74
+ - `fastcs.panda`
75
+ - `fastcs.odin`
76
+
77
+ in preparation.
78
+
79
+ For PandA its namespace should contain `CommonPandaBlocks`, `SeqBlock`, `PandaHdfWriter`, `PandaPcapController`, etc. These should be included in files like `_control.py`, `_writer.py`, `_block.py`, `_table.py` and imported into the `panda` namespace.
80
+
81
+ ### planstubs
82
+
83
+ There will be some planstubs for shared setup that may reach across modules like `epics` and `fastcs/panda`, these should live in a `planstubs/` package.
84
+
85
+ ### sim
86
+
87
+ There will be 2 subpackages:
88
+ - `sim.demo` for demo devices like `PatternDetector` and `SimMotor` used in tutorials.
89
+ - `sim.testing` for devices that will support tests in `ophyd-async` and `bluesky`. Some test fixtures could be moved here
90
+
91
+ There should probably be one file per Device, in an underscore prefixed file reimported into the public namespace, e.g. `demo/_sim_motor.py` and `demo/_pattern_detector.py`.
92
+
93
+ ## Consequences
94
+
95
+ The public import paths are fixed, but the underlying implementation can move from modules to packages without change to the public interface.
@@ -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/__init__.py
14
+ .. literalinclude:: ../../src/ophyd_async/epics/demo/_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/__init__.py
38
+ .. literalinclude:: ../../src/ophyd_async/epics/demo/_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.
@@ -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/__init__.py
25
+ .. literalinclude:: ../../src/ophyd_async/epics/demo/_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/__init__.py
57
+ .. literalinclude:: ../../src/ophyd_async/epics/demo/_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/__init__.py
74
+ .. literalinclude:: ../../src/ophyd_async/epics/demo/_mover.py
75
75
  :pyobject: SampleStage
76
76
 
77
77
  This applies prefixes on construction:
@@ -9,7 +9,7 @@ Make a StandardDetector
9
9
  `StandardDetector` is an abstract class to assist in creating Device classes for hardware that writes its own data e.g. an AreaDetector implementation, or a PandA writing motor encoder positions to file.
10
10
  The `StandardDetector` is a simple compound device, with 2 standard components:
11
11
 
12
- - `DetectorWriter` to handle data persistence, i/o and pass information about data to the RunEngine (usually an instance of :py:class:`HDFWriter`)
12
+ - `DetectorWriter` to handle data persistence, i/o and pass information about data to the RunEngine (usually an instance of :py:class:`ADHDFWriter`)
13
13
  - `DetectorControl` with logic for arming and disarming the detector. This will be unique to the StandardDetector implementation.
14
14
 
15
15
  Writing an AreaDetector StandardDetector
@@ -17,11 +17,11 @@ Writing an AreaDetector StandardDetector
17
17
 
18
18
  For an AreaDetector implementation of the StandardDetector, two entity objects which are subdevices of the `StandardDetector` are used to map to AreaDetector plugins:
19
19
 
20
- - An NDPluginFile instance (for :py:class:`HDFWriter` an instance of :py:class:`NDFileHDF`)
21
- - An :py:class:`ADBase` instance mapping to NDArray for the "driver" of the detector implementation
20
+ - An NDPluginFile instance (for :py:class:`ADHDFWriter` an instance of :py:class:`NDFileHDFIO`)
21
+ - An :py:class:`ADBaseIO` instance mapping to NDArray for the "driver" of the detector implementation
22
22
 
23
23
 
24
- Define a :py:class:`FooDriver` if the NDArray requires fields in addition to those on :py:class:`ADBase` to be exposed. It should extend :py:class:`ADBase`.
24
+ Define a :py:class:`FooDriver` if the NDArray requires fields in addition to those on :py:class:`ADBaseIO` to be exposed. It should extend :py:class:`ADBaseIO`.
25
25
  Enumeration fields should be named to prevent namespace collision, i.e. for a Signal named "TriggerSource" use the enum "FooTriggerSource"
26
26
 
27
27
  .. literalinclude:: ../examples/foo_detector.py
@@ -50,15 +50,15 @@ Writing a non-AreaDetector StandardDetector
50
50
  A non-AreaDetector `StandardDetector` should implement `DetectorControl` and `DetectorWriter` directly.
51
51
  Here we construct a `DetectorControl` that co-ordinates signals on a PandA PositionCapture block - a child device "pcap" of the `StandardDetector` implementation, analogous to the :py:class:`FooDriver`.
52
52
 
53
- .. literalinclude:: ../../src/ophyd_async/panda/_panda_controller.py
53
+ .. literalinclude:: ../../src/ophyd_async/fastcs/panda/_panda_controller.py
54
54
  :pyobject: PandaPcapController
55
55
 
56
56
  The PandA may write a number of fields, and the :py:class:`PandaHDFWriter` co-ordinates those, configures the filewriter and describes the data for the RunEngine.
57
57
 
58
- .. literalinclude:: ../../src/ophyd_async/panda/writers/_hdf_writer.py
58
+ .. literalinclude:: ../../src/ophyd_async/fastcs/panda/_hdf_writer.py
59
59
  :pyobject: PandaHDFWriter
60
60
 
61
61
  The PandA StandardDetector implementation simply ties the component parts and its child devices together.
62
62
 
63
- .. literalinclude:: ../../src/ophyd_async/panda/_hdf_panda.py
63
+ .. literalinclude:: ../../src/ophyd_async/fastcs/panda/_hdf_panda.py
64
64
  :pyobject: HDFPanda
@@ -26,4 +26,4 @@ This is the internal API reference for ophyd_async
26
26
 
27
27
  core
28
28
  epics
29
- panda
29
+ fastcs
@@ -17,10 +17,12 @@ dependencies = [
17
17
  "packaging",
18
18
  "pint",
19
19
  "bluesky>=1.13.0a3",
20
- "event-model<1.21.0",
20
+ "event_model",
21
21
  "p4p",
22
22
  "pyyaml",
23
23
  "colorlog",
24
+ "pydantic>=2.0",
25
+ "pydantic-numpy",
24
26
  ]
25
27
  dynamic = ["version"]
26
28
  license.file = "LICENSE"
@@ -58,10 +60,13 @@ dev = [
58
60
  "pytest-rerunfailures",
59
61
  "pytest-timeout",
60
62
  "ruff",
63
+ "sphinx<7.4.0", # https://github.com/bluesky/ophyd-async/issues/459
61
64
  "sphinx-autobuild",
65
+ "autodoc-pydantic",
62
66
  "sphinxcontrib-mermaid",
63
67
  "sphinx-copybutton",
64
68
  "sphinx-design",
69
+ "super_state_machine",
65
70
  "tox-direct",
66
71
  "types-mock",
67
72
  "types-pyyaml",
@@ -127,7 +132,7 @@ allowlist_externals =
127
132
  commands =
128
133
  tests: pytest --cov=ophyd_async --cov-report term --cov-report xml:cov.xml {posargs}
129
134
  type-checking: ruff check src tests {posargs}
130
- pre-commit: pre-commit run --all-files {posargs}
135
+ pre-commit: pre-commit run --all-files --show-diff-on-failure {posargs}
131
136
  docs: sphinx-{posargs:build -EW --keep-going} -T docs build/html
132
137
  """
133
138
 
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.3.4a1'
16
- __version_tuple__ = version_tuple = (0, 3, 4)
15
+ __version__ = version = '0.5.0'
16
+ __version_tuple__ = version_tuple = (0, 5, 0)
@@ -1,20 +1,13 @@
1
- from ._providers import (
2
- DirectoryInfo,
3
- DirectoryProvider,
4
- NameProvider,
5
- ShapeProvider,
6
- StaticDirectoryProvider,
7
- )
8
- from .async_status import AsyncStatus, WatchableAsyncStatus
9
- from .detector import (
1
+ from ._detector import (
10
2
  DetectorControl,
11
3
  DetectorTrigger,
12
4
  DetectorWriter,
13
5
  StandardDetector,
14
6
  TriggerInfo,
15
7
  )
16
- from .device import Device, DeviceCollector, DeviceVector
17
- from .device_save_loader import (
8
+ from ._device import Device, DeviceCollector, DeviceVector
9
+ from ._device_save_loader import (
10
+ all_at_once,
18
11
  get_signal_values,
19
12
  load_device,
20
13
  load_from_yaml,
@@ -23,9 +16,11 @@ from .device_save_loader import (
23
16
  set_signal_values,
24
17
  walk_rw_signals,
25
18
  )
26
- from .flyer import HardwareTriggeredFlyable, TriggerLogic
27
- from .mock_signal_backend import MockSignalBackend
28
- from .mock_signal_utils import (
19
+ from ._flyer import StandardFlyer, TriggerLogic
20
+ from ._hdf_dataset import HDFDataset, HDFFile
21
+ from ._log import config_ophyd_async_logging
22
+ from ._mock_signal_backend import MockSignalBackend
23
+ from ._mock_signal_utils import (
29
24
  callback_on_mock_put,
30
25
  get_mock_put,
31
26
  mock_puts_blocked,
@@ -34,7 +29,22 @@ from .mock_signal_utils import (
34
29
  set_mock_value,
35
30
  set_mock_values,
36
31
  )
37
- from .signal import (
32
+ from ._protocol import AsyncConfigurable, AsyncReadable, AsyncStageable
33
+ from ._providers import (
34
+ AutoIncrementFilenameProvider,
35
+ AutoIncrementingPathProvider,
36
+ FilenameProvider,
37
+ NameProvider,
38
+ PathInfo,
39
+ PathProvider,
40
+ ShapeProvider,
41
+ StaticFilenameProvider,
42
+ StaticPathProvider,
43
+ UUIDFilenameProvider,
44
+ YMDPathProvider,
45
+ )
46
+ from ._readable import ConfigSignal, HintedSignal, StandardReadable
47
+ from ._signal import (
38
48
  Signal,
39
49
  SignalR,
40
50
  SignalRW,
@@ -50,87 +60,100 @@ from .signal import (
50
60
  soft_signal_rw,
51
61
  wait_for_value,
52
62
  )
53
- from .signal_backend import RuntimeSubsetEnum, SignalBackend, SubsetEnum
54
- from .soft_signal_backend import SoftSignalBackend
55
- from .standard_readable import ConfigSignal, HintedSignal, StandardReadable
56
- from .utils import (
63
+ from ._signal_backend import RuntimeSubsetEnum, SignalBackend, SubsetEnum
64
+ from ._soft_signal_backend import SignalMetadata, SoftSignalBackend
65
+ from ._status import AsyncStatus, WatchableAsyncStatus
66
+ from ._utils import (
57
67
  DEFAULT_TIMEOUT,
58
68
  CalculatableTimeout,
59
69
  CalculateTimeout,
60
- Callback,
61
70
  NotConnected,
62
71
  ReadingValueCallback,
63
72
  T,
73
+ WatcherUpdate,
64
74
  get_dtype,
65
75
  get_unique,
66
- merge_gathered_dicts,
76
+ in_micros,
67
77
  wait_for_connection,
68
78
  )
69
79
 
70
80
  __all__ = [
71
- "AsyncStatus",
72
- "CalculatableTimeout",
73
- "CalculateTimeout",
74
- "Callback",
75
- "ConfigSignal",
76
- "DEFAULT_TIMEOUT",
77
81
  "DetectorControl",
78
82
  "DetectorTrigger",
79
83
  "DetectorWriter",
84
+ "StandardDetector",
85
+ "TriggerInfo",
80
86
  "Device",
81
87
  "DeviceCollector",
82
88
  "DeviceVector",
83
- "DirectoryInfo",
84
- "DirectoryProvider",
85
- "HardwareTriggeredFlyable",
86
- "HintedSignal",
89
+ "all_at_once",
90
+ "get_signal_values",
91
+ "load_device",
92
+ "load_from_yaml",
93
+ "save_device",
94
+ "save_to_yaml",
95
+ "set_signal_values",
96
+ "walk_rw_signals",
97
+ "StandardFlyer",
98
+ "TriggerLogic",
99
+ "HDFDataset",
100
+ "HDFFile",
101
+ "config_ophyd_async_logging",
87
102
  "MockSignalBackend",
103
+ "callback_on_mock_put",
104
+ "get_mock_put",
105
+ "mock_puts_blocked",
106
+ "reset_mock_put_calls",
107
+ "set_mock_put_proceeds",
108
+ "set_mock_value",
109
+ "set_mock_values",
110
+ "AsyncConfigurable",
111
+ "AsyncReadable",
112
+ "AsyncStageable",
113
+ "AutoIncrementFilenameProvider",
114
+ "AutoIncrementingPathProvider",
115
+ "FilenameProvider",
88
116
  "NameProvider",
89
- "NotConnected",
90
- "ReadingValueCallback",
91
- "RuntimeSubsetEnum",
92
- "SubsetEnum",
117
+ "PathInfo",
118
+ "PathProvider",
93
119
  "ShapeProvider",
120
+ "StaticFilenameProvider",
121
+ "StaticPathProvider",
122
+ "UUIDFilenameProvider",
123
+ "YMDPathProvider",
124
+ "ConfigSignal",
125
+ "HintedSignal",
126
+ "StandardReadable",
94
127
  "Signal",
95
- "SignalBackend",
96
128
  "SignalR",
97
129
  "SignalRW",
98
130
  "SignalW",
99
131
  "SignalX",
100
- "SoftSignalBackend",
101
- "StandardDetector",
102
- "StandardReadable",
103
- "StaticDirectoryProvider",
104
- "T",
105
- "TriggerInfo",
106
- "TriggerLogic",
107
- "WatchableAsyncStatus",
108
132
  "assert_configuration",
109
133
  "assert_emitted",
110
- "assert_mock_put_called_with",
111
134
  "assert_reading",
112
135
  "assert_value",
113
- "callback_on_mock_put",
114
- "get_dtype",
115
- "get_mock_put",
116
- "get_signal_values",
117
- "get_unique",
118
- "load_device",
119
- "load_from_yaml",
120
- "merge_gathered_dicts",
121
- "mock_puts_blocked",
122
136
  "observe_value",
123
- "reset_mock_put_calls",
124
- "save_device",
125
- "save_to_yaml",
126
137
  "set_and_wait_for_value",
127
- "set_mock_put_proceeds",
128
- "set_mock_value",
129
- "set_mock_values",
130
- "set_signal_values",
131
138
  "soft_signal_r_and_setter",
132
139
  "soft_signal_rw",
133
- "wait_for_connection",
134
140
  "wait_for_value",
135
- "walk_rw_signals",
141
+ "RuntimeSubsetEnum",
142
+ "SignalBackend",
143
+ "SubsetEnum",
144
+ "SignalMetadata",
145
+ "SoftSignalBackend",
146
+ "AsyncStatus",
147
+ "WatchableAsyncStatus",
148
+ "DEFAULT_TIMEOUT",
149
+ "CalculatableTimeout",
150
+ "CalculateTimeout",
151
+ "NotConnected",
152
+ "ReadingValueCallback",
153
+ "T",
154
+ "WatcherUpdate",
155
+ "get_dtype",
156
+ "get_unique",
157
+ "in_micros",
158
+ "wait_for_connection",
136
159
  ]