ophyd-async 0.13.5__tar.gz → 0.13.7__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 (332) hide show
  1. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.copier-answers.yml +1 -1
  2. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.devcontainer/devcontainer.json +30 -15
  3. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/CONTRIBUTING.md +1 -1
  4. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/_dist.yml +2 -2
  5. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/_docs.yml +2 -2
  6. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/_pypi.yml +1 -1
  7. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/_release.yml +2 -2
  8. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/_test.yml +3 -15
  9. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/_tox.yml +2 -2
  10. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/ci.yml +2 -7
  11. ophyd_async-0.13.7/Dockerfile +25 -0
  12. {ophyd_async-0.13.5/src/ophyd_async.egg-info → ophyd_async-0.13.7}/PKG-INFO +1 -1
  13. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/conf.py +0 -1
  14. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/_version.py +3 -3
  15. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_mock_signal_backend.py +7 -3
  16. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_signal.py +2 -1
  17. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/motor.py +18 -3
  18. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/pmac/_pmac_io.py +10 -13
  19. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/pmac/_pmac_trajectory.py +9 -10
  20. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/pmac/_pmac_trajectory_generation.py +3 -0
  21. ophyd_async-0.13.7/src/ophyd_async/epics/pmac/_utils.py +210 -0
  22. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/panda/_block.py +10 -9
  23. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/core/__init__.py +0 -2
  24. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/core/_base_device.py +4 -1
  25. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/demo/_counter.py +10 -3
  26. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/demo/_mover.py +4 -3
  27. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/testing/_mock_signal_utils.py +5 -2
  28. {ophyd_async-0.13.5 → ophyd_async-0.13.7/src/ophyd_async.egg-info}/PKG-INFO +1 -1
  29. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async.egg-info/SOURCES.txt +2 -3
  30. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/conftest.py +160 -0
  31. ophyd_async-0.13.7/tests/system_tests/conftest.py +11 -0
  32. ophyd_async-0.13.7/tests/system_tests/epics/adsim/external_dependencies.sh +32 -0
  33. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/epics/adsim/test_adsim_system.py +20 -4
  34. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/tango/test_base_device.py +5 -4
  35. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/tango/test_tango_signals.py +1 -0
  36. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_mock_signal_backend.py +46 -0
  37. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_signal.py +41 -0
  38. ophyd_async-0.13.7/tests/unit_tests/epics/pmac/conftest.py +93 -0
  39. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/pmac/test_pmac_trajectory.py +9 -8
  40. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/pmac/test_pmac_trajectory_generation.py +111 -73
  41. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/pmac/test_pmac_utils.py +39 -4
  42. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/test_motor.py +6 -2
  43. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/panda/db/panda.db +13 -0
  44. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/panda/test_panda_utils.py +2 -0
  45. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/uv.lock +200 -189
  46. ophyd_async-0.13.5/Dockerfile +0 -10
  47. ophyd_async-0.13.5/src/ophyd_async/epics/pmac/_utils.py +0 -167
  48. ophyd_async-0.13.5/src/ophyd_async/tango/core/_tango_readable.py +0 -15
  49. ophyd_async-0.13.5/tests/system_tests/epics/adsim/start_iocs.sh +0 -14
  50. ophyd_async-0.13.5/tests/system_tests/epics/adsim/stop_iocs.sh +0 -14
  51. ophyd_async-0.13.5/tests/unit_tests/epics/pmac/conftest.py +0 -34
  52. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.codecov.yml +0 -0
  53. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.git-blame-ignore-revs +0 -0
  54. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  55. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/ISSUE_TEMPLATE/issue.md +0 -0
  56. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -0
  57. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/codeql/codeql-config.yml +0 -0
  58. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/pages/index.html +0 -0
  59. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/pages/make_switcher.py +0 -0
  60. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/renovate.json +0 -0
  61. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/_codeql.yml +0 -0
  62. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/periodic.yml +0 -0
  63. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.gitignore +0 -0
  64. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.gitleaks.toml +0 -0
  65. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.gitmodules +0 -0
  66. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.pre-commit-config.yaml +0 -0
  67. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.python-version +0 -0
  68. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/LICENSE +0 -0
  69. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/README.md +0 -0
  70. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/_static/custom.css +0 -0
  71. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
  72. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
  73. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0003-ophyd-async-migration.rst +0 -0
  74. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0004-repository-structure.rst +0 -0
  75. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0005-respect-black-line-length.rst +0 -0
  76. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0006-procedural-device-definitions.rst +0 -0
  77. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0007-subpackage-structure.md +0 -0
  78. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0008-signal-types.md +0 -0
  79. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0009-procedural-vs-declarative-devices.md +0 -0
  80. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0010-docstring-format.md +0 -0
  81. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0011-buffer-updates-camonitor.md +0 -0
  82. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/COPYME +0 -0
  83. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions.md +0 -0
  84. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/declarative-vs-procedural.md +0 -0
  85. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/design-goals.md +0 -0
  86. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/device-connection-strategies.md +0 -0
  87. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/devices-signals-backends.md +0 -0
  88. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/fly-scanning.md +0 -0
  89. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/plan-stubs.md +0 -0
  90. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/when-to-extend-movable.md +0 -0
  91. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/where-device-logic.md +0 -0
  92. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations.md +0 -0
  93. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/genindex.rst +0 -0
  94. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/how-to/choose-right-baseclass.md +0 -0
  95. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/how-to/contribute.md +0 -0
  96. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/how-to/derive-one-signal-from-others.md +0 -0
  97. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/how-to/implement-ad-detector.md +0 -0
  98. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/how-to/interact-with-signals.md +0 -0
  99. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/how-to/put-device-back.md +0 -0
  100. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/how-to/store-and-retrieve.md +0 -0
  101. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/how-to.md +0 -0
  102. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/images/fly_scan_collection_windows_and_frames.svg +0 -0
  103. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/images/ophyd-async-logo.svg +0 -0
  104. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/images/ophyd-favicon.svg +0 -0
  105. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/images/set_and_wait_for_other_value.excalidraw.svg +0 -0
  106. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/index.md +0 -0
  107. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/reference.md +0 -0
  108. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/tutorials/implementing-detectors.md +0 -0
  109. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/tutorials/implementing-devices.md +0 -0
  110. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/tutorials/installation.md +0 -0
  111. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/tutorials/using-devices.md +0 -0
  112. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/tutorials/writing-tests-for-devices.md +0 -0
  113. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/tutorials.md +0 -0
  114. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/pyproject.toml +0 -0
  115. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/setup.cfg +0 -0
  116. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/__init__.py +0 -0
  117. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/__main__.py +0 -0
  118. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/_docs_parser.py +0 -0
  119. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/__init__.py +0 -0
  120. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_derived_signal.py +0 -0
  121. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_derived_signal_backend.py +0 -0
  122. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_detector.py +0 -0
  123. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_device.py +0 -0
  124. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_device_filler.py +0 -0
  125. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_enums.py +0 -0
  126. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_flyer.py +0 -0
  127. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_hdf_dataset.py +0 -0
  128. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_log.py +0 -0
  129. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_protocol.py +0 -0
  130. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_providers.py +0 -0
  131. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_readable.py +0 -0
  132. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_settings.py +0 -0
  133. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_signal_backend.py +0 -0
  134. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_soft_signal_backend.py +0 -0
  135. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_status.py +0 -0
  136. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_table.py +0 -0
  137. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_utils.py +0 -0
  138. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_yaml_settings.py +0 -0
  139. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/__init__.py +0 -0
  140. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adandor/__init__.py +0 -0
  141. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adandor/_andor.py +0 -0
  142. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adandor/_andor_controller.py +0 -0
  143. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adandor/_andor_io.py +0 -0
  144. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adaravis/__init__.py +0 -0
  145. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adaravis/_aravis.py +0 -0
  146. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adaravis/_aravis_controller.py +0 -0
  147. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adaravis/_aravis_io.py +0 -0
  148. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/__init__.py +0 -0
  149. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_core_detector.py +0 -0
  150. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_core_io.py +0 -0
  151. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_core_logic.py +0 -0
  152. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_core_writer.py +0 -0
  153. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_hdf_writer.py +0 -0
  154. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_jpeg_writer.py +0 -0
  155. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_single_trigger.py +0 -0
  156. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_tiff_writer.py +0 -0
  157. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_utils.py +0 -0
  158. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adkinetix/__init__.py +0 -0
  159. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adkinetix/_kinetix.py +0 -0
  160. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adkinetix/_kinetix_controller.py +0 -0
  161. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adkinetix/_kinetix_io.py +0 -0
  162. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adpilatus/__init__.py +0 -0
  163. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adpilatus/_pilatus.py +0 -0
  164. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adpilatus/_pilatus_controller.py +0 -0
  165. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adpilatus/_pilatus_io.py +0 -0
  166. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adsimdetector/__init__.py +0 -0
  167. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adsimdetector/_sim.py +0 -0
  168. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adsimdetector/_sim_controller.py +0 -0
  169. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adsimdetector/_sim_io.py +0 -0
  170. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/advimba/__init__.py +0 -0
  171. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/advimba/_vimba.py +0 -0
  172. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/advimba/_vimba_controller.py +0 -0
  173. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/advimba/_vimba_io.py +0 -0
  174. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/core/__init__.py +0 -0
  175. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/core/_aioca.py +0 -0
  176. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/core/_epics_connector.py +0 -0
  177. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/core/_epics_device.py +0 -0
  178. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/core/_p4p.py +0 -0
  179. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/core/_pvi_connector.py +0 -0
  180. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/core/_signal.py +0 -0
  181. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/core/_util.py +0 -0
  182. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/__init__.py +0 -0
  183. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/__main__.py +0 -0
  184. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/_ioc.py +0 -0
  185. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/_motor.py +0 -0
  186. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/_point_detector.py +0 -0
  187. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/_point_detector_channel.py +0 -0
  188. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/_stage.py +0 -0
  189. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/motor.db +0 -0
  190. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/point_detector.db +0 -0
  191. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/point_detector_channel.db +0 -0
  192. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/odin/__init__.py +0 -0
  193. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/odin/_odin_io.py +0 -0
  194. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/pmac/__init__.py +0 -0
  195. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/signal.py +0 -0
  196. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/testing/__init__.py +0 -0
  197. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/testing/_example_ioc.py +0 -0
  198. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/testing/_utils.py +0 -0
  199. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/testing/test_records.db +0 -0
  200. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/testing/test_records_pva.db +0 -0
  201. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/__init__.py +0 -0
  202. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/core.py +0 -0
  203. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/eiger/__init__.py +0 -0
  204. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/eiger/_eiger.py +0 -0
  205. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/eiger/_eiger_controller.py +0 -0
  206. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/eiger/_eiger_io.py +0 -0
  207. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/jungfrau/__init__.py +0 -0
  208. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/jungfrau/_controller.py +0 -0
  209. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/jungfrau/_jungfrau.py +0 -0
  210. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/jungfrau/_signals.py +0 -0
  211. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/jungfrau/_utils.py +0 -0
  212. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/odin/__init__.py +0 -0
  213. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/panda/__init__.py +0 -0
  214. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/panda/_control.py +0 -0
  215. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/panda/_hdf_panda.py +0 -0
  216. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/panda/_table.py +0 -0
  217. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/panda/_trigger.py +0 -0
  218. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/panda/_writer.py +0 -0
  219. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/plan_stubs/__init__.py +0 -0
  220. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/plan_stubs/_ensure_connected.py +0 -0
  221. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/plan_stubs/_fly.py +0 -0
  222. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/plan_stubs/_nd_attributes.py +0 -0
  223. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/plan_stubs/_panda.py +0 -0
  224. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/plan_stubs/_settings.py +0 -0
  225. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/plan_stubs/_utils.py +0 -0
  226. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/plan_stubs/_wait_for_awaitable.py +0 -0
  227. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/py.typed +0 -0
  228. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/__init__.py +0 -0
  229. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/__main__.py +0 -0
  230. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_blob_detector.py +0 -0
  231. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_blob_detector_controller.py +0 -0
  232. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_blob_detector_writer.py +0 -0
  233. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_mirror_horizontal.py +0 -0
  234. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_mirror_vertical.py +0 -0
  235. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_motor.py +0 -0
  236. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_pattern_generator.py +0 -0
  237. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_point_detector.py +0 -0
  238. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_stage.py +0 -0
  239. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/__init__.py +0 -0
  240. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/core/_converters.py +0 -0
  241. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/core/_signal.py +0 -0
  242. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/core/_tango_transport.py +0 -0
  243. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/core/_utils.py +0 -0
  244. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/demo/__init__.py +0 -0
  245. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/demo/_detector.py +0 -0
  246. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/demo/_tango/__init__.py +0 -0
  247. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/demo/_tango/_servers.py +0 -0
  248. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/testing/__init__.py +0 -0
  249. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/testing/_one_of_everything.py +0 -0
  250. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/testing/_test_config.py +0 -0
  251. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/testing/__init__.py +0 -0
  252. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/testing/__pytest_assert_rewrite.py +0 -0
  253. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/testing/_assert.py +0 -0
  254. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/testing/_one_of_everything.py +0 -0
  255. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/testing/_single_derived.py +0 -0
  256. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/testing/_utils.py +0 -0
  257. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/testing/_wait_for_pending.py +0 -0
  258. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async.egg-info/dependency_links.txt +0 -0
  259. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async.egg-info/requires.txt +0 -0
  260. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async.egg-info/top_level.txt +0 -0
  261. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/README.md +0 -0
  262. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/epics/adsim/baseline.yaml +0 -0
  263. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/epics/eiger/README.md +0 -0
  264. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/epics/eiger/start_iocs_and_run_tests.sh +0 -0
  265. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/epics/eiger/test_eiger_system.py +0 -0
  266. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/epics/signal/test_signals.py +0 -0
  267. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/epics/signal/test_yaml_save_ca.yaml +0 -0
  268. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/epics/signal/test_yaml_save_pva.yaml +0 -0
  269. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/fastcs/panda/test_panda_connect.py +0 -0
  270. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/tango/conftest.py +0 -0
  271. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/tango/context_subprocess.py +0 -0
  272. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/tango/test_tango_transport.py +0 -0
  273. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/test_tutorials.py +0 -0
  274. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_auto_init_devices.py +0 -0
  275. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_detector.py +0 -0
  276. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_device.py +0 -0
  277. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_flyer.py +0 -0
  278. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_log.py +0 -0
  279. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_multi_derived_signal.py +0 -0
  280. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_observe.py +0 -0
  281. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_protocol.py +0 -0
  282. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_providers.py +0 -0
  283. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_readable.py +0 -0
  284. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_single_derived_signal.py +0 -0
  285. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_soft_signal_backend.py +0 -0
  286. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_status.py +0 -0
  287. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_subset_enum.py +0 -0
  288. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_table.py +0 -0
  289. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_utils.py +0 -0
  290. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_watchable_async_status.py +0 -0
  291. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adandor/test_andor.py +0 -0
  292. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adaravis/test_aravis.py +0 -0
  293. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adcore/test_cont_acq_detector.py +0 -0
  294. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adcore/test_detectors.py +0 -0
  295. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adcore/test_drivers.py +0 -0
  296. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adcore/test_plugins.py +0 -0
  297. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adcore/test_scans.py +0 -0
  298. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adcore/test_single_trigger.py +0 -0
  299. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adcore/test_writers.py +0 -0
  300. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adkinetix/test_kinetix.py +0 -0
  301. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adpilatus/test_pilatus.py +0 -0
  302. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adsimdetector/test_sim.py +0 -0
  303. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/advimba/test_vimba.py +0 -0
  304. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/conftest.py +0 -0
  305. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/demo/test_epics_demo.py +0 -0
  306. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/eiger/test_odin_io.py +0 -0
  307. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/pmac/test_pmac_io.py +0 -0
  308. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/pvi/test_pvi.py +0 -0
  309. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/signal/test_common.py +0 -0
  310. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/test_areadetector_subclass_naming.py +0 -0
  311. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/eiger/test_eiger_controller.py +0 -0
  312. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/eiger/test_eiger_detector.py +0 -0
  313. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/jungfrau/__init__.py +0 -0
  314. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/jungfrau/test_controller.py +0 -0
  315. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/jungfrau/test_utils.py +0 -0
  316. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/panda/test_hdf_panda.py +0 -0
  317. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/panda/test_panda_connect_mock.py +0 -0
  318. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/panda/test_panda_control.py +0 -0
  319. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/panda/test_seq_table.py +0 -0
  320. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/panda/test_trigger.py +0 -0
  321. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/panda/test_writer.py +0 -0
  322. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/plan_stubs/test_ensure_connected.py +0 -0
  323. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/plan_stubs/test_fly.py +0 -0
  324. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/plan_stubs/test_settings.py +0 -0
  325. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/plan_stubs/test_setup.py +0 -0
  326. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/sim/__init__.py +0 -0
  327. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/sim/test_sim_blob_detector.py +0 -0
  328. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/sim/test_sim_motor.py +0 -0
  329. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/test_branching.py +0 -0
  330. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/test_cli.py +0 -0
  331. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/test_data/test_yaml_config_save.yaml +0 -0
  332. {ophyd_async-0.13.5 → ophyd_async-0.13.7}/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,24 @@
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}",
20
+ // Help external service fixtures match docker compose working directory with the host
21
+ "EXAMPLE_SERVICES_PATH": "${localWorkspaceFolder}/example-services"
14
22
  },
