ophyd-async 0.13.0__tar.gz → 0.13.2__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 (324) hide show
  1. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.copier-answers.yml +3 -2
  2. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/CONTRIBUTING.md +1 -1
  3. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  4. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/actions/install_requirements/action.yml +2 -1
  5. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/dependabot.yml +4 -0
  6. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/workflows/_docs.yml +1 -0
  7. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/workflows/_release.yml +1 -1
  8. ophyd_async-0.13.2/.github/workflows/_system_test.yml +38 -0
  9. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/workflows/_test.yml +1 -1
  10. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/workflows/ci.yml +10 -17
  11. ophyd_async-0.13.2/.gitmodules +3 -0
  12. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.pre-commit-config.yaml +1 -1
  13. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/PKG-INFO +5 -4
  14. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/decisions/0008-signal-types.md +2 -2
  15. ophyd_async-0.13.2/docs/explanations/when-to-extend-movable.md +17 -0
  16. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/how-to/choose-right-baseclass.md +1 -1
  17. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/tutorials/installation.md +1 -1
  18. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/pyproject.toml +18 -4
  19. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/_version.py +16 -3
  20. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/__init__.py +2 -1
  21. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_detector.py +1 -1
  22. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_signal.py +16 -9
  23. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_utils.py +5 -4
  24. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adandor/_andor.py +1 -2
  25. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adcore/_core_detector.py +1 -2
  26. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adcore/_core_io.py +1 -1
  27. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adcore/_core_logic.py +2 -2
  28. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adcore/_core_writer.py +9 -6
  29. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adcore/_hdf_writer.py +6 -1
  30. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adkinetix/_kinetix_io.py +4 -4
  31. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adpilatus/_pilatus.py +2 -6
  32. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/advimba/_vimba_io.py +1 -1
  33. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/core/_epics_connector.py +14 -1
  34. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/core/_p4p.py +2 -3
  35. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/core/_pvi_connector.py +1 -1
  36. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/motor.py +21 -16
  37. {ophyd_async-0.13.0/src/ophyd_async/epics/eiger → ophyd_async-0.13.2/src/ophyd_async/epics/odin}/_odin_io.py +5 -3
  38. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/pmac/__init__.py +2 -0
  39. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/pmac/_pmac_io.py +2 -2
  40. ophyd_async-0.13.2/src/ophyd_async/epics/pmac/_pmac_trajectory.py +116 -0
  41. ophyd_async-0.13.2/src/ophyd_async/epics/pmac/_utils.py +847 -0
  42. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/testing/_example_ioc.py +1 -2
  43. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/fastcs/eiger/_eiger.py +1 -1
  44. ophyd_async-0.13.2/src/ophyd_async/fastcs/jungfrau/__init__.py +29 -0
  45. ophyd_async-0.13.2/src/ophyd_async/fastcs/jungfrau/_controller.py +139 -0
  46. ophyd_async-0.13.2/src/ophyd_async/fastcs/jungfrau/_jungfrau.py +30 -0
  47. ophyd_async-0.13.2/src/ophyd_async/fastcs/jungfrau/_signals.py +94 -0
  48. ophyd_async-0.13.2/src/ophyd_async/fastcs/jungfrau/_utils.py +79 -0
  49. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/plan_stubs/_settings.py +1 -1
  50. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/sim/_motor.py +11 -3
  51. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/sim/_point_detector.py +6 -3
  52. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/sim/_stage.py +14 -3
  53. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/tango/core/_tango_transport.py +2 -2
  54. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/testing/_assert.py +6 -6
  55. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/testing/_one_of_everything.py +1 -1
  56. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async.egg-info/PKG-INFO +5 -4
  57. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async.egg-info/SOURCES.txt +20 -3
  58. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async.egg-info/requires.txt +2 -1
  59. ophyd_async-0.13.2/system_tests/conftest.py +10 -0
  60. ophyd_async-0.13.2/system_tests/epics/adsim/baseline.yaml +32 -0
  61. ophyd_async-0.13.2/system_tests/epics/adsim/start_iocs.sh +14 -0
  62. ophyd_async-0.13.2/system_tests/epics/adsim/stop_iocs.sh +14 -0
  63. ophyd_async-0.13.2/system_tests/epics/adsim/test_adsim_system.py +237 -0
  64. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/system_tests/epics/eiger/test_eiger_system.py +5 -12
  65. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/conftest.py +0 -17
  66. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_auto_init_devices.py +2 -0
  67. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_signal.py +2 -2
  68. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_watchable_async_status.py +1 -1
  69. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/adcore/test_drivers.py +1 -1
  70. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/conftest.py +0 -3
  71. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/eiger/test_odin_io.py +2 -2
  72. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/pmac/test_pmac_io.py +2 -2
  73. ophyd_async-0.13.2/tests/epics/pmac/test_pmac_trajectory.py +170 -0
  74. ophyd_async-0.13.2/tests/epics/pmac/test_pmac_utils.py +922 -0
  75. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/signal/test_signals.py +33 -1
  76. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/test_motor.py +22 -0
  77. ophyd_async-0.13.2/tests/fastcs/jungfrau/test_controller.py +165 -0
  78. ophyd_async-0.13.2/tests/fastcs/jungfrau/test_utils.py +49 -0
  79. ophyd_async-0.13.2/tests/sim/__init__.py +0 -0
  80. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/tango/test_tango_signals.py +1 -1
  81. ophyd_async-0.13.0/.github/workflows/_check.yml +0 -27
  82. ophyd_async-0.13.0/src/ophyd_async/epics/pmac/_utils.py +0 -231
  83. ophyd_async-0.13.0/tests/epics/pmac/test_pmac_utils.py +0 -324
  84. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.codecov.yml +0 -0
  85. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.devcontainer/devcontainer.json +0 -0
  86. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.git-blame-ignore-revs +0 -0
  87. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/ISSUE_TEMPLATE/issue.md +0 -0
  88. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -0
  89. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/codeql/codeql-config.yml +0 -0
  90. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/pages/index.html +0 -0
  91. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/pages/make_switcher.py +0 -0
  92. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/workflows/_codeql.yml +0 -0
  93. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/workflows/_dist.yml +0 -0
  94. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/workflows/_import_with_no_extras.yml +0 -0
  95. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/workflows/_pypi.yml +0 -0
  96. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/workflows/_tox.yml +0 -0
  97. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.github/workflows/periodic.yml +0 -0
  98. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/.gitignore +0 -0
  99. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/Dockerfile +0 -0
  100. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/LICENSE +0 -0
  101. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/README.md +0 -0
  102. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/_static/custom.css +0 -0
  103. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/conf.py +0 -0
  104. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
  105. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
  106. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/decisions/0003-ophyd-async-migration.rst +0 -0
  107. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/decisions/0004-repository-structure.rst +0 -0
  108. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/decisions/0005-respect-black-line-length.rst +0 -0
  109. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/decisions/0006-procedural-device-definitions.rst +0 -0
  110. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/decisions/0007-subpackage-structure.md +0 -0
  111. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/decisions/0009-procedural-vs-declarative-devices.md +0 -0
  112. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/decisions/0010-docstring-format.md +0 -0
  113. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/decisions/0011-buffer-updates-camonitor.md +0 -0
  114. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/decisions/COPYME +0 -0
  115. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/decisions.md +0 -0
  116. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/declarative-vs-procedural.md +0 -0
  117. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/design-goals.md +0 -0
  118. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/device-connection-strategies.md +0 -0
  119. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/devices-signals-backends.md +0 -0
  120. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/fly-scanning.md +0 -0
  121. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/plan-stubs.md +0 -0
  122. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations/where-device-logic.md +0 -0
  123. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/explanations.md +0 -0
  124. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/genindex.rst +0 -0
  125. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/how-to/contribute.md +0 -0
  126. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/how-to/derive-one-signal-from-others.md +0 -0
  127. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/how-to/implement-ad-detector.md +0 -0
  128. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/how-to/interact-with-signals.md +0 -0
  129. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/how-to/put-device-back.md +0 -0
  130. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/how-to/store-and-retrieve.md +0 -0
  131. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/how-to.md +0 -0
  132. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/images/fly_scan_collection_windows_and_frames.svg +0 -0
  133. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/images/ophyd-async-logo.svg +0 -0
  134. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/images/ophyd-favicon.svg +0 -0
  135. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/images/set_and_wait_for_other_value.excalidraw.svg +0 -0
  136. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/index.md +0 -0
  137. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/reference.md +0 -0
  138. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/tutorials/implementing-detectors.md +0 -0
  139. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/tutorials/implementing-devices.md +0 -0
  140. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/tutorials/using-devices.md +0 -0
  141. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/tutorials/writing-tests-for-devices.md +0 -0
  142. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/docs/tutorials.md +0 -0
  143. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/setup.cfg +0 -0
  144. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/__init__.py +0 -0
  145. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/__main__.py +0 -0
  146. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/_docs_parser.py +0 -0
  147. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_derived_signal.py +0 -0
  148. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_derived_signal_backend.py +0 -0
  149. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_device.py +0 -0
  150. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_device_filler.py +0 -0
  151. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_enums.py +0 -0
  152. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_flyer.py +0 -0
  153. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_hdf_dataset.py +0 -0
  154. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_log.py +0 -0
  155. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_mock_signal_backend.py +0 -0
  156. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_protocol.py +0 -0
  157. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_providers.py +0 -0
  158. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_readable.py +0 -0
  159. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_settings.py +0 -0
  160. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_signal_backend.py +0 -0
  161. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_soft_signal_backend.py +0 -0
  162. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_status.py +0 -0
  163. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_table.py +0 -0
  164. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/core/_yaml_settings.py +0 -0
  165. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/__init__.py +0 -0
  166. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adandor/__init__.py +0 -0
  167. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adandor/_andor_controller.py +0 -0
  168. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adandor/_andor_io.py +0 -0
  169. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adaravis/__init__.py +0 -0
  170. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adaravis/_aravis.py +0 -0
  171. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adaravis/_aravis_controller.py +0 -0
  172. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adaravis/_aravis_io.py +0 -0
  173. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adcore/__init__.py +0 -0
  174. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adcore/_jpeg_writer.py +0 -0
  175. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adcore/_single_trigger.py +0 -0
  176. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adcore/_tiff_writer.py +0 -0
  177. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adcore/_utils.py +0 -0
  178. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adkinetix/__init__.py +0 -0
  179. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adkinetix/_kinetix.py +0 -0
  180. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adkinetix/_kinetix_controller.py +0 -0
  181. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adpilatus/__init__.py +0 -0
  182. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adpilatus/_pilatus_controller.py +0 -0
  183. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adpilatus/_pilatus_io.py +0 -0
  184. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adsimdetector/__init__.py +0 -0
  185. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adsimdetector/_sim.py +0 -0
  186. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adsimdetector/_sim_controller.py +0 -0
  187. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/adsimdetector/_sim_io.py +0 -0
  188. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/advimba/__init__.py +0 -0
  189. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/advimba/_vimba.py +0 -0
  190. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/advimba/_vimba_controller.py +0 -0
  191. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/core/__init__.py +0 -0
  192. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/core/_aioca.py +0 -0
  193. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/core/_epics_device.py +0 -0
  194. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/core/_signal.py +0 -0
  195. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/core/_util.py +0 -0
  196. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/demo/__init__.py +0 -0
  197. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/demo/__main__.py +0 -0
  198. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/demo/_ioc.py +0 -0
  199. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/demo/_motor.py +0 -0
  200. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/demo/_point_detector.py +0 -0
  201. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/demo/_point_detector_channel.py +0 -0
  202. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/demo/_stage.py +0 -0
  203. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/demo/motor.db +0 -0
  204. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/demo/point_detector.db +0 -0
  205. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/demo/point_detector_channel.db +0 -0
  206. {ophyd_async-0.13.0/src/ophyd_async/epics/eiger → ophyd_async-0.13.2/src/ophyd_async/epics/odin}/__init__.py +0 -0
  207. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/signal.py +0 -0
  208. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/testing/__init__.py +0 -0
  209. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/testing/_utils.py +0 -0
  210. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/testing/test_records.db +0 -0
  211. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/epics/testing/test_records_pva.db +0 -0
  212. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/fastcs/__init__.py +0 -0
  213. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/fastcs/core.py +0 -0
  214. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/fastcs/eiger/__init__.py +0 -0
  215. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/fastcs/eiger/_eiger_controller.py +0 -0
  216. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/fastcs/eiger/_eiger_io.py +0 -0
  217. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/fastcs/odin/__init__.py +0 -0
  218. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/fastcs/panda/__init__.py +0 -0
  219. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/fastcs/panda/_block.py +0 -0
  220. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/fastcs/panda/_control.py +0 -0
  221. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/fastcs/panda/_hdf_panda.py +0 -0
  222. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/fastcs/panda/_table.py +0 -0
  223. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/fastcs/panda/_trigger.py +0 -0
  224. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/fastcs/panda/_writer.py +0 -0
  225. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/plan_stubs/__init__.py +0 -0
  226. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/plan_stubs/_ensure_connected.py +0 -0
  227. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/plan_stubs/_fly.py +0 -0
  228. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/plan_stubs/_nd_attributes.py +0 -0
  229. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/plan_stubs/_panda.py +0 -0
  230. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/plan_stubs/_utils.py +0 -0
  231. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/plan_stubs/_wait_for_awaitable.py +0 -0
  232. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/py.typed +0 -0
  233. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/sim/__init__.py +0 -0
  234. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/sim/__main__.py +0 -0
  235. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/sim/_blob_detector.py +0 -0
  236. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/sim/_blob_detector_controller.py +0 -0
  237. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/sim/_blob_detector_writer.py +0 -0
  238. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/sim/_mirror_horizontal.py +0 -0
  239. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/sim/_mirror_vertical.py +0 -0
  240. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/sim/_pattern_generator.py +0 -0
  241. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/tango/__init__.py +0 -0
  242. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/tango/core/__init__.py +0 -0
  243. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/tango/core/_base_device.py +0 -0
  244. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/tango/core/_converters.py +0 -0
  245. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/tango/core/_signal.py +0 -0
  246. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/tango/core/_tango_readable.py +0 -0
  247. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/tango/core/_utils.py +0 -0
  248. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/tango/demo/__init__.py +0 -0
  249. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/tango/demo/_counter.py +0 -0
  250. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/tango/demo/_detector.py +0 -0
  251. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/tango/demo/_mover.py +0 -0
  252. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/tango/demo/_tango/__init__.py +0 -0
  253. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/tango/demo/_tango/_servers.py +0 -0
  254. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/tango/testing/__init__.py +0 -0
  255. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/tango/testing/_one_of_everything.py +0 -0
  256. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/testing/__init__.py +0 -0
  257. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/testing/__pytest_assert_rewrite.py +0 -0
  258. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/testing/_mock_signal_utils.py +0 -0
  259. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/testing/_single_derived.py +0 -0
  260. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/testing/_utils.py +0 -0
  261. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async/testing/_wait_for_pending.py +0 -0
  262. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async.egg-info/dependency_links.txt +0 -0
  263. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/src/ophyd_async.egg-info/top_level.txt +0 -0
  264. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/system_tests/epics/eiger/README.md +0 -0
  265. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/system_tests/epics/eiger/start_iocs_and_run_tests.sh +0 -0
  266. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_detector.py +0 -0
  267. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_device.py +0 -0
  268. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_flyer.py +0 -0
  269. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_log.py +0 -0
  270. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_mock_signal_backend.py +0 -0
  271. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_multi_derived_signal.py +0 -0
  272. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_observe.py +0 -0
  273. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_protocol.py +0 -0
  274. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_providers.py +0 -0
  275. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_readable.py +0 -0
  276. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_single_derived_signal.py +0 -0
  277. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_soft_signal_backend.py +0 -0
  278. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_status.py +0 -0
  279. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_subset_enum.py +0 -0
  280. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_table.py +0 -0
  281. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/core/test_utils.py +0 -0
  282. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/adandor/test_andor.py +0 -0
  283. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/adaravis/test_aravis.py +0 -0
  284. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/adcore/test_cont_acq_detector.py +0 -0
  285. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/adcore/test_detectors.py +0 -0
  286. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/adcore/test_plugins.py +0 -0
  287. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/adcore/test_scans.py +0 -0
  288. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/adcore/test_single_trigger.py +0 -0
  289. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/adcore/test_writers.py +0 -0
  290. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/adkinetix/test_kinetix.py +0 -0
  291. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/adpilatus/test_pilatus.py +0 -0
  292. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/adsimdetector/test_sim.py +0 -0
  293. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/advimba/test_vimba.py +0 -0
  294. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/demo/test_epics_demo.py +0 -0
  295. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/pvi/test_pvi.py +0 -0
  296. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/signal/test_common.py +0 -0
  297. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/signal/test_yaml_save_ca.yaml +0 -0
  298. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/signal/test_yaml_save_pva.yaml +0 -0
  299. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/epics/test_areadetector_subclass_naming.py +0 -0
  300. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/fastcs/eiger/test_eiger_controller.py +0 -0
  301. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/fastcs/eiger/test_eiger_detector.py +0 -0
  302. {ophyd_async-0.13.0/tests/sim → ophyd_async-0.13.2/tests/fastcs/jungfrau}/__init__.py +0 -0
  303. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/fastcs/panda/db/panda.db +0 -0
  304. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/fastcs/panda/test_hdf_panda.py +0 -0
  305. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/fastcs/panda/test_panda_connect.py +0 -0
  306. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/fastcs/panda/test_panda_control.py +0 -0
  307. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/fastcs/panda/test_panda_utils.py +0 -0
  308. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/fastcs/panda/test_seq_table.py +0 -0
  309. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/fastcs/panda/test_trigger.py +0 -0
  310. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/fastcs/panda/test_writer.py +0 -0
  311. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/plan_stubs/test_ensure_connected.py +0 -0
  312. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/plan_stubs/test_fly.py +0 -0
  313. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/plan_stubs/test_settings.py +0 -0
  314. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/plan_stubs/test_setup.py +0 -0
  315. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/sim/test_sim_blob_detector.py +0 -0
  316. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/sim/test_sim_motor.py +0 -0
  317. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/tango/conftest.py +0 -0
  318. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/tango/context_subprocess.py +0 -0
  319. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/tango/test_base_device.py +0 -0
  320. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/tango/test_tango_transport.py +0 -0
  321. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/test_cli.py +0 -0
  322. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/test_data/test_yaml_config_save.yaml +0 -0
  323. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/test_data/test_yaml_save.yaml +0 -0
  324. {ophyd_async-0.13.0 → ophyd_async-0.13.2}/tests/test_tutorials.py +0 -0
