ophyd-async 0.13.3__tar.gz → 0.13.5__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 (341) hide show
  1. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.copier-answers.yml +1 -1
  2. ophyd_async-0.13.5/.devcontainer/devcontainer.json +82 -0
  3. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/CONTRIBUTING.md +1 -1
  4. ophyd_async-0.13.5/.github/renovate.json +53 -0
  5. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/_codeql.yml +2 -2
  6. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/_dist.yml +14 -5
  7. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/_docs.yml +3 -3
  8. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/_test.yml +33 -30
  9. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/_tox.yml +3 -3
  10. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/ci.yml +9 -13
  11. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/periodic.yml +2 -1
  12. ophyd_async-0.13.5/.gitleaks.toml +19 -0
  13. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.pre-commit-config.yaml +13 -0
  14. ophyd_async-0.13.5/.python-version +1 -0
  15. ophyd_async-0.13.5/Dockerfile +10 -0
  16. {ophyd_async-0.13.3/src/ophyd_async.egg-info → ophyd_async-0.13.5}/PKG-INFO +2 -36
  17. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0009-procedural-vs-declarative-devices.md +9 -0
  18. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/devices-signals-backends.md +1 -1
  19. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/tutorials/writing-tests-for-devices.md +6 -6
  20. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/pyproject.toml +96 -25
  21. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/_version.py +3 -3
  22. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/__init__.py +26 -3
  23. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_derived_signal_backend.py +2 -1
  24. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_detector.py +2 -2
  25. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_device.py +9 -9
  26. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_enums.py +5 -0
  27. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_signal.py +34 -38
  28. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_signal_backend.py +3 -1
  29. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_status.py +2 -2
  30. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_table.py +8 -0
  31. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_utils.py +11 -11
  32. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_core_logic.py +3 -1
  33. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_utils.py +4 -4
  34. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/core/_aioca.py +2 -2
  35. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/core/_p4p.py +2 -2
  36. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/motor.py +28 -7
  37. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/pmac/_pmac_io.py +8 -4
  38. ophyd_async-0.13.5/src/ophyd_async/epics/pmac/_pmac_trajectory.py +217 -0
  39. ophyd_async-0.13.5/src/ophyd_async/epics/pmac/_pmac_trajectory_generation.py +692 -0
  40. ophyd_async-0.13.5/src/ophyd_async/epics/pmac/_utils.py +167 -0
  41. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/jungfrau/__init__.py +2 -1
  42. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/jungfrau/_controller.py +29 -11
  43. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/jungfrau/_utils.py +10 -2
  44. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/panda/__init__.py +10 -0
  45. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/panda/_block.py +14 -0
  46. ophyd_async-0.13.5/src/ophyd_async/fastcs/panda/_trigger.py +223 -0
  47. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_motor.py +4 -2
  48. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_stage.py +14 -4
  49. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/core/__init__.py +17 -3
  50. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/core/_signal.py +18 -22
  51. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/core/_tango_transport.py +407 -239
  52. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/core/_utils.py +9 -0
  53. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/demo/_mover.py +1 -2
  54. ophyd_async-0.13.5/src/ophyd_async/tango/testing/__init__.py +7 -0
  55. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/testing/_one_of_everything.py +13 -5
  56. ophyd_async-0.13.5/src/ophyd_async/tango/testing/_test_config.py +11 -0
  57. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/testing/_assert.py +2 -2
  58. {ophyd_async-0.13.3 → ophyd_async-0.13.5/src/ophyd_async.egg-info}/PKG-INFO +2 -36
  59. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async.egg-info/SOURCES.txt +92 -86
  60. ophyd_async-0.13.5/src/ophyd_async.egg-info/requires.txt +27 -0
  61. ophyd_async-0.13.5/tests/README.md +7 -0
  62. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/tests/conftest.py +22 -7
  63. {ophyd_async-0.13.3 → ophyd_async-0.13.5/tests}/system_tests/epics/adsim/test_adsim_system.py +6 -1
  64. {ophyd_async-0.13.3 → ophyd_async-0.13.5/tests}/system_tests/epics/eiger/test_eiger_system.py +58 -2
  65. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/epics/signal/test_signals.py +9 -9
  66. ophyd_async-0.13.5/tests/system_tests/fastcs/panda/test_panda_connect.py +98 -0
  67. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/tango/conftest.py +61 -24
  68. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/tango/test_base_device.py +152 -25
  69. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/tango/test_tango_signals.py +144 -64
  70. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/tango/test_tango_transport.py +291 -302
  71. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/test_tutorials.py +1 -1
  72. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_auto_init_devices.py +4 -4
  73. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_device.py +9 -9
  74. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_log.py +2 -3
  75. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_multi_derived_signal.py +2 -2
  76. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_providers.py +1 -2
  77. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_signal.py +18 -23
  78. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_single_derived_signal.py +36 -9
  79. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_soft_signal_backend.py +2 -2
  80. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_status.py +2 -2
  81. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_table.py +2 -2
  82. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_utils.py +50 -48
  83. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_watchable_async_status.py +4 -4
  84. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adcore/test_cont_acq_detector.py +8 -8
  85. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adcore/test_writers.py +7 -7
  86. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/demo/test_epics_demo.py +20 -20
  87. ophyd_async-0.13.5/tests/unit_tests/epics/pmac/conftest.py +34 -0
  88. ophyd_async-0.13.5/tests/unit_tests/epics/pmac/test_pmac_trajectory.py +211 -0
  89. ophyd_async-0.13.3/tests/epics/pmac/test_pmac_utils.py → ophyd_async-0.13.5/tests/unit_tests/epics/pmac/test_pmac_trajectory_generation.py +535 -300
  90. ophyd_async-0.13.5/tests/unit_tests/epics/pmac/test_pmac_utils.py +119 -0
  91. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/pvi/test_pvi.py +4 -4
  92. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/test_motor.py +12 -7
  93. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/jungfrau/test_controller.py +49 -2
  94. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/jungfrau/test_utils.py +4 -2
  95. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/panda/db/panda.db +12 -1
  96. ophyd_async-0.13.3/tests/fastcs/panda/test_panda_connect.py → ophyd_async-0.13.5/tests/unit_tests/fastcs/panda/test_panda_connect_mock.py +2 -68
  97. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/panda/test_panda_control.py +10 -10
  98. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/panda/test_panda_utils.py +4 -1
  99. ophyd_async-0.13.5/tests/unit_tests/fastcs/panda/test_trigger.py +351 -0
  100. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/plan_stubs/test_ensure_connected.py +4 -4
  101. ophyd_async-0.13.5/tests/unit_tests/test_branching.py +52 -0
  102. ophyd_async-0.13.5/uv.lock +3247 -0
  103. ophyd_async-0.13.3/.devcontainer/devcontainer.json +0 -56
  104. ophyd_async-0.13.3/.github/actions/install_requirements/action.yml +0 -35
  105. ophyd_async-0.13.3/.github/dependabot.yml +0 -28
  106. ophyd_async-0.13.3/.github/workflows/_import_with_no_extras.yml +0 -26
  107. ophyd_async-0.13.3/.github/workflows/_system_test.yml +0 -38
  108. ophyd_async-0.13.3/Dockerfile +0 -15
  109. ophyd_async-0.13.3/src/ophyd_async/epics/pmac/_pmac_trajectory.py +0 -114
  110. ophyd_async-0.13.3/src/ophyd_async/epics/pmac/_utils.py +0 -847
  111. ophyd_async-0.13.3/src/ophyd_async/fastcs/panda/_trigger.py +0 -103
  112. ophyd_async-0.13.3/src/ophyd_async/tango/testing/__init__.py +0 -6
  113. ophyd_async-0.13.3/src/ophyd_async.egg-info/requires.txt +0 -62
  114. ophyd_async-0.13.3/system_tests/conftest.py +0 -10
  115. ophyd_async-0.13.3/tests/epics/pmac/test_pmac_trajectory.py +0 -170
  116. ophyd_async-0.13.3/tests/fastcs/panda/test_trigger.py +0 -156
  117. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.codecov.yml +0 -0
  118. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.git-blame-ignore-revs +0 -0
  119. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  120. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/ISSUE_TEMPLATE/issue.md +0 -0
  121. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -0
  122. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/codeql/codeql-config.yml +0 -0
  123. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/pages/index.html +0 -0
  124. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/pages/make_switcher.py +0 -0
  125. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/_pypi.yml +0 -0
  126. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/_release.yml +0 -0
  127. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.gitignore +0 -0
  128. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.gitmodules +0 -0
  129. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/LICENSE +0 -0
  130. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/README.md +0 -0
  131. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/_static/custom.css +0 -0
  132. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/conf.py +0 -0
  133. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
  134. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
  135. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0003-ophyd-async-migration.rst +0 -0
  136. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0004-repository-structure.rst +0 -0
  137. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0005-respect-black-line-length.rst +0 -0
  138. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0006-procedural-device-definitions.rst +0 -0
  139. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0007-subpackage-structure.md +0 -0
  140. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0008-signal-types.md +0 -0
  141. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0010-docstring-format.md +0 -0
  142. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0011-buffer-updates-camonitor.md +0 -0
  143. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/COPYME +0 -0
  144. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions.md +0 -0
  145. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/declarative-vs-procedural.md +0 -0
  146. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/design-goals.md +0 -0
  147. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/device-connection-strategies.md +0 -0
  148. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/fly-scanning.md +0 -0
  149. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/plan-stubs.md +0 -0
  150. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/when-to-extend-movable.md +0 -0
  151. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/where-device-logic.md +0 -0
  152. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations.md +0 -0
  153. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/genindex.rst +0 -0
  154. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/how-to/choose-right-baseclass.md +0 -0
  155. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/how-to/contribute.md +0 -0
  156. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/how-to/derive-one-signal-from-others.md +0 -0
  157. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/how-to/implement-ad-detector.md +0 -0
  158. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/how-to/interact-with-signals.md +0 -0
  159. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/how-to/put-device-back.md +0 -0
  160. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/how-to/store-and-retrieve.md +0 -0
  161. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/how-to.md +0 -0
  162. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/images/fly_scan_collection_windows_and_frames.svg +0 -0
  163. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/images/ophyd-async-logo.svg +0 -0
  164. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/images/ophyd-favicon.svg +0 -0
  165. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/images/set_and_wait_for_other_value.excalidraw.svg +0 -0
  166. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/index.md +0 -0
  167. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/reference.md +0 -0
  168. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/tutorials/implementing-detectors.md +0 -0
  169. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/tutorials/implementing-devices.md +0 -0
  170. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/tutorials/installation.md +0 -0
  171. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/tutorials/using-devices.md +0 -0
  172. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/tutorials.md +0 -0
  173. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/setup.cfg +0 -0
  174. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/__init__.py +0 -0
  175. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/__main__.py +0 -0
  176. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/_docs_parser.py +0 -0
  177. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_derived_signal.py +0 -0
  178. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_device_filler.py +0 -0
  179. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_flyer.py +0 -0
  180. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_hdf_dataset.py +0 -0
  181. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_log.py +0 -0
  182. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_mock_signal_backend.py +0 -0
  183. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_protocol.py +0 -0
  184. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_providers.py +0 -0
  185. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_readable.py +0 -0
  186. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_settings.py +0 -0
  187. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_soft_signal_backend.py +0 -0
  188. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_yaml_settings.py +0 -0
  189. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/__init__.py +0 -0
  190. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adandor/__init__.py +0 -0
  191. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adandor/_andor.py +0 -0
  192. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adandor/_andor_controller.py +0 -0
  193. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adandor/_andor_io.py +0 -0
  194. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adaravis/__init__.py +0 -0
  195. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adaravis/_aravis.py +0 -0
  196. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adaravis/_aravis_controller.py +0 -0
  197. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adaravis/_aravis_io.py +0 -0
  198. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/__init__.py +0 -0
  199. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_core_detector.py +0 -0
  200. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_core_io.py +0 -0
  201. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_core_writer.py +0 -0
  202. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_hdf_writer.py +0 -0
  203. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_jpeg_writer.py +0 -0
  204. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_single_trigger.py +0 -0
  205. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_tiff_writer.py +0 -0
  206. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adkinetix/__init__.py +0 -0
  207. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adkinetix/_kinetix.py +0 -0
  208. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adkinetix/_kinetix_controller.py +0 -0
  209. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adkinetix/_kinetix_io.py +0 -0
  210. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adpilatus/__init__.py +0 -0
  211. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adpilatus/_pilatus.py +0 -0
  212. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adpilatus/_pilatus_controller.py +0 -0
  213. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adpilatus/_pilatus_io.py +0 -0
  214. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adsimdetector/__init__.py +0 -0
  215. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adsimdetector/_sim.py +0 -0
  216. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adsimdetector/_sim_controller.py +0 -0
  217. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adsimdetector/_sim_io.py +0 -0
  218. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/advimba/__init__.py +0 -0
  219. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/advimba/_vimba.py +0 -0
  220. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/advimba/_vimba_controller.py +0 -0
  221. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/advimba/_vimba_io.py +0 -0
  222. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/core/__init__.py +0 -0
  223. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/core/_epics_connector.py +0 -0
  224. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/core/_epics_device.py +0 -0
  225. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/core/_pvi_connector.py +0 -0
  226. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/core/_signal.py +0 -0
  227. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/core/_util.py +0 -0
  228. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/__init__.py +0 -0
  229. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/__main__.py +0 -0
  230. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/_ioc.py +0 -0
  231. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/_motor.py +0 -0
  232. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/_point_detector.py +0 -0
  233. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/_point_detector_channel.py +0 -0
  234. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/_stage.py +0 -0
  235. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/motor.db +0 -0
  236. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/point_detector.db +0 -0
  237. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/point_detector_channel.db +0 -0
  238. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/odin/__init__.py +0 -0
  239. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/odin/_odin_io.py +0 -0
  240. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/pmac/__init__.py +0 -0
  241. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/signal.py +0 -0
  242. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/testing/__init__.py +0 -0
  243. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/testing/_example_ioc.py +0 -0
  244. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/testing/_utils.py +0 -0
  245. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/testing/test_records.db +0 -0
  246. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/testing/test_records_pva.db +0 -0
  247. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/__init__.py +0 -0
  248. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/core.py +0 -0
  249. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/eiger/__init__.py +0 -0
  250. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/eiger/_eiger.py +0 -0
  251. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/eiger/_eiger_controller.py +0 -0
  252. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/eiger/_eiger_io.py +0 -0
  253. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/jungfrau/_jungfrau.py +0 -0
  254. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/jungfrau/_signals.py +0 -0
  255. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/odin/__init__.py +0 -0
  256. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/panda/_control.py +0 -0
  257. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/panda/_hdf_panda.py +0 -0
  258. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/panda/_table.py +0 -0
  259. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/panda/_writer.py +0 -0
  260. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/plan_stubs/__init__.py +0 -0
  261. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/plan_stubs/_ensure_connected.py +0 -0
  262. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/plan_stubs/_fly.py +0 -0
  263. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/plan_stubs/_nd_attributes.py +0 -0
  264. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/plan_stubs/_panda.py +0 -0
  265. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/plan_stubs/_settings.py +0 -0
  266. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/plan_stubs/_utils.py +0 -0
  267. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/plan_stubs/_wait_for_awaitable.py +0 -0
  268. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/py.typed +0 -0
  269. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/__init__.py +0 -0
  270. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/__main__.py +0 -0
  271. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_blob_detector.py +0 -0
  272. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_blob_detector_controller.py +0 -0
  273. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_blob_detector_writer.py +0 -0
  274. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_mirror_horizontal.py +0 -0
  275. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_mirror_vertical.py +0 -0
  276. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_pattern_generator.py +0 -0
  277. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_point_detector.py +0 -0
  278. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/__init__.py +0 -0
  279. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/core/_base_device.py +0 -0
  280. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/core/_converters.py +0 -0
  281. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/core/_tango_readable.py +0 -0
  282. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/demo/__init__.py +0 -0
  283. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/demo/_counter.py +0 -0
  284. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/demo/_detector.py +0 -0
  285. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/demo/_tango/__init__.py +0 -0
  286. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/demo/_tango/_servers.py +0 -0
  287. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/testing/__init__.py +0 -0
  288. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/testing/__pytest_assert_rewrite.py +0 -0
  289. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/testing/_mock_signal_utils.py +0 -0
  290. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/testing/_one_of_everything.py +0 -0
  291. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/testing/_single_derived.py +0 -0
  292. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/testing/_utils.py +0 -0
  293. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/testing/_wait_for_pending.py +0 -0
  294. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async.egg-info/dependency_links.txt +0 -0
  295. {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async.egg-info/top_level.txt +0 -0
  296. {ophyd_async-0.13.3 → ophyd_async-0.13.5/tests}/system_tests/epics/adsim/baseline.yaml +0 -0
  297. {ophyd_async-0.13.3 → ophyd_async-0.13.5/tests}/system_tests/epics/adsim/start_iocs.sh +0 -0
  298. {ophyd_async-0.13.3 → ophyd_async-0.13.5/tests}/system_tests/epics/adsim/stop_iocs.sh +0 -0
  299. {ophyd_async-0.13.3 → ophyd_async-0.13.5/tests}/system_tests/epics/eiger/README.md +0 -0
  300. {ophyd_async-0.13.3 → ophyd_async-0.13.5/tests}/system_tests/epics/eiger/start_iocs_and_run_tests.sh +0 -0
  301. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/epics/signal/test_yaml_save_ca.yaml +0 -0
  302. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/epics/signal/test_yaml_save_pva.yaml +0 -0
  303. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/tango/context_subprocess.py +0 -0
  304. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_detector.py +0 -0
  305. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_flyer.py +0 -0
  306. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_mock_signal_backend.py +0 -0
  307. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_observe.py +0 -0
  308. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_protocol.py +0 -0
  309. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_readable.py +0 -0
  310. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_subset_enum.py +0 -0
  311. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adandor/test_andor.py +0 -0
  312. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adaravis/test_aravis.py +0 -0
  313. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adcore/test_detectors.py +0 -0
  314. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adcore/test_drivers.py +0 -0
  315. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adcore/test_plugins.py +0 -0
  316. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adcore/test_scans.py +0 -0
  317. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adcore/test_single_trigger.py +0 -0
  318. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adkinetix/test_kinetix.py +0 -0
  319. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adpilatus/test_pilatus.py +0 -0
  320. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adsimdetector/test_sim.py +0 -0
  321. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/advimba/test_vimba.py +0 -0
  322. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/conftest.py +0 -0
  323. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/eiger/test_odin_io.py +0 -0
  324. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/pmac/test_pmac_io.py +0 -0
  325. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/signal/test_common.py +0 -0
  326. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/test_areadetector_subclass_naming.py +0 -0
  327. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/eiger/test_eiger_controller.py +0 -0
  328. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/eiger/test_eiger_detector.py +0 -0
  329. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/jungfrau/__init__.py +0 -0
  330. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/panda/test_hdf_panda.py +0 -0
  331. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/panda/test_seq_table.py +0 -0
  332. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/panda/test_writer.py +0 -0
  333. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/plan_stubs/test_fly.py +0 -0
  334. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/plan_stubs/test_settings.py +0 -0
  335. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/plan_stubs/test_setup.py +0 -0
  336. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/sim/__init__.py +0 -0
  337. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/sim/test_sim_blob_detector.py +0 -0
  338. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/sim/test_sim_motor.py +0 -0
  339. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/test_cli.py +0 -0
  340. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/test_data/test_yaml_config_save.yaml +0 -0
  341. {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/test_data/test_yaml_save.yaml +0 -0
@@ -1,5 +1,5 @@
1
1
  # Changes here will be overwritten by Copier
2
- _commit: 4.1.0
2
+ _commit: 5.0.0a3
3
3
  _src_path: https://github.com/DiamondLightSource/python-copier-template
4
4
  author_email: tom.cobb@diamond.ac.uk
5
5
  author_name: Tom Cobb
@@ -0,0 +1,82 @@
1
+ // For format details, see https://containers.dev/implementors/json_reference/
2
+ {
3
+ "name": "Python 3 Developer Container",
4
+ "build": {
5
+ "dockerfile": "../Dockerfile",
6
+ "target": "developer"
7
+ },
8
+ "remoteEnv": {
9
+ // Allow X11 apps to run inside the container
10
+ "DISPLAY": "${localEnv:DISPLAY}",
11
+ // Do the equivalent of "activate" the venv so we don't have to "uv run" everything
12
+ "VIRTUAL_ENV": "/workspaces/${localWorkspaceFolderBasename}/.venv",
13
+ "PATH": "/workspaces/${localWorkspaceFolderBasename}/.venv/bin:${containerEnv:PATH}"
14
+ },
15
+ "customizations": {
16
+ "vscode": {
17
+ // Set *default* container specific settings.json values on container create.
18
+ "settings": {
19
+ // Use the container's python by default
20
+ "python.defaultInterpreterPath": "/workspaces/${localWorkspaceFolderBasename}/.venv/bin/python",
21
+ // Don't activate the venv as it is already in the PATH
22
+ "python.terminal.activateEnvInCurrentTerminal": false,
23
+ "python.terminal.activateEnvironment": false,
24
+ // Workaround to prevent garbled python REPL in the terminal
25
+ // https://github.com/microsoft/vscode-python/issues/25505
26
+ "python.terminal.shellIntegration.enabled": false,
27
+ "python.testing.unittestEnabled": false,
28
+ "python.testing.pytestEnabled": true,
29
+ "editor.formatOnSave": true,
30
+ "editor.codeActionsOnSave": {
31
+ "source.organizeImports": "explicit"
32
+ },
33
+ "[python]": {
34
+ "editor.defaultFormatter": "charliermarsh.ruff"
35
+ }
36
+ },
37
+ // Add the IDs of extensions you want installed when the container is created.
38
+ "extensions": [
39
+ "ms-python.python",
40
+ "github.vscode-github-actions",
41
+ "tamasfe.even-better-toml",
42
+ "redhat.vscode-yaml",
43
+ "ryanluker.vscode-coverage-gutters",
44
+ "charliermarsh.ruff",
45
+ "ms-azuretools.vscode-docker"
46
+ ]
47
+ }
48
+ },
49
+ // Create the config folder for the bash-config feature and uv cache
50
+ // NOTE: The uv cache can get large, DLS users should read
51
+ // https://dev-guide.diamond.ac.uk/linux-user-environment/how-tos/disk-quota-troubleshooting
52
+ "initializeCommand": "mkdir -p ${localEnv:HOME}/.config/terminal-config ${localEnv:HOME}/.cache/uv",
53
+ "runArgs": [
54
+ // Allow the container to access the host X11 display and EPICS CA
55
+ "--net=host",
56
+ // Make sure SELinux does not disable with access to host filesystems like tmp
57
+ "--security-opt=label=disable"
58
+ ],
59
+ "mounts": [
60
+ // Mount in the user terminal config folder so it can be edited
61
+ {
62
+ "source": "${localEnv:HOME}/.config/terminal-config",
63
+ "target": "/user-terminal-config",
64
+ "type": "bind"
65
+ },
66
+ // Keep a persistent cross container cache for uv
67
+ {
68
+ "source": "${localEnv:HOME}/.cache/uv",
69
+ "target": "/root/.cache/uv",
70
+ "type": "bind"
71
+ },
72
+ // Use a volume mount for the uv venv so it is local to the container
73
+ {
74
+ "target": "/workspaces/${localWorkspaceFolderBasename}/.venv",
75
+ "type": "volume"
76
+ }
77
+ ],
78
+ // Mount the parent as /workspaces so we can pip install peers as editable
79
+ "workspaceMount": "source=${localWorkspaceFolder}/..,target=/workspaces,type=bind",
80
+ // After the container is created, install the python project in editable form
81
+ "postCreateCommand": "uv sync && uv run pre-commit install --install-hooks"
82
+ }
@@ -24,4 +24,4 @@ It is recommended that developers use a [vscode devcontainer](https://code.visua
24
24
 
25
25
  This project was created using the [Diamond Light Source Copier Template](https://github.com/DiamondLightSource/python-copier-template) for Python projects.
26
26
 
27
- For more information on common tasks like setting up a developer environment, running the tests, and setting a pre-commit hook, see the template's [How-to guides](https://diamondlightsource.github.io/python-copier-template/4.1.0/how-to.html).
27
+ For more information on common tasks like setting up a developer environment, running the tests, and setting a pre-commit hook, see the template's [How-to guides](https://diamondlightsource.github.io/python-copier-template/5.0.0a3/how-to.html).
@@ -0,0 +1,53 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "extends": [
4
+ "config:recommended"
5
+ ],
6
+ "lockFileMaintenance": {
7
+ "description": "Keep uv.lock up to date, merging if tests pass",
8
+ "enabled": true,
9
+ "automerge": true
10
+ },
11
+ "packageRules": [
12
+ {
13
+ "description": "Disable python version as that is managed by python-copier-template",
14
+ "matchManagers": [
15
+ "pyenv"
16
+ ],
17
+ "enabled": false
18
+ },
19
+ {
20
+ "description": "Disable github actions that are managed by python-copier-template",
21
+ "matchPackageNames": [
22
+ "actions/checkout",
23
+ "actions/download-artifact",
24
+ "actions/setup-python",
25
+ "actions/upload-artifact",
26
+ "astral-sh/setup-uv",
27
+ "codecov/codecov-action",
28
+ "docker/build-push-action",
29
+ "docker/login-action",
30
+ "docker/metadata-action",
31
+ "docker/setup-buildx-action",
32
+ "peaceiris/actions-gh-pages",
33
+ "pypa/gh-action-pypi-publish",
34
+ "softprops/action-gh-release"
35
+ ],
36
+ "matchManagers": [
37
+ "github-actions"
38
+ ],
39
+ "enabled": false
40
+ },
41
+ {
42
+ "description": "Group non-major github action updates",
43
+ "groupName": "GitHub Actions",
44
+ "matchUpdateTypes": [
45
+ "patch",
46
+ "minor"
47
+ ],
48
+ "matchManagers": [
49
+ "github-actions"
50
+ ]
51
+ }
52
+ ]
53
+ }
@@ -19,7 +19,7 @@ jobs:
19
19
  uses: actions/checkout@v4
20
20
 
21
21
  - name: Initialize CodeQL
22
- uses: github/codeql-action/init@v3
22
+ uses: github/codeql-action/init@v4
23
23
  with:
24
24
  languages: python
25
25
  build-mode: none
@@ -27,6 +27,6 @@ jobs:
27
27
  config-file: ./.github/codeql/codeql-config.yml
28
28
 
29
29
  - name: Perform CodeQL Analysis
30
- uses: github/codeql-action/analyze@v3
30
+ uses: github/codeql-action/analyze@v4
31
31
  with:
32
32
  category: "/language:python"
@@ -12,10 +12,13 @@ jobs:
12
12
  # Need this to get version number from last tag
13
13
  fetch-depth: 0
14
14
 
15
+ - name: Install uv
16
+ uses: astral-sh/setup-uv@v6
17
+
15
18
  - name: Build sdist and wheel
16
19
  run: >
17
20
  export SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct) &&
18
- pipx run build
21
+ uvx --from build pyproject-build
19
22
 
20
23
  - name: Upload sdist and wheel as artifacts
21
24
  uses: actions/upload-artifact@v4
@@ -24,13 +27,19 @@ jobs:
24
27
  path: dist
25
28
 
26
29
  - name: Check for packaging errors
27
- run: pipx run twine check --strict dist/*
30
+ run: uvx twine check --strict dist/*
28
31
 
29
32
  - name: Install produced wheel
30
- uses: ./.github/actions/install_requirements
31
- with:
32
- pip-install: dist/*.whl
33
+ run: python -m pip install dist/*.whl
33
34
 
34
35
  - name: Test module --version works using the installed wheel
35
36
  # If more than one module in src/ replace with module name to test
36
37
  run: python -m $(ls --hide='*.egg-info' src | head -1) --version
38
+
39
+ - name: Check APIs are importable
40
+ run: |
41
+ python -c "import ophyd_async"
42
+ python -c "import ophyd_async.core"
43
+ python -c "import ophyd_async.epics.core"
44
+ python -c "import ophyd_async.epics.motor"
45
+ python -c "import ophyd_async.plan_stubs"
@@ -20,11 +20,11 @@ jobs:
20
20
  - name: Install system packages
21
21
  run: sudo apt-get install graphviz
22
22
 
23
- - name: Install python packages
24
- uses: ./.github/actions/install_requirements
23
+ - name: Install uv
24
+ uses: astral-sh/setup-uv@v5
25
25
 
26
26
  - name: Build docs
27
- run: tox -e docs
27
+ run: uv run --locked tox -e docs
28
28
 
29
29
  - name: Remove environment.pickle
30
30
  run: rm build/html/.doctrees/environment.pickle
@@ -3,12 +3,20 @@ on:
3
3
  inputs:
4
4
  python-version:
5
5
  type: string
6
- description: The version of python to install
7
- required: true
6
+ description: The version of python to install, default is from .python-version file
7
+ default: ""
8
8
  runs-on:
9
9
  type: string
10
10
  description: The runner to run this job on
11
11
  required: true
12
+ tests-path:
13
+ type: string
14
+ description: The path to look for tests
15
+ required: true
16
+ needs-services:
17
+ type: boolean
18
+ description: Whether to start external services
19
+ required: true
12
20
  secrets:
13
21
  CODECOV_TOKEN:
14
22
  required: true
@@ -16,57 +24,52 @@ on:
16
24
  env:
17
25
  # https://github.com/pytest-dev/pytest/issues/2042
18
26
  PY_IGNORE_IMPORTMISMATCH: "1"
27
+ UV_PYTHON: ${{ inputs.python-version }}
19
28
 
20
29
  jobs:
21
30
  run:
22
31
  runs-on: ${{ inputs.runs-on }}
23
32
 
33
+ env:
34
+ COVERAGE_PROCESS_START: .coveragerc
35
+
24
36
  steps:
37
+ - name: Checkout repository (with submodules)
38
+ uses: actions/checkout@v4
39
+ with:
40
+ submodules: recursive
41
+ fetch-depth: 0
42
+
25
43
  - name: Set TEMP to D:/Temp
26
44
  if: inputs.runs-on == 'windows-latest'
27
45
  run: |
28
46
  mkdir "D:\\Temp"
29
47
  echo "TEMP=D:\\Temp" >> $env:GITHUB_ENV
30
- - name: Checkout
31
- uses: actions/checkout@v4
32
- with:
33
- # Need this to get version number from last tag
34
- fetch-depth: 0
35
48
 
36
- - if: inputs.python-version == 'dev'
37
- name: Install dev versions of python packages
38
- uses: ./.github/actions/install_requirements
49
+ - name: Install uv
50
+ uses: astral-sh/setup-uv@v5
39
51
 
40
- - if: inputs.python-version == 'dev'
41
- name: Write the requirements as an artifact
42
- run: pip freeze --exclude-editable > /tmp/dev-requirements.txt
43
-
44
- - if: inputs.python-version == 'dev'
45
- name: Upload dev-requirements.txt
46
- uses: actions/upload-artifact@v4
52
+ - if: inputs.needs-services && inputs.runs-on != 'windows-latest'
53
+ name: Run docker compose
54
+ uses: hoverkraft-tech/compose-action@v2.4.1
47
55
  with:
48
- name: dev-requirements
49
- path: /tmp/dev-requirements.txt
56
+ compose-file: "./example-services/compose.yaml"
57
+ services: |
58
+ bl01t-di-cam-01
59
+ ca-gateway
50
60
 
51
- - if: inputs.python-version != 'dev'
52
- name: Install latest versions of python packages
53
- uses: ./.github/actions/install_requirements
54
- with:
55
- python-version: ${{ inputs.python-version }}
56
- pip-install: ".[dev]"
57
-
58
61
  - name: Run tests win
59
62
  if: inputs.runs-on == 'windows-latest'
60
- run: tox -e tests -- --timeout=6
63
+ run: uv run --locked tox -e tests -- --timeout=10 ${{ inputs.tests-path}}
61
64
 
62
65
  - name: Non win tests
63
66
  if: inputs.runs-on != 'windows-latest'
64
- run: tox -e tests -- --timeout=2
65
-
67
+ run: uv run --locked tox -e tests -- --timeout=2 ${{ inputs.tests-path}}
68
+
66
69
  - name: Upload coverage to Codecov
67
70
  uses: codecov/codecov-action@v5
68
71
  with:
69
- name: ${{ inputs.python-version }}/${{ inputs.runs-on }}
72
+ name: ${{ inputs.python-version }}/${{ inputs.runs-on }}/${{ inputs.tests-path }}
70
73
  files: cov.xml
71
74
  env:
72
75
  CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
@@ -15,8 +15,8 @@ jobs:
15
15
  - name: Checkout
16
16
  uses: actions/checkout@v4
17
17
 
18
- - name: Install python packages
19
- uses: ./.github/actions/install_requirements
18
+ - name: Install uv
19
+ uses: astral-sh/setup-uv@v5
20
20
 
21
21
  - name: Run tox
22
- run: tox -e ${{ inputs.tox }}
22
+ run: uv run --locked tox -e ${{ inputs.tox }}
@@ -5,11 +5,10 @@ on:
5
5
  branches:
6
6
  - main
7
7
  tags:
8
- - '*'
8
+ - "*"
9
9
  pull_request:
10
10
 
11
11
  jobs:
12
-
13
12
  lint:
14
13
  uses: ./.github/workflows/_tox.yml
15
14
  with:
@@ -20,27 +19,24 @@ jobs:
20
19
  matrix:
21
20
  runs-on: ["ubuntu-latest", "windows-latest"] # can add macos-latest
22
21
  python-version: ["3.11", "3.12", "3.13"]
23
- include:
24
- # Include one that runs in the dev environment
25
- - runs-on: "ubuntu-latest"
26
- python-version: "dev"
22
+ test-config:
23
+ - tests-path: "tests/unit_tests"
24
+ needs-services: false
25
+ - tests-path: "tests/system_tests"
26
+ needs-services: true
27
27
  fail-fast: false
28
28
  uses: ./.github/workflows/_test.yml
29
29
  with:
30
30
  runs-on: ${{ matrix.runs-on }}
31
31
  python-version: ${{ matrix.python-version }}
32
+ tests-path: ${{ matrix.test-config.tests-path }}
33
+ needs-services: ${{ matrix.test-config.needs-services }}
32
34
  secrets:
33
35
  CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
34
36
 
35
- import_with_no_extras:
36
- uses: ./.github/workflows/_import_with_no_extras.yml
37
-
38
37
  docs:
39
38
  uses: ./.github/workflows/_docs.yml
40
39
 
41
- system_tests:
42
- uses: ./.github/workflows/_system_test.yml
43
-
44
40
  dist:
45
41
  uses: ./.github/workflows/_dist.yml
46
42
 
@@ -55,7 +51,7 @@ jobs:
55
51
  uses: ./.github/workflows/_codeql.yml
56
52
 
57
53
  release:
58
- needs: [dist, test, docs, system_tests]
54
+ needs: [dist, test, docs]
59
55
  if: github.ref_type == 'tag'
60
56
  uses: ./.github/workflows/_release.yml
61
57
  permissions:
@@ -10,6 +10,7 @@ jobs:
10
10
  linkcheck:
11
11
  uses: ./.github/workflows/_tox.yml
12
12
  with:
13
- tox: docs build -- -b linkcheck
13
+ tox: docs -- -b linkcheck
14
+
14
15
  codeql:
15
16
  uses: ./.github/workflows/_codeql.yml
@@ -0,0 +1,19 @@
1
+ # This allow-list is limited to YAML/YML files to cut down SealedSecrets false positives.
2
+ # All gitleaks default rules still apply everywhere (useDefault = true).
3
+ # To broaden this allow-list to all files, comment out the 'paths' line below.
4
+
5
+ [extend]
6
+ useDefault = true
7
+
8
+ [[rules]]
9
+ id = "generic-api-key"
10
+
11
+ # Pattern-only allowlist for long Ag… tokens in YAML
12
+ [[rules.allowlists]]
13
+ condition = "AND"
14
+ regexes = [
15
+ # Boundary-safe Ag… token without lookarounds (RE2-safe)
16
+ '''(?:^|[^A-Za-z0-9+/=])(Ag[A-Za-z0-9+/]{500,}={0,2})(?:[^A-Za-z0-9+/=]|$)'''
17
+ ]
18
+ # Limit to YAML only for now. Comment this out if you want it to apply everywhere.
19
+ paths = ['''(?i).*\.ya?ml$''']
@@ -3,6 +3,7 @@ repos:
3
3
  rev: v5.0.0
4
4
  hooks:
5
5
  - id: check-added-large-files
6
+ args: ["--maxkb=1000"] # uv.lock is more than 500kB
6
7
  - id: check-yaml
7
8
  - id: check-merge-conflict
8
9
  - id: end-of-file-fixer
@@ -23,6 +24,13 @@ repos:
23
24
  types: [python]
24
25
  require_serial: true
25
26
 
27
+ - id: uv-sync
28
+ name: update uv.lock and venv
29
+ pass_filenames: false
30
+ language: system
31
+ entry: uv sync
32
+ files: ^(uv\.lock|pyproject\.toml)$
33
+
26
34
  - id: import-contracts
27
35
  name: Ensure import directionality
28
36
  pass_filenames: false
@@ -30,3 +38,8 @@ repos:
30
38
  entry: lint-imports
31
39
  types: [python]
32
40
  require_serial: false
41
+
42
+ - repo: https://github.com/gitleaks/gitleaks
43
+ rev: v8.28.0
44
+ hooks:
45
+ - id: gitleaks
@@ -0,0 +1 @@
1
+ 3.11
@@ -0,0 +1,10 @@
1
+ # The devcontainer should use the developer target and run as root with podman
2
+ # or docker with user namespaces.
3
+ FROM ghcr.io/diamondlightsource/ubuntu-devcontainer:noble AS developer
4
+
5
+ # Add any system dependencies for the developer/build environment here
6
+ RUN apt-get update -y && apt-get install -y --no-install-recommends \
7
+ graphviz \
8
+ libxcb-cursor0 \
9
+ qt6-base-dev \
10
+ && apt-get dist-clean
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ophyd-async
3
- Version: 0.13.3
3
+ Version: 0.13.5
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
@@ -58,45 +58,11 @@ Requires-Dist: aioca>=2.0a4; extra == "ca"
58
58
  Provides-Extra: pva
59
59
  Requires-Dist: p4p>=4.2.0; extra == "pva"
60
60
  Provides-Extra: tango
61
- Requires-Dist: pytango==10.0.2; extra == "tango"
61
+ Requires-Dist: pytango>=10.0.2; extra == "tango"
62
62
  Provides-Extra: demo
63
63
  Requires-Dist: ipython; extra == "demo"
64
64
  Requires-Dist: matplotlib; extra == "demo"
65
65
  Requires-Dist: pyqt6; extra == "demo"
66
- Provides-Extra: dev
67
- Requires-Dist: ophyd_async[sim]; extra == "dev"
68
- Requires-Dist: ophyd_async[ca]; extra == "dev"
69
- Requires-Dist: ophyd_async[pva]; extra == "dev"
70
- Requires-Dist: ophyd_async[tango]; extra == "dev"
71
- Requires-Dist: ophyd_async[demo]; extra == "dev"
72
- Requires-Dist: inflection; extra == "dev"
73
- Requires-Dist: import-linter; extra == "dev"
74
- Requires-Dist: myst-parser; extra == "dev"
75
- Requires-Dist: numpydoc; extra == "dev"
76
- Requires-Dist: ophyd>=1.10.7; extra == "dev"
77
- Requires-Dist: pickleshare; extra == "dev"
78
- Requires-Dist: pipdeptree; extra == "dev"
79
- Requires-Dist: pre-commit; extra == "dev"
80
- Requires-Dist: pydata-sphinx-theme>=0.12; extra == "dev"
81
- Requires-Dist: pyepics>=3.4.2; extra == "dev"
82
- Requires-Dist: pyright; extra == "dev"
83
- Requires-Dist: pytest; extra == "dev"
84
- Requires-Dist: pytest-asyncio; extra == "dev"
85
- Requires-Dist: pytest-cov; extra == "dev"
86
- Requires-Dist: pytest-faulthandler; extra == "dev"
87
- Requires-Dist: pytest-forked; extra == "dev"
88
- Requires-Dist: pytest-rerunfailures; extra == "dev"
89
- Requires-Dist: pytest-timeout; extra == "dev"
90
- Requires-Dist: ruff; extra == "dev"
91
- Requires-Dist: scanspec>=1.0a1; extra == "dev"
92
- Requires-Dist: sphinx-autobuild; extra == "dev"
93
- Requires-Dist: sphinx-autodoc2; extra == "dev"
94
- Requires-Dist: sphinxcontrib-mermaid; extra == "dev"
95
- Requires-Dist: sphinx-copybutton; extra == "dev"
96
- Requires-Dist: sphinx-design; extra == "dev"
97
- Requires-Dist: tox-direct; extra == "dev"
98
- Requires-Dist: types-mock; extra == "dev"
99
- Requires-Dist: types-pyyaml; extra == "dev"
100
66
  Dynamic: license-file
101
67
 
102
68
  [![CI](https://github.com/bluesky/ophyd-async/actions/workflows/ci.yml/badge.svg)](https://github.com/bluesky/ophyd-async/actions/workflows/ci.yml)
@@ -138,3 +138,12 @@ class Sensor(StandardReadable, EpicsDevice):
138
138
  value: A[SignalR[float], PvSuffix("Value"), Format.HINTED_SIGNAL]
139
139
  mode: A[SignalRW[EnergyMode], PvSuffix("Mode"), Format.CONFIG_SIGNAL]
140
140
  ```
141
+
142
+ Note that to use `Annotated as A` with ruff name checking we recommend adding something like:
143
+
144
+ ```
145
+ [tool.ruff.lint.flake8-import-conventions.extend-aliases]
146
+ # We often shorten "Annotated" to "A" for brevity
147
+ "typing.Annotated" = "A"
148
+ ```
149
+ to your `pyproject.toml`.
@@ -62,7 +62,7 @@ SignalBackend <|-- TangoSignalConnector
62
62
  ```
63
63
 
64
64
  If a `Device` with children is like a branch in a tree, a `Signal` is like a leaf. It has no children, but represents a single value or action in the control system. There are 4 types of signal:
65
- - [](#SignalR) is a signal with a read-only value that supports the [Readable](#bluesky.protocols.Readable) and [Subscribable](#bluesky.protocols.Subscribable) protocols. It also adds the [](#SignalR.get_value) and [](#SignalR.subscribe_value) methods that are used to interact with the Signal in the parent Device.
65
+ - [](#SignalR) is a signal with a read-only value that supports the [Readable](#bluesky.protocols.Readable) and [Subscribable](#bluesky.protocols.Subscribable) protocols. It also adds the [](#SignalR.subscribe_reading) method that is used to interact with the Signal in the parent Device.
66
66
  - [](#SignalW) is a signal with a write-only value that supports the [Movable](#bluesky.protocols.Movable) protocol.
67
67
  - [](#SignalRW) is a signal with a read-write value that inherits from SignalR and SignalW and adds the [Locatable](#bluesky.protocols.Locatable) protocol
68
68
  - [](#SignalX) is a signal that performs an action, and supports the [Triggerable](#bluesky.protocols.Triggerable) protocol
@@ -21,7 +21,7 @@ If we need to add a feature to a particular Device, or fix a bug, and it only af
21
21
 
22
22
  We will be writing a test using the pytest framework which encourages fixtures to setup and teardown the Devices we wish to test. In this case we will create the `DemoMotor` from the previous tutorial:
23
23
 
24
- ```{literalinclude} ../../tests/epics/demo/test_epics_demo.py
24
+ ```{literalinclude} ../../tests/unit_tests/epics/demo/test_epics_demo.py
25
25
  :pyobject: mock_motor
26
26
  ```
27
27
 
@@ -49,7 +49,7 @@ asyncio_mode = "auto"
49
49
 
50
50
  Let's test some verbs. We want to check that we can `read()` and `read_configuration()` on a `DemoMotor` while staged, and that we can still call them when unstaged:
51
51
 
52
- ```{literalinclude} ../../tests/epics/demo/test_epics_demo.py
52
+ ```{literalinclude} ../../tests/unit_tests/epics/demo/test_epics_demo.py
53
53
  :pyobject: test_read_motor
54
54
  ```
55
55
 
@@ -63,7 +63,7 @@ Some of our tests produce timestamps, instead of checking their values we use []
63
63
 
64
64
  Now let's call some verbs and check that they do the right thing. We want to check that `stop()` triggers the [](#SignalX) `stop_`, waiting for it to complete:
65
65
 
66
- ```{literalinclude} ../../tests/epics/demo/test_epics_demo.py
66
+ ```{literalinclude} ../../tests/unit_tests/epics/demo/test_epics_demo.py
67
67
  :pyobject: test_motor_stopped
68
68
  ```
69
69
 
@@ -73,7 +73,7 @@ This time we use [](#get_mock_put) to get a [](#unittest.mock.Mock) that will be
73
73
 
74
74
  Now let's pretend to be a progress bar and check that we get the right outputs. We want to check that `set()` will call any progress watchers with appropriate updates, and also terminate when the readback value reaches the correct value:
75
75
 
76
- ```{literalinclude} ../../tests/epics/demo/test_epics_demo.py
76
+ ```{literalinclude} ../../tests/unit_tests/epics/demo/test_epics_demo.py
77
77
  :pyobject: test_motor_moving_well
78
78
  ```
79
79
 
@@ -109,11 +109,11 @@ def RE():
109
109
 
110
110
  Now you can run a plan, and check that it produces the correct bluesky documents. Let's go back to the demo and test the `DemoPointDetector` in a `bp.count` plan:
111
111
 
112
- ```{literalinclude} ../../tests/epics/demo/test_epics_demo.py
112
+ ```{literalinclude} ../../tests/unit_tests/epics/demo/test_epics_demo.py
113
113
  :pyobject: mock_point_detector
114
114
  ```
115
115
 
116
- ```{literalinclude} ../../tests/epics/demo/test_epics_demo.py
116
+ ```{literalinclude} ../../tests/unit_tests/epics/demo/test_epics_demo.py
117
117
  :pyobject: test_point_detector_in_plan
118
118
  ```
119
119