15
23
  "customizations": {
16
24
  "vscode": {
17
25
  // Set *default* container specific settings.json values on container create.
18
26
  "settings": {
19
27
  // Use the container's python by default
20
- "python.defaultInterpreterPath": "/workspaces/${localWorkspaceFolderBasename}/.venv/bin/python",
28
+ "python.defaultInterpreterPath": "/cache/venv-for${localWorkspaceFolder}/bin/python",
21
29
  // Don't activate the venv as it is already in the PATH
22
30
  "python.terminal.activateEnvInCurrentTerminal": false,
23
31
  "python.terminal.activateEnvironment": false,
@@ -47,14 +55,14 @@
47
55
  }
48
56
  },
49
57
  // 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",
58
+ "initializeCommand": "mkdir -p ${localEnv:HOME}/.config/terminal-config",
53
59
  "runArgs": [
54
60
  // Allow the container to access the host X11 display and EPICS CA
55
61
  "--net=host",
56
62
  // Make sure SELinux does not disable with access to host filesystems like tmp
57
- "--security-opt=label=disable"
63
+ "--security-opt=label=disable",
64
+ // add the docker socket environment variable to the container
65
+ "-e=DOCKER_HOST=${localEnv:DOCKER_HOST}"
58
66
  ],
59
67
  "mounts": [
60
68
  // Mount in the user terminal config folder so it can be edited
@@ -63,20 +71,27 @@
63
71
  "target": "/user-terminal-config",
64
72
  "type": "bind"
65
73
  },
66
- // Keep a persistent cross container cache for uv
74
+ // Keep a persistent cross container cache for uv, pre-commit, and the venvs
67
75
  {
68
- "source": "${localEnv:HOME}/.cache/uv",
69
- "target": "/root/.cache/uv",
76
+ "source": "devcontainer-shared-cache",
77
+ "target": "/cache",
78
+ "type": "volume"
79
+ },
80
+ // Match host external services file paths (internal docker starts them on the host)
81
+ {
82
+ "source": "${localWorkspaceFolder}/example-services",
83
+ "target": "${localWorkspaceFolder}/example-services",
70
84
  "type": "bind"
71
85
  },
72
- // Use a volume mount for the uv venv so it is local to the container
86
+ // Mount the user sockets folder
73
87
  {
74
- "target": "/workspaces/${localWorkspaceFolderBasename}/.venv",
75
- "type": "volume"
88
+ "source": "${localEnv:XDG_RUNTIME_DIR}",
89
+ "target": "${localEnv:XDG_RUNTIME_DIR}",
90
+ "type": "bind"
76
91
  }
77
92
  ],