@@ -1,6 +1,6 @@
1
1
  # Changes here will be overwritten by Copier
2
- _commit: 2.6.0
3
- _src_path: gh:DiamondLightSource/python-copier-template
2
+ _commit: 4.1.0
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
6
6
  description: Asynchronous Bluesky hardware abstraction code, compatible with control
@@ -13,4 +13,5 @@ github_org: bluesky
13
13
  package_name: ophyd_async
14
14
  pypi: true
15
15
  repo_name: ophyd-async
16
+ strict_typing: false
16
17
  type_checker: pyright
@@ -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/2.6.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/4.1.0/how-to.html).
@@ -7,7 +7,7 @@ assignees: ''
7
7
 
8
8
  ---
9
9
 
10
- Describe the bug, including a clear and concise description of the expected behavior, the actual behavior and the context in which you encountered it (ideally include details of your environment).
10
+ Describe the bug, including a clear and concise description of the expected behaviour, the actual behavior and the context in which you encountered it (ideally include details of your environment).
11
11
 
12
12
  ## Steps To Reproduce
13
13
  Steps to reproduce the behavior:
@@ -15,7 +15,8 @@ runs:
15
15
  run: |
16
16
  PYTHON_VERSION="${{ inputs.python-version }}"
17
17
  if [ $PYTHON_VERSION == "dev" ]; then
