ophyd-async 0.13.5__tar.gz → 0.13.6__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 (327) hide show
  1. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.copier-answers.yml +1 -1
  2. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.devcontainer/devcontainer.json +15 -16
  3. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.github/CONTRIBUTING.md +1 -1
  4. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.github/workflows/_dist.yml +2 -2
  5. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.github/workflows/_docs.yml +2 -2
  6. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.github/workflows/_pypi.yml +1 -1
  7. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.github/workflows/_release.yml +2 -2
  8. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.github/workflows/_test.yml +2 -2
  9. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.github/workflows/_tox.yml +2 -2
  10. {ophyd_async-0.13.5/src/ophyd_async.egg-info → ophyd_async-0.13.6}/PKG-INFO +1 -1
  11. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/_version.py +3 -3
  12. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_mock_signal_backend.py +7 -3
  13. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/pmac/_pmac_trajectory_generation.py +3 -0
  14. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/panda/_block.py +10 -9
  15. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/testing/_mock_signal_utils.py +5 -2
  16. {ophyd_async-0.13.5 → ophyd_async-0.13.6/src/ophyd_async.egg-info}/PKG-INFO +1 -1
  17. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_mock_signal_backend.py +46 -0
  18. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_signal.py +10 -0
  19. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/pmac/test_pmac_trajectory.py +8 -7
  20. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/pmac/test_pmac_trajectory_generation.py +111 -73
  21. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/fastcs/panda/db/panda.db +13 -0
  22. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/fastcs/panda/test_panda_utils.py +2 -0
  23. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/uv.lock +200 -189
  24. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.codecov.yml +0 -0
  25. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.git-blame-ignore-revs +0 -0
  26. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  27. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.github/ISSUE_TEMPLATE/issue.md +0 -0
  28. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -0
  29. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.github/codeql/codeql-config.yml +0 -0
  30. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.github/pages/index.html +0 -0
  31. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.github/pages/make_switcher.py +0 -0
  32. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.github/renovate.json +0 -0
  33. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.github/workflows/_codeql.yml +0 -0
  34. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.github/workflows/ci.yml +0 -0
  35. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.github/workflows/periodic.yml +0 -0
  36. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.gitignore +0 -0
  37. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.gitleaks.toml +0 -0
  38. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.gitmodules +0 -0
  39. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.pre-commit-config.yaml +0 -0
  40. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/.python-version +0 -0
  41. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/Dockerfile +0 -0
  42. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/LICENSE +0 -0
  43. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/README.md +0 -0
  44. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/_static/custom.css +0 -0
  45. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/conf.py +0 -0
  46. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
  47. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
  48. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/decisions/0003-ophyd-async-migration.rst +0 -0
  49. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/decisions/0004-repository-structure.rst +0 -0
  50. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/decisions/0005-respect-black-line-length.rst +0 -0
  51. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/decisions/0006-procedural-device-definitions.rst +0 -0
  52. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/decisions/0007-subpackage-structure.md +0 -0
  53. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/decisions/0008-signal-types.md +0 -0
  54. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/decisions/0009-procedural-vs-declarative-devices.md +0 -0
  55. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/decisions/0010-docstring-format.md +0 -0
  56. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/decisions/0011-buffer-updates-camonitor.md +0 -0
  57. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/decisions/COPYME +0 -0
  58. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/decisions.md +0 -0
  59. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/declarative-vs-procedural.md +0 -0
  60. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/design-goals.md +0 -0
  61. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/device-connection-strategies.md +0 -0
  62. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/devices-signals-backends.md +0 -0
  63. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/fly-scanning.md +0 -0
  64. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/plan-stubs.md +0 -0
  65. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/when-to-extend-movable.md +0 -0
  66. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations/where-device-logic.md +0 -0
  67. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/explanations.md +0 -0
  68. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/genindex.rst +0 -0
  69. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/how-to/choose-right-baseclass.md +0 -0
  70. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/how-to/contribute.md +0 -0
  71. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/how-to/derive-one-signal-from-others.md +0 -0
  72. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/how-to/implement-ad-detector.md +0 -0
  73. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/how-to/interact-with-signals.md +0 -0
  74. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/how-to/put-device-back.md +0 -0
  75. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/how-to/store-and-retrieve.md +0 -0
  76. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/how-to.md +0 -0
  77. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/images/fly_scan_collection_windows_and_frames.svg +0 -0
  78. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/images/ophyd-async-logo.svg +0 -0
  79. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/images/ophyd-favicon.svg +0 -0
  80. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/images/set_and_wait_for_other_value.excalidraw.svg +0 -0
  81. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/index.md +0 -0
  82. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/reference.md +0 -0
  83. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/tutorials/implementing-detectors.md +0 -0
  84. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/tutorials/implementing-devices.md +0 -0
  85. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/tutorials/installation.md +0 -0
  86. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/tutorials/using-devices.md +0 -0
  87. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/tutorials/writing-tests-for-devices.md +0 -0
  88. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/docs/tutorials.md +0 -0
  89. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/pyproject.toml +0 -0
  90. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/setup.cfg +0 -0
  91. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/__init__.py +0 -0
  92. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/__main__.py +0 -0
  93. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/_docs_parser.py +0 -0
  94. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/__init__.py +0 -0
  95. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_derived_signal.py +0 -0
  96. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_derived_signal_backend.py +0 -0
  97. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_detector.py +0 -0
  98. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_device.py +0 -0
  99. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_device_filler.py +0 -0
  100. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_enums.py +0 -0
  101. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_flyer.py +0 -0
  102. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_hdf_dataset.py +0 -0
  103. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_log.py +0 -0
  104. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_protocol.py +0 -0
  105. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_providers.py +0 -0
  106. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_readable.py +0 -0
  107. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_settings.py +0 -0
  108. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_signal.py +0 -0
  109. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_signal_backend.py +0 -0
  110. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_soft_signal_backend.py +0 -0
  111. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_status.py +0 -0
  112. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_table.py +0 -0
  113. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_utils.py +0 -0
  114. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/core/_yaml_settings.py +0 -0
  115. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/__init__.py +0 -0
  116. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adandor/__init__.py +0 -0
  117. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adandor/_andor.py +0 -0
  118. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adandor/_andor_controller.py +0 -0
  119. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adandor/_andor_io.py +0 -0
  120. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adaravis/__init__.py +0 -0
  121. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adaravis/_aravis.py +0 -0
  122. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adaravis/_aravis_controller.py +0 -0
  123. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adaravis/_aravis_io.py +0 -0
  124. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adcore/__init__.py +0 -0
  125. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adcore/_core_detector.py +0 -0
  126. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adcore/_core_io.py +0 -0
  127. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adcore/_core_logic.py +0 -0
  128. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adcore/_core_writer.py +0 -0
  129. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adcore/_hdf_writer.py +0 -0
  130. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adcore/_jpeg_writer.py +0 -0
  131. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adcore/_single_trigger.py +0 -0
  132. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adcore/_tiff_writer.py +0 -0
  133. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adcore/_utils.py +0 -0
  134. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adkinetix/__init__.py +0 -0
  135. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adkinetix/_kinetix.py +0 -0
  136. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adkinetix/_kinetix_controller.py +0 -0
  137. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adkinetix/_kinetix_io.py +0 -0
  138. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adpilatus/__init__.py +0 -0
  139. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adpilatus/_pilatus.py +0 -0
  140. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adpilatus/_pilatus_controller.py +0 -0
  141. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adpilatus/_pilatus_io.py +0 -0
  142. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adsimdetector/__init__.py +0 -0
  143. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adsimdetector/_sim.py +0 -0
  144. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adsimdetector/_sim_controller.py +0 -0
  145. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/adsimdetector/_sim_io.py +0 -0
  146. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/advimba/__init__.py +0 -0
  147. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/advimba/_vimba.py +0 -0
  148. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/advimba/_vimba_controller.py +0 -0
  149. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/advimba/_vimba_io.py +0 -0
  150. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/core/__init__.py +0 -0
  151. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/core/_aioca.py +0 -0
  152. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/core/_epics_connector.py +0 -0
  153. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/core/_epics_device.py +0 -0
  154. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/core/_p4p.py +0 -0
  155. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/core/_pvi_connector.py +0 -0
  156. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/core/_signal.py +0 -0
  157. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/core/_util.py +0 -0
  158. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/demo/__init__.py +0 -0
  159. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/demo/__main__.py +0 -0
  160. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/demo/_ioc.py +0 -0
  161. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/demo/_motor.py +0 -0
  162. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/demo/_point_detector.py +0 -0
  163. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/demo/_point_detector_channel.py +0 -0
  164. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/demo/_stage.py +0 -0
  165. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/demo/motor.db +0 -0
  166. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/demo/point_detector.db +0 -0
  167. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/demo/point_detector_channel.db +0 -0
  168. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/motor.py +0 -0
  169. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/odin/__init__.py +0 -0
  170. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/odin/_odin_io.py +0 -0
  171. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/pmac/__init__.py +0 -0
  172. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/pmac/_pmac_io.py +0 -0
  173. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/pmac/_pmac_trajectory.py +0 -0
  174. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/pmac/_utils.py +0 -0
  175. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/signal.py +0 -0
  176. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/testing/__init__.py +0 -0
  177. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/testing/_example_ioc.py +0 -0
  178. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/testing/_utils.py +0 -0
  179. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/testing/test_records.db +0 -0
  180. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/epics/testing/test_records_pva.db +0 -0
  181. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/__init__.py +0 -0
  182. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/core.py +0 -0
  183. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/eiger/__init__.py +0 -0
  184. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/eiger/_eiger.py +0 -0
  185. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/eiger/_eiger_controller.py +0 -0
  186. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/eiger/_eiger_io.py +0 -0
  187. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/jungfrau/__init__.py +0 -0
  188. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/jungfrau/_controller.py +0 -0
  189. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/jungfrau/_jungfrau.py +0 -0
  190. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/jungfrau/_signals.py +0 -0
  191. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/jungfrau/_utils.py +0 -0
  192. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/odin/__init__.py +0 -0
  193. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/panda/__init__.py +0 -0
  194. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/panda/_control.py +0 -0
  195. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/panda/_hdf_panda.py +0 -0
  196. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/panda/_table.py +0 -0
  197. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/panda/_trigger.py +0 -0
  198. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/fastcs/panda/_writer.py +0 -0
  199. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/plan_stubs/__init__.py +0 -0
  200. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/plan_stubs/_ensure_connected.py +0 -0
  201. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/plan_stubs/_fly.py +0 -0
  202. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/plan_stubs/_nd_attributes.py +0 -0
  203. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/plan_stubs/_panda.py +0 -0
  204. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/plan_stubs/_settings.py +0 -0
  205. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/plan_stubs/_utils.py +0 -0
  206. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/plan_stubs/_wait_for_awaitable.py +0 -0
  207. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/py.typed +0 -0
  208. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/sim/__init__.py +0 -0
  209. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/sim/__main__.py +0 -0
  210. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/sim/_blob_detector.py +0 -0
  211. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/sim/_blob_detector_controller.py +0 -0
  212. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/sim/_blob_detector_writer.py +0 -0
  213. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/sim/_mirror_horizontal.py +0 -0
  214. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/sim/_mirror_vertical.py +0 -0
  215. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/sim/_motor.py +0 -0
  216. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/sim/_pattern_generator.py +0 -0
  217. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/sim/_point_detector.py +0 -0
  218. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/sim/_stage.py +0 -0
  219. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/tango/__init__.py +0 -0
  220. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/tango/core/__init__.py +0 -0
  221. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/tango/core/_base_device.py +0 -0
  222. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/tango/core/_converters.py +0 -0
  223. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/tango/core/_signal.py +0 -0
  224. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/tango/core/_tango_readable.py +0 -0
  225. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/tango/core/_tango_transport.py +0 -0
  226. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/tango/core/_utils.py +0 -0
  227. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/tango/demo/__init__.py +0 -0
  228. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/tango/demo/_counter.py +0 -0
  229. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/tango/demo/_detector.py +0 -0
  230. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/tango/demo/_mover.py +0 -0
  231. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/tango/demo/_tango/__init__.py +0 -0
  232. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/tango/demo/_tango/_servers.py +0 -0
  233. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/tango/testing/__init__.py +0 -0
  234. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/tango/testing/_one_of_everything.py +0 -0
  235. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/tango/testing/_test_config.py +0 -0
  236. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/testing/__init__.py +0 -0
  237. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/testing/__pytest_assert_rewrite.py +0 -0
  238. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/testing/_assert.py +0 -0
  239. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/testing/_one_of_everything.py +0 -0
  240. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/testing/_single_derived.py +0 -0
  241. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/testing/_utils.py +0 -0
  242. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async/testing/_wait_for_pending.py +0 -0
  243. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async.egg-info/SOURCES.txt +0 -0
  244. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async.egg-info/dependency_links.txt +0 -0
  245. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async.egg-info/requires.txt +0 -0
  246. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/src/ophyd_async.egg-info/top_level.txt +0 -0
  247. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/README.md +0 -0
  248. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/conftest.py +0 -0
  249. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/system_tests/epics/adsim/baseline.yaml +0 -0
  250. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/system_tests/epics/adsim/start_iocs.sh +0 -0
  251. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/system_tests/epics/adsim/stop_iocs.sh +0 -0
  252. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/system_tests/epics/adsim/test_adsim_system.py +0 -0
  253. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/system_tests/epics/eiger/README.md +0 -0
  254. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/system_tests/epics/eiger/start_iocs_and_run_tests.sh +0 -0
  255. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/system_tests/epics/eiger/test_eiger_system.py +0 -0
  256. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/system_tests/epics/signal/test_signals.py +0 -0
  257. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/system_tests/epics/signal/test_yaml_save_ca.yaml +0 -0
  258. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/system_tests/epics/signal/test_yaml_save_pva.yaml +0 -0
  259. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/system_tests/fastcs/panda/test_panda_connect.py +0 -0
  260. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/system_tests/tango/conftest.py +0 -0
  261. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/system_tests/tango/context_subprocess.py +0 -0
  262. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/system_tests/tango/test_base_device.py +0 -0
  263. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/system_tests/tango/test_tango_signals.py +0 -0
  264. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/system_tests/tango/test_tango_transport.py +0 -0
  265. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/system_tests/test_tutorials.py +0 -0
  266. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_auto_init_devices.py +0 -0
  267. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_detector.py +0 -0
  268. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_device.py +0 -0
  269. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_flyer.py +0 -0
  270. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_log.py +0 -0
  271. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_multi_derived_signal.py +0 -0
  272. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_observe.py +0 -0
  273. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_protocol.py +0 -0
  274. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_providers.py +0 -0
  275. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_readable.py +0 -0
  276. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_single_derived_signal.py +0 -0
  277. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_soft_signal_backend.py +0 -0
  278. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_status.py +0 -0
  279. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_subset_enum.py +0 -0
  280. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_table.py +0 -0
  281. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_utils.py +0 -0
  282. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/core/test_watchable_async_status.py +0 -0
  283. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/adandor/test_andor.py +0 -0
  284. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/adaravis/test_aravis.py +0 -0
  285. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/adcore/test_cont_acq_detector.py +0 -0
  286. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/adcore/test_detectors.py +0 -0
  287. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/adcore/test_drivers.py +0 -0
  288. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/adcore/test_plugins.py +0 -0
  289. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/adcore/test_scans.py +0 -0
  290. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/adcore/test_single_trigger.py +0 -0
  291. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/adcore/test_writers.py +0 -0
  292. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/adkinetix/test_kinetix.py +0 -0
  293. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/adpilatus/test_pilatus.py +0 -0
  294. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/adsimdetector/test_sim.py +0 -0
  295. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/advimba/test_vimba.py +0 -0
  296. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/conftest.py +0 -0
  297. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/demo/test_epics_demo.py +0 -0
  298. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/eiger/test_odin_io.py +0 -0
  299. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/pmac/conftest.py +0 -0
  300. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/pmac/test_pmac_io.py +0 -0
  301. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/pmac/test_pmac_utils.py +0 -0
  302. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/pvi/test_pvi.py +0 -0
  303. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/signal/test_common.py +0 -0
  304. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/test_areadetector_subclass_naming.py +0 -0
  305. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/epics/test_motor.py +0 -0
  306. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/fastcs/eiger/test_eiger_controller.py +0 -0
  307. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/fastcs/eiger/test_eiger_detector.py +0 -0
  308. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/fastcs/jungfrau/__init__.py +0 -0
  309. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/fastcs/jungfrau/test_controller.py +0 -0
  310. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/fastcs/jungfrau/test_utils.py +0 -0
  311. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/fastcs/panda/test_hdf_panda.py +0 -0
  312. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/fastcs/panda/test_panda_connect_mock.py +0 -0
  313. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/fastcs/panda/test_panda_control.py +0 -0
  314. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/fastcs/panda/test_seq_table.py +0 -0
  315. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/fastcs/panda/test_trigger.py +0 -0
  316. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/fastcs/panda/test_writer.py +0 -0
  317. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/plan_stubs/test_ensure_connected.py +0 -0
  318. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/plan_stubs/test_fly.py +0 -0
  319. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/plan_stubs/test_settings.py +0 -0
  320. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/plan_stubs/test_setup.py +0 -0
  321. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/sim/__init__.py +0 -0
  322. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/sim/test_sim_blob_detector.py +0 -0
  323. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/sim/test_sim_motor.py +0 -0
  324. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/test_branching.py +0 -0
  325. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/test_cli.py +0 -0
  326. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/tests/unit_tests/test_data/test_yaml_config_save.yaml +0 -0
  327. {ophyd_async-0.13.5 → ophyd_async-0.13.6}/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: 5.0.0a3
