dls-dodal 1.55.1__tar.gz → 1.57.0__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 (569) hide show
  1. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/workflows/ci.yml +1 -1
  2. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.pre-commit-config.yaml +3 -3
  3. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/PKG-INFO +3 -3
  4. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/conftest.py +16 -7
  5. dls_dodal-1.57.0/docs/explanations/decisions/0006-devices-shared-between-endstations.md +27 -0
  6. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/coverage.md +4 -0
  7. dls_dodal-1.55.1/docs/how-to/create-beamline.rst → dls_dodal-1.57.0/docs/how-to/create-beamline.md +6 -7
  8. dls_dodal-1.57.0/docs/how-to/create-device.md +66 -0
  9. dls_dodal-1.57.0/docs/how-to/move-code.md +94 -0
  10. dls_dodal-1.57.0/docs/how-to/run-tests.md +61 -0
  11. dls_dodal-1.57.0/docs/how-to/write-tests.md +122 -0
  12. dls_dodal-1.55.1/docs/how-to/zocalo.rst → dls_dodal-1.57.0/docs/how-to/zocalo.md +23 -26
  13. dls_dodal-1.55.1/docs/reference/device-standards.rst → dls_dodal-1.57.0/docs/reference/device-standards.md +49 -54
  14. dls_dodal-1.57.0/docs/reference/standards.md +68 -0
  15. dls_dodal-1.57.0/docs/tutorials/get_started.md +49 -0
  16. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/pyproject.toml +2 -2
  17. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dls_dodal.egg-info/PKG-INFO +3 -3
  18. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dls_dodal.egg-info/SOURCES.txt +160 -132
  19. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dls_dodal.egg-info/requires.txt +2 -2
  20. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/_version.py +16 -3
  21. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/b01_1.py +6 -1
  22. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/b07.py +2 -1
  23. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/b07_1.py +2 -1
  24. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/b21.py +4 -24
  25. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i03.py +53 -53
  26. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i04.py +16 -38
  27. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i09.py +3 -2
  28. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i09_1.py +2 -1
  29. dls_dodal-1.57.0/src/dodal/beamlines/i11.py +143 -0
  30. dls_dodal-1.57.0/src/dodal/beamlines/i17.py +37 -0
  31. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i19_1.py +1 -0
  32. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i19_2.py +7 -0
  33. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i22.py +5 -5
  34. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i23.py +3 -3
  35. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i24.py +6 -33
  36. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/p38.py +1 -0
  37. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/p60.py +3 -2
  38. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/cli.py +11 -1
  39. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/__init__.py +4 -0
  40. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/beamlines/beamline_parameters.py +1 -1
  41. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/beamlines/beamline_utils.py +5 -1
  42. dls_dodal-1.57.0/src/dodal/common/enums.py +19 -0
  43. dls_dodal-1.57.0/src/dodal/common/watcher_utils.py +83 -0
  44. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/aithre_lasershaping/laser_robot.py +4 -9
  45. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/aperturescatterguard.py +52 -12
  46. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/apple2_undulator.py +0 -1
  47. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/b16/detector.py +1 -10
  48. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/backlight.py +8 -20
  49. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/bimorph_mirror.py +4 -7
  50. dls_dodal-1.57.0/src/dodal/devices/collimation_table.py +36 -0
  51. dls_dodal-1.57.0/src/dodal/devices/controllers.py +21 -0
  52. dls_dodal-1.57.0/src/dodal/devices/cryostream.py +109 -0
  53. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/current_amplifiers/femto.py +1 -1
  54. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/detector/detector_motion.py +1 -7
  55. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/eiger.py +22 -8
  56. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/eiger_odin.py +2 -0
  57. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/__init__.py +2 -1
  58. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/abstract/__init__.py +0 -1
  59. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/abstract/base_detector.py +3 -25
  60. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/abstract/base_driver_io.py +18 -9
  61. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/abstract/base_region.py +34 -3
  62. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/detector.py +24 -0
  63. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/enums.py +5 -0
  64. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/specs/detector.py +2 -1
  65. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/specs/driver_io.py +21 -26
  66. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/specs/region.py +1 -1
  67. dls_dodal-1.57.0/src/dodal/devices/electron_analyser/util.py +33 -0
  68. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/vgscienta/__init__.py +3 -3
  69. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/vgscienta/detector.py +2 -1
  70. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/vgscienta/driver_io.py +24 -32
  71. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/vgscienta/enums.py +0 -8
  72. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/vgscienta/region.py +2 -31
  73. dls_dodal-1.57.0/src/dodal/devices/eurotherm.py +126 -0
  74. dls_dodal-1.57.0/src/dodal/devices/fluorescence_detector_motion.py +9 -0
  75. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/focusing_mirror.py +1 -1
  76. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i03/undulator_dcm.py +0 -1
  77. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i09/enums.py +8 -8
  78. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/diagnostics.py +4 -4
  79. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/i10_apple2.py +3 -6
  80. dls_dodal-1.57.0/src/dodal/devices/i11/cyberstar_blower.py +34 -0
  81. dls_dodal-1.57.0/src/dodal/devices/i11/diff_stages.py +55 -0
  82. dls_dodal-1.57.0/src/dodal/devices/i11/mythen.py +165 -0
  83. dls_dodal-1.57.0/src/dodal/devices/i11/nx100robot.py +153 -0
  84. dls_dodal-1.57.0/src/dodal/devices/i11/spinner.py +30 -0
  85. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i13_1/merlin_controller.py +4 -4
  86. dls_dodal-1.57.0/src/dodal/devices/i19/diffractometer.py +34 -0
  87. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i19/shutter.py +11 -1
  88. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i22/dcm.py +1 -1
  89. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i22/fswitch.py +3 -12
  90. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i24/aperture.py +3 -3
  91. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i24/beam_center.py +1 -2
  92. dls_dodal-1.57.0/src/dodal/devices/i24/dcm.py +29 -0
  93. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i24/dual_backlight.py +11 -12
  94. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i24/pmac.py +8 -7
  95. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/mx_phase1/beamstop.py +10 -11
  96. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/pin_image_recognition/__init__.py +0 -3
  97. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/p60/enums.py +8 -8
  98. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/p60/lab_xray_source.py +3 -2
  99. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/pressure_jump_cell.py +77 -123
  100. dls_dodal-1.57.0/src/dodal/devices/scintillator.py +82 -0
  101. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/smargon.py +35 -18
  102. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/synchrotron.py +1 -2
  103. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/thawer.py +22 -15
  104. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/undulator.py +3 -8
  105. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/util/epics_util.py +1 -1
  106. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/watsonmarlow323_pump.py +7 -7
  107. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/webcam.py +1 -0
  108. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/xbpm_feedback.py +4 -6
  109. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/xspress3/xspress3.py +0 -5
  110. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/zocalo/zocalo_results.py +1 -3
  111. dls_dodal-1.57.0/src/dodal/testing/__init__.py +3 -0
  112. dls_dodal-1.57.0/src/dodal/testing/electron_analyser/__init__.py +6 -0
  113. dls_dodal-1.57.0/src/dodal/testing/electron_analyser/device_factory.py +59 -0
  114. dls_dodal-1.57.0/src/dodal/testing/setup.py +67 -0
  115. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/system_tests/test_oav_system.py +6 -6
  116. {dls_dodal-1.55.1/tests/beamlines/unit_tests → dls_dodal-1.57.0/tests/beamlines}/test_b16.py +2 -11
  117. {dls_dodal-1.55.1/tests/beamlines/unit_tests → dls_dodal-1.57.0/tests/beamlines}/test_i24.py +1 -1
  118. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/common/beamlines/test_beamline_parameters.py +11 -8
  119. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/common/beamlines/test_beamline_utils.py +4 -6
  120. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/common/beamlines/test_device_instantiation.py +2 -2
  121. dls_dodal-1.57.0/tests/common/test_watcher_utils.py +63 -0
  122. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/conftest.py +4 -4
  123. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/aithre_lasershaping/test_goniometer.py +2 -3
  124. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/b07_1/test_ccmc.py +5 -7
  125. dls_dodal-1.57.0/tests/devices/detector/test_data/__init__.py +7 -0
  126. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/detector/test_det_resolution.py +4 -1
  127. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/detector/test_detector.py +2 -1
  128. dls_dodal-1.57.0/tests/devices/electron_analyser/abstract/test_base_detector.py +93 -0
  129. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/electron_analyser/abstract/test_base_driver_io.py +27 -15
  130. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/electron_analyser/abstract/test_base_region.py +49 -1
  131. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/electron_analyser/conftest.py +8 -6
  132. dls_dodal-1.57.0/tests/devices/electron_analyser/helper_util/__init__.py +8 -0
  133. dls_dodal-1.57.0/tests/devices/electron_analyser/helper_util/assert_func.py +16 -0
  134. dls_dodal-1.57.0/tests/devices/electron_analyser/helper_util/sequence.py +34 -0
  135. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/electron_analyser/specs/test_detector.py +10 -10
  136. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/electron_analyser/specs/test_driver_io.py +23 -36
  137. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/electron_analyser/specs/test_region.py +8 -8
  138. dls_dodal-1.57.0/tests/devices/electron_analyser/test_data/__init__.py +8 -0
  139. dls_dodal-1.55.1/tests/devices/unit_tests/electron_analyser/abstract/test_base_detector.py → dls_dodal-1.57.0/tests/devices/electron_analyser/test_detector.py +44 -42
  140. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/electron_analyser/vgscienta/test_detector.py +9 -8
  141. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/electron_analyser/vgscienta/test_driver_io.py +24 -49
  142. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/electron_analyser/vgscienta/test_region.py +9 -35
  143. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/i03/test_undulator_dcm.py +20 -12
  144. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/i09/test_dcm.py +1 -2
  145. dls_dodal-1.57.0/tests/devices/i10/test_data/__init__.py +32 -0
  146. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i10/test_i10Apple2.py +28 -20
  147. dls_dodal-1.57.0/tests/devices/i11/test_i11devices.py +201 -0
  148. dls_dodal-1.57.0/tests/devices/i11/test_mythen.py +82 -0
  149. dls_dodal-1.57.0/tests/devices/i19/test_diffractometer.py +36 -0
  150. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i19/test_shutter.py +5 -5
  151. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i22/test_fswitch.py +5 -4
  152. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i22/test_metadataholder.py +1 -1
  153. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/i24/test_dual_backlight.py +18 -12
  154. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/i24/test_focus_mirrors.py +3 -2
  155. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/i24/test_pmac.py +24 -14
  156. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/i24/test_vgonio.py +4 -3
  157. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/mx_phase1/test_beamstop.py +21 -18
  158. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/oav/conftest.py +4 -6
  159. dls_dodal-1.57.0/tests/devices/oav/test_data/__init__.py +13 -0
  160. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/oav/test_oav.py +5 -5
  161. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/oav/test_oav_parameters.py +8 -7
  162. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/oav/test_oav_to_redis_forwarder.py +1 -1
  163. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/oav/test_oav_utils.py +3 -3
  164. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/oav/test_snapshot_image_processing.py +6 -2
  165. dls_dodal-1.57.0/tests/devices/oav/test_snapshots.py +188 -0
  166. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/p60/test_lab_xray_source.py +2 -6
  167. dls_dodal-1.57.0/tests/devices/test.png +0 -0
  168. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_aperture_scatterguard.py +137 -10
  169. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_apple2_undulator.py +4 -4
  170. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_backlight.py +17 -17
  171. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_baton.py +1 -2
  172. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_bimorph_mirror.py +1 -2
  173. dls_dodal-1.57.0/tests/devices/test_controllers.py +16 -0
  174. dls_dodal-1.57.0/tests/devices/test_daq_configuration/__init__.py +6 -0
  175. dls_dodal-1.57.0/tests/devices/test_daq_configuration/domain/__init__.py +10 -0
  176. dls_dodal-1.57.0/tests/devices/test_daq_configuration/lookup/__init__.py +17 -0
  177. dls_dodal-1.57.0/tests/devices/test_data/__init__.py +13 -0
  178. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_eiger.py +7 -4
  179. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_focusing_mirror.py +3 -9
  180. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_gridscan.py +3 -3
  181. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_hutch_shutter.py +1 -1
  182. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/test_motors.py +77 -0
  183. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_pressure_jump_cell.py +192 -49
  184. dls_dodal-1.57.0/tests/devices/test_scintillator.py +97 -0
  185. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_smargon.py +63 -5
  186. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_synchrotron.py +8 -8
  187. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_tetramm.py +1 -3
  188. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_thawer.py +68 -15
  189. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_turbo_slit.py +13 -15
  190. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_undulator.py +10 -8
  191. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_utils.py +1 -1
  192. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_webcam.py +63 -5
  193. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_xbpm_feedback.py +2 -2
  194. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_zebra.py +2 -3
  195. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_zocalo_results.py +1 -1
  196. dls_dodal-1.57.0/tests/devices/util/test_data/__init__.py +19 -0
  197. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/util/test_lookup_tables.py +32 -15
  198. dls_dodal-1.57.0/tests/plan_stubs/test_data/__init__.py +11 -0
  199. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plan_stubs/test_data_session.py +8 -1
  200. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plan_stubs/test_motor_util_plans.py +11 -9
  201. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plan_stubs/test_topup_plan.py +24 -19
  202. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plan_stubs/test_wrapped_stubs.py +2 -3
  203. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plans/conftest.py +7 -10
  204. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plans/test_bimorph.py +6 -13
  205. dls_dodal-1.57.0/tests/test_data/__init__.py +17 -0
  206. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/test_utils.py +5 -12
  207. dls_dodal-1.55.1/.talismanrc +0 -10
  208. dls_dodal-1.55.1/docs/how-to/create-device.md +0 -32
  209. dls_dodal-1.55.1/docs/how-to/move-code.rst +0 -73
  210. dls_dodal-1.55.1/docs/how-to/run-tests.md +0 -44
  211. dls_dodal-1.55.1/docs/how-to/write-tests.md +0 -8
  212. dls_dodal-1.55.1/docs/reference/standards.rst +0 -77
  213. dls_dodal-1.55.1/docs/tutorials/get_started.rst +0 -52
  214. dls_dodal-1.55.1/src/dodal/devices/CTAB.py +0 -41
  215. dls_dodal-1.55.1/src/dodal/devices/cryostream.py +0 -19
  216. dls_dodal-1.55.1/src/dodal/devices/electron_analyser/util.py +0 -13
  217. dls_dodal-1.55.1/src/dodal/devices/fluorescence_detector_motion.py +0 -16
  218. dls_dodal-1.55.1/src/dodal/devices/i24/dcm.py +0 -33
  219. dls_dodal-1.55.1/src/dodal/devices/i24/pilatus_metadata.py +0 -44
  220. dls_dodal-1.55.1/src/dodal/devices/scintillator.py +0 -10
  221. dls_dodal-1.55.1/src/dodal/devices/util/test_utils.py +0 -37
  222. dls_dodal-1.55.1/tests/constants.py +0 -3
  223. dls_dodal-1.55.1/tests/devices/unit_tests/electron_analyser/util.py +0 -86
  224. dls_dodal-1.55.1/tests/devices/unit_tests/i24/test_pilatus_metadata.py +0 -24
  225. dls_dodal-1.55.1/tests/devices/unit_tests/oav/test_snapshots.py +0 -162
  226. dls_dodal-1.55.1/tests/devices/unit_tests/test_lookup_table_2.txt +0 -5
  227. dls_dodal-1.55.1/tests/devices/unit_tests/test_motors.py +0 -82
  228. dls_dodal-1.55.1/tests/devices/unit_tests/util/__init__.py +0 -0
  229. dls_dodal-1.55.1/tests/fake_zocalo/__init__.py +0 -0
  230. dls_dodal-1.55.1/tests/unit_tests/__init__.py +0 -0
  231. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.copier-answers.yml +0 -0
  232. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.devcontainer/devcontainer.json +0 -0
  233. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/CODEOWNERS +0 -0
  234. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/CONTRIBUTING.md +0 -0
  235. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/ISSUE_TEMPLATE/issue_template.md +0 -0
  236. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/actions/install_requirements/action.yml +0 -0
  237. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/dependabot.yml +0 -0
  238. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/pages/index.html +0 -0
  239. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/pages/make_switcher.py +0 -0
  240. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/scripts/check_test_durations.py +0 -0
  241. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/workflows/_dist.yml +0 -0
  242. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/workflows/_docs.yml +0 -0
  243. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/workflows/_pypi.yml +0 -0
  244. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/workflows/_release.yml +0 -0
  245. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/workflows/_test.yml +0 -0
  246. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/workflows/_tox.yml +0 -0
  247. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/workflows/periodic.yml +0 -0
  248. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.gitignore +0 -0
  249. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.vscode/extensions.json +0 -0
  250. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.vscode/launch.json +0 -0
  251. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.vscode/settings.json +0 -0
  252. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.vscode/tasks.json +0 -0
  253. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/Dockerfile +0 -0
  254. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/LICENSE +0 -0
  255. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/README.md +0 -0
  256. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/catalog-info.yaml +0 -0
  257. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/_templates/autosummary/class.rst +0 -0
  258. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/_templates/autosummary/module.rst +0 -0
  259. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/_templates/custom-module-template.rst +0 -0
  260. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/assets/where-to-put-dodal-logic.png +0 -0
  261. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/assets/zocalo.png +0 -0
  262. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/conf.py +0 -0
  263. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
  264. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
  265. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/decisions/0003-codeowners.md +0 -0
  266. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/decisions/0004-make-devices-factory.md +0 -0
  267. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/decisions/0005-standardise-devices-at-epics-level.md +0 -0
  268. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/decisions/COPYME +0 -0
  269. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/decisions.md +0 -0
  270. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/reviews.md +0 -0
  271. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/umls/apple2_design.png +0 -0
  272. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/umls/i10_id_design.png +0 -0
  273. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations.md +0 -0
  274. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/genindex.md +0 -0
  275. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/build-docs.md +0 -0
  276. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/contribute.md +0 -0
  277. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/dev-install.md +0 -0
  278. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/excalidraw.md +0 -0
  279. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/external-io-devices.md +0 -0
  280. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/lint.md +0 -0
  281. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/lock-requirements.md +0 -0
  282. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/make-release.md +0 -0
  283. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/pypi.md +0 -0
  284. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/static-analysis.md +0 -0
  285. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/update-template.md +0 -0
  286. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to.md +0 -0
  287. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/images/dls-logo.svg +0 -0
  288. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/images/excalidraw-example.svg +0 -0
  289. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/index.md +0 -0
  290. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/reference/api.md +0 -0
  291. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/reference.md +0 -0
  292. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/tutorials/installation.md +0 -0
  293. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/tutorials.md +0 -0
  294. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/pull_request_template.md +0 -0
  295. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/setup.cfg +0 -0
  296. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/__init__.py +0 -0
  297. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dls_dodal.egg-info/dependency_links.txt +0 -0
  298. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dls_dodal.egg-info/entry_points.txt +0 -0
  299. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dls_dodal.egg-info/top_level.txt +0 -0
  300. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/__init__.py +0 -0
  301. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/__main__.py +0 -0
  302. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamline_specific_utils/__init__.py +0 -0
  303. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamline_specific_utils/i03.py +0 -0
  304. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamline_specific_utils/i05_shared.py +0 -0
  305. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/README.md +0 -0
  306. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/__init__.py +0 -0
  307. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/adsim.py +0 -0
  308. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/aithre.py +0 -0
  309. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/b16.py +0 -0
  310. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/b18.py +0 -0
  311. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i02_1.py +0 -0
  312. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i05.py +0 -0
  313. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i05_1.py +0 -0
  314. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i09_2.py +0 -0
  315. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i10.py +0 -0
  316. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i13_1.py +0 -0
  317. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i18.py +0 -0
  318. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i19_optics.py +0 -0
  319. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i20_1.py +0 -0
  320. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/k11.py +0 -0
  321. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/p45.py +0 -0
  322. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/p99.py +0 -0
  323. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/training_rig.py +0 -0
  324. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/beamlines/__init__.py +0 -0
  325. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/beamlines/device_helpers.py +0 -0
  326. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/coordination.py +0 -0
  327. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/crystal_metadata.py +0 -0
  328. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/data_util.py +0 -0
  329. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/device_utils.py +0 -0
  330. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/maths.py +0 -0
  331. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/types.py +0 -0
  332. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/udc_directory_provider.py +0 -0
  333. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/visit.py +0 -0
  334. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/__init__.py +0 -0
  335. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/aithre_lasershaping/__init__.py +0 -0
  336. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/aithre_lasershaping/goniometer.py +0 -0
  337. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/aperture.py +0 -0
  338. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/areadetector/plugins/CAM.py +0 -0
  339. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/areadetector/plugins/MJPG.py +0 -0
  340. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/attenuator/attenuator.py +0 -0
  341. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/attenuator/filter.py +0 -0
  342. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/attenuator/filter_selections.py +0 -0
  343. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/b07/__init__.py +0 -0
  344. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/b07/enums.py +0 -0
  345. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/b07_1/__init__.py +0 -0
  346. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/b07_1/ccmc.py +0 -0
  347. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/b07_1/enums.py +0 -0
  348. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/b16/__init__.py +0 -0
  349. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/baton.py +0 -0
  350. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/common_dcm.py +0 -0
  351. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/current_amplifiers/__init__.py +0 -0
  352. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/current_amplifiers/current_amplifier.py +0 -0
  353. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/current_amplifiers/current_amplifier_detector.py +0 -0
  354. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/current_amplifiers/sr570.py +0 -0
  355. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/current_amplifiers/struck_scaler_counter.py +0 -0
  356. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/detector/__init__.py +0 -0
  357. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/detector/det_dim_constants.py +0 -0
  358. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/detector/det_dist_to_beam_converter.py +0 -0
  359. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/detector/det_resolution.py +0 -0
  360. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/detector/detector.py +0 -0
  361. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/diamond_filter.py +0 -0
  362. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/abstract/types.py +0 -0
  363. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/specs/__init__.py +0 -0
  364. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/specs/enums.py +0 -0
  365. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/types.py +0 -0
  366. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/fast_grid_scan.py +0 -0
  367. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/flux.py +0 -0
  368. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/hutch_shutter.py +0 -0
  369. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i03/__init__.py +0 -0
  370. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i03/dcm.py +0 -0
  371. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i04/__init__.py +0 -0
  372. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i04/constants.py +0 -0
  373. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i04/murko_results.py +0 -0
  374. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i04/transfocator.py +0 -0
  375. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i05/__init__.py +0 -0
  376. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i05/enums.py +0 -0
  377. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i09/__init__.py +0 -0
  378. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i09/dcm.py +0 -0
  379. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i09_1/__init__.py +0 -0
  380. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i09_1/enums.py +0 -0
  381. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/__init__.py +0 -0
  382. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/i10_setting_data.py +0 -0
  383. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/mirrors.py +0 -0
  384. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/rasor/rasor_current_amp.py +0 -0
  385. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/rasor/rasor_motors.py +0 -0
  386. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/rasor/rasor_scaler_cards.py +0 -0
  387. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/slits.py +0 -0
  388. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i13_1/__init__.py +0 -0
  389. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i13_1/merlin.py +0 -0
  390. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i18/KBMirror.py +0 -0
  391. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i18/diode.py +0 -0
  392. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i19/__init__.py +0 -0
  393. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i19/beamstop.py +0 -0
  394. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i19/blueapi_device.py +0 -0
  395. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i19/hutch_access.py +0 -0
  396. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i20_1/__init__.py +0 -0
  397. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i22/nxsas.py +0 -0
  398. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i24/__init__.py +0 -0
  399. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i24/beamstop.py +0 -0
  400. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i24/focus_mirrors.py +0 -0
  401. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i24/vgonio.py +0 -0
  402. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/ipin.py +0 -0
  403. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/linkam3.py +0 -0
  404. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/motors.py +0 -0
  405. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/__init__.py +0 -0
  406. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/oav_calculations.py +0 -0
  407. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/oav_detector.py +0 -0
  408. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/oav_parameters.py +0 -0
  409. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/oav_to_redis_forwarder.py +0 -0
  410. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/pin_image_recognition/manual_test.py +0 -0
  411. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/pin_image_recognition/utils.py +0 -0
  412. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/snapshots/grid_overlay.py +0 -0
  413. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/snapshots/snapshot.py +0 -0
  414. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/snapshots/snapshot_image_processing.py +0 -0
  415. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/snapshots/snapshot_with_grid.py +0 -0
  416. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/utils.py +0 -0
  417. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/p45.py +0 -0
  418. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/p60/__init__.py +0 -0
  419. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/p99/__init__.py +0 -0
  420. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/p99/andor2_point.py +0 -0
  421. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/p99/sample_stage.py +0 -0
  422. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/pgm.py +0 -0
  423. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/positioner.py +0 -0
  424. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/qbpm.py +0 -0
  425. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/robot.py +0 -0
  426. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/s4_slit_gaps.py +0 -0
  427. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/slits.py +0 -0
  428. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/status.py +0 -0
  429. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/tetramm.py +0 -0
  430. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/turbo_slit.py +0 -0
  431. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/util/__init__.py +0 -0
  432. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/util/adjuster_plans.py +0 -0
  433. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/util/lookup_tables.py +0 -0
  434. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/xspress3/xspress3_channel.py +0 -0
  435. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/zebra/__init__.py +0 -0
  436. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/zebra/zebra.py +0 -0
  437. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/zebra/zebra_constants_mapping.py +0 -0
  438. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/zebra/zebra_controlled_shutter.py +0 -0
  439. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/zocalo/__init__.py +0 -0
  440. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/zocalo/zocalo_constants.py +0 -0
  441. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/zocalo/zocalo_interaction.py +0 -0
  442. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/log.py +0 -0
  443. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/parameters/experiment_parameter_base.py +0 -0
  444. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plan_stubs/__init__.py +0 -0
  445. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plan_stubs/check_topup.py +0 -0
  446. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plan_stubs/data_session.py +0 -0
  447. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plan_stubs/motor_utils.py +0 -0
  448. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plan_stubs/wrapped.py +0 -0
  449. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/__init__.py +0 -0
  450. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/bimorph.py +0 -0
  451. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/configure_arm_trigger_and_disarm_detector.py +0 -0
  452. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/preprocessors/__init__.py +0 -0
  453. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/preprocessors/verify_undulator_gap.py +0 -0
  454. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/save_panda.py +0 -0
  455. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/scanspec.py +0 -0
  456. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/verify_undulator_gap.py +0 -0
  457. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/wrapped.py +0 -0
  458. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/utils.py +0 -0
  459. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/system_tests/__init__.py +0 -0
  460. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/system_tests/test_adsim.py +0 -0
  461. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/system_tests/test_cli.py +0 -0
  462. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/system_tests/test_oav_to_redis_system.py +0 -0
  463. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/__init__.py +0 -0
  464. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/beamlines/__init__.py +0 -0
  465. {dls_dodal-1.55.1/tests/beamlines/unit_tests → dls_dodal-1.57.0/tests/beamlines}/test_i03.py +0 -0
  466. {dls_dodal-1.55.1/tests/beamlines/unit_tests → dls_dodal-1.57.0/tests/beamlines}/test_mapping.py +0 -0
  467. {dls_dodal-1.55.1/tests/beamlines/unit_tests → dls_dodal-1.57.0/tests/common}/__init__.py +0 -0
  468. {dls_dodal-1.55.1/tests/common → dls_dodal-1.57.0/tests/common/beamlines}/__init__.py +0 -0
  469. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/common/test_coordination.py +0 -0
  470. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/common/test_crystal_metadata.py +0 -0
  471. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/common/test_maths.py +0 -0
  472. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/common/test_udc_directory_provider.py +0 -0
  473. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/common/test_visit.py +0 -0
  474. {dls_dodal-1.55.1/tests/common/beamlines → dls_dodal-1.57.0/tests/devices}/__init__.py +0 -0
  475. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/current_amplifier/test_femto.py +0 -0
  476. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/current_amplifier/test_sr570.py +0 -0
  477. {dls_dodal-1.55.1/tests → dls_dodal-1.57.0/tests/devices/detector}/test_data/test_det_dist_converter.txt +0 -0
  478. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/detector/test_det_dim_constants.py +0 -0
  479. {dls_dodal-1.55.1/tests/devices → dls_dodal-1.57.0/tests/devices/electron_analyser}/__init__.py +0 -0
  480. {dls_dodal-1.55.1/tests/devices/i03 → dls_dodal-1.57.0/tests/devices/electron_analyser/abstract}/__init__.py +0 -0
  481. {dls_dodal-1.55.1/tests/devices/i04 → dls_dodal-1.57.0/tests/devices/electron_analyser/specs}/__init__.py +0 -0
  482. {dls_dodal-1.55.1/tests/test_data/electron_analyser → dls_dodal-1.57.0/tests/devices/electron_analyser/test_data}/specs_sequence.seq +0 -0
  483. {dls_dodal-1.55.1/tests/test_data/electron_analyser → dls_dodal-1.57.0/tests/devices/electron_analyser/test_data}/vgscienta_sequence.seq +0 -0
  484. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/electron_analyser/test_util.py +0 -0
  485. {dls_dodal-1.55.1/tests/devices/i19 → dls_dodal-1.57.0/tests/devices/electron_analyser/vgscienta}/__init__.py +0 -0
  486. {dls_dodal-1.55.1/tests/devices/mx_phase1 → dls_dodal-1.57.0/tests/devices/i03}/__init__.py +0 -0
  487. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/i03/test_dcm.py +0 -0
  488. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices/i04}/__init__.py +0 -0
  489. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i04/test_murko_results.py +0 -0
  490. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i04/test_transfocator.py +0 -0
  491. {dls_dodal-1.55.1/tests/devices/unit_tests/electron_analyser → dls_dodal-1.57.0/tests/devices/i09}/__init__.py +0 -0
  492. {dls_dodal-1.55.1/tests/devices/i10/lookupTables → dls_dodal-1.57.0/tests/devices/i10/test_data}/IDEnergy2GapCalibrations.csv +0 -0
  493. {dls_dodal-1.55.1/tests/devices/i10/lookupTables → dls_dodal-1.57.0/tests/devices/i10/test_data}/IDEnergy2PhaseCalibrations.csv +0 -0
  494. {dls_dodal-1.55.1/tests/devices/i10/lookupTables → dls_dodal-1.57.0/tests/devices/i10/test_data}/expectedIDEnergy2GapCalibrationsIdd.pkl +0 -0
  495. {dls_dodal-1.55.1/tests/devices/i10/lookupTables → dls_dodal-1.57.0/tests/devices/i10/test_data}/expectedIDEnergy2GapCalibrationsIdu.pkl +0 -0
  496. {dls_dodal-1.55.1/tests/devices/i10/lookupTables → dls_dodal-1.57.0/tests/devices/i10/test_data}/expectedIDEnergy2PhaseCalibrationsidd.pkl +0 -0
  497. {dls_dodal-1.55.1/tests/devices/i10/lookupTables → dls_dodal-1.57.0/tests/devices/i10/test_data}/expectedIDEnergy2PhaseCalibrationsidu.pkl +0 -0
  498. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i13_1/test_merlin.py +0 -0
  499. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i18/test_kb_mirror.py +0 -0
  500. {dls_dodal-1.55.1/tests/devices/unit_tests/electron_analyser/abstract → dls_dodal-1.57.0/tests/devices/i19}/__init__.py +0 -0
  501. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i19/test_beamstop.py +0 -0
  502. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i22/test_dcm.py +0 -0
  503. {dls_dodal-1.55.1/tests/devices/unit_tests/electron_analyser/specs → dls_dodal-1.57.0/tests/devices/i24}/__init__.py +0 -0
  504. {dls_dodal-1.55.1/tests/devices/unit_tests/electron_analyser/vgscienta → dls_dodal-1.57.0/tests/devices/mx_phase1}/__init__.py +0 -0
  505. {dls_dodal-1.55.1/tests/devices/unit_tests/i03 → dls_dodal-1.57.0/tests/devices/oav}/__init__.py +0 -0
  506. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/oav/image_recognition/test_pin_tip_detect.py +0 -0
  507. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/oav/image_recognition/test_pin_tip_detect_utils.py +0 -0
  508. {dls_dodal-1.55.1/tests/test_data/test_images → dls_dodal-1.57.0/tests/devices/oav/test_data}/oav_snapshot_expected.png +0 -0
  509. {dls_dodal-1.55.1/tests/test_data/test_images → dls_dodal-1.57.0/tests/devices/oav/test_data}/oav_snapshot_test.png +0 -0
  510. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices/oav/test_data}/test_OAVCentring.json +0 -0
  511. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/oav/test_grid_overlay.py +0 -0
  512. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/p99/test_p99_stage.py +0 -0
  513. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_aperture.py +0 -0
  514. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_attenuator.py +0 -0
  515. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_bart_robot.py +0 -0
  516. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_beam_converter.py +0 -0
  517. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/test_common_dcm.py +0 -0
  518. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_daq_configuration/domain/beamlineParameters +0 -0
  519. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_daq_configuration/lookup/BeamLineEnergy_DCM_Pitch_converter.txt +0 -0
  520. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_daq_configuration/lookup/BeamLineEnergy_DCM_Roll_converter.txt +0 -0
  521. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices/test_data}/test_beamline_undulator_to_gap_lookup_table.txt +0 -0
  522. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices/test_data}/test_lookup_table.txt +0 -0
  523. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/test_diamond_filter.py +0 -0
  524. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_odin.py +0 -0
  525. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_positioner.py +0 -0
  526. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_qbpm.py +0 -0
  527. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_slits.py +0 -0
  528. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_status.py +0 -0
  529. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_watsonmarlow323_pump.py +0 -0
  530. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_xspress3.py +0 -0
  531. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_zebra_constants_mapping.py +0 -0
  532. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_zebra_shutter.py +0 -0
  533. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_zocalo_interaction.py +0 -0
  534. {dls_dodal-1.55.1/tests/devices/unit_tests/i09 → dls_dodal-1.57.0/tests/devices/util}/__init__.py +0 -0
  535. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/util/test_adjuster_plans.py +0 -0
  536. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/util/test_beamline_specific_utils.py +0 -0
  537. {dls_dodal-1.55.1/tests → dls_dodal-1.57.0/tests/devices/util}/test_data/test_beamline_dcm_roll_converter.txt +0 -0
  538. {dls_dodal-1.55.1/tests → dls_dodal-1.57.0/tests/devices/util}/test_data/test_beamline_dcm_roll_converter_non_monotonic.txt +0 -0
  539. {dls_dodal-1.55.1/tests → dls_dodal-1.57.0/tests/devices/util}/test_data/test_beamline_dcm_roll_converter_reversed.txt +0 -0
  540. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/util/test_save_panda.py +0 -0
  541. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_beamline.py +0 -0
  542. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_beamline_all_devices_raise_exception.py +0 -0
  543. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_beamline_broken_dependency.py +0 -0
  544. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_beamline_dependencies.py +0 -0
  545. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_beamline_disordered_dependencies.py +0 -0
  546. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_beamline_misbehaving_builtins.py +0 -0
  547. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_beamline_some_devices_working.py +0 -0
  548. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_device_factory_beamline.py +0 -0
  549. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_zocalo/README.rst +0 -0
  550. {dls_dodal-1.55.1/tests/devices/unit_tests/i24 → dls_dodal-1.57.0/tests/fake_zocalo}/__init__.py +0 -0
  551. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_zocalo/__main__.py +0 -0
  552. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_zocalo/dls_start_fake_zocalo.sh +0 -0
  553. {dls_dodal-1.55.1/tests/devices/unit_tests/oav → dls_dodal-1.57.0/tests/plan_stubs}/__init__.py +0 -0
  554. {dls_dodal-1.55.1/tests → dls_dodal-1.57.0/tests/plan_stubs}/test_data/topup_long_delay.txt +0 -0
  555. {dls_dodal-1.55.1/tests → dls_dodal-1.57.0/tests/plan_stubs}/test_data/topup_short_params.txt +0 -0
  556. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plans/test_compliance.py +0 -0
  557. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plans/test_configure_arm_trigger_and_disarm_detector.py +0 -0
  558. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plans/test_preprocessors/test_verify_undulator_gap.py +0 -0
  559. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plans/test_scanspec.py +0 -0
  560. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plans/test_verify_undulator_gap_plan.py +0 -0
  561. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plans/test_wrapped.py +0 -0
  562. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/preprocessors/test_filesystem_metadata.py +0 -0
  563. {dls_dodal-1.55.1/tests/unit_tests → dls_dodal-1.57.0/tests}/test_cli.py +0 -0
  564. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/test_data/bad_beamlineParameters +0 -0
  565. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/test_data/i04_beamlineParameters +0 -0
  566. {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/test_data/test_beamline_parameters.txt +0 -0
  567. {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/test_data}/test_display.configuration +0 -0
  568. /dls_dodal-1.55.1/tests/devices/unit_tests/test_jCameraManZoomLevels.xml → /dls_dodal-1.57.0/tests/test_data/test_oav_zoom_levels.xml +0 -0
  569. {dls_dodal-1.55.1/tests/unit_tests → dls_dodal-1.57.0/tests}/test_log.py +0 -0
@@ -19,7 +19,7 @@ jobs:
19
19
  strategy:
20
20
  matrix:
21
21
  runs-on: ["ubuntu-latest"] # can add windows-latest, macos-latest
22
- python-version: ["3.11", "3.12"]
22
+ python-version: ["3.11", "3.12", "3.13"]
23
23
  include:
24
24
  # Include one that runs in the dev environment
25
25
  - runs-on: "ubuntu-latest"
@@ -31,7 +31,7 @@ repos:
31
31
  types: [python]
32
32
  require_serial: false
33
33
 
34
- - repo: https://github.com/thoughtworks/talisman
35
- rev: v1.37.0
34
+ - repo: https://github.com/gitleaks/gitleaks
35
+ rev: v8.28.0
36
36
  hooks:
37
- - id: talisman-commit
37
+ - id: gitleaks
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dls-dodal
3
- Version: 1.55.1
3
+ Version: 1.57.0
4
4
  Summary: Ophyd devices and other utils that could be used across DLS beamlines
5
5
  Author-email: Dominic Oram <dominic.oram@diamond.ac.uk>, Joseph Ware <joseph.ware@diamond.ac.uk>, Oliver Silvester <Oliver.Silvester@diamond.ac.uk>, Noemi Frisina <noemi.frisina@diamond.ac.uk>
6
6
  License: Apache License
@@ -215,8 +215,8 @@ Description-Content-Type: text/markdown
215
215
  License-File: LICENSE
216
216
  Requires-Dist: click
217
217
  Requires-Dist: ophyd
218
- Requires-Dist: ophyd-async[ca,pva]>=0.13.0
219
- Requires-Dist: bluesky
218
+ Requires-Dist: ophyd-async[ca,pva]>=0.13.2
219
+ Requires-Dist: bluesky==1.14.2
220
220
  Requires-Dist: pyepics
221
221
  Requires-Dist: dataclasses-json
222
222
  Requires-Dist: pillow
@@ -14,6 +14,12 @@ from ophyd_async.core import (
14
14
  PathInfo,
15
15
  PathProvider,
16
16
  )
17
+ from tests.devices.i10.test_data import LOOKUP_TABLE_PATH
18
+ from tests.devices.test_daq_configuration import MOCK_DAQ_CONFIG_PATH
19
+ from tests.test_data import (
20
+ TEST_DISPLAY_CONFIG,
21
+ TEST_OAV_ZOOM_LEVELS_XML,
22
+ )
17
23
 
18
24
  from dodal.common.beamlines import beamline_utils
19
25
  from dodal.common.visit import (
@@ -23,12 +29,11 @@ from dodal.common.visit import (
23
29
  )
24
30
  from dodal.log import LOGGER, GELFTCPHandler, set_up_all_logging_handlers
25
31
 
26
- MOCK_DAQ_CONFIG_PATH = "tests/devices/unit_tests/test_daq_configuration"
27
32
  mock_paths = [
28
33
  ("DAQ_CONFIGURATION_PATH", MOCK_DAQ_CONFIG_PATH),
29
- ("ZOOM_PARAMS_FILE", "tests/devices/unit_tests/test_jCameraManZoomLevels.xml"),
30
- ("DISPLAY_CONFIG", "tests/devices/unit_tests/test_display.configuration"),
31
- ("LOOK_UPTABLE_DIR", "tests/devices/i10/lookupTables/"),
34
+ ("ZOOM_PARAMS_FILE", TEST_OAV_ZOOM_LEVELS_XML),
35
+ ("DISPLAY_CONFIG", TEST_DISPLAY_CONFIG),
36
+ ("LOOK_UPTABLE_DIR", LOOKUP_TABLE_PATH),
32
37
  ]
33
38
  mock_attributes_table = {
34
39
  "i03": mock_paths,
@@ -119,8 +124,8 @@ def failed_status(failure: Exception) -> Status:
119
124
  return status
120
125
 
121
126
 
122
- @pytest.fixture
123
- async def RE():
127
+ @pytest.fixture(scope="session", autouse=True)
128
+ async def _ensure_running_bluesky_event_loop():
124
129
  RE = RunEngine()
125
130
  # make sure the event loop is thoroughly up and running before we try to create
126
131
  # any ophyd_async devices which might need it
@@ -129,4 +134,8 @@ async def RE():
129
134
  await asyncio.sleep(0)
130
135
  if time.monotonic() > timeout:
131
136
  raise TimeoutError("This really shouldn't happen but just in case...")
132
- yield RE
137
+
138
+
139
+ @pytest.fixture()
140
+ async def RE():
141
+ yield RunEngine()
@@ -0,0 +1,27 @@
1
+ # 6. Handle devices shared between multiple endstations
2
+
3
+ Date: 2025-08-27
4
+
5
+ ## Status
6
+
7
+ Proposed
8
+
9
+ ## Context
10
+
11
+ Some beamlines have multiple endstations with shared hardware in the optics or experiment hutch, and could potentially be trying to control it at the same time. Any device in the common hutch should only be fully controlled by one endstation at a time - the one that is taking data - but still be readable from the other endstations.
12
+
13
+ ## Decision
14
+
15
+ The current solution is to have a separate blueapi instance for the shared hutch in order to be able to control the access to all the devices defined there.
16
+ For all hardware in the shared optics hutch, the architecture should follow this structure:
17
+
18
+ - There is a base device in dodal that sends a REST call to the shared blueapi with plan and devices names, as well as the name of the endstation performing the call.
19
+ - There are read-only versions of the shared devices in the endstation blueapi which inherit from the base device above and set up the request parameters.
20
+ - The real settable devices are only defined in the shared blueapi and should never be called directly from a plan.
21
+ - The shared blueapi instance also has an ``AccessControl`` device that reads the endstation in use for beamtime from a PV.
22
+ - Every plan should then be wrapped in a decorator that reads the ``AccessControl`` device, check which endstation is making the request and only allows the plan to run if the two values match.
23
+
24
+
25
+ :::{seealso}
26
+ [Optics hutch implementation on I19](https://diamondlightsource.github.io/i19-bluesky/main/explanations/decisions/0004-optics-blueapi-architecture.html) for an example.
27
+ :::
@@ -3,6 +3,10 @@
3
3
 
4
4
  Code coverage is reported to the command line and to a `cov.xml` file by the command `tox -e tests`. The file is uploaded to the Codecov service in CI.
5
5
 
6
+ If you are using VSCode IDE, you can also check code coverage by right-clicking on the test icon and selecting `Run with coverage`. This will re-run the test and highlight line numbers in your file:
7
+ - Green = covered by tests
8
+ - Red = not covered (and ideally should be tested)
9
+
6
10
  ## Adding a Codecov Token
7
11
 
8
12
  If the repo is not hosted in DiamondLightSource, then you need to visit `https://app.codecov.io/account/gh/<org_name>/org-upload-token` to generate a token for your org, and store it as a secret named `CODECOV_TOKEN` in `https://github.com/organizations/<org_name>/settings/secrets/actions`
@@ -1,13 +1,11 @@
1
- Creating a new beamline
2
- =======================
1
+ # Creating a new beamline
3
2
 
4
3
  A beamline is a collection of devices that can be used together to run experiments, they may be read-only or capable of being set.
5
4
  They include motors in the experiment hutch, optical components in the optics hutch, the synchrotron "machine" and more.
6
5
 
7
- Beamline Modules
8
- ----------------
6
+ ## Beamline Modules
9
7
 
10
- Each beamline should have its own file in the ``dodal.beamlines`` folder, in which the particular devices for the
8
+ Each beamline should have its own file in the ``dodal.beamlines`` folder, in which the particular devices for the
11
9
  beamline are instantiated. The file should be named after the colloquial name for the beamline. For example:
12
10
 
13
11
  * ``i03.py``
@@ -16,14 +14,14 @@ beamline are instantiated. The file should be named after the colloquial name fo
16
14
 
17
15
  Beamline modules (in ``dodal.beamlines``) are code-as-configuration. They define the set of devices and common device
18
16
  settings needed for a particular beamline or group of similar beamlines (e.g. a beamline and its digital twin). Some
19
- of our tooling depends on the convention of *only* beamline modules going in this package. Common utilities should
17
+ of our tooling depends on the convention of *only* beamline modules going in this package. Common utilities should
20
18
  go somewhere else e.g. ``dodal.utils`` or ``dodal.beamlines.common``.
21
19
 
22
20
  The following example creates a fictitious beamline ``w41``, with a simulated twin ``s41``.
23
21
  ``w41`` needs to monitor the status of the Synchrotron and has an AdAravisDetector.
24
22
  ``s41`` has a simulated clone of the AdAravisDetector, but not of the Synchrotron machine.
25
23
 
26
- .. code-block:: python
24
+ ```python
27
25
 
28
26
  from ophyd_async.epics.adaravis import AravisDetector
29
27
 
@@ -85,3 +83,4 @@ The following example creates a fictitious beamline ``w41``, with a simulated tw
85
83
  drv_suffix=CAM_SUFFIX,
86
84
  fileio_suffix=HDF5_SUFFIX,
87
85
  )
86
+ ```
@@ -0,0 +1,66 @@
1
+ Creating a new device
2
+ ---------------------
3
+
4
+ Devices in dodal use the ophyd-async framework for hardware abstraction at Diamond Light Source. Before starting, [review where your code should live](../reference/device-standards.rst#where_to_put_devices) to avoid duplication and ensure maintainability.
5
+
6
+ Reusing an existing class
7
+ =========================
8
+
9
+ Before creating a new device, always check if a suitable class already exists in dodal or ophyd-async. This helps avoid duplication, ensures maintainability, and leverages tested code.
10
+
11
+ - **Motors:** Use [Motor](https://github.com/bluesky/ophyd-async/blob/main/src/ophyd_async/epics/motor.py) for EPICS motor records.
12
+ - **Storage ring signals:** Use [Synchrotron](https://github.com/DiamondLightSource/dodal/blob/main/src/dodal/devices/synchrotron.py).
13
+ - **AreaDetectors:** Use [StandardDetector](https://github.com/bluesky/ophyd-async/tree/main/src/ophyd_async/epics/adcore) or [adcore](https://github.com/bluesky/ophyd-async/tree/main/src/ophyd_async/epics/adcore).
14
+
15
+ If a compatible device class exists:
16
+ - Use it and add it to the [beamline](./create-beamline.rst) to avoid re-implementation and share improvements.
17
+ - You can use ophyd-async's [DeviceVector](https://blueskyproject.io/ophyd-async/main/explanations/decisions/0006-procedural-device-definitions.html) to handle a collection of identical devices.
18
+ - If a device class only differs by PV address, request an alias in the EPICS IOC support module with the relevant controls support team.
19
+ - If that's not possible (e.g. proprietary support), add configurability to the dodal device class, ensuring defaults match existing patterns and that `dodal connect` still works for current devices.
20
+ - Avoid dynamic attribute assignment (e.g. dicts of motors) as it hinders type checking and plan writing.
21
+ - Use static attributes and type hints for better IDE support and maintainability.
22
+
23
+ Many device classes in `dodal.devices.motors` represent physical relationships between motors, such as `Stage` and `XYStage`.
24
+
25
+ For example, only use `XYStage` for two perpendicular motors (e.g. X and Y axes on a sample table):
26
+ - Do not use `XYStage` for unrelated motors or for motors that move in the same axis (e.g. coarse and fine adjustment).
27
+ - Only a device that represents a group of motors with a physical relationship, should be defined in `motor`.
28
+ - If your class define an `XYStage` but you need extra signals or behaviour, extend the `XYStage` class outside the `motor` module.
29
+
30
+ **Only if no suitable class exists**, create a new device that connects to the required signals. During review, refactor to align with existing devices if needed, using inheritance or composition to deduplicate code.
31
+
32
+ Writing a device class
33
+ ======================
34
+
35
+ To develop a new device, get an initial, working version of your code into the main branch as early as possible. Test it at the beamline, then continuously make and merge small changes into main. This approach prevents pull requests from becoming long-standing issues.
36
+
37
+ - **Follow the [ophyd-async device implementation guide](https://blueskyproject.io/ophyd-async/main/tutorials/implementing-devices.html)** to structure your device code.
38
+ - **Choose the right base class** by consulting the [base class guide](https://blueskyproject.io/ophyd-async/main/how-to/choose-right-baseclass.html), If your device needs to move, you'll need to extend the Movable protocol. For detailed guidance on when and how to do this, refer to the [movable device guide](https://blueskyproject.io/ophyd-async/main/explanations/when-to-extend-movable.html).
39
+ - **Write thorough unit tests** for all expected use cases. Reference the [ophyd-async device test guide](https://blueskyproject.io/ophyd-async/main/tutorials/implementing-devices.html) for best practices.
40
+ - **Validate your device on the beamline** and keep notes of any issues for later fixes.
41
+ - **Make use of type annotations** so that pyright will validate that you are passing around values that ophyd-async will accept.
42
+ - Use `dodal connect <beamline>` to check device connectivity and `cainfo <PV address>` to confirm PVs and datatypes. You can check a PV's datatype by using the `cainfo <PV address>` command. If the datatype is an enum, `caget -d 31 <PV address>` will also display the available enums that the PV takes. Common enums are defined in `ophyd-async.core` for devices to use, but you can define custom ones when suitable (inheriting from `ophyd_async.core` `StrictEnum`, `SupersetEnum` or `SubsetEnum`). The values should be capitalised e.g `ON = "On"`. If the PV expects upper case for the enum (e.g `ON = "ON"`), please speak to the relevant controls engineer(s) to get this changed if possible. For more infomation, please visit [here](https://blueskyproject.io/ophyd-async/main/explanations/decisions/0008-signal-types.html).
43
+
44
+ **Device best practices for Bluesky plans:**
45
+
46
+ - Interact with devices in plans only through the Bluesky [messages protocol](https://blueskyproject.io/bluesky/main/msg.html), such as `yield from bps.abs_set(...)` or `yield Msg("set", ...)`.
47
+ - Avoid calling device methods directly inside plans (e.g. `device.do_thing()`), as this breaks the abstraction and can lead to unpredictable behaviour.
48
+
49
+ Example of what **not** to do:
50
+ ```python
51
+ class MyDevice(Device):
52
+ def do_thing(...):
53
+ ...
54
+
55
+ def my_plan():
56
+ yield from bps.set(...)
57
+ device.do_thing() # This is bad: do not call device methods directly in plans
58
+ ```
59
+
60
+ **Tip:**
61
+
62
+ - If you are unsure how to represent a PV as a Signal, seek feedback early (for example, by opening a draft PR).
63
+ - Whenever possible, merge with existing devices—comprehensive tests help ensure changes do not break current functionality.
64
+ - Document any device-specific quirks or limitations for future maintainers.
65
+
66
+ For further guidance, see the [ophyd-async documentation](https://blueskyproject.io/ophyd-async/main/how-to/choose-interfaces-for-devices.html).
@@ -0,0 +1,94 @@
1
+
2
+ # Moving code from another repo
3
+
4
+ In the process of writing code in other DLS repos you may come to realise that it makes more sense to be in ``dodal``. It is a good idea to keep the history for this code, you can do this by doing the following (we will be using moving devices from https://github.com/DiamondLightSource/hyperion as an example):
5
+
6
+ * Clone the codebase you are copying from:
7
+
8
+ ```bash
9
+ git clone git@github.com:DiamondLightSource/hyperion.git clone_for_history
10
+ cd clone_for_history/
11
+ ```
12
+
13
+ * Remove the remote to avoid any mistaken pushes:
14
+
15
+ ```bash
16
+ git remote rm origin
17
+ ```
18
+
19
+ * Filter out only the directory/file you want to move:
20
+
21
+ ```bash
22
+ pip install git-filter-repo
23
+ git-filter-repo --path file/to/move --path /other/file/to/move -f
24
+ ```
25
+
26
+ * Clean everything up:
27
+
28
+ ```bash
29
+ git reset --hard
30
+ git gc --aggressive
31
+ git prune
32
+ git clean -fd
33
+ ```
34
+
35
+ * Add a note to every commit message to mention it's been moved::
36
+
37
+ ```bash
38
+ git filter-branch --msg-filter 'sed "$ a \
39
+ NOTE: Commit originally came from https://github.com/DiamondLightSource/hyperion"' -f -- --all
40
+ ```
41
+
42
+ * If you have been using Github [issue references](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/autolinked-references-and-urls#issues-and-pull-requests) in the old repository modify these to point to be more explicit (Note that this assumes the old repo uses ``#123`` notation and only ever references issues from it's own repo)::
43
+
44
+ ```bash
45
+ git filter-branch -f --msg-filter 'sed "s|#[0-9]\+|DiamondLightSource/hyperion&|g"' -- --all
46
+ ```
47
+
48
+ * Prepare the code to be in the correct structure for dodal::
49
+
50
+ ```bash
51
+ mkdir -p src/dodal/devices
52
+ mv path/to/device src/dodal/devices/
53
+ ```
54
+
55
+ * At this point it's a good idea to check the log ``git log`` and the general directory structure to ensure it looks mostly correct
56
+
57
+ * Add and commit this (locally)::
58
+
59
+ ```bash
60
+ git add .
61
+ git commit -m "Prepare for import into dodal"
62
+ ```
63
+
64
+ * In a different folder clone ``dodal``, remove the origin (for now) to be safe and create a branch::
65
+
66
+ ```bash
67
+ git clone git@github.com:DiamondLightSource/dodal.git
68
+ cd dodal
69
+ git remote rm origin
70
+ git checkout -b add_code_from_hyperion
71
+ ```
72
+
73
+ * Add the source repo as a remote for ``dodal``::
74
+
75
+ ```bash
76
+ git remote add source /path/to/source/old_repo/.git
77
+ ```
78
+
79
+ * Pull from the source repo::
80
+
81
+ ```bash
82
+ git pull --no-rebase source main --allow-unrelated-histories
83
+ ```
84
+
85
+ * This is another point where it's a good idea to check the log ``git log`` and the general directory structure to ensure it looks mostly correct
86
+
87
+ * Remove the source remote and re-add origin::
88
+
89
+ ```bash
90
+ git remote rm source
91
+ git remote add origin git@github.com:DiamondLightSource/dodal.git
92
+ ```
93
+
94
+ * Tidy up the code so that it fits into the ``dodal`` repo e.g. in the Hyperion case we had to change the tests to import from ``hyperion`` to import from ``dodal`` and add some more dependencies.
@@ -0,0 +1,61 @@
1
+ (using-pytest)=
2
+
3
+ # Running tests
4
+
5
+ Tests can be ran locally via command line or VSCode IDE.
6
+
7
+ ## With VSCode
8
+
9
+ When using the VSCode IDE, it should automatically detect all of your tests and display one of the following icons next to each of them:
10
+ - Grey circle (not run yet)
11
+ - Green circle with a tick (test passed)
12
+ - Red circle with a cross (test failed)
13
+
14
+ You can also check code coverage by right-clicking on the test icon and selecting `Run with coverage`. This will re-run the test and highlight line numbers in your file:
15
+ - Green = covered by tests
16
+ - Red = not covered (and ideally should be tested)
17
+
18
+ To view all tests inside dodal, use the `Test Explorer` panel (flask icon) in VSCode. It displays all of your tests in a hierarchy, which you can run individually or in groups. It also shows the pass/fail icons mentioned above. Clicking on an item will run all tests beneath it in the hierarchy.
19
+
20
+ If you find that your tests are being skipped or not recognised by `pytest`, check for any syntax errors as this will block the tests being found. You can also check to see if there is an error output at the very bottom of the `Test Explorer` panel. This is usually caused by invalid syntax in your test file, or by circular dependencies in the code you are testing.
21
+
22
+ ## Command line
23
+
24
+ ### Unit tests
25
+
26
+ `pytest` will find functions in the project that [look like tests][look like tests], and run them to check for errors.
27
+
28
+ When you have some fully working tests then you can run it with coverage:
29
+
30
+ ```
31
+ $ tox -e tests
32
+ ```
33
+
34
+ It will also report coverage to the command line and to `cov.xml`.
35
+
36
+ [look like tests]: https://docs.pytest.org/explanation/goodpractices.html#test-discovery
37
+ [pytest]: https://pytest.org/
38
+
39
+ ### System tests locally
40
+
41
+ The system tests require the ``example-services`` project:
42
+
43
+ ```commandline
44
+ git clone git@github.com:epics-containers/example-services.git
45
+ ```
46
+
47
+ Then you need to launch some of the example ioc containers. Please note, this requires docker-compose not
48
+ podman-compose:
49
+
50
+ ```commandline
51
+ module load docker-compose
52
+ cd example-services
53
+ . ./environment.sh
54
+ podman compose up -d bl01t-di-cam-01 bl01t-mo-sim-01 ca-gateway
55
+ ```
56
+
57
+ Once this is done, then the system tests can be run:
58
+
59
+ ```commandline
60
+ tox -e system-report
61
+ ```
@@ -0,0 +1,122 @@
1
+ # Writing Tests in This Python Project
2
+
3
+ Testing is essential to maintain the integrity and reliability of the codebase. Follow the guidelines below to write tests for this project effectively.
4
+
5
+ ## Test Organization
6
+
7
+ - **Unit Tests**: Place unit tests for individual components in the `tests` directory, but take care to mirror the file structure of the `src` folder with the corresponding code files. Use the `test_*.py` naming convention for test files.
8
+ - **System Tests**: Tests that interact with DLS infrastructure, network, and filesystem should be placed in the top-level `systems_test` folder. This separation ensures that these tests are easily identifiable and can be run independently from unit tests.
9
+
10
+ Useful functions for testing that can be reused across multiple tests for common devices and for external plan repositories belong in the `dodal/testing` directory. For example, when mocking a `Motor` device, all of the signals will default to zero, which will cause errors when trying to move. The `patch_motor` and `patch_all_motors` functions, found in `dodal.testing`, will populate the mocked motor with useful default values for the signals so that it can still be used in tests.
11
+
12
+
13
+ ## Writing a test for a device
14
+ We aim for high test coverage in dodal with small, modular test functions. To achieve this, we need to test the relevant methods by writing tests for the class/method we are creating or changing, checking for the expected behaviour. We shouldn't need to write tests for parent classes unless we alter their behaviour.
15
+
16
+ Below, a `StandardReadable` example device is defined which also implements the `Stageable` protocol.
17
+
18
+ ```Python
19
+ from bluesky import RunEngine
20
+ from bluesky.protocols import Stageable
21
+ from ophyd_async.core import AsyncStatus, OnOff, StandardReadable
22
+ from ophyd_async.epics.core import epics_signal_rw
23
+
24
+
25
+ class MyDevice(StandardReadable, Stageable):
26
+ """
27
+ Example device demostrating how to test stage, unstage and read methods.
28
+ """
29
+
30
+ def __init__(self, prefix: str, name: str = "") -> None:
31
+ """
32
+ Constructor for setting up instance of device.
33
+
34
+ Parameters:
35
+ prefix: Base PV used for connecting signals.
36
+ name: Name of the device.
37
+ """
38
+ with self.add_children_as_readables():
39
+ self.signal_a = epics_signal_rw(float, prefix + "A")
40
+ self.signal_b = epics_signal_rw(OnOff, prefix + "B")
41
+
42
+ super().__init__(name)
43
+
44
+ @AsyncStatus.wrap
45
+ async def stage(self):
46
+ """
47
+ Setup device by moving signal_a to ON.
48
+ """
49
+ await asyncio.gather(super().stage(), self.signal_b.set(OnOff.ON))
50
+
51
+ @AsyncStatus.wrap
52
+ async def unstage(self):
53
+ """
54
+ Once device is finished, set signal_b back to OFF.
55
+ """
56
+ await asyncio.gather(super().stage(), self.signal_b.set(OnOff.OFF))
57
+ ```
58
+
59
+ In this example, we need to test the `stage` and `unstage` methods. For more complex devices, it is also a good idea to test the `read` method to confirm that we get the expected read signals back when this method is called.
60
+
61
+ We use [pytest](https://docs.pytest.org/en/stable/contents.html) for writing tests in dodal. A core part of this library is the use of fixtures. A fixture is a function decorated with `@pytest.fixture` that provides setup/teardown or reusable test data for your tests. It is defined once and can be reused across multiple tests. Fixtures are mainly used to define devices and then inject them into each test.
62
+
63
+ To help set up a device, they are created with the `init_devices(mock=True)` function from `ophyd_async.core`, which automatically initialises the device in mock mode. The `RunEngine` fixture is passed when creating a device to ensure there is an event loop available when connecting signals. This fixture is defined in `dodal/tests/conftest.py`, which is a special file recognised by `pytest`. It defines fixtures that are automatically available to any test in the same directory (and its subdirectories) without needing to import them. This is useful for defining common setup code once without duplicating it across test files.
64
+
65
+ In order for `pytest` to detect something as a test, a function should begin with `test_*`. The test function should be self-descriptive about what it is testing, and it is acceptable (even encouraged) to have longer names for test functions for clarity.
66
+
67
+ ```Python
68
+ import asyncio
69
+
70
+ import pytest
71
+ from bluesky import RunEngine
72
+ from bluesky import plan_stubs as bps
73
+ from ophyd_async.core import OnOff, init_devices
74
+ from ophyd_async.testing import assert_reading, get_mock_put, partial_reading
75
+ from dodal.device.my_device import MyDevice
76
+
77
+
78
+ # RunEngine is needed to make sure there is an event loop when creating device.
79
+ @pytest.fixture
80
+ async def sim_my_device(RE: RunEngine) -> MyDevice:
81
+ async with init_devices(mock=True):
82
+ sim_my_device = MyDevice("TEST:")
83
+ return sim_my_device
84
+
85
+
86
+ def test_my_device_stage(sim_my_device: MyDevice, RE: RunEngine) -> None:
87
+ RE(bps.stage(sim_my_device, wait=True), wait=True)
88
+ get_mock_put(sim_my_device.signal_b).assert_called_once_with(OnOff.ON, wait=True)
89
+
90
+
91
+ def test_my_device_unstage(sim_my_device: MyDevice, RE: RunEngine) -> None:
92
+ RE(bps.unstage(sim_my_device, wait=True), wait=True)
93
+ get_mock_put(sim_my_device.signal_b).assert_called_once_with(OnOff.OFF, wait=True)
94
+
95
+ ```
96
+
97
+ You should test the output of a device when the device has many signals read and you want to ensure the correct ones are read at the correct times, or when the `read` method of it or one of its signals (e.g. a DerivedSignal) requires testing. Functions are defined in `ophyd-async` to aid with this. `assert_reading` allows us to compare the readings generated from a `Readable` device to the expected results.
98
+
99
+ ```Python
100
+ async def test_my_device_read(sim_my_device: MyDevice, RE: RunEngine) -> None:
101
+ prefix = sim_my_device.name
102
+ await assert_reading(
103
+ sim_my_device,
104
+ {
105
+ f"{prefix}-signal_a": partial_reading(OnOff.ON),
106
+ f"{prefix}-signal_b": partial_reading(0),
107
+ },
108
+ )
109
+ ```
110
+
111
+ `partial_reading` wraps the value given in a mapping like `{"value": ANY}`, so we are actually checking that the reading matches the expected structure.
112
+
113
+ ```Python
114
+ prefix = sim_my_device.name
115
+ await assert_reading(
116
+ sim_my_device,
117
+ {
118
+ f"{prefix}-signal_a" : {"value": OnOff.ON},
119
+ f"{prefix}-signal_b" : {"value": 0},
120
+ }
121
+ )
122
+ ```
@@ -1,32 +1,27 @@
1
- Zocalo Interaction
2
- ==================
1
+ # Zocalo Interaction
3
2
 
4
- .. image:: ../assets/zocalo.png
5
- :alt: Diagram of zocalo
3
+ ![Diagram of zocalo](../assets/zocalo.png)
6
4
 
7
- Zocalo jobs are triggered based on their ISPyB DCID using the ``ZocaloTrigger`` class in a callback subscribed to the
8
- Bluesky plan or ``RunEngine``. These can trigger processing for any kind of job, as zocalo infers the necessary
5
+ Zocalo jobs are triggered based on their ISPyB DCID using the ``ZocaloTrigger`` class in a callback subscribed to the
6
+ Bluesky plan or ``RunEngine``. These can trigger processing for any kind of job, as zocalo infers the necessary
9
7
  processing from data in ISPyB.
10
8
 
11
- Results are received using the ``ZocaloResults`` device, so that they can be read into a plan and used for
12
- decision-making. Currently the ``ZocaloResults`` device is only made to handle X-ray centring results. It subscribes to
9
+ Results are received using the ``ZocaloResults`` device, so that they can be read into a plan and used for
10
+ decision-making. Currently the ``ZocaloResults`` device is only made to handle X-ray centring results. It subscribes to
13
11
  a given zocalo RabbitMQ channel the first time that it is triggered.
14
12
 
15
- Zocalo Service
16
- ==============
13
+ # Zocalo Service
17
14
 
18
- The Zocalo service processes incoming messages using recipes which describe routing of messages between processing
19
- steps. You can see `source for the recipes here`_.
20
-
21
- .. _source for the recipes here: https://gitlab.diamond.ac.uk/scisoft/zocalo/-/tree/master/recipes
15
+ The Zocalo service processes incoming messages using recipes which describe routing of messages between processing
16
+ steps. You can see [source for the recipes here](https://gitlab.diamond.ac.uk/scisoft/zocalo/-/tree/master/recipes).
22
17
 
23
18
  You can find more information about Zocalo at https://confluence.diamond.ac.uk/display/SSCC/How+to+create+an+MX+processing+pipeline
24
19
 
25
- Gridscans
26
- ---------
20
+ ## Gridscans
27
21
 
28
- The Zocalo Service receives messages of the following form for both the xy and xz gridscans::
22
+ The Zocalo Service receives messages of the following form for both the xy and xz gridscans:
29
23
 
24
+ ```
30
25
  {
31
26
  'recipes': ['mimas'],
32
27
  'parameters': {
@@ -39,9 +34,11 @@ The Zocalo Service receives messages of the following form for both the xy and x
39
34
  'guid': 'd6f117bb-c856-4df8-b9bc-2d3c625e9fd5'
40
35
  }
41
36
  }
37
+ ```
42
38
 
43
- Zocalo is then sent stop messages::
39
+ Zocalo is then sent stop messages:
44
40
 
41
+ ```
45
42
  {
46
43
  'recipes': ['mimas'],
47
44
  'parameters': {
@@ -50,22 +47,22 @@ Zocalo is then sent stop messages::
50
47
  'guid': '9a96e59c-da30-494c-8380-c7a5c828c2c9'
51
48
  },
52
49
  }
50
+ ```
53
51
 
54
52
  these tell zocalo that the data is now ready to be processed.
55
53
 
56
54
  Zocalo then uses the ISPyB DataCollection ID to fetch the corresponding info from ISPyB
57
55
 
58
- The messages that zocalo receives can be found in Graylog in the Zocalo stream, from there you can find the log of
56
+ The messages that zocalo receives can be found in Graylog in the Zocalo stream, from there you can find the log of
59
57
  the recipe processing using the path to the logbook that comes from messages like these::
60
58
  Message saved in logbook at /dls/tmp/zocalo/dispatcher/2024-12/cb/62d35b-7cc9-4f1b-868b-712e82aa0271
61
59
 
62
- From the zocalo graylog you can also see that once the gridscan nexus file is picked up (for the CPU gridscan) it
63
- starts a recipe::
60
+ From the zocalo graylog you can also see that once the gridscan nexus file is picked up (for the CPU gridscan) it
61
+ starts a recipe:
64
62
 
63
+ ```
65
64
  {'recipes': ['per-image-analysis-gridscan-i03-no-really'], 'parameters': {'ispyb_dcid': 16085803, 'filename': '{filename}', 'start_frame_index': '{start_frame_index}', 'number_of_frames': '{number_of_frames}', 'message_index': '{message_index}', 'guid': 'd10f8b8c-57a5-4dc4-acaf-a22f8d2bbf60'}, 'recipe': <workflows.recipe.recipe.Recipe object at 0x7f0587f13110>}
65
+ ```
66
66
 
67
-
68
- If you look at the recipe json, Zocalo then runs Per-Image-Analysis on each frame and then assembles the results in
69
- the `DLS X-Ray Centring service`_.
70
-
71
- .. _DLS X-Ray Centring service: https://github.com/DiamondLightSource/python-dlstbx/blob/a8fcbd30335bf13f5e35df78badfc60397500535/src/dlstbx/services/xray_centering.py
67
+ If you look at the recipe json, Zocalo then runs Per-Image-Analysis on each frame and then assembles the results in
68
+ the [DLS X-Ray Centring service](https://github.com/DiamondLightSource/python-dlstbx/blob/a8fcbd30335bf13f5e35df78badfc60397500535/src/dlstbx/services/xray_centering.py).