18
- PYTHON_VERSION=$(sed -n "s/ARG PYTHON_VERSION=//p" Dockerfile)
18
+ # python version from Dockerfile, removing potential pinned sha
19
+ PYTHON_VERSION=$(sed -Ene "s/ARG PYTHON_VERSION=([0-9\.]+).*/\1/p" Dockerfile)
19
20
  fi
20
21
  echo "PYTHON_VERSION=$PYTHON_VERSION" >> "$GITHUB_ENV"
21
22
  shell: bash
@@ -13,6 +13,8 @@ updates:
13
13
  actions:
14
14
  patterns:
15
15
  - "*"
16
+ commit-message:
17
+ prefix: "chore"
16
18
 
17
19
  - package-ecosystem: "pip"
18
20
  directory: "/"
@@ -22,3 +24,5 @@ updates:
22
24
  dev-dependencies:
23
25
  patterns:
24
26
  - "*"
27
+ commit-message:
28
+ prefix: "chore"
@@ -1,6 +1,7 @@
1
1
  on:
2
2
  workflow_call:
3
3
 
4
+
4
5
  jobs:
5
6
  build:
6
7
  runs-on: ubuntu-latest
@@ -23,7 +23,7 @@ jobs:
23
23
  - name: Create GitHub Release
24
24
  # We pin to the SHA, not the tag, for security reasons.