2
+ _commit: 5.0.0a4
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
@@ -8,16 +8,22 @@
8
8
  "remoteEnv": {
9
9
  // Allow X11 apps to run inside the container
10
10
  "DISPLAY": "${localEnv:DISPLAY}",
11
+ // Put things that allow it in the persistent cache
12
+ "PRE_COMMIT_HOME": "/cache/pre-commit",
13
+ "UV_CACHE_DIR": "/cache/uv",
14
+ "UV_PYTHON_CACHE_DIR": "/cache/uv-python",
15
+ // Make a venv that is specific for this workspace path as the cache is shared
16
+ "UV_PROJECT_ENVIRONMENT": "/cache/venv-for${localWorkspaceFolder}",
11
17
  // 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}"
18
+ "VIRTUAL_ENV": "/cache/venv-for${localWorkspaceFolder}",
19
+ "PATH": "/cache/venv-for${localWorkspaceFolder}/bin:${containerEnv:PATH}"
14
20
  },
15
21
  "customizations": {
16
22
  "vscode": {
17
23
  // Set *default* container specific settings.json values on container create.
18
24
  "settings": {
19
25
  // Use the container's python by default
20
- "python.defaultInterpreterPath": "/workspaces/${localWorkspaceFolderBasename}/.venv/bin/python",
26
+ "python.defaultInterpreterPath": "/cache/venv-for${localWorkspaceFolder}/bin/python",
21
27
  // Don't activate the venv as it is already in the PATH
22
28
  "python.terminal.activateEnvInCurrentTerminal": false,
23
29
  "python.terminal.activateEnvironment": false,
@@ -47,9 +53,7 @@
47
53
  }
48
54
  },
49
55
  // 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",
56
+ "initializeCommand": "mkdir -p ${localEnv:HOME}/.config/terminal-config",
53
57
  "runArgs": [
54
58
  // Allow the container to access the host X11 display and EPICS CA
55
59
  "--net=host",
@@ -63,20 +67,15 @@
63
67
  "target": "/user-terminal-config",
64
68
  "type": "bind"
65
69
  },
66
- // Keep a persistent cross container cache for uv
70
+ // Keep a persistent cross container cache for uv, pre-commit, and the venvs
67
71
  {
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",
72
+ "source": "devcontainer-shared-cache",
73
+ "target": "/cache",
75
74
  "type": "volume"
76
75
  }
77
76
  ],