78
93
  // Mount the parent as /workspaces so we can pip install peers as editable
79
94
  "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"
95
+ // After the container is created, recreate the venv then make pre-commit first run faster
96
+ "postCreateCommand": "uv venv --clear && uv sync && pre-commit install --install-hooks"
82
97
  }
@@ -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: "*"
@@ -13,10 +13,6 @@ on:
13
13
  type: string
14
14
  description: The path to look for tests
15
15
  required: true
16
- needs-services:
17
- type: boolean
18
- description: Whether to start external services
19
- required: true
20
16
  secrets:
21
17
  CODECOV_TOKEN:
22
18
  required: true
@@ -32,10 +28,11 @@ jobs:
32
28
 
33
29
  env:
34
30
  COVERAGE_PROCESS_START: .coveragerc
31
+ EXAMPLE_SERVICES_PATH: ./example-services
35
32
 
36
33
  steps:
37
34
  - name: Checkout repository (with submodules)
38
- uses: actions/checkout@v4
35
+ uses: actions/checkout@v5
39
36
  with:
40
37
  submodules: recursive
41
38
  fetch-depth: 0
@@ -47,16 +44,7 @@ jobs:
47
44
  echo "TEMP=D:\\Temp" >> $env:GITHUB_ENV
48
45
 
49
46
  - name: Install uv