25
25
  # https://docs.github.com/en/actions/learn-github-actions/security-hardening-for-github-actions#using-third-party-actions
26
- uses: softprops/action-gh-release@e7a8f85e1c67a31e6ed99a94b41bd0b71bbee6b8 # v2.0.9
26
+ uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631 # v2.2.2
27
27
  with:
28
28
  prerelease: ${{ contains(github.ref_name, 'a') || contains(github.ref_name, 'b') || contains(github.ref_name, 'rc') }}
29
29
  files: "*"
@@ -0,0 +1,38 @@
1
+ on:
2
+ workflow_call:
3
+
4
+ env:
5
+ # https://github.com/pytest-dev/pytest/issues/2042
6
+ PY_IGNORE_IMPORTMISMATCH: "1"
7
+
8
+ jobs:
9
+ run:
10
+ runs-on: ubuntu-latest
11
+
12
+ steps:
13
+ - name: Checkout
14
+ uses: actions/checkout@v4
15
+ with:
16
+ # Need this to get version number from last tag
17
+ fetch-depth: 0
18
+
19
+ - name: Install dev versions of python packages
20
+ uses: ./.github/actions/install_requirements
21
+
22
+ - name: Checkout simulated devices
23
+ uses: actions/checkout@v4
24
+ with:
25
+ repository: epics-containers/example-services
26
+ path: example-services
27
+ ref: 'main'
28
+
29
+ - name: Run docker compose
30
+ uses: hoverkraft-tech/compose-action@v2.3.0
31
+ with:
32
+ compose-file: "./example-services/compose.yaml"
33
+ services: |
34
+ bl01t-di-cam-01
35
+ ca-gateway
36
+
37
+ - name: Run system tests
38
+ run: pytest system_tests/epics/adsim
@@ -64,7 +64,7 @@ jobs:
64
64
  run: tox -e tests -- --timeout=2
65
65
 
66
66
  - name: Upload coverage to Codecov
67
- uses: codecov/codecov-action@v4
67
+ uses: codecov/codecov-action@v5
68
68
  with:
69
69
  name: ${{ inputs.python-version }}/${{ inputs.runs-on }}
70
70
  files: cov.xml
@@ -2,26 +2,24 @@ name: CI
2
2
 
3
3
  on:
4
4
  push:
5
+ branches:
6
+ - main
7
+ tags:
8
+ - '*'
5
9
  pull_request:
6
10
 