78
77
  // Mount the parent as /workspaces so we can pip install peers as editable
79
78
  "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"
79
+ // After the container is created, recreate the venv then make pre-commit first run faster
80
+ "postCreateCommand": "uv venv --clear && uv sync && pre-commit install --install-hooks"
82
81
  }
@@ -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/5.0.0a3/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.0a4/how-to.html).
@@ -7,13 +7,13 @@ jobs:
7
7
 
8
8
  steps:
9
9
  - name: Checkout
10
- uses: actions/checkout@v4
10
+ uses: actions/checkout@v5
11
11
  with:
12
12
  # Need this to get version number from last tag
13
13
  fetch-depth: 0
14
14
 
15
15
  - name: Install uv
16
- uses: astral-sh/setup-uv@v6
16
+ uses: astral-sh/setup-uv@v7
17
17
 
18
18
  - name: Build sdist and wheel
19
19
  run: >
@@ -12,7 +12,7 @@ jobs:
12
12
  run: sleep 60
13
13
 
14
14
  - name: Checkout
15
- uses: actions/checkout@v4
15
+ uses: actions/checkout@v5
16
16
  with:
17
17
  # Need this to get version number from last tag
18
18
  fetch-depth: 0
@@ -21,7 +21,7 @@ jobs:
21
21
  run: sudo apt-get install graphviz