50
- uses: astral-sh/setup-uv@v5
51
-
52
- - if: inputs.needs-services && inputs.runs-on != 'windows-latest'
53
- name: Run docker compose
54
- uses: hoverkraft-tech/compose-action@v2.4.1
55
- with:
56
- compose-file: "./example-services/compose.yaml"
57
- services: |
58
- bl01t-di-cam-01
59
- ca-gateway
47
+ uses: astral-sh/setup-uv@v7
60
48
 
61
49
  - name: Run tests win
62
50
  if: inputs.runs-on == 'windows-latest'
@@ -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 }}
@@ -19,18 +19,13 @@ jobs:
19
19
  matrix:
20
20
  runs-on: ["ubuntu-latest", "windows-latest"] # can add macos-latest
21
21
  python-version: ["3.11", "3.12", "3.13"]
22
- test-config:
23
- - tests-path: "tests/unit_tests"
24
- needs-services: false
25
- - tests-path: "tests/system_tests"
26
- needs-services: true
22
+ tests-path: ["", "tests/system_tests"]
27
23
  fail-fast: false
28
24
  uses: ./.github/workflows/_test.yml
29
25
  with:
30
26
  runs-on: ${{ matrix.runs-on }}
31
27
  python-version: ${{ matrix.python-version }}