7
11
  jobs:
8
- check:
9
- uses: ./.github/workflows/_check.yml
10
12
 
11
13
  lint:
12
- needs: check
13
- if: needs.check.outputs.branch-pr == ''
14
14
  uses: ./.github/workflows/_tox.yml
15
15
  with:
16
16
  tox: pre-commit,type-checking
17
17
 
18
18
  test:
19
- needs: check
20
- if: needs.check.outputs.branch-pr == ''
21
19
  strategy:
22
20
  matrix:
23
21
  runs-on: ["ubuntu-latest", "windows-latest"] # can add macos-latest
24
- python-version: ["3.10","3.11","3.12"]
22
+ python-version: ["3.11", "3.12", "3.13"]
25
23
  include:
26
24
  # Include one that runs in the dev environment
27
25
  - runs-on: "ubuntu-latest"
@@ -35,35 +33,30 @@ jobs:
35
33
  CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
36
34
 
37
35
  import_with_no_extras:
38
- needs: check
39
- if: needs.check.outputs.branch-pr == ''
40
36
  uses: ./.github/workflows/_import_with_no_extras.yml
41
37
 
42
38
  docs:
43
- needs: check
44
- if: needs.check.outputs.branch-pr == ''
45
39
  uses: ./.github/workflows/_docs.yml
46
40
 
41
+ system_tests:
42
+ uses: ./.github/workflows/_system_test.yml
43
+
47
44
  dist:
48
- needs: check
49
- if: needs.check.outputs.branch-pr == ''
50
45
  uses: ./.github/workflows/_dist.yml
51
46
 
52
47
  pypi:
48
+ needs: [dist, test]
53
49
  if: github.ref_type == 'tag'
54
- needs: dist
55
50
  uses: ./.github/workflows/_pypi.yml
56
51
  permissions:
57
52
  id-token: write
58
53
 
59
54
  codeql:
60
- needs: check
61
- if: needs.check.outputs.branch-pr == ''
62
55
  uses: ./.github/workflows/_codeql.yml
63
56
 
64
57
  release:
58
+ needs: [dist, test, docs, system_tests]
65
59
  if: github.ref_type == 'tag'
66
- needs: [dist, docs]
67
60
  uses: ./.github/workflows/_release.yml
68
61
  permissions:
69
62
  contents: write
@@ -0,0 +1,3 @@
1
+ [submodule "example-services"]
2
+ path = example-services
3
+ url = https://github.com/epics-containers/example-services.git
@@ -12,7 +12,7 @@ repos:
12
12
  - id: ruff
13
13
  name: lint with ruff
14
14
  language: system
15
- entry: ruff check --force-exclude
15
+ entry: ruff check --force-exclude --fix
16
16
  types: [python]
17
17
  require_serial: true
18
18
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ophyd-async
3
- Version: 0.13.0
3
+ Version: 0.13.2
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
@@ -35,10 +35,10 @@ License: BSD 3-Clause License
35
35
  Project-URL: GitHub, https://github.com/bluesky/ophyd-async
36
36
  Classifier: Development Status :: 3 - Alpha
37
37
  Classifier: License :: OSI Approved :: BSD License
38
- Classifier: Programming Language :: Python :: 3.10
39
38
  Classifier: Programming Language :: Python :: 3.11
40
39
  Classifier: Programming Language :: Python :: 3.12
41
- Requires-Python: >=3.10
40
+ Classifier: Programming Language :: Python :: 3.13
41
+ Requires-Python: >=3.11
42
42
  Description-Content-Type: text/markdown
43
43
  License-File: LICENSE
44
44
  Requires-Dist: numpy
@@ -50,6 +50,7 @@ Requires-Dist: pydantic>=2.0
50
50
  Requires-Dist: pydantic-numpy
51
51
  Requires-Dist: stamina>=23.1.0
52
52
  Requires-Dist: scanspec>=1.0a1
53
+ Requires-Dist: velocity-profile
53
54
  Provides-Extra: sim
54
55
  Requires-Dist: h5py; extra == "sim"
55
56
  Provides-Extra: ca
@@ -57,7 +58,7 @@ Requires-Dist: aioca>=2.0a4; extra == "ca"
57
58
  Provides-Extra: pva
58
59
  Requires-Dist: p4p>=4.2.0; extra == "pva"
59
60
  Provides-Extra: tango
60
- Requires-Dist: pytango==10.0.0; extra == "tango"
61
+ Requires-Dist: pytango==10.0.2; extra == "tango"
61
62
  Provides-Extra: demo
62
63
  Requires-Dist: ipython; extra == "demo"
63
64
  Requires-Dist: matplotlib; extra == "demo"
@@ -54,8 +54,8 @@ Structure now read from `.value` rather than `.pvi`. Supported in FastCS. Requir
54
54
  ## `StrictEnum` is now requried for all strictly checked `Enums`
