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.
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/workflows/ci.yml +1 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.pre-commit-config.yaml +3 -3
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/PKG-INFO +3 -3
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/conftest.py +16 -7
- dls_dodal-1.57.0/docs/explanations/decisions/0006-devices-shared-between-endstations.md +27 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/coverage.md +4 -0
- dls_dodal-1.55.1/docs/how-to/create-beamline.rst → dls_dodal-1.57.0/docs/how-to/create-beamline.md +6 -7
- dls_dodal-1.57.0/docs/how-to/create-device.md +66 -0
- dls_dodal-1.57.0/docs/how-to/move-code.md +94 -0
- dls_dodal-1.57.0/docs/how-to/run-tests.md +61 -0
- dls_dodal-1.57.0/docs/how-to/write-tests.md +122 -0
- dls_dodal-1.55.1/docs/how-to/zocalo.rst → dls_dodal-1.57.0/docs/how-to/zocalo.md +23 -26
- dls_dodal-1.55.1/docs/reference/device-standards.rst → dls_dodal-1.57.0/docs/reference/device-standards.md +49 -54
- dls_dodal-1.57.0/docs/reference/standards.md +68 -0
- dls_dodal-1.57.0/docs/tutorials/get_started.md +49 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/pyproject.toml +2 -2
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dls_dodal.egg-info/PKG-INFO +3 -3
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dls_dodal.egg-info/SOURCES.txt +160 -132
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dls_dodal.egg-info/requires.txt +2 -2
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/_version.py +16 -3
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/b01_1.py +6 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/b07.py +2 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/b07_1.py +2 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/b21.py +4 -24
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i03.py +53 -53
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i04.py +16 -38
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i09.py +3 -2
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i09_1.py +2 -1
- dls_dodal-1.57.0/src/dodal/beamlines/i11.py +143 -0
- dls_dodal-1.57.0/src/dodal/beamlines/i17.py +37 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i19_1.py +1 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i19_2.py +7 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i22.py +5 -5
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i23.py +3 -3
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i24.py +6 -33
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/p38.py +1 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/p60.py +3 -2
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/cli.py +11 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/__init__.py +4 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/beamlines/beamline_parameters.py +1 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/beamlines/beamline_utils.py +5 -1
- dls_dodal-1.57.0/src/dodal/common/enums.py +19 -0
- dls_dodal-1.57.0/src/dodal/common/watcher_utils.py +83 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/aithre_lasershaping/laser_robot.py +4 -9
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/aperturescatterguard.py +52 -12
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/apple2_undulator.py +0 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/b16/detector.py +1 -10
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/backlight.py +8 -20
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/bimorph_mirror.py +4 -7
- dls_dodal-1.57.0/src/dodal/devices/collimation_table.py +36 -0
- dls_dodal-1.57.0/src/dodal/devices/controllers.py +21 -0
- dls_dodal-1.57.0/src/dodal/devices/cryostream.py +109 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/current_amplifiers/femto.py +1 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/detector/detector_motion.py +1 -7
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/eiger.py +22 -8
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/eiger_odin.py +2 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/__init__.py +2 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/abstract/__init__.py +0 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/abstract/base_detector.py +3 -25
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/abstract/base_driver_io.py +18 -9
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/abstract/base_region.py +34 -3
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/detector.py +24 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/enums.py +5 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/specs/detector.py +2 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/specs/driver_io.py +21 -26
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/specs/region.py +1 -1
- dls_dodal-1.57.0/src/dodal/devices/electron_analyser/util.py +33 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/vgscienta/__init__.py +3 -3
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/vgscienta/detector.py +2 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/vgscienta/driver_io.py +24 -32
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/vgscienta/enums.py +0 -8
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/vgscienta/region.py +2 -31
- dls_dodal-1.57.0/src/dodal/devices/eurotherm.py +126 -0
- dls_dodal-1.57.0/src/dodal/devices/fluorescence_detector_motion.py +9 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/focusing_mirror.py +1 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i03/undulator_dcm.py +0 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i09/enums.py +8 -8
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/diagnostics.py +4 -4
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/i10_apple2.py +3 -6
- dls_dodal-1.57.0/src/dodal/devices/i11/cyberstar_blower.py +34 -0
- dls_dodal-1.57.0/src/dodal/devices/i11/diff_stages.py +55 -0
- dls_dodal-1.57.0/src/dodal/devices/i11/mythen.py +165 -0
- dls_dodal-1.57.0/src/dodal/devices/i11/nx100robot.py +153 -0
- dls_dodal-1.57.0/src/dodal/devices/i11/spinner.py +30 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i13_1/merlin_controller.py +4 -4
- dls_dodal-1.57.0/src/dodal/devices/i19/diffractometer.py +34 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i19/shutter.py +11 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i22/dcm.py +1 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i22/fswitch.py +3 -12
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i24/aperture.py +3 -3
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i24/beam_center.py +1 -2
- dls_dodal-1.57.0/src/dodal/devices/i24/dcm.py +29 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i24/dual_backlight.py +11 -12
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i24/pmac.py +8 -7
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/mx_phase1/beamstop.py +10 -11
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/pin_image_recognition/__init__.py +0 -3
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/p60/enums.py +8 -8
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/p60/lab_xray_source.py +3 -2
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/pressure_jump_cell.py +77 -123
- dls_dodal-1.57.0/src/dodal/devices/scintillator.py +82 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/smargon.py +35 -18
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/synchrotron.py +1 -2
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/thawer.py +22 -15
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/undulator.py +3 -8
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/util/epics_util.py +1 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/watsonmarlow323_pump.py +7 -7
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/webcam.py +1 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/xbpm_feedback.py +4 -6
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/xspress3/xspress3.py +0 -5
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/zocalo/zocalo_results.py +1 -3
- dls_dodal-1.57.0/src/dodal/testing/__init__.py +3 -0
- dls_dodal-1.57.0/src/dodal/testing/electron_analyser/__init__.py +6 -0
- dls_dodal-1.57.0/src/dodal/testing/electron_analyser/device_factory.py +59 -0
- dls_dodal-1.57.0/src/dodal/testing/setup.py +67 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/system_tests/test_oav_system.py +6 -6
- {dls_dodal-1.55.1/tests/beamlines/unit_tests → dls_dodal-1.57.0/tests/beamlines}/test_b16.py +2 -11
- {dls_dodal-1.55.1/tests/beamlines/unit_tests → dls_dodal-1.57.0/tests/beamlines}/test_i24.py +1 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/common/beamlines/test_beamline_parameters.py +11 -8
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/common/beamlines/test_beamline_utils.py +4 -6
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/common/beamlines/test_device_instantiation.py +2 -2
- dls_dodal-1.57.0/tests/common/test_watcher_utils.py +63 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/conftest.py +4 -4
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/aithre_lasershaping/test_goniometer.py +2 -3
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/b07_1/test_ccmc.py +5 -7
- dls_dodal-1.57.0/tests/devices/detector/test_data/__init__.py +7 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/detector/test_det_resolution.py +4 -1
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/detector/test_detector.py +2 -1
- dls_dodal-1.57.0/tests/devices/electron_analyser/abstract/test_base_detector.py +93 -0
- {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
- {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
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/electron_analyser/conftest.py +8 -6
- dls_dodal-1.57.0/tests/devices/electron_analyser/helper_util/__init__.py +8 -0
- dls_dodal-1.57.0/tests/devices/electron_analyser/helper_util/assert_func.py +16 -0
- dls_dodal-1.57.0/tests/devices/electron_analyser/helper_util/sequence.py +34 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/electron_analyser/specs/test_detector.py +10 -10
- {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
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/electron_analyser/specs/test_region.py +8 -8
- dls_dodal-1.57.0/tests/devices/electron_analyser/test_data/__init__.py +8 -0
- 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
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/electron_analyser/vgscienta/test_detector.py +9 -8
- {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
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/electron_analyser/vgscienta/test_region.py +9 -35
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/i03/test_undulator_dcm.py +20 -12
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/i09/test_dcm.py +1 -2
- dls_dodal-1.57.0/tests/devices/i10/test_data/__init__.py +32 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i10/test_i10Apple2.py +28 -20
- dls_dodal-1.57.0/tests/devices/i11/test_i11devices.py +201 -0
- dls_dodal-1.57.0/tests/devices/i11/test_mythen.py +82 -0
- dls_dodal-1.57.0/tests/devices/i19/test_diffractometer.py +36 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i19/test_shutter.py +5 -5
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i22/test_fswitch.py +5 -4
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i22/test_metadataholder.py +1 -1
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/i24/test_dual_backlight.py +18 -12
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/i24/test_focus_mirrors.py +3 -2
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/i24/test_pmac.py +24 -14
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/i24/test_vgonio.py +4 -3
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/mx_phase1/test_beamstop.py +21 -18
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/oav/conftest.py +4 -6
- dls_dodal-1.57.0/tests/devices/oav/test_data/__init__.py +13 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/oav/test_oav.py +5 -5
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/oav/test_oav_parameters.py +8 -7
- {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
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/oav/test_oav_utils.py +3 -3
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/oav/test_snapshot_image_processing.py +6 -2
- dls_dodal-1.57.0/tests/devices/oav/test_snapshots.py +188 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/p60/test_lab_xray_source.py +2 -6
- dls_dodal-1.57.0/tests/devices/test.png +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_aperture_scatterguard.py +137 -10
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_apple2_undulator.py +4 -4
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_backlight.py +17 -17
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_baton.py +1 -2
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_bimorph_mirror.py +1 -2
- dls_dodal-1.57.0/tests/devices/test_controllers.py +16 -0
- dls_dodal-1.57.0/tests/devices/test_daq_configuration/__init__.py +6 -0
- dls_dodal-1.57.0/tests/devices/test_daq_configuration/domain/__init__.py +10 -0
- dls_dodal-1.57.0/tests/devices/test_daq_configuration/lookup/__init__.py +17 -0
- dls_dodal-1.57.0/tests/devices/test_data/__init__.py +13 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_eiger.py +7 -4
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_focusing_mirror.py +3 -9
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_gridscan.py +3 -3
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_hutch_shutter.py +1 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/test_motors.py +77 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_pressure_jump_cell.py +192 -49
- dls_dodal-1.57.0/tests/devices/test_scintillator.py +97 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_smargon.py +63 -5
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_synchrotron.py +8 -8
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_tetramm.py +1 -3
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_thawer.py +68 -15
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_turbo_slit.py +13 -15
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_undulator.py +10 -8
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_utils.py +1 -1
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_webcam.py +63 -5
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_xbpm_feedback.py +2 -2
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_zebra.py +2 -3
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_zocalo_results.py +1 -1
- dls_dodal-1.57.0/tests/devices/util/test_data/__init__.py +19 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/util/test_lookup_tables.py +32 -15
- dls_dodal-1.57.0/tests/plan_stubs/test_data/__init__.py +11 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plan_stubs/test_data_session.py +8 -1
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plan_stubs/test_motor_util_plans.py +11 -9
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plan_stubs/test_topup_plan.py +24 -19
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plan_stubs/test_wrapped_stubs.py +2 -3
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plans/conftest.py +7 -10
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plans/test_bimorph.py +6 -13
- dls_dodal-1.57.0/tests/test_data/__init__.py +17 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/test_utils.py +5 -12
- dls_dodal-1.55.1/.talismanrc +0 -10
- dls_dodal-1.55.1/docs/how-to/create-device.md +0 -32
- dls_dodal-1.55.1/docs/how-to/move-code.rst +0 -73
- dls_dodal-1.55.1/docs/how-to/run-tests.md +0 -44
- dls_dodal-1.55.1/docs/how-to/write-tests.md +0 -8
- dls_dodal-1.55.1/docs/reference/standards.rst +0 -77
- dls_dodal-1.55.1/docs/tutorials/get_started.rst +0 -52
- dls_dodal-1.55.1/src/dodal/devices/CTAB.py +0 -41
- dls_dodal-1.55.1/src/dodal/devices/cryostream.py +0 -19
- dls_dodal-1.55.1/src/dodal/devices/electron_analyser/util.py +0 -13
- dls_dodal-1.55.1/src/dodal/devices/fluorescence_detector_motion.py +0 -16
- dls_dodal-1.55.1/src/dodal/devices/i24/dcm.py +0 -33
- dls_dodal-1.55.1/src/dodal/devices/i24/pilatus_metadata.py +0 -44
- dls_dodal-1.55.1/src/dodal/devices/scintillator.py +0 -10
- dls_dodal-1.55.1/src/dodal/devices/util/test_utils.py +0 -37
- dls_dodal-1.55.1/tests/constants.py +0 -3
- dls_dodal-1.55.1/tests/devices/unit_tests/electron_analyser/util.py +0 -86
- dls_dodal-1.55.1/tests/devices/unit_tests/i24/test_pilatus_metadata.py +0 -24
- dls_dodal-1.55.1/tests/devices/unit_tests/oav/test_snapshots.py +0 -162
- dls_dodal-1.55.1/tests/devices/unit_tests/test_lookup_table_2.txt +0 -5
- dls_dodal-1.55.1/tests/devices/unit_tests/test_motors.py +0 -82
- dls_dodal-1.55.1/tests/devices/unit_tests/util/__init__.py +0 -0
- dls_dodal-1.55.1/tests/fake_zocalo/__init__.py +0 -0
- dls_dodal-1.55.1/tests/unit_tests/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.copier-answers.yml +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.devcontainer/devcontainer.json +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/CODEOWNERS +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/CONTRIBUTING.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/ISSUE_TEMPLATE/issue_template.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/actions/install_requirements/action.yml +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/dependabot.yml +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/pages/index.html +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/pages/make_switcher.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/scripts/check_test_durations.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/workflows/_dist.yml +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/workflows/_docs.yml +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/workflows/_pypi.yml +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/workflows/_release.yml +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/workflows/_test.yml +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/workflows/_tox.yml +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.github/workflows/periodic.yml +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.gitignore +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.vscode/extensions.json +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.vscode/launch.json +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.vscode/settings.json +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/.vscode/tasks.json +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/Dockerfile +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/LICENSE +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/README.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/catalog-info.yaml +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/_templates/autosummary/class.rst +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/_templates/autosummary/module.rst +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/_templates/custom-module-template.rst +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/assets/where-to-put-dodal-logic.png +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/assets/zocalo.png +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/conf.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/decisions/0003-codeowners.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/decisions/0004-make-devices-factory.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/decisions/0005-standardise-devices-at-epics-level.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/decisions/COPYME +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/decisions.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/reviews.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/umls/apple2_design.png +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations/umls/i10_id_design.png +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/explanations.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/genindex.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/build-docs.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/contribute.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/dev-install.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/excalidraw.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/external-io-devices.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/lint.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/lock-requirements.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/make-release.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/pypi.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/static-analysis.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to/update-template.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/how-to.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/images/dls-logo.svg +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/images/excalidraw-example.svg +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/index.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/reference/api.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/reference.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/tutorials/installation.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/docs/tutorials.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/pull_request_template.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/setup.cfg +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dls_dodal.egg-info/dependency_links.txt +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dls_dodal.egg-info/entry_points.txt +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dls_dodal.egg-info/top_level.txt +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/__main__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamline_specific_utils/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamline_specific_utils/i03.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamline_specific_utils/i05_shared.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/README.md +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/adsim.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/aithre.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/b16.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/b18.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i02_1.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i05.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i05_1.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i09_2.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i10.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i13_1.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i18.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i19_optics.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/i20_1.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/k11.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/p45.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/p99.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/beamlines/training_rig.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/beamlines/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/beamlines/device_helpers.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/coordination.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/crystal_metadata.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/data_util.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/device_utils.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/maths.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/types.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/udc_directory_provider.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/common/visit.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/aithre_lasershaping/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/aithre_lasershaping/goniometer.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/aperture.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/areadetector/plugins/CAM.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/areadetector/plugins/MJPG.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/attenuator/attenuator.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/attenuator/filter.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/attenuator/filter_selections.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/b07/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/b07/enums.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/b07_1/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/b07_1/ccmc.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/b07_1/enums.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/b16/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/baton.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/common_dcm.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/current_amplifiers/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/current_amplifiers/current_amplifier.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/current_amplifiers/current_amplifier_detector.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/current_amplifiers/sr570.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/current_amplifiers/struck_scaler_counter.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/detector/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/detector/det_dim_constants.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/detector/det_dist_to_beam_converter.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/detector/det_resolution.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/detector/detector.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/diamond_filter.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/abstract/types.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/specs/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/specs/enums.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/electron_analyser/types.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/fast_grid_scan.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/flux.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/hutch_shutter.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i03/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i03/dcm.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i04/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i04/constants.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i04/murko_results.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i04/transfocator.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i05/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i05/enums.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i09/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i09/dcm.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i09_1/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i09_1/enums.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/i10_setting_data.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/mirrors.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/rasor/rasor_current_amp.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/rasor/rasor_motors.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/rasor/rasor_scaler_cards.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i10/slits.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i13_1/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i13_1/merlin.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i18/KBMirror.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i18/diode.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i19/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i19/beamstop.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i19/blueapi_device.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i19/hutch_access.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i20_1/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i22/nxsas.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i24/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i24/beamstop.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i24/focus_mirrors.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/i24/vgonio.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/ipin.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/linkam3.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/motors.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/oav_calculations.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/oav_detector.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/oav_parameters.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/oav_to_redis_forwarder.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/pin_image_recognition/manual_test.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/pin_image_recognition/utils.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/snapshots/grid_overlay.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/snapshots/snapshot.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/snapshots/snapshot_image_processing.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/snapshots/snapshot_with_grid.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/oav/utils.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/p45.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/p60/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/p99/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/p99/andor2_point.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/p99/sample_stage.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/pgm.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/positioner.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/qbpm.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/robot.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/s4_slit_gaps.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/slits.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/status.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/tetramm.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/turbo_slit.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/util/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/util/adjuster_plans.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/util/lookup_tables.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/xspress3/xspress3_channel.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/zebra/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/zebra/zebra.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/zebra/zebra_constants_mapping.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/zebra/zebra_controlled_shutter.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/zocalo/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/zocalo/zocalo_constants.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/devices/zocalo/zocalo_interaction.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/log.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/parameters/experiment_parameter_base.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plan_stubs/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plan_stubs/check_topup.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plan_stubs/data_session.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plan_stubs/motor_utils.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plan_stubs/wrapped.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/bimorph.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/configure_arm_trigger_and_disarm_detector.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/preprocessors/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/preprocessors/verify_undulator_gap.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/save_panda.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/scanspec.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/verify_undulator_gap.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/plans/wrapped.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/src/dodal/utils.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/system_tests/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/system_tests/test_adsim.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/system_tests/test_cli.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/system_tests/test_oav_to_redis_system.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/beamlines/__init__.py +0 -0
- {dls_dodal-1.55.1/tests/beamlines/unit_tests → dls_dodal-1.57.0/tests/beamlines}/test_i03.py +0 -0
- {dls_dodal-1.55.1/tests/beamlines/unit_tests → dls_dodal-1.57.0/tests/beamlines}/test_mapping.py +0 -0
- {dls_dodal-1.55.1/tests/beamlines/unit_tests → dls_dodal-1.57.0/tests/common}/__init__.py +0 -0
- {dls_dodal-1.55.1/tests/common → dls_dodal-1.57.0/tests/common/beamlines}/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/common/test_coordination.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/common/test_crystal_metadata.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/common/test_maths.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/common/test_udc_directory_provider.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/common/test_visit.py +0 -0
- {dls_dodal-1.55.1/tests/common/beamlines → dls_dodal-1.57.0/tests/devices}/__init__.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/current_amplifier/test_femto.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/current_amplifier/test_sr570.py +0 -0
- {dls_dodal-1.55.1/tests → dls_dodal-1.57.0/tests/devices/detector}/test_data/test_det_dist_converter.txt +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/detector/test_det_dim_constants.py +0 -0
- {dls_dodal-1.55.1/tests/devices → dls_dodal-1.57.0/tests/devices/electron_analyser}/__init__.py +0 -0
- {dls_dodal-1.55.1/tests/devices/i03 → dls_dodal-1.57.0/tests/devices/electron_analyser/abstract}/__init__.py +0 -0
- {dls_dodal-1.55.1/tests/devices/i04 → dls_dodal-1.57.0/tests/devices/electron_analyser/specs}/__init__.py +0 -0
- {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
- {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
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/electron_analyser/test_util.py +0 -0
- {dls_dodal-1.55.1/tests/devices/i19 → dls_dodal-1.57.0/tests/devices/electron_analyser/vgscienta}/__init__.py +0 -0
- {dls_dodal-1.55.1/tests/devices/mx_phase1 → dls_dodal-1.57.0/tests/devices/i03}/__init__.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/i03/test_dcm.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices/i04}/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i04/test_murko_results.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i04/test_transfocator.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests/electron_analyser → dls_dodal-1.57.0/tests/devices/i09}/__init__.py +0 -0
- {dls_dodal-1.55.1/tests/devices/i10/lookupTables → dls_dodal-1.57.0/tests/devices/i10/test_data}/IDEnergy2GapCalibrations.csv +0 -0
- {dls_dodal-1.55.1/tests/devices/i10/lookupTables → dls_dodal-1.57.0/tests/devices/i10/test_data}/IDEnergy2PhaseCalibrations.csv +0 -0
- {dls_dodal-1.55.1/tests/devices/i10/lookupTables → dls_dodal-1.57.0/tests/devices/i10/test_data}/expectedIDEnergy2GapCalibrationsIdd.pkl +0 -0
- {dls_dodal-1.55.1/tests/devices/i10/lookupTables → dls_dodal-1.57.0/tests/devices/i10/test_data}/expectedIDEnergy2GapCalibrationsIdu.pkl +0 -0
- {dls_dodal-1.55.1/tests/devices/i10/lookupTables → dls_dodal-1.57.0/tests/devices/i10/test_data}/expectedIDEnergy2PhaseCalibrationsidd.pkl +0 -0
- {dls_dodal-1.55.1/tests/devices/i10/lookupTables → dls_dodal-1.57.0/tests/devices/i10/test_data}/expectedIDEnergy2PhaseCalibrationsidu.pkl +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i13_1/test_merlin.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i18/test_kb_mirror.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests/electron_analyser/abstract → dls_dodal-1.57.0/tests/devices/i19}/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i19/test_beamstop.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/i22/test_dcm.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests/electron_analyser/specs → dls_dodal-1.57.0/tests/devices/i24}/__init__.py +0 -0
- {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
- {dls_dodal-1.55.1/tests/devices/unit_tests/i03 → dls_dodal-1.57.0/tests/devices/oav}/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices/oav/test_data}/test_OAVCentring.json +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/oav/test_grid_overlay.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/p99/test_p99_stage.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_aperture.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_attenuator.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_bart_robot.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_beam_converter.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/test_common_dcm.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_daq_configuration/domain/beamlineParameters +0 -0
- {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
- {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
- {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
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices/test_data}/test_lookup_table.txt +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/devices/test_diamond_filter.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_odin.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_positioner.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_qbpm.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_slits.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_status.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_watsonmarlow323_pump.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_xspress3.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_zebra_constants_mapping.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_zebra_shutter.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/test_zocalo_interaction.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests/i09 → dls_dodal-1.57.0/tests/devices/util}/__init__.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/util/test_adjuster_plans.py +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/util/test_beamline_specific_utils.py +0 -0
- {dls_dodal-1.55.1/tests → dls_dodal-1.57.0/tests/devices/util}/test_data/test_beamline_dcm_roll_converter.txt +0 -0
- {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
- {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
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/devices}/util/test_save_panda.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_beamline.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_beamline_all_devices_raise_exception.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_beamline_broken_dependency.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_beamline_dependencies.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_beamline_disordered_dependencies.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_beamline_misbehaving_builtins.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_beamline_some_devices_working.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_device_factory_beamline.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_zocalo/README.rst +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests/i24 → dls_dodal-1.57.0/tests/fake_zocalo}/__init__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_zocalo/__main__.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/fake_zocalo/dls_start_fake_zocalo.sh +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests/oav → dls_dodal-1.57.0/tests/plan_stubs}/__init__.py +0 -0
- {dls_dodal-1.55.1/tests → dls_dodal-1.57.0/tests/plan_stubs}/test_data/topup_long_delay.txt +0 -0
- {dls_dodal-1.55.1/tests → dls_dodal-1.57.0/tests/plan_stubs}/test_data/topup_short_params.txt +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plans/test_compliance.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plans/test_configure_arm_trigger_and_disarm_detector.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plans/test_preprocessors/test_verify_undulator_gap.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plans/test_scanspec.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plans/test_verify_undulator_gap_plan.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/plans/test_wrapped.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/preprocessors/test_filesystem_metadata.py +0 -0
- {dls_dodal-1.55.1/tests/unit_tests → dls_dodal-1.57.0/tests}/test_cli.py +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/test_data/bad_beamlineParameters +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/test_data/i04_beamlineParameters +0 -0
- {dls_dodal-1.55.1 → dls_dodal-1.57.0}/tests/test_data/test_beamline_parameters.txt +0 -0
- {dls_dodal-1.55.1/tests/devices/unit_tests → dls_dodal-1.57.0/tests/test_data}/test_display.configuration +0 -0
- /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
- {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"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dls-dodal
|
|
3
|
-
Version: 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.
|
|
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",
|
|
30
|
-
("DISPLAY_CONFIG",
|
|
31
|
-
("LOOK_UPTABLE_DIR",
|
|
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
|
|
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
|
-
|
|
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`
|
dls_dodal-1.55.1/docs/how-to/create-beamline.rst → dls_dodal-1.57.0/docs/how-to/create-beamline.md
RENAMED
|
@@ -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
|
-
|
|
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
|
-
|
|
5
|
-
:alt: Diagram of zocalo
|
|
3
|
+

|
|
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
|
|
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
|
-
|
|
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).
|