32
- tests-path: ${{ matrix.test-config.tests-path }}
33
- needs-services: ${{ matrix.test-config.needs-services }}
28
+ tests-path: ${{ matrix.tests-path }}
34
29
  secrets:
35
30
  CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
36
31
 
@@ -0,0 +1,25 @@
1
+ # The devcontainer should use the developer target and run as root with podman
2
+ # or docker with user namespaces.
3
+ FROM ghcr.io/diamondlightsource/ubuntu-devcontainer:noble AS developer
4
+
5
+ ENV DOCKER=docker-28.5.1
6
+ ENV DOCKER_COMPOSE_RELEASE_TAG=v2.40.3
7
+
8
+ # Add any system dependencies for the developer/build environment here
9
+ RUN apt-get update -y && apt-get install -y --no-install-recommends \
10
+ graphviz \
11
+ libxcb-cursor0 \
12
+ qt6-base-dev \
13
+ curl \
14
+ && apt-get dist-clean
15
+
16
+ # install the docker ce cli binary
17
+ RUN curl -O https://download.docker.com/linux/static/stable/x86_64/${DOCKER}.tgz && \
18
+ tar xvf ${DOCKER}.tgz && \
19
+ cp docker/docker /usr/bin && \
20
+ rm -r ${DOCKER}.tgz docker
21
+
22
+ # install docker-compose plugin
23
+ RUN mkdir -p /usr/libexec/docker/cli-plugins/ && \
24
+ curl -SL https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_RELEASE_TAG}/docker-compose-linux-x86_64 -o /usr/libexec/docker/cli-plugins/docker-compose && \
25
+ chmod +x /usr/libexec/docker/cli-plugins/docker-compose
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ophyd-async
3
- Version: 0.13.5
3
+ Version: 0.13.7
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
@@ -206,7 +206,6 @@ intersphinx_mapping = {
206
206
  "bluesky": ("https://blueskyproject.io/bluesky/main", None),
207
207
  "scanspec": ("https://blueskyproject.io/scanspec/main", None),
208
208
  "numpy": ("https://numpy.org/devdocs/", None),
209
- "databroker": ("https://blueskyproject.io/databroker/", None),
210
209
  "event-model": ("https://blueskyproject.io/event-model/main", None),
211
210
  "pytest": ("https://docs.pytest.org/en/stable/", None),
212
211
  }