55
55
  ```python
56
56
  # old
57
- from enum import Enum
58
- class MyEnum(str, Enum):
57
+ from enum import StrEnum
58
+ class MyEnum(StrEnum):
59
59
  ONE = "one"
60
60
  TWO = "two"
61
61
  # new
@@ -0,0 +1,17 @@
1
+ # When should a device extend movable
2
+
3
+ The [`Movable`](#bluesky.protocols.Movable) protocol indicates that a device has a `set` method which can be called in the bluesky through the plan stubs [`bps.abs_set`](#bluesky.plan_stubs.abs_set) and [`bps.mv`](#bluesky.plan_stubs.mv). The [RunEngine](#bluesky.run_engine.RunEngine) treats this `set` as an atomic operation. A `Movable` device is appropriate when:
4
+
5
+ - The `set` involves changing multiple signals in parallel alongside a desired ordering of the setting of signals - having this logic inside an asyncio function can provide speedup.
6
+
7
+ - The `RunEngine` should not be altering any other devices while this `set` is taking place.
8
+
9
+ - There is only one clear interpretation of what it means to set the device. For example, setting a motor is fairly unambiguous whereas setting a detector could mean a number of different things.
10
+
11
+ - You are doing some logic that a user will almost always want to do with this device.
12
+
13
+ The `set` method, in general, should be used be used with primitive values rather than more complex types, for example, dataclasses. Using the latter here leads to extra boilerplate at the plan level. An exception to this is where using `set` will provide speedup - in this case it could be worth the extra boilerplate.
14
+
15
+ ## What to use instead
16
+
17
+ If the device doesn't satisfy the above criteria, it is generally more suitable to be using combinations of [`bps.mv`](#bluesky.plan_stubs.mv) and [`bps.abs_set`](#bluesky.plan_stubs.abs_set) on individual signals of a plan's devices. This avoids adding unnecessary complexity to the device whilst giving the plan more flexability.
@@ -18,7 +18,7 @@ There are some utility baseclasses that allow you to create a Device pre-populat
18
18
 
19
19
  There are some [bluesky protocols](inv:bluesky#hardware) that show the verbs you can implement to add functionality in standard plans. For example:
20
20
 
21
- - [](#bluesky.protocols.Movable) to add behavior during `bps.mv` and `bps.abs_set`
21
+ - [](#bluesky.protocols.Movable) to add behavior during `bps.mv` and `bps.abs_set`. See [here](../explanations/when-to-extend-movable.md) for deciding if a device should extend movable.
22
22
  - [](#bluesky.protocols.Triggerable) to add behavior before `read()` in `bps.scan`
23
23
 
24
24
  It is not strictly required to add the protocol class as a baseclass (the presence of a method with the right signature is all that is required) but generally this is done so that the IDE gives you help when filling in the method, and the type checker knows to check that you have filled it in correctly.
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Check your version of python
4
4
 
5
- You will need python 3.10 or later. You can check your version of python by
5
+ You will need python 3.11 or later. You can check your version of python by
6
6
  typing into a terminal:
7
7
 
8
8
  ```
@@ -7,9 +7,9 @@ name = "ophyd-async"
7
7
  classifiers = [
8
8
  "Development Status :: 3 - Alpha",
9
9
  "License :: OSI Approved :: BSD License",
10
- "Programming Language :: Python :: 3.10",
11
10
  "Programming Language :: Python :: 3.11",
12
11
  "Programming Language :: Python :: 3.12",
12
+ "Programming Language :: Python :: 3.13",
13
13
  ]
14
14
  description = "Asynchronous Bluesky hardware abstraction code, compatible with control systems like EPICS and Tango"
