ophyd-async 0.9.0a2__tar.gz → 0.10.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 (352) hide show
  1. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.devcontainer/devcontainer.json +2 -1
  2. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.github/CONTRIBUTING.md +1 -1
  3. ophyd_async-0.10.0a2/.github/codeql/codeql-config.yml +4 -0
  4. ophyd_async-0.10.0a2/.github/workflows/_codeql.yml +32 -0
  5. ophyd_async-0.10.0a2/.github/workflows/_import_with_no_extras.yml +26 -0
  6. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.github/workflows/ci.yml +10 -0
  7. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.github/workflows/periodic.yml +2 -0
  8. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.pre-commit-config.yaml +1 -1
  9. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/Dockerfile +0 -3
  10. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/PKG-INFO +25 -26
  11. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/README.md +10 -7
  12. ophyd_async-0.10.0a2/docs/_static/custom.css +5 -0
  13. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/conf.py +123 -78
  14. ophyd_async-0.10.0a2/docs/explanations/decisions/0010-docstring-format.md +101 -0
  15. ophyd_async-0.10.0a2/docs/explanations/declarative-vs-procedural.md +36 -0
  16. ophyd_async-0.10.0a2/docs/explanations/design-goals.md +67 -0
  17. ophyd_async-0.10.0a2/docs/explanations/device-connection-strategies.md +48 -0
  18. ophyd_async-0.10.0a2/docs/explanations/devices-signals-backends.md +109 -0
  19. ophyd_async-0.10.0a2/docs/explanations/flyscanning.md +84 -0
  20. ophyd_async-0.10.0a2/docs/explanations/where-device-logic.md +33 -0
  21. ophyd_async-0.10.0a2/docs/how-to/choose-right-baseclass.md +33 -0
  22. ophyd_async-0.10.0a2/docs/how-to/derive-one-signal-from-others.md +44 -0
  23. ophyd_async-0.10.0a2/docs/how-to/implement-ad-detector.md +105 -0
  24. ophyd_async-0.10.0a2/docs/how-to/interact-with-signals.md +111 -0
  25. ophyd_async-0.10.0a2/docs/how-to/put-device-back.md +42 -0
  26. ophyd_async-0.10.0a2/docs/how-to/store-and-retrieve.md +45 -0
  27. ophyd_async-0.10.0a2/docs/images/flyscan_collection_windows_and_frames.svg +2 -0
  28. ophyd_async-0.10.0a2/docs/images/set_and_wait_for_other_value.excalidraw.svg +21 -0
  29. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/reference.md +1 -1
  30. ophyd_async-0.10.0a2/docs/tutorials/implementing-detectors.md +211 -0
  31. ophyd_async-0.10.0a2/docs/tutorials/implementing-devices.md +338 -0
  32. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/tutorials/installation.md +15 -1
  33. ophyd_async-0.10.0a2/docs/tutorials/using-devices.md +156 -0
  34. ophyd_async-0.10.0a2/docs/tutorials/writing-tests-for-devices.md +124 -0
  35. ophyd_async-0.10.0a2/docs/tutorials.md +14 -0
  36. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/pyproject.toml +22 -25
  37. ophyd_async-0.10.0a2/src/ophyd_async/__init__.py +9 -0
  38. ophyd_async-0.10.0a2/src/ophyd_async/_docs_parser.py +12 -0
  39. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/_version.py +9 -4
  40. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/__init__.py +97 -62
  41. ophyd_async-0.10.0a2/src/ophyd_async/core/_derived_signal.py +271 -0
  42. ophyd_async-0.10.0a2/src/ophyd_async/core/_derived_signal_backend.py +300 -0
  43. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/_detector.py +106 -125
  44. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/_device.py +69 -63
  45. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/_device_filler.py +65 -1
  46. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/_flyer.py +14 -5
  47. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/_hdf_dataset.py +29 -22
  48. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/_log.py +14 -23
  49. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/_mock_signal_backend.py +11 -3
  50. ophyd_async-0.10.0a2/src/ophyd_async/core/_protocol.py +138 -0
  51. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/_providers.py +28 -9
  52. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/_readable.py +44 -35
  53. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/_settings.py +36 -27
  54. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/_signal.py +262 -170
  55. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/_signal_backend.py +56 -13
  56. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/_soft_signal_backend.py +16 -11
  57. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/_status.py +72 -24
  58. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/_table.py +41 -11
  59. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/_utils.py +96 -49
  60. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/core/_yaml_settings.py +2 -0
  61. ophyd_async-0.10.0a2/src/ophyd_async/epics/__init__.py +1 -0
  62. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adandor/_andor.py +2 -2
  63. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adandor/_andor_controller.py +4 -2
  64. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adandor/_andor_io.py +2 -4
  65. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adaravis/__init__.py +5 -0
  66. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adaravis/_aravis.py +4 -8
  67. ophyd_async-0.10.0a2/src/ophyd_async/epics/adaravis/_aravis_controller.py +45 -0
  68. ophyd_async-0.10.0a2/src/ophyd_async/epics/adaravis/_aravis_io.py +31 -0
  69. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adcore/__init__.py +23 -8
  70. ophyd_async-0.10.0a2/src/ophyd_async/epics/adcore/_core_detector.py +81 -0
  71. ophyd_async-0.10.0a2/src/ophyd_async/epics/adcore/_core_io.py +188 -0
  72. ophyd_async-0.10.0a2/src/ophyd_async/epics/adcore/_core_logic.py +200 -0
  73. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adcore/_core_writer.py +12 -8
  74. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adcore/_hdf_writer.py +21 -38
  75. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adcore/_single_trigger.py +2 -2
  76. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adcore/_utils.py +2 -2
  77. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adkinetix/__init__.py +2 -1
  78. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adkinetix/_kinetix.py +3 -3
  79. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adkinetix/_kinetix_controller.py +4 -2
  80. ophyd_async-0.10.0a2/src/ophyd_async/epics/adkinetix/_kinetix_io.py +29 -0
  81. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adpilatus/__init__.py +5 -0
  82. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adpilatus/_pilatus.py +1 -1
  83. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adpilatus/_pilatus_controller.py +5 -24
  84. ophyd_async-0.10.0a2/src/ophyd_async/epics/adpilatus/_pilatus_io.py +24 -0
  85. ophyd_async-0.10.0a2/src/ophyd_async/epics/adsimdetector/__init__.py +14 -0
  86. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adsimdetector/_sim.py +4 -14
  87. ophyd_async-0.10.0a2/src/ophyd_async/epics/adsimdetector/_sim_controller.py +17 -0
  88. ophyd_async-0.10.0a2/src/ophyd_async/epics/adsimdetector/_sim_io.py +10 -0
  89. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/advimba/__init__.py +10 -1
  90. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/advimba/_vimba.py +3 -2
  91. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/advimba/_vimba_controller.py +4 -2
  92. ophyd_async-0.10.0a2/src/ophyd_async/epics/advimba/_vimba_io.py +60 -0
  93. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/core/_aioca.py +35 -16
  94. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/core/_epics_connector.py +4 -0
  95. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/core/_epics_device.py +2 -0
  96. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/core/_p4p.py +10 -2
  97. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/core/_pvi_connector.py +65 -8
  98. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/core/_signal.py +51 -51
  99. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/core/_util.py +4 -4
  100. ophyd_async-0.10.0a2/src/ophyd_async/epics/demo/__init__.py +16 -0
  101. ophyd_async-0.10.0a2/src/ophyd_async/epics/demo/__main__.py +31 -0
  102. ophyd_async-0.10.0a2/src/ophyd_async/epics/demo/_ioc.py +32 -0
  103. ophyd_async-0.10.0a2/src/ophyd_async/epics/demo/_motor.py +82 -0
  104. ophyd_async-0.10.0a2/src/ophyd_async/epics/demo/_point_detector.py +42 -0
  105. ophyd_async-0.10.0a2/src/ophyd_async/epics/demo/_point_detector_channel.py +22 -0
  106. ophyd_async-0.10.0a2/src/ophyd_async/epics/demo/_stage.py +15 -0
  107. ophyd_async-0.9.0a2/src/ophyd_async/epics/sim/mover.db → ophyd_async-0.10.0a2/src/ophyd_async/epics/demo/motor.db +2 -1
  108. ophyd_async-0.10.0a2/src/ophyd_async/epics/demo/point_detector.db +59 -0
  109. ophyd_async-0.10.0a2/src/ophyd_async/epics/demo/point_detector_channel.db +21 -0
  110. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/eiger/_eiger.py +1 -3
  111. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/eiger/_eiger_controller.py +11 -4
  112. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/eiger/_eiger_io.py +2 -0
  113. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/eiger/_odin_io.py +1 -2
  114. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/motor.py +65 -28
  115. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/signal.py +4 -1
  116. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/testing/_example_ioc.py +21 -9
  117. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/testing/_utils.py +3 -0
  118. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/testing/test_records.db +8 -0
  119. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/testing/test_records_pva.db +17 -16
  120. ophyd_async-0.10.0a2/src/ophyd_async/fastcs/__init__.py +1 -0
  121. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/fastcs/core.py +6 -0
  122. ophyd_async-0.10.0a2/src/ophyd_async/fastcs/odin/__init__.py +1 -0
  123. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/fastcs/panda/__init__.py +8 -6
  124. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/fastcs/panda/_block.py +29 -9
  125. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/fastcs/panda/_control.py +5 -0
  126. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/fastcs/panda/_hdf_panda.py +2 -0
  127. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/fastcs/panda/_table.py +9 -6
  128. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/fastcs/panda/_trigger.py +23 -9
  129. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/fastcs/panda/_writer.py +27 -30
  130. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/plan_stubs/__init__.py +2 -0
  131. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/plan_stubs/_ensure_connected.py +1 -0
  132. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/plan_stubs/_fly.py +2 -4
  133. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/plan_stubs/_nd_attributes.py +2 -0
  134. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/plan_stubs/_panda.py +1 -0
  135. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/plan_stubs/_settings.py +43 -16
  136. ophyd_async-0.10.0a2/src/ophyd_async/plan_stubs/_utils.py +3 -0
  137. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/plan_stubs/_wait_for_awaitable.py +1 -1
  138. ophyd_async-0.10.0a2/src/ophyd_async/sim/__init__.py +29 -0
  139. ophyd_async-0.10.0a2/src/ophyd_async/sim/__main__.py +43 -0
  140. ophyd_async-0.10.0a2/src/ophyd_async/sim/_blob_detector.py +33 -0
  141. ophyd_async-0.10.0a2/src/ophyd_async/sim/_blob_detector_controller.py +48 -0
  142. ophyd_async-0.10.0a2/src/ophyd_async/sim/_blob_detector_writer.py +105 -0
  143. ophyd_async-0.10.0a2/src/ophyd_async/sim/_mirror_horizontal.py +46 -0
  144. ophyd_async-0.10.0a2/src/ophyd_async/sim/_mirror_vertical.py +74 -0
  145. ophyd_async-0.10.0a2/src/ophyd_async/sim/_motor.py +233 -0
  146. ophyd_async-0.10.0a2/src/ophyd_async/sim/_pattern_generator.py +124 -0
  147. ophyd_async-0.10.0a2/src/ophyd_async/sim/_point_detector.py +86 -0
  148. ophyd_async-0.10.0a2/src/ophyd_async/sim/_stage.py +19 -0
  149. ophyd_async-0.10.0a2/src/ophyd_async/tango/__init__.py +1 -0
  150. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/tango/core/__init__.py +6 -1
  151. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/tango/core/_base_device.py +41 -33
  152. ophyd_async-0.10.0a2/src/ophyd_async/tango/core/_converters.py +81 -0
  153. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/tango/core/_signal.py +18 -32
  154. ophyd_async-0.10.0a2/src/ophyd_async/tango/core/_tango_readable.py +15 -0
  155. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/tango/core/_tango_transport.py +136 -60
  156. ophyd_async-0.10.0a2/src/ophyd_async/tango/core/_utils.py +47 -0
  157. {ophyd_async-0.9.0a2/src/ophyd_async/tango/sim → ophyd_async-0.10.0a2/src/ophyd_async/tango/demo}/_counter.py +2 -0
  158. {ophyd_async-0.9.0a2/src/ophyd_async/tango/sim → ophyd_async-0.10.0a2/src/ophyd_async/tango/demo}/_detector.py +2 -0
  159. {ophyd_async-0.9.0a2/src/ophyd_async/tango/sim → ophyd_async-0.10.0a2/src/ophyd_async/tango/demo}/_mover.py +5 -4
  160. {ophyd_async-0.9.0a2/src/ophyd_async/tango/sim → ophyd_async-0.10.0a2/src/ophyd_async/tango/demo}/_tango/_servers.py +4 -0
  161. ophyd_async-0.10.0a2/src/ophyd_async/tango/testing/__init__.py +6 -0
  162. ophyd_async-0.10.0a2/src/ophyd_async/tango/testing/_one_of_everything.py +200 -0
  163. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/testing/__init__.py +29 -7
  164. ophyd_async-0.10.0a2/src/ophyd_async/testing/_assert.py +238 -0
  165. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/testing/_mock_signal_utils.py +56 -70
  166. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/testing/_one_of_everything.py +41 -21
  167. ophyd_async-0.10.0a2/src/ophyd_async/testing/_single_derived.py +89 -0
  168. ophyd_async-0.10.0a2/src/ophyd_async/testing/_utils.py +3 -0
  169. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async.egg-info/PKG-INFO +25 -26
  170. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async.egg-info/SOURCES.txt +71 -40
  171. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async.egg-info/requires.txt +11 -15
  172. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/system_tests/epics/eiger/test_eiger_system.py +2 -1
  173. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/conftest.py +0 -27
  174. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/core/test_detector.py +2 -2
  175. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/core/test_flyer.py +6 -7
  176. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/core/test_mock_signal_backend.py +1 -2
  177. ophyd_async-0.10.0a2/tests/core/test_multi_derived_signal.py +130 -0
  178. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/core/test_signal.py +224 -112
  179. ophyd_async-0.10.0a2/tests/core/test_single_derived_signal.py +120 -0
  180. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/core/test_soft_signal_backend.py +30 -51
  181. ophyd_async-0.10.0a2/tests/epics/adandor/test_andor.py +46 -0
  182. ophyd_async-0.10.0a2/tests/epics/adaravis/test_aravis.py +44 -0
  183. ophyd_async-0.10.0a2/tests/epics/adcore/test_cont_acq_detector.py +83 -0
  184. ophyd_async-0.10.0a2/tests/epics/adcore/test_detectors.py +151 -0
  185. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/adcore/test_drivers.py +3 -5
  186. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/adcore/test_scans.py +2 -2
  187. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/adcore/test_single_trigger.py +2 -2
  188. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/adcore/test_writers.py +4 -4
  189. ophyd_async-0.10.0a2/tests/epics/adkinetix/test_kinetix.py +51 -0
  190. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/adpilatus/test_pilatus.py +1 -5
  191. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/adsimdetector/test_sim.py +5 -3
  192. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/advimba/test_vimba.py +0 -76
  193. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/conftest.py +18 -0
  194. ophyd_async-0.10.0a2/tests/epics/demo/test_epics_demo.py +338 -0
  195. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/eiger/test_eiger_controller.py +2 -1
  196. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/eiger/test_eiger_detector.py +0 -2
  197. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/signal/test_signals.py +94 -50
  198. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/signal/test_yaml_save_ca.yaml +5 -4
  199. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/signal/test_yaml_save_pva.yaml +10 -9
  200. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/test_motor.py +8 -67
  201. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/fastcs/panda/test_hdf_panda.py +0 -1
  202. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/fastcs/panda/test_panda_utils.py +8 -3
  203. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/fastcs/panda/test_trigger.py +2 -2
  204. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/fastcs/panda/test_writer.py +5 -8
  205. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/plan_stubs/test_fly.py +1 -1
  206. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/plan_stubs/test_settings.py +89 -2
  207. ophyd_async-0.10.0a2/tests/sim/test_sim_blob_detector.py +129 -0
  208. ophyd_async-0.10.0a2/tests/sim/test_sim_motor.py +105 -0
  209. ophyd_async-0.10.0a2/tests/tango/conftest.py +187 -0
  210. ophyd_async-0.10.0a2/tests/tango/context_subprocess.py +28 -0
  211. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/tango/test_base_device.py +70 -65
  212. ophyd_async-0.10.0a2/tests/tango/test_tango_signals.py +470 -0
  213. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/tango/test_tango_transport.py +70 -65
  214. ophyd_async-0.10.0a2/tests/test_data/test_yaml_config_save.yaml +58 -0
  215. ophyd_async-0.10.0a2/tests/test_data/test_yaml_save.yaml +176 -0
  216. ophyd_async-0.10.0a2/tests/test_tutorials.py +47 -0
  217. ophyd_async-0.9.0a2/docs/_api.rst +0 -16
  218. ophyd_async-0.9.0a2/docs/_templates/custom-module-template.rst +0 -42
  219. ophyd_async-0.9.0a2/docs/examples/epics_demo.py +0 -37
  220. ophyd_async-0.9.0a2/docs/examples/foo_detector.py +0 -79
  221. ophyd_async-0.9.0a2/docs/examples/tango_demo.py +0 -54
  222. ophyd_async-0.9.0a2/docs/explanations/design-goals.rst +0 -57
  223. ophyd_async-0.9.0a2/docs/explanations/event-loop-choice.rst +0 -50
  224. ophyd_async-0.9.0a2/docs/explanations/flyscanning.rst +0 -29
  225. ophyd_async-0.9.0a2/docs/how-to/choose-interfaces-for-devices.md +0 -15
  226. ophyd_async-0.9.0a2/docs/how-to/compound-devices.rst +0 -44
  227. ophyd_async-0.9.0a2/docs/how-to/make-a-simple-device.rst +0 -91
  228. ophyd_async-0.9.0a2/docs/how-to/make-a-standard-detector.rst +0 -64
  229. ophyd_async-0.9.0a2/docs/how-to/use_set_and_wait_for_other_value.md +0 -45
  230. ophyd_async-0.9.0a2/docs/how-to/write-tests-for-devices.rst +0 -63
  231. ophyd_async-0.9.0a2/docs/images/set_and_wait_for_other_value.svg +0 -2
  232. ophyd_async-0.9.0a2/docs/tutorials/using-existing-devices.rst +0 -184
  233. ophyd_async-0.9.0a2/docs/tutorials.md +0 -10
  234. ophyd_async-0.9.0a2/src/ophyd_async/__init__.py +0 -12
  235. ophyd_async-0.9.0a2/src/ophyd_async/core/_protocol.py +0 -118
  236. ophyd_async-0.9.0a2/src/ophyd_async/epics/adaravis/_aravis_controller.py +0 -68
  237. ophyd_async-0.9.0a2/src/ophyd_async/epics/adaravis/_aravis_io.py +0 -46
  238. ophyd_async-0.9.0a2/src/ophyd_async/epics/adcore/_core_detector.py +0 -41
  239. ophyd_async-0.9.0a2/src/ophyd_async/epics/adcore/_core_io.py +0 -163
  240. ophyd_async-0.9.0a2/src/ophyd_async/epics/adcore/_core_logic.py +0 -121
  241. ophyd_async-0.9.0a2/src/ophyd_async/epics/adkinetix/_kinetix_io.py +0 -30
  242. ophyd_async-0.9.0a2/src/ophyd_async/epics/adpilatus/_pilatus_io.py +0 -22
  243. ophyd_async-0.9.0a2/src/ophyd_async/epics/adsimdetector/__init__.py +0 -7
  244. ophyd_async-0.9.0a2/src/ophyd_async/epics/advimba/_vimba_io.py +0 -65
  245. ophyd_async-0.9.0a2/src/ophyd_async/epics/sim/__init__.py +0 -54
  246. ophyd_async-0.9.0a2/src/ophyd_async/epics/sim/_ioc.py +0 -29
  247. ophyd_async-0.9.0a2/src/ophyd_async/epics/sim/_mover.py +0 -101
  248. ophyd_async-0.9.0a2/src/ophyd_async/epics/sim/_sensor.py +0 -37
  249. ophyd_async-0.9.0a2/src/ophyd_async/epics/sim/sensor.db +0 -19
  250. ophyd_async-0.9.0a2/src/ophyd_async/fastcs/__init__.py +0 -0
  251. ophyd_async-0.9.0a2/src/ophyd_async/fastcs/odin/__init__.py +0 -0
  252. ophyd_async-0.9.0a2/src/ophyd_async/sim/__init__.py +0 -19
  253. ophyd_async-0.9.0a2/src/ophyd_async/sim/_pattern_detector/__init__.py +0 -13
  254. ophyd_async-0.9.0a2/src/ophyd_async/sim/_pattern_detector/_pattern_detector.py +0 -42
  255. ophyd_async-0.9.0a2/src/ophyd_async/sim/_pattern_detector/_pattern_detector_controller.py +0 -69
  256. ophyd_async-0.9.0a2/src/ophyd_async/sim/_pattern_detector/_pattern_detector_writer.py +0 -41
  257. ophyd_async-0.9.0a2/src/ophyd_async/sim/_pattern_detector/_pattern_generator.py +0 -214
  258. ophyd_async-0.9.0a2/src/ophyd_async/sim/_sim_motor.py +0 -107
  259. ophyd_async-0.9.0a2/src/ophyd_async/tango/__init__.py +0 -0
  260. ophyd_async-0.9.0a2/src/ophyd_async/tango/core/_tango_readable.py +0 -32
  261. ophyd_async-0.9.0a2/src/ophyd_async/testing/_assert.py +0 -176
  262. ophyd_async-0.9.0a2/tests/epics/adandor/test_andor.py +0 -123
  263. ophyd_async-0.9.0a2/tests/epics/adaravis/test_aravis.py +0 -157
  264. ophyd_async-0.9.0a2/tests/epics/adkinetix/test_kinetix.py +0 -127
  265. ophyd_async-0.9.0a2/tests/epics/sim/test_epics_sim.py +0 -409
  266. ophyd_async-0.9.0a2/tests/sim/__init__.py +0 -0
  267. ophyd_async-0.9.0a2/tests/sim/conftest.py +0 -11
  268. ophyd_async-0.9.0a2/tests/sim/test_pattern_generator.py +0 -67
  269. ophyd_async-0.9.0a2/tests/sim/test_sim_detector.py +0 -66
  270. ophyd_async-0.9.0a2/tests/sim/test_sim_motor.py +0 -93
  271. ophyd_async-0.9.0a2/tests/sim/test_sim_writer.py +0 -42
  272. ophyd_async-0.9.0a2/tests/sim/test_streaming_plan.py +0 -56
  273. ophyd_async-0.9.0a2/tests/tango/test_tango_signals.py +0 -631
  274. ophyd_async-0.9.0a2/tests/test_data/test_yaml_save.yaml +0 -119
  275. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.codecov.yml +0 -0
  276. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.copier-answers.yml +0 -0
  277. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.git-blame-ignore-revs +0 -0
  278. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  279. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.github/ISSUE_TEMPLATE/issue.md +0 -0
  280. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -0
  281. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.github/actions/install_requirements/action.yml +0 -0
  282. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.github/dependabot.yml +0 -0
  283. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.github/pages/index.html +0 -0
  284. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.github/pages/make_switcher.py +0 -0
  285. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.github/workflows/_check.yml +0 -0
  286. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.github/workflows/_dist.yml +0 -0
  287. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.github/workflows/_docs.yml +0 -0
  288. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.github/workflows/_pypi.yml +0 -0
  289. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.github/workflows/_release.yml +0 -0
  290. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.github/workflows/_test.yml +0 -0
  291. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.github/workflows/_tox.yml +0 -0
  292. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/.gitignore +0 -0
  293. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/LICENSE +0 -0
  294. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
  295. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
  296. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/explanations/decisions/0003-ophyd-async-migration.rst +0 -0
  297. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/explanations/decisions/0004-repository-structure.rst +0 -0
  298. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/explanations/decisions/0005-respect-black-line-length.rst +0 -0
  299. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/explanations/decisions/0006-procedural-device-definitions.rst +0 -0
  300. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/explanations/decisions/0007-subpackage-structure.md +0 -0
  301. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/explanations/decisions/0008-signal-types.md +0 -0
  302. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/explanations/decisions/0009-procedural-vs-declarative-devices.md +0 -0
  303. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/explanations/decisions/COPYME +0 -0
  304. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/explanations/decisions.md +0 -0
  305. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/explanations.md +0 -0
  306. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/genindex.rst +0 -0
  307. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/how-to/contribute.md +0 -0
  308. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/how-to.md +0 -0
  309. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/images/ophyd-async-logo.svg +0 -0
  310. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/images/ophyd-favicon.svg +0 -0
  311. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/docs/index.md +0 -0
  312. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/setup.cfg +0 -0
  313. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/__main__.py +0 -0
  314. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adandor/__init__.py +0 -0
  315. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adcore/_jpeg_writer.py +0 -0
  316. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/adcore/_tiff_writer.py +0 -0
  317. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/core/__init__.py +0 -0
  318. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/eiger/__init__.py +0 -0
  319. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/epics/testing/__init__.py +0 -0
  320. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/py.typed +0 -0
  321. {ophyd_async-0.9.0a2/src/ophyd_async/tango/sim → ophyd_async-0.10.0a2/src/ophyd_async/tango/demo}/__init__.py +0 -0
  322. {ophyd_async-0.9.0a2/src/ophyd_async/tango/sim → ophyd_async-0.10.0a2/src/ophyd_async/tango/demo}/_tango/__init__.py +0 -0
  323. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/testing/__pytest_assert_rewrite.py +0 -0
  324. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async/testing/_wait_for_pending.py +0 -0
  325. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async.egg-info/dependency_links.txt +0 -0
  326. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/src/ophyd_async.egg-info/top_level.txt +0 -0
  327. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/system_tests/epics/eiger/README.md +0 -0
  328. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/system_tests/epics/eiger/start_iocs_and_run_tests.sh +0 -0
  329. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/core/test_auto_init_devices.py +0 -0
  330. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/core/test_device.py +0 -0
  331. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/core/test_log.py +0 -0
  332. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/core/test_observe.py +0 -0
  333. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/core/test_protocol.py +0 -0
  334. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/core/test_providers.py +0 -0
  335. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/core/test_readable.py +0 -0
  336. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/core/test_status.py +0 -0
  337. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/core/test_subset_enum.py +0 -0
  338. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/core/test_table.py +0 -0
  339. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/core/test_utils.py +0 -0
  340. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/core/test_watchable_async_status.py +0 -0
  341. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/eiger/test_odin_io.py +0 -0
  342. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/pvi/test_pvi.py +0 -0
  343. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/signal/test_common.py +0 -0
  344. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/epics/test_areadetector_subclass_naming.py +0 -0
  345. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/fastcs/panda/db/panda.db +0 -0
  346. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/fastcs/panda/test_panda_connect.py +0 -0
  347. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/fastcs/panda/test_panda_control.py +0 -0
  348. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/fastcs/panda/test_seq_table.py +0 -0
  349. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/plan_stubs/test_ensure_connected.py +0 -0
  350. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/plan_stubs/test_setup.py +0 -0
  351. {ophyd_async-0.9.0a2/src/ophyd_async/epics → ophyd_async-0.10.0a2/tests/sim}/__init__.py +0 -0
  352. {ophyd_async-0.9.0a2 → ophyd_async-0.10.0a2}/tests/test_cli.py +0 -0