22
22
 
23
23
  - name: Install uv
24
- uses: astral-sh/setup-uv@v5
24
+ uses: astral-sh/setup-uv@v7
25
25
 
26
26
  - name: Build docs
27
27
  run: uv run --locked tox -e docs
@@ -8,7 +8,7 @@ jobs:
8
8
 
9
9
  steps:
10
10
  - name: Download dist artifact
11
- uses: actions/download-artifact@v4
11
+ uses: actions/download-artifact@v5
12
12
  with:
13
13
  name: dist
14
14
  path: dist
@@ -7,7 +7,7 @@ jobs:
7
7
 
8
8
  steps:
9
9
  - name: Download artifacts
10
- uses: actions/download-artifact@v4
10
+ uses: actions/download-artifact@v5
11
11
  with:
12
12
  merge-multiple: true
13
13
 
@@ -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@da05d552573ad5aba039eaac05058a918a7bf631 # v2.2.2
26
+ uses: softprops/action-gh-release@6da8fa9354ddfdc4aeace5fc48d7f679b5214090 # v2.4.1
27
27
  with:
28
28
  prerelease: ${{ contains(github.ref_name, 'a') || contains(github.ref_name, 'b') || contains(github.ref_name, 'rc') }}
29
29
  files: "*"
@@ -35,7 +35,7 @@ jobs:
35
35
 