15
15
  dependencies = [
@@ -22,17 +22,18 @@ dependencies = [
22
22
  "pydantic-numpy",
23
23
  "stamina>=23.1.0",
24
24
  "scanspec>=1.0a1",
25
+ "velocity-profile",
25
26
  ]
26
27
  dynamic = ["version"]
27
28
  license.file = "LICENSE"
28
29
  readme = "README.md"
29
- requires-python = ">=3.10"
30
+ requires-python = ">=3.11"
30
31
 
31
32
  [project.optional-dependencies]
32
33
  sim = ["h5py"]
33
34
  ca = ["aioca>=2.0a4"]
34
35
  pva = ["p4p>=4.2.0"]
35
- tango = ["pytango==10.0.0"]
36
+ tango = ["pytango==10.0.2"]
36
37
  demo = ["ipython", "matplotlib", "pyqt6"]
37
38
  dev = [
38
39
  "ophyd_async[sim]",
@@ -103,7 +104,7 @@ markers = [
103
104
  ]
104
105
  asyncio_mode = "auto"
105
106
  asyncio_default_fixture_loop_scope = "function"
106
- timeout = 0.75
107
+ timeout = 1
107
108
  [tool.coverage.run]
108
109
  data_file = "/tmp/ophyd_async.coverage"
109
110
 
@@ -192,3 +193,16 @@ source_modules = [
192
193
  "ophyd_async.tango.*",
193
194
  ]
194
195
  ignore_imports = ["ophyd_async.*.testing.* -> ophyd_async.testing"]
196
+
197
+ [[tool.importlinter.contracts]]
198
+ name = "ophyd_async.core private modules are not to be used outside ophyd_async.core"
199
+ type = "forbidden"
200
+ forbidden_modules = ["ophyd_async.core.*"]
201
+ source_modules = [
202
+ "ophyd_async.testing",
203
+ "ophyd_async.plan_stubs",
204
+ "ophyd_async.fastcs.*",
205
+ "ophyd_async.epics.*",
206
+ "ophyd_async.tango.*",
207
+ ]
208
+ allow_indirect_imports = true
@@ -1,7 +1,14 @@
1
1
  # file generated by setuptools-scm
2
2
  # don't change, don't track in version control
3
3
 
4
- __all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
5
12
 
6
13
  TYPE_CHECKING = False
7
14
  if TYPE_CHECKING:
@@ -9,13 +16,19 @@ if TYPE_CHECKING:
9
16
  from typing import Union
10
17
 
11
18
  VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
12
20
  else:
13
21
  VERSION_TUPLE = object
22
+ COMMIT_ID = object
14
23
 
15
24
  version: str
16
25
  __version__: str
17
26
  __version_tuple__: VERSION_TUPLE
18
27
  version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
19
30
 
20
- __version__ = version = '0.13.0'
21
- __version_tuple__ = version_tuple = (0, 13, 0)
31
+ __version__ = version = '0.13.2'
32
+ __version_tuple__ = version_tuple = (0, 13, 2)
33
+
34
+ __commit_id__ = commit_id = 'gc5aa76fc4'
@@ -6,7 +6,7 @@ from ._derived_signal import (
6
6
  derived_signal_rw,
7
7
  derived_signal_w,
8
8
  )
9
- from ._derived_signal_backend import Transform
9
+ from ._derived_signal_backend import Transform, merge_gathered_dicts
10
10
  from ._detector import (
11
11
  DetectorController,
12
12
  DetectorTrigger,
@@ -212,6 +212,7 @@ __all__ = [
212
212
  "derived_signal_w",
213
213
  "Transform",
214
214
  "DerivedSignalFactory",
215
+ "merge_gathered_dicts",
215
216
  # Back compat - delete before 1.0
216
217
  "ConfigSignal",
217
218
  "HintedSignal",
@@ -84,7 +84,7 @@ class TriggerInfo(ConfinedModel):
84
84
  A exposures_per_event > 1 can be useful to have exposures from a faster detector
85
85
  able to be zipped with a single exposure from a slower detector. E.g. if
86
86
  number_of_events=10 and exposures_per_event=5 then the detector will take
87
- 10 exposures, but publish 2 StreamDatum indices, and describe() will show a
87
+ 50 exposures, but publish 10 StreamDatum indices, and describe() will show a
88
88
  shape of (5, h, w) for each.
89
89
  Default is 1.
90
90
  """
@@ -39,8 +39,8 @@ from ._utils import (
39
39
  async def _wait_for(coro: Awaitable[T], timeout: float | None, source: str) -> T:
40
40
  try:
41
41
  return await asyncio.wait_for(coro, timeout)
42
- except asyncio.TimeoutError as e:
43
- raise asyncio.TimeoutError(source) from e
42
+ except TimeoutError as e:
43
+ raise TimeoutError(source) from e
44
44
 
45
45
 
46
46
  def _add_timeout(func):
@@ -121,6 +121,13 @@ class _SignalCache(Generic[SignalDatatypeT]):
121
121
  self._valid = asyncio.Event()
122
122
  self._reading: Reading[SignalDatatypeT] | None = None
123
123
  self.backend: SignalBackend[SignalDatatypeT] = backend
124
+ try:
125
+ asyncio.get_running_loop()
126
+ except RuntimeError as e:
127
+ raise RuntimeError(
128
+ "Need a running event loop to subscribe to a signal, "
129
+ "are you trying to run subscribe outside a plan?"
130
+ ) from e
124
131
  signal.log.debug(f"Making subscription on source {signal.source}")
125
132
  backend.set_callback(self._callback)
126
133
 
@@ -492,7 +499,7 @@ async def observe_signals_value(
492
499
  last_item = ()
493
500
  while True:
494
501
  if overall_deadline and time.monotonic() >= overall_deadline:
495
- raise asyncio.TimeoutError(
502
+ raise TimeoutError(
496
503
  f"observe_value was still observing signals "
497
504
  f"{[signal.source for signal in signals]} after "
498
505
  f"timeout {done_timeout}s"
@@ -500,8 +507,8 @@ async def observe_signals_value(
500
507
  iteration_timeout = _get_iteration_timeout(timeout, overall_deadline)
501
508
  try:
502
509
  item = await asyncio.wait_for(q.get(), iteration_timeout)
503
- except asyncio.TimeoutError as exc:
504
- raise asyncio.TimeoutError(
510
+ except TimeoutError as exc:
511
+ raise TimeoutError(
505
512
  f"Timeout Error while waiting {iteration_timeout}s to update "
506
513
  f"{[signal.source for signal in signals]}. "
507
514
  f"Last observed signal and value were {last_item}"
@@ -536,8 +543,8 @@ class _ValueChecker(Generic[SignalDatatypeT]):
536
543
  ):
537
544
  try:
538
545
  await asyncio.wait_for(self._wait_for_value(signal), timeout)
539
- except asyncio.TimeoutError as e:
540
- raise asyncio.TimeoutError(
546
+ except TimeoutError as e:
547
+ raise TimeoutError(
541
548
  f"{signal.name} didn't match {self._matcher_name} in {timeout}s, "
542
549
  f"last value {self._last_value!r}"
543
550
  ) from e
@@ -635,8 +642,8 @@ async def set_and_wait_for_other_value(
635
642
  await asyncio.wait_for(_wait_for_value(), timeout)
636
643
  if wait_for_set_completion:
637
644
  await status
638
- except asyncio.TimeoutError as e:
639
- raise asyncio.TimeoutError(
645
+ except TimeoutError as e:
646
+ raise TimeoutError(
640
647
  f"{match_signal.name} value didn't match value from"
641
648
  f" {matcher.__name__}() in {timeout}s"
642
649
  ) from e
@@ -4,7 +4,7 @@ import asyncio
4
4
  import logging
5
5
  from collections.abc import Awaitable, Callable, Iterable, Mapping, Sequence
6
6
  from dataclasses import dataclass
7
- from enum import Enum, EnumMeta
7
+ from enum import Enum, EnumMeta, StrEnum
8
8
  from typing import (
9
9
  Any,
10
10
  Generic,
@@ -59,15 +59,15 @@ class AnyStringUppercaseNameEnumMeta(UppercaseNameEnumMeta):
59
59
  return super().__call__(value, *args, **kwargs)
60
60
 
61
61
 
62
- class StrictEnum(str, Enum, metaclass=UppercaseNameEnumMeta):
62
+ class StrictEnum(StrEnum, metaclass=UppercaseNameEnumMeta):
63
63
  """All members should exist in the Backend, and there will be no extras."""
64
64
 
65
65
 
66
- class SubsetEnum(str, Enum, metaclass=AnyStringUppercaseNameEnumMeta):
66
+ class SubsetEnum(StrEnum, metaclass=AnyStringUppercaseNameEnumMeta):
67
67
  """All members should exist in the Backend, but there may be extras."""
68
68
 
69
69
 
70
- class SupersetEnum(str, Enum, metaclass=UppercaseNameEnumMeta):
70
+ class SupersetEnum(StrEnum, metaclass=UppercaseNameEnumMeta):
71
71
  """Some members should exist in the Backend, and there should be no extras."""
72
72
 
73
73
 
@@ -243,6 +243,7 @@ def get_enum_cls(datatype: type | None) -> type[EnumTypes] | None:
243
243
  """
244
244
  if get_origin(datatype) is Sequence:
245
245
  datatype = get_args(datatype)[0]
246
+ datatype = get_origin_class(datatype)
246
247
  if datatype and issubclass(datatype, Enum):
247
248
  if not issubclass(datatype, EnumTypes):
248
249
  raise TypeError(
@@ -1,7 +1,6 @@
1
1
  from collections.abc import Sequence
2
2
 
3
- from ophyd_async.core import PathProvider
4
- from ophyd_async.core._signal import SignalR
3
+ from ophyd_async.core import PathProvider, SignalR
5
4
  from ophyd_async.epics import adcore
6
5
 
7
6
  from ._andor_controller import Andor2Controller
@@ -1,7 +1,6 @@
1
1
  from collections.abc import Sequence
2
2
 
3
- from ophyd_async.core import SignalR, StandardDetector
4
- from ophyd_async.core._providers import PathProvider
3
+ from ophyd_async.core import PathProvider, SignalR, StandardDetector
5
4
 
6
5
  from ._core_io import ADBaseIO, NDPluginBaseIO, NDPluginCBIO
7
6
  from ._core_logic import ADBaseContAcqController, ADBaseControllerT
@@ -229,7 +229,7 @@ class NDFileHDFIO(NDFilePluginIO):
229
229
  swmr_mode: A[SignalRW[bool], PvSuffix.rbv("SWMRMode")]
230
230
  flush_now: A[SignalRW[bool], PvSuffix("FlushNow")]
231
231
  xml_file_name: A[SignalRW[str], PvSuffix.rbv("XMLFileName")]
232
- num_frames_chunks: A[SignalR[int], PvSuffix("NumFramesChunks_RBV")]
232
+ num_frames_chunks: A[SignalRW[int], PvSuffix.rbv("NumFramesChunks")]
233
233
  chunk_size_auto: A[SignalRW[bool], PvSuffix.rbv("ChunkSizeAuto")]
234
234
  lazy_open: A[SignalRW[bool], PvSuffix.rbv("LazyOpen")]
235
235
 
@@ -130,7 +130,7 @@ class ADBaseController(DetectorController, Generic[ADBaseIOT]):
130
130
  ):
131
131
  if state in self.good_states:
132
132
  return
133
- except asyncio.TimeoutError as exc:
133
+ except TimeoutError as exc:
134
134
  if state is not None:
135
135
  raise ValueError(
136
136
  f"Final detector state {state.value} not in valid end "
@@ -138,7 +138,7 @@ class ADBaseController(DetectorController, Generic[ADBaseIOT]):
138
138
  ) from exc
139
139
  else:
140
140
  # No updates from the detector, something else is wrong
141
- raise asyncio.TimeoutError(
141
+ raise TimeoutError(
142
142
  "Could not monitor detector state: "
143
143
  + self.driver.detector_state.source
144
144
  ) from exc
@@ -11,15 +11,18 @@ from event_model import ( # type: ignore
11
11
  )
12
12
  from pydantic import PositiveInt
13
13
 
14
- from ophyd_async.core._detector import DetectorWriter
15
- from ophyd_async.core._enums import EnableDisable
16
- from ophyd_async.core._providers import DatasetDescriber, PathInfo, PathProvider
17
- from ophyd_async.core._signal import (
14
+ from ophyd_async.core import (
15
+ DEFAULT_TIMEOUT,
16
+ AsyncStatus,
17
+ DatasetDescriber,
18
+ DetectorWriter,
19
+ EnableDisable,
20
+ PathInfo,
21
+ PathProvider,
22
+ error_if_none,
18
23
  observe_value,
19
24
  set_and_wait_for_value,
20
25
  )
21
- from ophyd_async.core._status import AsyncStatus
22
- from ophyd_async.core._utils import DEFAULT_TIMEOUT, error_if_none
23
26
  from ophyd_async.epics.core import stop_busy_record
24
27
 
25
28
  # from ophyd_async.epics.adcore._core_logic import ADBaseDatasetDescriber
@@ -75,8 +75,13 @@ class ADHDFWriter(ADWriter[NDFileHDFIO]):
75
75
  # Used by the base class
76
76
  self._exposures_per_event = exposures_per_event
77
77
 
78
- # Determine number of frames that will be saved per HDF chunk
78
+ # Determine number of frames that will be saved per HDF chunk.
79
+ # On a fresh IOC startup, this is set to zero until the first capture,
80
+ # so if it is zero, set it to 1.
79
81
  frames_per_chunk = await self.fileio.num_frames_chunks.get_value()
82
+ if frames_per_chunk == 0:
83
+ frames_per_chunk = 1
84
+ await self.fileio.num_frames_chunks.set(frames_per_chunk)
80
85
 
81
86
  if not _is_fully_described(detector_shape):
82
87
  # Questions:
@@ -16,10 +16,10 @@ class KinetixTriggerMode(StrictEnum):
16
16
  class KinetixReadoutMode(StrictEnum):
17
17
  """Readout mode for ADKinetix detector."""
18
18
 
19
- SENSITIVITY = 1
20
- SPEED = 2
21
- DYNAMIC_RANGE = 3
22
- SUB_ELECTRON = 4
19
+ SENSITIVITY = "1"
20
+ SPEED = "2"
21
+ DYNAMIC_RANGE = "3"
22
+ SUB_ELECTRON = "4"
23
23
 
24
24
 
25
25
  class KinetixDriverIO(adcore.ADBaseIO):
@@ -1,11 +1,7 @@
1
1
  from collections.abc import Sequence
2
2
 
3
- from ophyd_async.core import PathProvider
4
- from ophyd_async.core._signal import SignalR
5
- from ophyd_async.epics.adcore._core_detector import AreaDetector
6
- from ophyd_async.epics.adcore._core_io import NDPluginBaseIO
7
- from ophyd_async.epics.adcore._core_writer import ADWriter
8
- from ophyd_async.epics.adcore._hdf_writer import ADHDFWriter
3
+ from ophyd_async.core import PathProvider, SignalR
4
+ from ophyd_async.epics.adcore import ADHDFWriter, ADWriter, AreaDetector, NDPluginBaseIO
9
5
 
10
6
  from ._pilatus_controller import PilatusController, PilatusReadoutTime
11
7
  from ._pilatus_io import PilatusDriverIO