@@ -20,6 +20,7 @@
20
20
  "editor.codeActionsOnSave": {
21
21
  "source.organizeImports": "explicit"
22
22
  },
23
+ "remote.autoForwardPorts": false,
23
24
  "[python]": {
24
25
  "editor.defaultFormatter": "charliermarsh.ruff"
25
26
  }
@@ -38,7 +39,7 @@
38
39
  },
39
40
  "features": {
40
41
  // add in eternal history and other bash features
41
- "ghcr.io/diamondlightsource/devcontainer-features/bash-config:1.0.0": {}
42
+ "ghcr.io/diamondlightsource/devcontainer-features/bash-config:1": {}
42
43
  },
43
44
  // Create the config folder for the bash-config feature
44
45
  "initializeCommand": "mkdir -p ${localEnv:HOME}/.config/bash-config",
@@ -1,4 +1,4 @@
1
- # Contribute to the project
1
+ # How to contribute to the project
2
2
 
3
3
  Contributions and issues are most welcome! All issues and pull requests are
4
4
  handled through [GitHub](https://github.com/bluesky/ophyd-async/issues). Also, please check for any existing issues before
@@ -0,0 +1,4 @@
1
+ paths:
2
+ - src/ophyd_async
3
+
4
+ # from https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning#using-a-custom-configuration-file
@@ -0,0 +1,32 @@
1
+ name: "CodeQL"
2
+
3
+ on:
4
+ workflow_call:
5
+
6
+ jobs:
7
+ analyze:
8
+ name: Analyze (python)
9
+ # Runner size impacts CodeQL analysis time. To learn more, please see:
10
+ # - https://gh.io/using-larger-runners (GitHub.com only)
11
+ runs-on: "ubuntu-latest"
12
+ timeout-minutes: 120
13
+ permissions:
14
+ # required for all workflows
15
+ security-events: write
16
+
17
+ steps:
18
+ - name: Checkout repository
19
+ uses: actions/checkout@v4
20
+
21
+ - name: Initialize CodeQL
22
+ uses: github/codeql-action/init@v3
23
+ with:
24
+ languages: python
25
+ build-mode: none
26
+ queries: +security-and-quality
27
+ config-file: ./.github/codeql/codeql-config.yml
28
+
29
+ - name: Perform CodeQL Analysis
30
+ uses: github/codeql-action/analyze@v3
31
+ with:
32
+ category: "/language:python"
@@ -0,0 +1,26 @@
1
+ on:
2
+ workflow_call:
3
+
4
+ jobs:
5
+ run:
6
+ runs-on: "ubuntu-latest"
7
+
8
+ steps:
9
+ - name: Checkout
10
+ uses: actions/checkout@v4
11
+ with:
12
+ # Need this to get version number from last tag
13
+ fetch-depth: 0
14
+
15
+ - name: Install (with no extras)
16
+ uses: ./.github/actions/install_requirements
17
+ with:
18
+ pip-install: "."
19
+
20
+ - name: Check APIs are importable
21
+ run: |
22
+ python -c "import ophyd_async"
23
+ python -c "import ophyd_async.core"
24
+ python -c "import ophyd_async.epics.core"
25
+ python -c "import ophyd_async.epics.motor"
26
+ python -c "import ophyd_async.plan_stubs"
@@ -34,6 +34,11 @@ jobs:
34
34
  secrets:
35
35
  CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
36
36
 
37
+ import_with_no_extras:
38
+ needs: check
39
+ if: needs.check.outputs.branch-pr == ''
40
+ uses: ./.github/workflows/_import_with_no_extras.yml
41
+
37
42
  docs:
38
43
  needs: check
39
44
  if: needs.check.outputs.branch-pr == ''
@@ -51,6 +56,11 @@ jobs:
51
56
  permissions:
52
57
  id-token: write
53
58
 
59
+ codeql:
60
+ needs: check
61
+ if: needs.check.outputs.branch-pr == ''
62
+ uses: ./.github/workflows/_codeql.yml
63
+
54
64
  release:
55
65
  if: github.ref_type == 'tag'
56
66
  needs: [dist, docs]
@@ -11,3 +11,5 @@ jobs:
11
11
  uses: ./.github/workflows/_tox.yml
12
12
  with:
13
13
  tox: docs build -- -b linkcheck
14
+ codeql:
15
+ uses: ./.github/workflows/_codeql.yml
@@ -1,6 +1,6 @@
1
1
  repos:
2
2
  - repo: https://github.com/pre-commit/pre-commit-hooks
3
- rev: v4.5.0
3
+ rev: v5.0.0
4
4
  hooks:
5
5
  - id: check-added-large-files
6
6
  - id: check-yaml
@@ -3,9 +3,6 @@
3
3
  ARG PYTHON_VERSION=3.11
4
4
  FROM python:${PYTHON_VERSION} AS developer
5
5
 
6
- # Allow Qt 6 (pyside6) UI to work in the container - also see apt-get below
7
- ENV MPLBACKEND=QtAgg
8
-
9
6
  # Add any system dependencies for the developer/build environment here
10
7
  RUN apt-get update && apt-get install -y --no-install-recommends \
11
8
  graphviz \
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: ophyd-async
3
- Version: 0.9.0a2
3
+ Version: 0.10.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
@@ -41,35 +41,33 @@ Classifier: Programming Language :: Python :: 3.12
41
41
  Requires-Python: >=3.10
42
42
  Description-Content-Type: text/markdown
43
43
  License-File: LICENSE
44
- Requires-Dist: networkx>=2.0
45
44
  Requires-Dist: numpy
46
- Requires-Dist: packaging
47
- Requires-Dist: pint
48
- Requires-Dist: bluesky>=1.13
45
+ Requires-Dist: bluesky>=1.13.1rc2
49
46
  Requires-Dist: event-model>=1.22.1
50
- Requires-Dist: p4p>=4.2.0a3
51
47
  Requires-Dist: pyyaml
52
48
  Requires-Dist: colorlog
53
49
  Requires-Dist: pydantic>=2.0
54
50
  Requires-Dist: pydantic-numpy
51
+ Provides-Extra: sim
52
+ Requires-Dist: h5py; extra == "sim"
55
53
  Provides-Extra: ca
56
54
  Requires-Dist: aioca>=1.6; extra == "ca"
57
55
  Provides-Extra: pva
58
- Requires-Dist: p4p; extra == "pva"
59
- Provides-Extra: sim
60
- Requires-Dist: h5py; extra == "sim"
56
+ Requires-Dist: p4p>=4.2.0; extra == "pva"
61
57
  Provides-Extra: tango
62
- Requires-Dist: pytango>=10.0.0; extra == "tango"
58
+ Requires-Dist: pytango==10.0.0; extra == "tango"
59
+ Provides-Extra: demo
60
+ Requires-Dist: ipython; extra == "demo"
61
+ Requires-Dist: matplotlib; extra == "demo"
62
+ Requires-Dist: pyqt6; extra == "demo"
63
63
  Provides-Extra: dev
64
- Requires-Dist: ophyd_async[pva]; extra == "dev"
65
64
  Requires-Dist: ophyd_async[sim]; extra == "dev"
66
65
  Requires-Dist: ophyd_async[ca]; extra == "dev"
66
+ Requires-Dist: ophyd_async[pva]; extra == "dev"
67
67
  Requires-Dist: ophyd_async[tango]; extra == "dev"
68
+ Requires-Dist: ophyd_async[demo]; extra == "dev"
68
69
  Requires-Dist: inflection; extra == "dev"
69
- Requires-Dist: ipython; extra == "dev"
70
- Requires-Dist: ipywidgets; extra == "dev"
71
70
  Requires-Dist: import-linter; extra == "dev"
72
- Requires-Dist: matplotlib; extra == "dev"
73
71
  Requires-Dist: myst-parser; extra == "dev"
74
72
  Requires-Dist: numpydoc; extra == "dev"
75
73
  Requires-Dist: ophyd; extra == "dev"
@@ -79,7 +77,6 @@ Requires-Dist: pre-commit; extra == "dev"
79
77
  Requires-Dist: pydata-sphinx-theme>=0.12; extra == "dev"
80
78
  Requires-Dist: pyepics>=3.4.2; extra == "dev"
81
79
  Requires-Dist: pyright; extra == "dev"
82
- Requires-Dist: pyside6==6.7.0; extra == "dev"
83
80
  Requires-Dist: pytest; extra == "dev"
84
81
  Requires-Dist: pytest-asyncio; extra == "dev"
85
82
  Requires-Dist: pytest-cov; extra == "dev"
@@ -88,16 +85,15 @@ Requires-Dist: pytest-forked; extra == "dev"
88
85
  Requires-Dist: pytest-rerunfailures; extra == "dev"
89
86
  Requires-Dist: pytest-timeout; extra == "dev"
90
87
  Requires-Dist: ruff; extra == "dev"
91
- Requires-Dist: sphinx<7.4.0; extra == "dev"
92
88
  Requires-Dist: sphinx-autobuild; extra == "dev"
93
- Requires-Dist: autodoc-pydantic; extra == "dev"
89
+ Requires-Dist: sphinx-autodoc2; extra == "dev"
94
90
  Requires-Dist: sphinxcontrib-mermaid; extra == "dev"
95
91
  Requires-Dist: sphinx-copybutton; extra == "dev"
96
92
  Requires-Dist: sphinx-design; extra == "dev"
97
- Requires-Dist: super_state_machine; extra == "dev"
98
93
  Requires-Dist: tox-direct; extra == "dev"
99
94
  Requires-Dist: types-mock; extra == "dev"
100
95
  Requires-Dist: types-pyyaml; extra == "dev"
96
+ Dynamic: license-file
101
97
 
102
98
  [![CI](https://github.com/bluesky/ophyd-async/actions/workflows/ci.yml/badge.svg)](https://github.com/bluesky/ophyd-async/actions/workflows/ci.yml)
103
99
  [![Coverage](https://codecov.io/gh/bluesky/ophyd-async/branch/main/graph/badge.svg)](https://codecov.io/gh/bluesky/ophyd-async)
@@ -114,16 +110,19 @@ Asynchronous Bluesky hardware abstraction code, compatible with control systems
114
110
  | Documentation | <https://bluesky.github.io/ophyd-async> |
115
111
  | Releases | <https://github.com/bluesky/ophyd-async/releases> |
116
112
 
117
- Ophyd-async is a Python library for asynchronously interfacing with hardware, intended to
118
- be used as an abstraction layer that enables experiment orchestration and data acquisition code to operate above the specifics of particular devices and control
119
- systems.
113
+ Ophyd-async is a Python library for asynchronously interfacing with hardware, intended to be used as an abstraction layer that enables experiment orchestration and data acquisition code to operate above the specifics of particular devices and control systems.
114
+
115
+ Both ophyd sync and ophyd-async are typically used with the [Bluesky Run Engine][] for experiment orchestration and data acquisition.
116
+
117
+ The main differences from ophyd sync are:
120
118
 
121
- Both ophyd and ophyd-async are typically used with the [Bluesky Run Engine][] for experiment orchestration and data acquisition.
119
+ - Asynchronous Signal access, simplifying the parallel control of multiple Signals
120
+ - Support for [EPICS][] PVA and [Tango][] as well as the traditional EPICS CA
121
+ - Better library support for splitting the logic from the hardware interface to avoid complex class heirarchies
122
122
 
123
- While [EPICS][] is the most common control system layer that ophyd-async can interface with, support for other control systems like [Tango][] will be supported in the future. The focus of ophyd-async is:
123
+ It was written with the aim of implementing flyscanning in a generic and extensible way with highly customizable devices like PandABox and the Delta Tau PMAC products. Using async code makes it possible to do the "put 3 PVs in parallel, then get from another PV" logic that is common in flyscanning without the performance and complexity overhead of multiple threads.
124
124
 
125
- * Asynchronous signal access, opening the possibility for hardware-triggered scanning (also known as fly-scanning)
126
- * Simpler instantiation of devices (groupings of signals) with less reliance upon complex class hierarchies
125
+ Devices from both ophyd sync and ophyd-async can be used in the same RunEngine and even in the same scan. This allows a per-device migration where devices are reimplemented in ophyd-async one by one.
127
126
 
128
127
  [Bluesky Run Engine]: http://blueskyproject.io/bluesky
129
128
  [EPICS]: http://www.aps.anl.gov/epics/
@@ -13,16 +13,19 @@ Asynchronous Bluesky hardware abstraction code, compatible with control systems
13
13
  | Documentation | <https://bluesky.github.io/ophyd-async> |
14
14
  | Releases | <https://github.com/bluesky/ophyd-async/releases> |
15
15
 
16
- Ophyd-async is a Python library for asynchronously interfacing with hardware, intended to
17
- be used as an abstraction layer that enables experiment orchestration and data acquisition code to operate above the specifics of particular devices and control
18
- systems.
16
+ Ophyd-async is a Python library for asynchronously interfacing with hardware, intended to be used as an abstraction layer that enables experiment orchestration and data acquisition code to operate above the specifics of particular devices and control systems.
19
17
 
20
- Both ophyd and ophyd-async are typically used with the [Bluesky Run Engine][] for experiment orchestration and data acquisition.
18
+ Both ophyd sync and ophyd-async are typically used with the [Bluesky Run Engine][] for experiment orchestration and data acquisition.
21
19
 
22
- While [EPICS][] is the most common control system layer that ophyd-async can interface with, support for other control systems like [Tango][] will be supported in the future. The focus of ophyd-async is:
20
+ The main differences from ophyd sync are:
23
21
 
24
- * Asynchronous signal access, opening the possibility for hardware-triggered scanning (also known as fly-scanning)
25
- * Simpler instantiation of devices (groupings of signals) with less reliance upon complex class hierarchies
22
+ - Asynchronous Signal access, simplifying the parallel control of multiple Signals
23
+ - Support for [EPICS][] PVA and [Tango][] as well as the traditional EPICS CA
24
+ - Better library support for splitting the logic from the hardware interface to avoid complex class heirarchies
25
+
26
+ It was written with the aim of implementing flyscanning in a generic and extensible way with highly customizable devices like PandABox and the Delta Tau PMAC products. Using async code makes it possible to do the "put 3 PVs in parallel, then get from another PV" logic that is common in flyscanning without the performance and complexity overhead of multiple threads.
27
+
28
+ Devices from both ophyd sync and ophyd-async can be used in the same RunEngine and even in the same scan. This allows a per-device migration where devices are reimplemented in ophyd-async one by one.
26
29
 
27
30
  [Bluesky Run Engine]: http://blueskyproject.io/bluesky
28
31
  [EPICS]: http://www.aps.anl.gov/epics/
@@ -0,0 +1,5 @@
1
+ /* allow a wider screen so we can fit 88 chars of source code on it */
2
+ .bd-page-width {
3
+ max-width: 100rem;
4
+ /* default is 88rem */
5
+ }
@@ -5,17 +5,45 @@ list see the documentation:
5
5
  https://www.sphinx-doc.org/en/master/usage/configuration.html
6
6
  """
7
7
 
8
- import os
9
8
  import sys
10
9
  from pathlib import Path
11
10
  from subprocess import check_output
12
11
 
13
12
  import requests
13
+ from sphinx import addnodes, application, environment
14
+ from sphinx.ext import intersphinx
14
15
 
15
16
  import ophyd_async
16
17
 
17
- # -- General configuration ------------------------------------------------
18
- sys.path.insert(0, os.path.abspath("../../src"))
18
+
19
+ def missing_reference_handler(
20
+ app: application.Sphinx,
21
+ env: environment.BuildEnvironment,
22
+ node: addnodes.pending_xref,
23
+ contnode,
24
+ ):
25
+ """Find refs for TypeVars and Unions."""
26
+ target = node["reftarget"]
27
+ if "." in target and node["reftype"] == "class":
28
+ # Try again as `obj` so we pick up Unions, TypeVars and other things
29
+ if target.startswith("ophyd_async"):
30
+ # Pick it up from our domain
31
+ domain = env.domains[node["refdomain"]]
32
+ refdoc = node.get("refdoc")
33
+ return domain.resolve_xref(
34
+ env, refdoc, app.builder, "obj", target, node, contnode
35
+ )
36
+ else:
37
+ # pass it to intersphinx with the right type
38
+ node["reftype"] = "obj"
39
+ return intersphinx.missing_reference(app, env, node, contnode)
40
+
41
+
42
+ def setup(app: application.Sphinx):
43
+ """Add the custom handler to the Sphinx app."""
44
+ app.connect("missing-reference", missing_reference_handler)
45
+
46
+
19
47
  # General information about the project.
20
48
  project = "ophyd-async"
21
49
  copyright = "2014, Brookhaven National Lab"
@@ -35,76 +63,119 @@ else:
35
63
  extensions = [
36
64
  # for diagrams
37
65
  "sphinxcontrib.mermaid",
38
- # Used for BaseModel autodoc
39
- "sphinxcontrib.autodoc_pydantic",
40
66
  # Use this for generating API docs
41
- "sphinx.ext.autodoc",
42
- # Not sure if this is still used?
43
- "sphinx.ext.doctest",
44
- # and making summary tables at the top of API docs
45
- "sphinx.ext.autosummary",
46
- # This can parse google style docstrings
47
- "sphinx.ext.napoleon",
67
+ "autodoc2",
48
68
  # For linking to external sphinx documentation
49
69
  "sphinx.ext.intersphinx",
50
70
  # Add links to source code in API docs
51
71
  "sphinx.ext.viewcode",
52
- # Adds the inheritance-diagram generation directive
53
- "sphinx.ext.inheritance_diagram",
54
72
  # Add a copy button to each code block
55
73
  "sphinx_copybutton",
56
74
  # For the card element
57
75
  "sphinx_design",
58
- "sphinx.ext.mathjax",
76
+ # To make .nojekyll
59
77
  "sphinx.ext.githubpages",
78
+ # To make the {ipython} directive
60
79
  "IPython.sphinxext.ipython_directive",
80
+ # To syntax highlight "ipython" language code blocks
61
81
  "IPython.sphinxext.ipython_console_highlighting",
82
+ # To embed matplotlib plots generated from code
62
83
  "matplotlib.sphinxext.plot_directive",
84
+ # To parse markdown
63
85
  "myst_parser",
64
- "numpydoc",
65
86
  ]
66
87
 
67
- # So we can use the ::: syntax
68
- myst_enable_extensions = ["colon_fence"]
88
+ # Which package to load and document
89
+ autodoc2_packages = [{"path": "../src/ophyd_async", "auto_mode": True}]
90
+
91
+ # Put them in docs/_api which is git ignored
92
+ autodoc2_output_dir = "_api"
93
+
94
+ # Modules that should have an all...
95
+ autodoc2_module_all_regexes = [
96
+ r"ophyd_async\.core",
97
+ r"ophyd_async\.sim",
98
+ r"ophyd_async\.epics\.[^\.]*",
99
+ r"ophyd_async\.tango\.[^\.]*",
100
+ r"ophyd_async\.fastcs\.[^\.]*",
101
+ r"ophyd_async\.plan_stubs",
102
+ r"ophyd_async\.testing",
103
+ ]
104
+
105
+ # ... so should have their private modules ignored
106
+ autodoc2_skip_module_regexes = [
107
+ x + r"\._.*" for x in autodoc2_module_all_regexes + ["ophyd_async"]
108
+ ]
109
+
110
+ # Render with shortened names
111
+ autodoc2_render_plugin = "ophyd_async._docs_parser.ShortenedNamesRenderer"
69
112
 
70
- napoleon_google_docstring = False
71
- napoleon_numpy_docstring = True
113
+ # Don't document private things
114
+ autodoc2_hidden_objects = {"private", "dunder", "inherited"}
115
+
116
+ # We don't have any docstring for __init__, so by separating
117
+ # them here we don't get the "Initilize" text that would otherwise be added
118
+ autodoc2_class_docstring = "both"
119
+
120
+ # For some reason annotations are not expanded, this will do here
121
+ autodoc2_replace_annotations = [
122
+ ("~PvSuffix.rbv", "ophyd_async.epics.core.PvSuffix.rbv"),
123
+ ("typing_extensions.Self", "typing.Self"),
124
+ ]
125
+
126
+ # Which objects to include docstrings for. ‘direct’ means only from objects
127
+ # that are not inherited.
128
+ autodoc2_docstrings = "all"
129
+
130
+ # So we can use the ::: syntax and the :param thing: syntax
131
+ myst_enable_extensions = ["colon_fence", "fieldlist"]
72
132
 
73
133
  # If true, Sphinx will warn about all references where the target cannot
74
134
  # be found.
75
- # nitpicky = True
135
+ nitpicky = True
76
136
 
77
137
  # A list of (type, target) tuples (by default empty) that should be ignored when
78
138
  # generating warnings in "nitpicky mode". Note that type should include the
79
139
  # domain name if present. Example entries would be ('py:func', 'int') or
80
140
  # ('envvar', 'LD_LIBRARY_PATH').
81
- nitpick_ignore = [
82
- # builtins
83
- ("py:class", "NoneType"),
84
- ("py:class", "'str'"),
85
- ("py:class", "'float'"),
86
- ("py:class", "'int'"),
87
- ("py:class", "'bool'"),
88
- ("py:class", "'object'"),
89
- ("py:class", "'id'"),
90
- # typing
91
- ("py:class", "typing_extensions.Literal"),
141
+ obj_ignore = [
142
+ "ophyd_async.core._derived_signal_backend.RawT",
143
+ "ophyd_async.core._derived_signal_backend.DerivedT",
144
+ "ophyd_async.core._detector.DetectorControllerT",
145
+ "ophyd_async.core._detector.DetectorWriterT",
146
+ "ophyd_async.core._device.DeviceT",
147
+ "ophyd_async.core._device_filler.SignalBackendT",
148
+ "ophyd_async.core._device_filler.DeviceConnectorT",
149
+ "ophyd_async.core._derived_signal_backend.TransformT",
150
+ "ophyd_async.core._protocol.C",
151
+ "ophyd_async.core._signal_backend.SignalDatatypeV",
152
+ "ophyd_async.core._status.AsyncStatusBase",
153
+ "ophyd_async.core._utils.P",
154
+ "ophyd_async.core._utils.T",
155
+ "ophyd_async.core._utils.V",
156
+ "ophyd_async.epics.adcore._core_logic.ADBaseIOT",
157
+ "ophyd_async.epics.adcore._core_logic.ADBaseControllerT",
158
+ "ophyd_async.epics.adcore._core_writer.NDFileIOT",
159
+ "ophyd_async.epics.adcore._core_writer.ADWriterT",
160
+ "ophyd_async.tango.core._base_device.T",
161
+ "ophyd_async.tango.core._tango_transport.P",
162
+ "ophyd_async.tango.core._tango_transport.R",
163
+ "ophyd_async.tango.core._tango_transport.TangoProxy",
164
+ "ophyd_async.testing._utils.T",
165
+ "ophyd_async.sim._mirror.TwoJackRaw",
166
+ "ophyd_async.sim._mirror.TwoJackDerived",
167
+ "0.1",
168
+ "1.0",
169
+ ]
170
+ nitpick_ignore = []
171
+ for var in obj_ignore:
172
+ nitpick_ignore.append(("py:class", var))
173
+ nitpick_ignore.append(("py:obj", var))
174
+ # Ignore classes in modules with no intersphinx
175
+ nitpick_ignore_regex = [
176
+ (r"py:.*", r"pydantic\..*"),
177
+ (r"py:.*", r"tango\..*"),
92
178
  ]
93
-
94
- # Order the members by the order they appear in the source code
95
- autodoc_member_order = "bysource"
96
-
97
- # Don't inherit docstrings from baseclasses
98
- autodoc_inherit_docstrings = False
99
-
100
- # Add some more modules to the top level autosummary
101
- ophyd_async.__all__ += ["sim", "epics", "tango", "fastcs", "plan_stubs"]
102
-
103
- # Document only what is in __all__
104
- autosummary_ignore_module_all = False
105
-
106
- # Add any paths that contain templates here, relative to this directory.
107
- templates_path = ["_templates"]
108
179
 
109
180
  # Output graphviz directive produced images in a scalable format
110
181
  graphviz_output_format = "svg"
@@ -127,7 +198,6 @@ exclude_patterns = ["_build"]
127
198
  # The name of the Pygments (syntax highlighting) style to use.
128
199
  pygments_style = "sphinx"
129
200
 
130
-
131
201
  # Example configuration for intersphinx: refer to the Python standard library.
132
202
  # This means you can link things like `str` and `asyncio` to the relevant
133
203
  # docs in the python documentation.
@@ -137,20 +207,12 @@ intersphinx_mapping = {
137
207
  "numpy": ("https://numpy.org/devdocs/", None),
138
208
  "databroker": ("https://blueskyproject.io/databroker/", None),
139
209
  "event-model": ("https://blueskyproject.io/event-model/main", None),
210
+ "pytest": ("https://docs.pytest.org/en/stable/", None),
140
211
  }
141
212
 
142
213
  # A dictionary of graphviz graph attributes for inheritance diagrams.
143
214
  inheritance_graph_attrs = {"rankdir": "TB"}
144
215
 
145
- # Common links that should be available on every page
146
- rst_epilog = """
147
- .. _NSLS: https://www.bnl.gov/nsls2
148
- .. _black: https://github.com/psf/black
149
- .. _ruff: https://beta.ruff.rs/docs/
150
- .. _mypy: http://mypy-lang.org/
151
- .. _pre-commit: https://pre-commit.com/
152
- """
153
-
154
216
  # Ignore localhost links for periodic check that links in docs are valid
155
217
  linkcheck_ignore = [r"http://localhost:\d+/"]
156
218
 
@@ -210,6 +272,7 @@ html_theme_options = {
210
272
  },
211
273
  ],
212
274
  "navigation_with_keys": False,
275
+ "show_toc_level": 3,
213
276
  }
214
277
 
215
278
  # A dictionary of values to pass into the template engine’s context for all pages
@@ -230,27 +293,9 @@ html_show_copyright = False
230
293
  html_logo = "images/ophyd-async-logo.svg"
231
294
  html_favicon = "images/ophyd-favicon.svg"
232
295
 
233
- # If False and a module has the __all__ attribute set, autosummary documents
234
- # every member listed in __all__ and no others. Default is True
235
- autosummary_ignore_module_all = False
236
-
237
- # Turn on sphinx.ext.autosummary
238
- autosummary_generate = True
239
-
240
- # Add any paths that contain templates here, relative to this directory.
241
- templates_path = ["_templates"]
242
-
243
- # Look for signatures in the first line of the docstring (used for C functions)
244
- autodoc_docstring_signature = True
245
-
246
- # numpydoc config
247
- numpydoc_show_class_members = False
248
-
249
- # Don't show config summary as it's not relevant
250
- autodoc_pydantic_model_show_config_summary = False
251
-
252
- # Show the fields in source order
253
- autodoc_pydantic_model_summary_list_order = "bysource"
296
+ # Custom CSS
297
+ html_static_path = ["_static"]
298
+ html_css_files = ["custom.css"]
254
299
 
255
300
  # Where to put Ipython savefigs
256
301
  ipython_savefig_dir = "../build/savefig"