36
36
  steps:
37
37
  - name: Checkout repository (with submodules)
38
- uses: actions/checkout@v4
38
+ uses: actions/checkout@v5
39
39
  with:
40
40
  submodules: recursive
41
41
  fetch-depth: 0
@@ -47,7 +47,7 @@ jobs:
47
47
  echo "TEMP=D:\\Temp" >> $env:GITHUB_ENV
48
48
 
49
49
  - name: Install uv
50
- uses: astral-sh/setup-uv@v5
50
+ uses: astral-sh/setup-uv@v7
51
51
 
52
52
  - if: inputs.needs-services && inputs.runs-on != 'windows-latest'
53
53
  name: Run docker compose
@@ -13,10 +13,10 @@ jobs:
13
13
 
14
14
  steps:
15
15
  - name: Checkout
16
- uses: actions/checkout@v4
16
+ uses: actions/checkout@v5
17
17
 
18
18
  - name: Install uv
19
- uses: astral-sh/setup-uv@v5
19
+ uses: astral-sh/setup-uv@v7
20
20
 
21
21
  - name: Run tox
22
22
  run: uv run --locked tox -e ${{ inputs.tox }}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ophyd-async
3
- Version: 0.13.5
3
+ Version: 0.13.6
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
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.13.5'
32
- __version_tuple__ = version_tuple = (0, 13, 5)
31
+ __version__ = version = '0.13.6'
32
+ __version_tuple__ = version_tuple = (0, 13, 6)
33
33
 