@@ -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.7'
32
+ __version_tuple__ = version_tuple = (0, 13, 7)
33
33
 
34
- __commit_id__ = commit_id = 'gbb7c98987'
34
+ __commit_id__ = commit_id = 'g80ae4488a'
@@ -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
 
@@ -639,9 +639,10 @@ async def set_and_wait_for_other_value(
639
639
  if wait_for_set_completion:
640
640
  await status
641
641
  except TimeoutError as exc:
642
+ matcher_name = getattr(matcher, "__name__", f"<{type(matcher).__name__}>")
642
643
  raise TimeoutError(
643
644
  f"{match_signal.name} value didn't match value from"
644
- f" {matcher.__name__}() in {timeout}s"
645
+ f" {matcher_name}() in {timeout}s"
645
646
  ) from exc
646
647
 
647
648
  return status
@@ -98,9 +98,12 @@ class Motor(
98
98
  self.motor_done_move = epics_signal_r(int, prefix + ".DMOV")
99
99
  self.low_limit_travel = epics_signal_rw(float, prefix + ".LLM")
100
100
  self.high_limit_travel = epics_signal_rw(float, prefix + ".HLM")
101
+ self.dial_low_limit_travel = epics_signal_rw(float, prefix + ".DLLM")
102
+ self.dial_high_limit_travel = epics_signal_rw(float, prefix + ".DHLM")
101
103
  self.offset_freeze_switch = epics_signal_rw(OffsetMode, prefix + ".FOFF")
102
104
  self.high_limit_switch = epics_signal_r(int, prefix + ".HLS")
103
105
  self.low_limit_switch = epics_signal_r(int, prefix + ".LLS")
106
+ self.output_link = epics_signal_r(str, prefix + ".OUT")
104
107
  self.set_use_switch = epics_signal_rw(UseSetMode, prefix + ".SET")
105
108
 
106
109
  # Note:cannot use epics_signal_x here, as the motor record specifies that
@@ -131,16 +134,26 @@ class Motor(
131
134
  Will raise a MotorLimitsException if the given absolute positions will be
132
135
  outside the motor soft limits.
133
136
  """
134
- motor_lower_limit, motor_upper_limit, egu = await asyncio.gather(
137
+ (
138
+ motor_lower_limit,
139
+ motor_upper_limit,
140
+ egu,
141
+ dial_lower_limit,
142
+ dial_upper_limit,
143
+ ) = await asyncio.gather(
135
144
  self.low_limit_travel.get_value(),
136
145
  self.high_limit_travel.get_value(),
137
146
  self.motor_egu.get_value(),
147
+ self.dial_low_limit_travel.get_value(),
148
+ self.dial_high_limit_travel.get_value(),
138
149
  )
139
150
 
140
- # EPICS motor record treats limits of 0, 0 as no limit
141
- if motor_lower_limit == 0 and motor_upper_limit == 0:
151
+ # EPICS motor record treats dial limits of 0, 0 as no limit
152
+ # Use DLLM and DHLM to check
153
+ if dial_lower_limit == 0 and dial_upper_limit == 0:
142
154
  return
143
155
 
156
+ # Use real motor limit(i.e. HLM and LLM) to check if the move is permissible
144
157
  if (
145
158
  not motor_upper_limit >= abs_start_pos >= motor_lower_limit
146
159
  or not motor_upper_limit >= abs_end_pos >= motor_lower_limit
@@ -150,6 +163,8 @@ class Motor(
150
163
  f"{abs_start_pos}{egu} to "
151
164
  f"{abs_end_pos}{egu} but motor limits are "
152
165
  f"{motor_lower_limit}{egu} <= x <= {motor_upper_limit}{egu} "
166
+ f"dial limits are "
167
+ f"{dial_lower_limit}{egu} <= x <= {dial_upper_limit}"
153
168
  )
154
169
 
155
170
  @AsyncStatus.wrap
@@ -6,7 +6,8 @@ from ophyd_async.core import Array1D, Device, DeviceVector, StandardReadable
6
6
  from ophyd_async.epics import motor
7
7
  from ophyd_async.epics.core import epics_signal_r, epics_signal_rw, epics_signal_x
8
8
 
9
- CS_LETTERS = "ABCUVWXYZ"
9
+ # Map the CS axis letters to their index (1 indexed)
10
+ CS_INDEX = {letter: index + 1 for index, letter in enumerate("ABCUVWXYZ")}
10
11
 
11
12
 
12
13
  class PmacTrajectoryIO(StandardReadable):
@@ -20,24 +21,20 @@ class PmacTrajectoryIO(StandardReadable):
20
21
  # 1 indexed CS axes so we can index into them from the compound motor input link
21
22
  self.positions = DeviceVector(
22
23
  {
23
- i + 1: epics_signal_rw(
24
- Array1D[np.float64], f"{prefix}{letter}:Positions"
25
- )
26
- for i, letter in enumerate(CS_LETTERS)
24
+ i: epics_signal_rw(Array1D[np.float64], f"{prefix}{letter}:Positions")
25
+ for letter, i in CS_INDEX.items()
27
26
  }
28
27
  )
29
28
  self.use_axis = DeviceVector(
30
29
  {
31
- i + 1: epics_signal_rw(bool, f"{prefix}{letter}:UseAxis")
32
- for i, letter in enumerate(CS_LETTERS)
30
+ i: epics_signal_rw(bool, f"{prefix}{letter}:UseAxis")
31
+ for letter, i in CS_INDEX.items()
33
32
  }
34
33
  )
35
34
  self.velocities = DeviceVector(
36
35
  {
37
- i + 1: epics_signal_rw(
38
- Array1D[np.float64], f"{prefix}{letter}:Velocities"
39
- )
40
- for i, letter in enumerate(CS_LETTERS)
36
+ i: epics_signal_rw(Array1D[np.float64], f"{prefix}{letter}:Velocities")
37
+ for letter, i in CS_INDEX.items()
41
38
  }
42
39
  )
43
40
  self.total_points = epics_signal_r(int, f"{prefix}TotalPoints_RBV")
@@ -76,8 +73,8 @@ class PmacCoordIO(Device):
76
73
  self.cs_port = epics_signal_r(str, f"{prefix}Port")
77
74
  self.cs_axis_setpoint = DeviceVector(
78
75
  {
79
- i + 1: epics_signal_rw(float, f"{prefix}M{i + 1}:DirectDemand")
80
- for i in range(len(CS_LETTERS))
76
+ i: epics_signal_rw(float, f"{prefix}M{i}:DirectDemand")
77
+ for i in CS_INDEX.values()
81
78
  }
82
79
  )
83
80
  super().__init__(name=name)
@@ -15,10 +15,10 @@ from ophyd_async.core import (
15
15
  wait_for_value,
16
16
  )
17
17
  from ophyd_async.epics.motor import Motor
18
- from ophyd_async.epics.pmac import PmacIO
19
- from ophyd_async.epics.pmac._pmac_io import CS_LETTERS
20
- from ophyd_async.epics.pmac._pmac_trajectory_generation import PVT, Trajectory
21
- from ophyd_async.epics.pmac._utils import (
18
+
19
+ from ._pmac_io import CS_INDEX, PmacIO
20
+ from ._pmac_trajectory_generation import PVT, Trajectory
21
+ from ._utils import (
22
22
  _PmacMotorInfo,
23
23
  calculate_ramp_position_and_duration,
24
24
  )
@@ -131,8 +131,7 @@ class PmacTrajectoryTriggerLogic(FlyerController):
131
131
  slice, path_length, motor_info, ramp_up_time
132
132
  )
133
133
  use_axis = {
134
- axis + 1: (axis in motor_info.motor_cs_index.values())
135
- for axis in range(len(CS_LETTERS))
134
+ i: (i in motor_info.motor_cs_index.values()) for i in CS_INDEX.values()
136
135
  }
137
136
 
138
137
  coros = [
@@ -177,14 +176,14 @@ class PmacTrajectoryTriggerLogic(FlyerController):
177
176
  self, trajectory: Trajectory, motor_info: _PmacMotorInfo
178
177
  ):
179
178
  coros = []
180
- for motor, number in motor_info.motor_cs_index.items():
179
+ for motor, cs_index in motor_info.motor_cs_index.items():
181
180
  coros.append(
182
- self.pmac.trajectory.positions[number + 1].set(
181
+ self.pmac.trajectory.positions[cs_index].set(
183
182
  trajectory.positions[motor]
184
183
  )
185
184
  )
186
185
  coros.append(
187
- self.pmac.trajectory.velocities[number + 1].set(
186
+ self.pmac.trajectory.velocities[cs_index].set(
188
187
  trajectory.velocities[motor]
189
188
  )
190
189
  )
@@ -206,7 +205,7 @@ class PmacTrajectoryTriggerLogic(FlyerController):
206
205
  for motor, position in ramp_up_position.items():
207
206
  coros.append(
208
207
  set_and_wait_for_value(
209
- coord.cs_axis_setpoint[motor_info.motor_cs_index[motor] + 1],
208
+ coord.cs_axis_setpoint[motor_info.motor_cs_index[motor]],
210
209
  position,
211
210
  set_timeout=10,
212
211
  wait_for_set_completion=False,
@@ -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()