34
- __commit_id__ = commit_id = 'gbb7c98987'
34
+ __commit_id__ = commit_id = 'g13f67ee23'
@@ -41,7 +41,9 @@ class MockSignalBackend(SignalBackend[SignalDatatypeT]):
41
41
  @cached_property
42
42
  def put_mock(self) -> AsyncMock:
43
43
  """Return the mock that will track calls to `put()`."""
44
- put_mock = AsyncMock(name="put", spec=Callable)
44
+ put_mock = AsyncMock(
45
+ name="put", spec=Callable, side_effect=lambda *_, **__: None
46
+ )
45
47
  self.mock().attach_mock(put_mock, "put")
46
48
  return put_mock
47
49
 
@@ -66,8 +68,10 @@ class MockSignalBackend(SignalBackend[SignalDatatypeT]):
66
68
  return put_proceeds
67
69
 
68
70
  async def put(self, value: SignalDatatypeT | None, wait: bool):
69
- await self.put_mock(value, wait=wait)
70
- await self.soft_backend.put(value, wait=wait)
71
+ new_value = await self.put_mock(value, wait=wait)
72
+ if new_value is None:
73
+ new_value = value
74
+ await self.soft_backend.put(new_value, wait=wait)
71
75
  if wait:
72
76
  await self.put_proceeds.wait()
73
77
 
@@ -558,6 +558,9 @@ def _get_velocity_profile(
558
558
  # Check if all profiles have converged on min_time
559
559
  if np.isclose(new_min_time, min_time):
560
560
  for motor in motors:
561
+ # MIN_INTERVAL should be less than our convergence tolerance
562
+ # such that motors snap to the same point in the time grid
563
+ profiles[motor].quantize()
561
564
  time_arrays[motor], velocity_arrays[motor] = profiles[
562
565
  motor
563
566
  ].make_arrays()
@@ -34,15 +34,6 @@ class DataBlock(Device):
34
34
  datasets: SignalR[DatasetTable]
35
35
 
36
36
 
37
- class PulseBlock(Device):
38
- """Used for configuring pulses in the PandA."""
39
-
40
- delay: SignalRW[float]
41
- pulses: SignalRW[int]
42
- step: SignalRW[float]
43
- width: SignalRW[float]
44
-
45
-
46
37
  class PandaPcompDirection(StrictEnum):
47
38
  """Direction options for position compare in the PandA."""
48
39
 
@@ -64,6 +55,16 @@ class PandaPosMux(SubsetEnum):
64
55
  ZERO = "ZERO"
65
56
 
66
57
 
58
+ class PulseBlock(Device):
59
+ """Used for configuring pulses in the PandA."""
60
+
61
+ enable: SignalRW[PandaBitMux]
62
+ delay: SignalRW[float]
63
+ pulses: SignalRW[int]
64
+ step: SignalRW[float]
65
+ width: SignalRW[float]
66
+
67
+
67
68
  class PcompBlock(Device):
68
69
  """Position compare block in the PandA."""
69
70
 
@@ -119,14 +119,17 @@ def _unset_side_effect_cm(put_mock: AsyncMock):
119
119
 
120
120
  def callback_on_mock_put(
121
121
  signal: Signal[SignalDatatypeT],
122
- callback: Callable[[SignalDatatypeT, bool], None]
123
- | Callable[[SignalDatatypeT, bool], Awaitable[None]],
122
+ callback: Callable[[SignalDatatypeT, bool], SignalDatatypeT | None]
123
+ | Callable[[SignalDatatypeT, bool], Awaitable[SignalDatatypeT | None]],
124
124
  ):
125
125
  """For setting a callback when a backend is put to.
126
126
 
127
127
  Can either be used in a context, with the callback being unset on exit, or
128
128
  as an ordinary function.
129
129
 
130
+ The value that the callback returns (if not None) will be set to the signal
131
+ readback. If None is returned then the readback will be set to the setpoint.
132
+
130
133
  :param signal: A signal with a `MockSignalBackend` backend.
131
134
  :param callback: The callback to call when the backend is put to during the
132
135
  context.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ophyd-async
3
- Version: 0.13.5
3
+ Version: 0.13.6
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
@@ -406,3 +406,49 @@ async def test_when_put_mock_called_with_typo_then_fails_but_calling_directly_pa
406
406
  with pytest.raises(AttributeError):
407
407
  mock.asssert_called_once() # Note typo here is deliberate!
408
408
  await mock()
409
+
410
+
411
+ async def test_when_callback_on_mock_put_returns_a_value_the_readback_is_set():
412
+ mock_signal = SignalRW(SoftSignalBackend(int))
413
+ await mock_signal.connect(mock=True)
414
+
415
+ callback_on_mock_put(mock_signal, lambda *_, **__: 2)
416
+
417
+ await mock_signal.set(5)
418
+ assert (await mock_signal.get_value()) == 2
419
+
420
+
421
+ async def test_when_callback_on_mock_put_returns_none_then_readback_is_the_setpoint():
422
+ mock_signal = SignalRW(SoftSignalBackend(int))
423
+ await mock_signal.connect(mock=True)
424
+
425
+ callback_on_mock_put(mock_signal, lambda *_, **__: None)
426
+
427
+ await mock_signal.set(5)
428
+ assert (await mock_signal.get_value()) == 5
429
+
430
+
431
+ async def test_when_async_callback_returns_a_value_the_readback_is_set():
432
+ mock_signal = SignalRW(SoftSignalBackend(int))
433
+ await mock_signal.connect(mock=True)
434
+
435
+ async def async_callback(*_, **__):
436
+ return 2
437
+
438
+ callback_on_mock_put(mock_signal, async_callback)
439
+
440
+ await mock_signal.set(5)
441
+ assert (await mock_signal.get_value()) == 2
442
+
443
+
444
+ async def test_when_async_callback_returns_none_then_readback_is_the_setpoint():
445
+ mock_signal = SignalRW(SoftSignalBackend(int))
446
+ await mock_signal.connect(mock=True)
447
+
448
+ async def async_callback(*_, **__):
449
+ return None
450
+
451
+ callback_on_mock_put(mock_signal, async_callback)
452
+
453
+ await mock_signal.set(5)
454
+ assert (await mock_signal.get_value()) == 5
@@ -163,6 +163,16 @@ async def test_set_and_wait_for_value_same_set_as_read():
163
163
  assert await signal.get_value() == 1
164
164
 
165
165
 
166
+ async def test_set_and_wait_for_value_same_set_and_read_times_out():
167
+ signal = epics_signal_rw(int, "pva://pv", name="signal")
168
+ await signal.connect(mock=True)
169
+ assert await signal.get_value() == 0
170
+ callback_on_mock_put(signal, lambda v, _: v + 2)
171
+
172
+ with pytest.raises(asyncio.TimeoutError):
173
+ await set_and_wait_for_value(signal, 1, timeout=0.1)
174
+
175
+
166
176
  async def test_set_and_wait_for_value_different_set_and_read():
167
177
  set_signal = epics_signal_rw(int, "pva://set", name="set-signal")
168
178
  match_signal = epics_signal_r(str, "pva://read", name="match-signal")
@@ -126,16 +126,17 @@ async def test_pmac_trajectory_kickoff(
126
126
  1.0,
127
127
  1.0,
128
128
  1.0,
129
- 1.4,
129
+ 1.395,
130
130
  3.0,
131
- 4.6,
131
+ 4.605,
132
132
  5.0,
133
133
  5.0,
134
134
  5.0,
135
135
  5.0,
136
136
  5.0,
137
137
  5.0,
138
- ]
138
+ ],
139
+ 1e-3,
139
140
  )
140
141
 
141
142
  sim_y_motor_velocity_arrays = [
@@ -173,9 +174,9 @@ async def test_pmac_trajectory_kickoff(
173
174
  0.0,
174
175
  0.0,
175
176
  0.0,
176
- 4.0,
177
- 8.9442,
178
- 4.0,
177
+ 3.951,
178
+ 8.888,
179
+ 3.951,
179
180
  0.0,
180
181
  0.0,
181
182
  0.0,
@@ -183,7 +184,7 @@ async def test_pmac_trajectory_kickoff(
183
184
  0.0,
184
185
  0.0,
185
186
  ],
186
- 1e-5,
187
+ 1e-3,
187
188
  )
188
189
 
189
190