ophyd-async 0.13.3__tar.gz → 0.13.5__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.
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.copier-answers.yml +1 -1
- ophyd_async-0.13.5/.devcontainer/devcontainer.json +82 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/CONTRIBUTING.md +1 -1
- ophyd_async-0.13.5/.github/renovate.json +53 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/_codeql.yml +2 -2
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/_dist.yml +14 -5
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/_docs.yml +3 -3
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/_test.yml +33 -30
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/_tox.yml +3 -3
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/ci.yml +9 -13
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/periodic.yml +2 -1
- ophyd_async-0.13.5/.gitleaks.toml +19 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.pre-commit-config.yaml +13 -0
- ophyd_async-0.13.5/.python-version +1 -0
- ophyd_async-0.13.5/Dockerfile +10 -0
- {ophyd_async-0.13.3/src/ophyd_async.egg-info → ophyd_async-0.13.5}/PKG-INFO +2 -36
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0009-procedural-vs-declarative-devices.md +9 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/devices-signals-backends.md +1 -1
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/tutorials/writing-tests-for-devices.md +6 -6
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/pyproject.toml +96 -25
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/_version.py +3 -3
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/__init__.py +26 -3
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_derived_signal_backend.py +2 -1
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_detector.py +2 -2
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_device.py +9 -9
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_enums.py +5 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_signal.py +34 -38
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_signal_backend.py +3 -1
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_status.py +2 -2
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_table.py +8 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_utils.py +11 -11
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_core_logic.py +3 -1
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_utils.py +4 -4
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/core/_aioca.py +2 -2
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/core/_p4p.py +2 -2
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/motor.py +28 -7
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/pmac/_pmac_io.py +8 -4
- ophyd_async-0.13.5/src/ophyd_async/epics/pmac/_pmac_trajectory.py +217 -0
- ophyd_async-0.13.5/src/ophyd_async/epics/pmac/_pmac_trajectory_generation.py +692 -0
- ophyd_async-0.13.5/src/ophyd_async/epics/pmac/_utils.py +167 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/jungfrau/__init__.py +2 -1
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/jungfrau/_controller.py +29 -11
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/jungfrau/_utils.py +10 -2
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/panda/__init__.py +10 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/panda/_block.py +14 -0
- ophyd_async-0.13.5/src/ophyd_async/fastcs/panda/_trigger.py +223 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_motor.py +4 -2
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_stage.py +14 -4
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/core/__init__.py +17 -3
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/core/_signal.py +18 -22
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/core/_tango_transport.py +407 -239
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/core/_utils.py +9 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/demo/_mover.py +1 -2
- ophyd_async-0.13.5/src/ophyd_async/tango/testing/__init__.py +7 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/testing/_one_of_everything.py +13 -5
- ophyd_async-0.13.5/src/ophyd_async/tango/testing/_test_config.py +11 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/testing/_assert.py +2 -2
- {ophyd_async-0.13.3 → ophyd_async-0.13.5/src/ophyd_async.egg-info}/PKG-INFO +2 -36
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async.egg-info/SOURCES.txt +92 -86
- ophyd_async-0.13.5/src/ophyd_async.egg-info/requires.txt +27 -0
- ophyd_async-0.13.5/tests/README.md +7 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/tests/conftest.py +22 -7
- {ophyd_async-0.13.3 → ophyd_async-0.13.5/tests}/system_tests/epics/adsim/test_adsim_system.py +6 -1
- {ophyd_async-0.13.3 → ophyd_async-0.13.5/tests}/system_tests/epics/eiger/test_eiger_system.py +58 -2
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/epics/signal/test_signals.py +9 -9
- ophyd_async-0.13.5/tests/system_tests/fastcs/panda/test_panda_connect.py +98 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/tango/conftest.py +61 -24
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/tango/test_base_device.py +152 -25
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/tango/test_tango_signals.py +144 -64
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/tango/test_tango_transport.py +291 -302
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/test_tutorials.py +1 -1
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_auto_init_devices.py +4 -4
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_device.py +9 -9
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_log.py +2 -3
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_multi_derived_signal.py +2 -2
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_providers.py +1 -2
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_signal.py +18 -23
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_single_derived_signal.py +36 -9
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_soft_signal_backend.py +2 -2
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_status.py +2 -2
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_table.py +2 -2
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_utils.py +50 -48
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_watchable_async_status.py +4 -4
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adcore/test_cont_acq_detector.py +8 -8
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adcore/test_writers.py +7 -7
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/demo/test_epics_demo.py +20 -20
- ophyd_async-0.13.5/tests/unit_tests/epics/pmac/conftest.py +34 -0
- ophyd_async-0.13.5/tests/unit_tests/epics/pmac/test_pmac_trajectory.py +211 -0
- ophyd_async-0.13.3/tests/epics/pmac/test_pmac_utils.py → ophyd_async-0.13.5/tests/unit_tests/epics/pmac/test_pmac_trajectory_generation.py +535 -300
- ophyd_async-0.13.5/tests/unit_tests/epics/pmac/test_pmac_utils.py +119 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/pvi/test_pvi.py +4 -4
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/test_motor.py +12 -7
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/jungfrau/test_controller.py +49 -2
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/jungfrau/test_utils.py +4 -2
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/panda/db/panda.db +12 -1
- ophyd_async-0.13.3/tests/fastcs/panda/test_panda_connect.py → ophyd_async-0.13.5/tests/unit_tests/fastcs/panda/test_panda_connect_mock.py +2 -68
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/panda/test_panda_control.py +10 -10
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/panda/test_panda_utils.py +4 -1
- ophyd_async-0.13.5/tests/unit_tests/fastcs/panda/test_trigger.py +351 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/plan_stubs/test_ensure_connected.py +4 -4
- ophyd_async-0.13.5/tests/unit_tests/test_branching.py +52 -0
- ophyd_async-0.13.5/uv.lock +3247 -0
- ophyd_async-0.13.3/.devcontainer/devcontainer.json +0 -56
- ophyd_async-0.13.3/.github/actions/install_requirements/action.yml +0 -35
- ophyd_async-0.13.3/.github/dependabot.yml +0 -28
- ophyd_async-0.13.3/.github/workflows/_import_with_no_extras.yml +0 -26
- ophyd_async-0.13.3/.github/workflows/_system_test.yml +0 -38
- ophyd_async-0.13.3/Dockerfile +0 -15
- ophyd_async-0.13.3/src/ophyd_async/epics/pmac/_pmac_trajectory.py +0 -114
- ophyd_async-0.13.3/src/ophyd_async/epics/pmac/_utils.py +0 -847
- ophyd_async-0.13.3/src/ophyd_async/fastcs/panda/_trigger.py +0 -103
- ophyd_async-0.13.3/src/ophyd_async/tango/testing/__init__.py +0 -6
- ophyd_async-0.13.3/src/ophyd_async.egg-info/requires.txt +0 -62
- ophyd_async-0.13.3/system_tests/conftest.py +0 -10
- ophyd_async-0.13.3/tests/epics/pmac/test_pmac_trajectory.py +0 -170
- ophyd_async-0.13.3/tests/fastcs/panda/test_trigger.py +0 -156
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.codecov.yml +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.git-blame-ignore-revs +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/ISSUE_TEMPLATE/issue.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/codeql/codeql-config.yml +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/pages/index.html +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/pages/make_switcher.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/_pypi.yml +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.github/workflows/_release.yml +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.gitignore +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/.gitmodules +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/LICENSE +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/README.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/_static/custom.css +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/conf.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0003-ophyd-async-migration.rst +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0004-repository-structure.rst +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0005-respect-black-line-length.rst +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0006-procedural-device-definitions.rst +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0007-subpackage-structure.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0008-signal-types.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0010-docstring-format.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/0011-buffer-updates-camonitor.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions/COPYME +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/decisions.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/declarative-vs-procedural.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/design-goals.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/device-connection-strategies.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/fly-scanning.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/plan-stubs.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/when-to-extend-movable.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations/where-device-logic.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/explanations.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/genindex.rst +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/how-to/choose-right-baseclass.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/how-to/contribute.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/how-to/derive-one-signal-from-others.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/how-to/implement-ad-detector.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/how-to/interact-with-signals.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/how-to/put-device-back.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/how-to/store-and-retrieve.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/how-to.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/images/fly_scan_collection_windows_and_frames.svg +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/images/ophyd-async-logo.svg +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/images/ophyd-favicon.svg +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/images/set_and_wait_for_other_value.excalidraw.svg +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/index.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/reference.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/tutorials/implementing-detectors.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/tutorials/implementing-devices.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/tutorials/installation.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/tutorials/using-devices.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/docs/tutorials.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/setup.cfg +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/__main__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/_docs_parser.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_derived_signal.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_device_filler.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_flyer.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_hdf_dataset.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_log.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_mock_signal_backend.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_protocol.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_providers.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_readable.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_settings.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_soft_signal_backend.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/core/_yaml_settings.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adandor/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adandor/_andor.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adandor/_andor_controller.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adandor/_andor_io.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adaravis/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adaravis/_aravis.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adaravis/_aravis_controller.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adaravis/_aravis_io.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_core_detector.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_core_io.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_core_writer.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_hdf_writer.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_jpeg_writer.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_single_trigger.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adcore/_tiff_writer.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adkinetix/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adkinetix/_kinetix.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adkinetix/_kinetix_controller.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adkinetix/_kinetix_io.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adpilatus/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adpilatus/_pilatus.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adpilatus/_pilatus_controller.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adpilatus/_pilatus_io.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adsimdetector/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adsimdetector/_sim.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adsimdetector/_sim_controller.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/adsimdetector/_sim_io.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/advimba/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/advimba/_vimba.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/advimba/_vimba_controller.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/advimba/_vimba_io.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/core/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/core/_epics_connector.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/core/_epics_device.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/core/_pvi_connector.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/core/_signal.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/core/_util.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/__main__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/_ioc.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/_motor.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/_point_detector.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/_point_detector_channel.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/_stage.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/motor.db +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/point_detector.db +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/demo/point_detector_channel.db +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/odin/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/odin/_odin_io.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/pmac/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/signal.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/testing/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/testing/_example_ioc.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/testing/_utils.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/testing/test_records.db +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/epics/testing/test_records_pva.db +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/core.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/eiger/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/eiger/_eiger.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/eiger/_eiger_controller.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/eiger/_eiger_io.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/jungfrau/_jungfrau.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/jungfrau/_signals.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/odin/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/panda/_control.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/panda/_hdf_panda.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/panda/_table.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/fastcs/panda/_writer.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/plan_stubs/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/plan_stubs/_ensure_connected.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/plan_stubs/_fly.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/plan_stubs/_nd_attributes.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/plan_stubs/_panda.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/plan_stubs/_settings.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/plan_stubs/_utils.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/plan_stubs/_wait_for_awaitable.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/py.typed +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/__main__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_blob_detector.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_blob_detector_controller.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_blob_detector_writer.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_mirror_horizontal.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_mirror_vertical.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_pattern_generator.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/sim/_point_detector.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/core/_base_device.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/core/_converters.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/core/_tango_readable.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/demo/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/demo/_counter.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/demo/_detector.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/demo/_tango/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/tango/demo/_tango/_servers.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/testing/__init__.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/testing/__pytest_assert_rewrite.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/testing/_mock_signal_utils.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/testing/_one_of_everything.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/testing/_single_derived.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/testing/_utils.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async/testing/_wait_for_pending.py +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async.egg-info/dependency_links.txt +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5}/src/ophyd_async.egg-info/top_level.txt +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5/tests}/system_tests/epics/adsim/baseline.yaml +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5/tests}/system_tests/epics/adsim/start_iocs.sh +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5/tests}/system_tests/epics/adsim/stop_iocs.sh +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5/tests}/system_tests/epics/eiger/README.md +0 -0
- {ophyd_async-0.13.3 → ophyd_async-0.13.5/tests}/system_tests/epics/eiger/start_iocs_and_run_tests.sh +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/epics/signal/test_yaml_save_ca.yaml +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/epics/signal/test_yaml_save_pva.yaml +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/system_tests}/tango/context_subprocess.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_detector.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_flyer.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_mock_signal_backend.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_observe.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_protocol.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_readable.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/core/test_subset_enum.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adandor/test_andor.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adaravis/test_aravis.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adcore/test_detectors.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adcore/test_drivers.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adcore/test_plugins.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adcore/test_scans.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adcore/test_single_trigger.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adkinetix/test_kinetix.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adpilatus/test_pilatus.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/adsimdetector/test_sim.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/advimba/test_vimba.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/conftest.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/eiger/test_odin_io.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/pmac/test_pmac_io.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/signal/test_common.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/epics/test_areadetector_subclass_naming.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/eiger/test_eiger_controller.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/eiger/test_eiger_detector.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/jungfrau/__init__.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/panda/test_hdf_panda.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/panda/test_seq_table.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/fastcs/panda/test_writer.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/plan_stubs/test_fly.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/plan_stubs/test_settings.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/plan_stubs/test_setup.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/sim/__init__.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/sim/test_sim_blob_detector.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/sim/test_sim_motor.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/test_cli.py +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/test_data/test_yaml_config_save.yaml +0 -0
- {ophyd_async-0.13.3/tests → ophyd_async-0.13.5/tests/unit_tests}/test_data/test_yaml_save.yaml +0 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// For format details, see https://containers.dev/implementors/json_reference/
|
|
2
|
+
{
|
|
3
|
+
"name": "Python 3 Developer Container",
|
|
4
|
+
"build": {
|
|
5
|
+
"dockerfile": "../Dockerfile",
|
|
6
|
+
"target": "developer"
|
|
7
|
+
},
|
|
8
|
+
"remoteEnv": {
|
|
9
|
+
// Allow X11 apps to run inside the container
|
|
10
|
+
"DISPLAY": "${localEnv:DISPLAY}",
|
|
11
|
+
// Do the equivalent of "activate" the venv so we don't have to "uv run" everything
|
|
12
|
+
"VIRTUAL_ENV": "/workspaces/${localWorkspaceFolderBasename}/.venv",
|
|
13
|
+
"PATH": "/workspaces/${localWorkspaceFolderBasename}/.venv/bin:${containerEnv:PATH}"
|
|
14
|
+
},
|
|
15
|
+
"customizations": {
|
|
16
|
+
"vscode": {
|
|
17
|
+
// Set *default* container specific settings.json values on container create.
|
|
18
|
+
"settings": {
|
|
19
|
+
// Use the container's python by default
|
|
20
|
+
"python.defaultInterpreterPath": "/workspaces/${localWorkspaceFolderBasename}/.venv/bin/python",
|
|
21
|
+
// Don't activate the venv as it is already in the PATH
|
|
22
|
+
"python.terminal.activateEnvInCurrentTerminal": false,
|
|
23
|
+
"python.terminal.activateEnvironment": false,
|
|
24
|
+
// Workaround to prevent garbled python REPL in the terminal
|
|
25
|
+
// https://github.com/microsoft/vscode-python/issues/25505
|
|
26
|
+
"python.terminal.shellIntegration.enabled": false,
|
|
27
|
+
"python.testing.unittestEnabled": false,
|
|
28
|
+
"python.testing.pytestEnabled": true,
|
|
29
|
+
"editor.formatOnSave": true,
|
|
30
|
+
"editor.codeActionsOnSave": {
|
|
31
|
+
"source.organizeImports": "explicit"
|
|
32
|
+
},
|
|
33
|
+
"[python]": {
|
|
34
|
+
"editor.defaultFormatter": "charliermarsh.ruff"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
// Add the IDs of extensions you want installed when the container is created.
|
|
38
|
+
"extensions": [
|
|
39
|
+
"ms-python.python",
|
|
40
|
+
"github.vscode-github-actions",
|
|
41
|
+
"tamasfe.even-better-toml",
|
|
42
|
+
"redhat.vscode-yaml",
|
|
43
|
+
"ryanluker.vscode-coverage-gutters",
|
|
44
|
+
"charliermarsh.ruff",
|
|
45
|
+
"ms-azuretools.vscode-docker"
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
// Create the config folder for the bash-config feature and uv cache
|
|
50
|
+
// NOTE: The uv cache can get large, DLS users should read
|
|
51
|
+
// https://dev-guide.diamond.ac.uk/linux-user-environment/how-tos/disk-quota-troubleshooting
|
|
52
|
+
"initializeCommand": "mkdir -p ${localEnv:HOME}/.config/terminal-config ${localEnv:HOME}/.cache/uv",
|
|
53
|
+
"runArgs": [
|
|
54
|
+
// Allow the container to access the host X11 display and EPICS CA
|
|
55
|
+
"--net=host",
|
|
56
|
+
// Make sure SELinux does not disable with access to host filesystems like tmp
|
|
57
|
+
"--security-opt=label=disable"
|
|
58
|
+
],
|
|
59
|
+
"mounts": [
|
|
60
|
+
// Mount in the user terminal config folder so it can be edited
|
|
61
|
+
{
|
|
62
|
+
"source": "${localEnv:HOME}/.config/terminal-config",
|
|
63
|
+
"target": "/user-terminal-config",
|
|
64
|
+
"type": "bind"
|
|
65
|
+
},
|
|
66
|
+
// Keep a persistent cross container cache for uv
|
|
67
|
+
{
|
|
68
|
+
"source": "${localEnv:HOME}/.cache/uv",
|
|
69
|
+
"target": "/root/.cache/uv",
|
|
70
|
+
"type": "bind"
|
|
71
|
+
},
|
|
72
|
+
// Use a volume mount for the uv venv so it is local to the container
|
|
73
|
+
{
|
|
74
|
+
"target": "/workspaces/${localWorkspaceFolderBasename}/.venv",
|
|
75
|
+
"type": "volume"
|
|
76
|
+
}
|
|
77
|
+
],
|
|
78
|
+
// Mount the parent as /workspaces so we can pip install peers as editable
|
|
79
|
+
"workspaceMount": "source=${localWorkspaceFolder}/..,target=/workspaces,type=bind",
|
|
80
|
+
// After the container is created, install the python project in editable form
|
|
81
|
+
"postCreateCommand": "uv sync && uv run pre-commit install --install-hooks"
|
|
82
|
+
}
|
|
@@ -24,4 +24,4 @@ It is recommended that developers use a [vscode devcontainer](https://code.visua
|
|
|
24
24
|
|
|
25
25
|
This project was created using the [Diamond Light Source Copier Template](https://github.com/DiamondLightSource/python-copier-template) for Python projects.
|
|
26
26
|
|
|
27
|
-
For more information on common tasks like setting up a developer environment, running the tests, and setting a pre-commit hook, see the template's [How-to guides](https://diamondlightsource.github.io/python-copier-template/
|
|
27
|
+
For more information on common tasks like setting up a developer environment, running the tests, and setting a pre-commit hook, see the template's [How-to guides](https://diamondlightsource.github.io/python-copier-template/5.0.0a3/how-to.html).
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
+
"extends": [
|
|
4
|
+
"config:recommended"
|
|
5
|
+
],
|
|
6
|
+
"lockFileMaintenance": {
|
|
7
|
+
"description": "Keep uv.lock up to date, merging if tests pass",
|
|
8
|
+
"enabled": true,
|
|
9
|
+
"automerge": true
|
|
10
|
+
},
|
|
11
|
+
"packageRules": [
|
|
12
|
+
{
|
|
13
|
+
"description": "Disable python version as that is managed by python-copier-template",
|
|
14
|
+
"matchManagers": [
|
|
15
|
+
"pyenv"
|
|
16
|
+
],
|
|
17
|
+
"enabled": false
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"description": "Disable github actions that are managed by python-copier-template",
|
|
21
|
+
"matchPackageNames": [
|
|
22
|
+
"actions/checkout",
|
|
23
|
+
"actions/download-artifact",
|
|
24
|
+
"actions/setup-python",
|
|
25
|
+
"actions/upload-artifact",
|
|
26
|
+
"astral-sh/setup-uv",
|
|
27
|
+
"codecov/codecov-action",
|
|
28
|
+
"docker/build-push-action",
|
|
29
|
+
"docker/login-action",
|
|
30
|
+
"docker/metadata-action",
|
|
31
|
+
"docker/setup-buildx-action",
|
|
32
|
+
"peaceiris/actions-gh-pages",
|
|
33
|
+
"pypa/gh-action-pypi-publish",
|
|
34
|
+
"softprops/action-gh-release"
|
|
35
|
+
],
|
|
36
|
+
"matchManagers": [
|
|
37
|
+
"github-actions"
|
|
38
|
+
],
|
|
39
|
+
"enabled": false
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"description": "Group non-major github action updates",
|
|
43
|
+
"groupName": "GitHub Actions",
|
|
44
|
+
"matchUpdateTypes": [
|
|
45
|
+
"patch",
|
|
46
|
+
"minor"
|
|
47
|
+
],
|
|
48
|
+
"matchManagers": [
|
|
49
|
+
"github-actions"
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
}
|
|
@@ -19,7 +19,7 @@ jobs:
|
|
|
19
19
|
uses: actions/checkout@v4
|
|
20
20
|
|
|
21
21
|
- name: Initialize CodeQL
|
|
22
|
-
uses: github/codeql-action/init@
|
|
22
|
+
uses: github/codeql-action/init@v4
|
|
23
23
|
with:
|
|
24
24
|
languages: python
|
|
25
25
|
build-mode: none
|
|
@@ -27,6 +27,6 @@ jobs:
|
|
|
27
27
|
config-file: ./.github/codeql/codeql-config.yml
|
|
28
28
|
|
|
29
29
|
- name: Perform CodeQL Analysis
|
|
30
|
-
uses: github/codeql-action/analyze@
|
|
30
|
+
uses: github/codeql-action/analyze@v4
|
|
31
31
|
with:
|
|
32
32
|
category: "/language:python"
|
|
@@ -12,10 +12,13 @@ jobs:
|
|
|
12
12
|
# Need this to get version number from last tag
|
|
13
13
|
fetch-depth: 0
|
|
14
14
|
|
|
15
|
+
- name: Install uv
|
|
16
|
+
uses: astral-sh/setup-uv@v6
|
|
17
|
+
|
|
15
18
|
- name: Build sdist and wheel
|
|
16
19
|
run: >
|
|
17
20
|
export SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct) &&
|
|
18
|
-
|
|
21
|
+
uvx --from build pyproject-build
|
|
19
22
|
|
|
20
23
|
- name: Upload sdist and wheel as artifacts
|
|
21
24
|
uses: actions/upload-artifact@v4
|
|
@@ -24,13 +27,19 @@ jobs:
|
|
|
24
27
|
path: dist
|
|
25
28
|
|
|
26
29
|
- name: Check for packaging errors
|
|
27
|
-
run:
|
|
30
|
+
run: uvx twine check --strict dist/*
|
|
28
31
|
|
|
29
32
|
- name: Install produced wheel
|
|
30
|
-
|
|
31
|
-
with:
|
|
32
|
-
pip-install: dist/*.whl
|
|
33
|
+
run: python -m pip install dist/*.whl
|
|
33
34
|
|
|
34
35
|
- name: Test module --version works using the installed wheel
|
|
35
36
|
# If more than one module in src/ replace with module name to test
|
|
36
37
|
run: python -m $(ls --hide='*.egg-info' src | head -1) --version
|
|
38
|
+
|
|
39
|
+
- name: Check APIs are importable
|
|
40
|
+
run: |
|
|
41
|
+
python -c "import ophyd_async"
|
|
42
|
+
python -c "import ophyd_async.core"
|
|
43
|
+
python -c "import ophyd_async.epics.core"
|
|
44
|
+
python -c "import ophyd_async.epics.motor"
|
|
45
|
+
python -c "import ophyd_async.plan_stubs"
|
|
@@ -20,11 +20,11 @@ jobs:
|
|
|
20
20
|
- name: Install system packages
|
|
21
21
|
run: sudo apt-get install graphviz
|
|
22
22
|
|
|
23
|
-
- name: Install
|
|
24
|
-
uses:
|
|
23
|
+
- name: Install uv
|
|
24
|
+
uses: astral-sh/setup-uv@v5
|
|
25
25
|
|
|
26
26
|
- name: Build docs
|
|
27
|
-
run: tox -e docs
|
|
27
|
+
run: uv run --locked tox -e docs
|
|
28
28
|
|
|
29
29
|
- name: Remove environment.pickle
|
|
30
30
|
run: rm build/html/.doctrees/environment.pickle
|
|
@@ -3,12 +3,20 @@ on:
|
|
|
3
3
|
inputs:
|
|
4
4
|
python-version:
|
|
5
5
|
type: string
|
|
6
|
-
description: The version of python to install
|
|
7
|
-
|
|
6
|
+
description: The version of python to install, default is from .python-version file
|
|
7
|
+
default: ""
|
|
8
8
|
runs-on:
|
|
9
9
|
type: string
|
|
10
10
|
description: The runner to run this job on
|
|
11
11
|
required: true
|
|
12
|
+
tests-path:
|
|
13
|
+
type: string
|
|
14
|
+
description: The path to look for tests
|
|
15
|
+
required: true
|
|
16
|
+
needs-services:
|
|
17
|
+
type: boolean
|
|
18
|
+
description: Whether to start external services
|
|
19
|
+
required: true
|
|
12
20
|
secrets:
|
|
13
21
|
CODECOV_TOKEN:
|
|
14
22
|
required: true
|
|
@@ -16,57 +24,52 @@ on:
|
|
|
16
24
|
env:
|
|
17
25
|
# https://github.com/pytest-dev/pytest/issues/2042
|
|
18
26
|
PY_IGNORE_IMPORTMISMATCH: "1"
|
|
27
|
+
UV_PYTHON: ${{ inputs.python-version }}
|
|
19
28
|
|
|
20
29
|
jobs:
|
|
21
30
|
run:
|
|
22
31
|
runs-on: ${{ inputs.runs-on }}
|
|
23
32
|
|
|
33
|
+
env:
|
|
34
|
+
COVERAGE_PROCESS_START: .coveragerc
|
|
35
|
+
|
|
24
36
|
steps:
|
|
37
|
+
- name: Checkout repository (with submodules)
|
|
38
|
+
uses: actions/checkout@v4
|
|
39
|
+
with:
|
|
40
|
+
submodules: recursive
|
|
41
|
+
fetch-depth: 0
|
|
42
|
+
|
|
25
43
|
- name: Set TEMP to D:/Temp
|
|
26
44
|
if: inputs.runs-on == 'windows-latest'
|
|
27
45
|
run: |
|
|
28
46
|
mkdir "D:\\Temp"
|
|
29
47
|
echo "TEMP=D:\\Temp" >> $env:GITHUB_ENV
|
|
30
|
-
- name: Checkout
|
|
31
|
-
uses: actions/checkout@v4
|
|
32
|
-
with:
|
|
33
|
-
# Need this to get version number from last tag
|
|
34
|
-
fetch-depth: 0
|
|
35
48
|
|
|
36
|
-
-
|
|
37
|
-
|
|
38
|
-
uses: ./.github/actions/install_requirements
|
|
49
|
+
- name: Install uv
|
|
50
|
+
uses: astral-sh/setup-uv@v5
|
|
39
51
|
|
|
40
|
-
- if: inputs.
|
|
41
|
-
name:
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
- if: inputs.python-version == 'dev'
|
|
45
|
-
name: Upload dev-requirements.txt
|
|
46
|
-
uses: actions/upload-artifact@v4
|
|
52
|
+
- if: inputs.needs-services && inputs.runs-on != 'windows-latest'
|
|
53
|
+
name: Run docker compose
|
|
54
|
+
uses: hoverkraft-tech/compose-action@v2.4.1
|
|
47
55
|
with:
|
|
48
|
-
|
|
49
|
-
|
|
56
|
+
compose-file: "./example-services/compose.yaml"
|
|
57
|
+
services: |
|
|
58
|
+
bl01t-di-cam-01
|
|
59
|
+
ca-gateway
|
|
50
60
|
|
|
51
|
-
- if: inputs.python-version != 'dev'
|
|
52
|
-
name: Install latest versions of python packages
|
|
53
|
-
uses: ./.github/actions/install_requirements
|
|
54
|
-
with:
|
|
55
|
-
python-version: ${{ inputs.python-version }}
|
|
56
|
-
pip-install: ".[dev]"
|
|
57
|
-
|
|
58
61
|
- name: Run tests win
|
|
59
62
|
if: inputs.runs-on == 'windows-latest'
|
|
60
|
-
run: tox -e tests -- --timeout=
|
|
63
|
+
run: uv run --locked tox -e tests -- --timeout=10 ${{ inputs.tests-path}}
|
|
61
64
|
|
|
62
65
|
- name: Non win tests
|
|
63
66
|
if: inputs.runs-on != 'windows-latest'
|
|
64
|
-
run: tox -e tests -- --timeout=2
|
|
65
|
-
|
|
67
|
+
run: uv run --locked tox -e tests -- --timeout=2 ${{ inputs.tests-path}}
|
|
68
|
+
|
|
66
69
|
- name: Upload coverage to Codecov
|
|
67
70
|
uses: codecov/codecov-action@v5
|
|
68
71
|
with:
|
|
69
|
-
name: ${{ inputs.python-version }}/${{ inputs.runs-on }}
|
|
72
|
+
name: ${{ inputs.python-version }}/${{ inputs.runs-on }}/${{ inputs.tests-path }}
|
|
70
73
|
files: cov.xml
|
|
71
74
|
env:
|
|
72
75
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
|
@@ -15,8 +15,8 @@ jobs:
|
|
|
15
15
|
- name: Checkout
|
|
16
16
|
uses: actions/checkout@v4
|
|
17
17
|
|
|
18
|
-
- name: Install
|
|
19
|
-
uses:
|
|
18
|
+
- name: Install uv
|
|
19
|
+
uses: astral-sh/setup-uv@v5
|
|
20
20
|
|
|
21
21
|
- name: Run tox
|
|
22
|
-
run: tox -e ${{ inputs.tox }}
|
|
22
|
+
run: uv run --locked tox -e ${{ inputs.tox }}
|
|
@@ -5,11 +5,10 @@ on:
|
|
|
5
5
|
branches:
|
|
6
6
|
- main
|
|
7
7
|
tags:
|
|
8
|
-
-
|
|
8
|
+
- "*"
|
|
9
9
|
pull_request:
|
|
10
10
|
|
|
11
11
|
jobs:
|
|
12
|
-
|
|
13
12
|
lint:
|
|
14
13
|
uses: ./.github/workflows/_tox.yml
|
|
15
14
|
with:
|
|
@@ -20,27 +19,24 @@ jobs:
|
|
|
20
19
|
matrix:
|
|
21
20
|
runs-on: ["ubuntu-latest", "windows-latest"] # can add macos-latest
|
|
22
21
|
python-version: ["3.11", "3.12", "3.13"]
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
test-config:
|
|
23
|
+
- tests-path: "tests/unit_tests"
|
|
24
|
+
needs-services: false
|
|
25
|
+
- tests-path: "tests/system_tests"
|
|
26
|
+
needs-services: true
|
|
27
27
|
fail-fast: false
|
|
28
28
|
uses: ./.github/workflows/_test.yml
|
|
29
29
|
with:
|
|
30
30
|
runs-on: ${{ matrix.runs-on }}
|
|
31
31
|
python-version: ${{ matrix.python-version }}
|
|
32
|
+
tests-path: ${{ matrix.test-config.tests-path }}
|
|
33
|
+
needs-services: ${{ matrix.test-config.needs-services }}
|
|
32
34
|
secrets:
|
|
33
35
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
|
34
36
|
|
|
35
|
-
import_with_no_extras:
|
|
36
|
-
uses: ./.github/workflows/_import_with_no_extras.yml
|
|
37
|
-
|
|
38
37
|
docs:
|
|
39
38
|
uses: ./.github/workflows/_docs.yml
|
|
40
39
|
|
|
41
|
-
system_tests:
|
|
42
|
-
uses: ./.github/workflows/_system_test.yml
|
|
43
|
-
|
|
44
40
|
dist:
|
|
45
41
|
uses: ./.github/workflows/_dist.yml
|
|
46
42
|
|
|
@@ -55,7 +51,7 @@ jobs:
|
|
|
55
51
|
uses: ./.github/workflows/_codeql.yml
|
|
56
52
|
|
|
57
53
|
release:
|
|
58
|
-
needs: [dist, test, docs
|
|
54
|
+
needs: [dist, test, docs]
|
|
59
55
|
if: github.ref_type == 'tag'
|
|
60
56
|
uses: ./.github/workflows/_release.yml
|
|
61
57
|
permissions:
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# This allow-list is limited to YAML/YML files to cut down SealedSecrets false positives.
|
|
2
|
+
# All gitleaks default rules still apply everywhere (useDefault = true).
|
|
3
|
+
# To broaden this allow-list to all files, comment out the 'paths' line below.
|
|
4
|
+
|
|
5
|
+
[extend]
|
|
6
|
+
useDefault = true
|
|
7
|
+
|
|
8
|
+
[[rules]]
|
|
9
|
+
id = "generic-api-key"
|
|
10
|
+
|
|
11
|
+
# Pattern-only allowlist for long Ag… tokens in YAML
|
|
12
|
+
[[rules.allowlists]]
|
|
13
|
+
condition = "AND"
|
|
14
|
+
regexes = [
|
|
15
|
+
# Boundary-safe Ag… token without lookarounds (RE2-safe)
|
|
16
|
+
'''(?:^|[^A-Za-z0-9+/=])(Ag[A-Za-z0-9+/]{500,}={0,2})(?:[^A-Za-z0-9+/=]|$)'''
|
|
17
|
+
]
|
|
18
|
+
# Limit to YAML only for now. Comment this out if you want it to apply everywhere.
|
|
19
|
+
paths = ['''(?i).*\.ya?ml$''']
|
|
@@ -3,6 +3,7 @@ repos:
|
|
|
3
3
|
rev: v5.0.0
|
|
4
4
|
hooks:
|
|
5
5
|
- id: check-added-large-files
|
|
6
|
+
args: ["--maxkb=1000"] # uv.lock is more than 500kB
|
|
6
7
|
- id: check-yaml
|
|
7
8
|
- id: check-merge-conflict
|
|
8
9
|
- id: end-of-file-fixer
|
|
@@ -23,6 +24,13 @@ repos:
|
|
|
23
24
|
types: [python]
|
|
24
25
|
require_serial: true
|
|
25
26
|
|
|
27
|
+
- id: uv-sync
|
|
28
|
+
name: update uv.lock and venv
|
|
29
|
+
pass_filenames: false
|
|
30
|
+
language: system
|
|
31
|
+
entry: uv sync
|
|
32
|
+
files: ^(uv\.lock|pyproject\.toml)$
|
|
33
|
+
|
|
26
34
|
- id: import-contracts
|
|
27
35
|
name: Ensure import directionality
|
|
28
36
|
pass_filenames: false
|
|
@@ -30,3 +38,8 @@ repos:
|
|
|
30
38
|
entry: lint-imports
|
|
31
39
|
types: [python]
|
|
32
40
|
require_serial: false
|
|
41
|
+
|
|
42
|
+
- repo: https://github.com/gitleaks/gitleaks
|
|
43
|
+
rev: v8.28.0
|
|
44
|
+
hooks:
|
|
45
|
+
- id: gitleaks
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.11
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# The devcontainer should use the developer target and run as root with podman
|
|
2
|
+
# or docker with user namespaces.
|
|
3
|
+
FROM ghcr.io/diamondlightsource/ubuntu-devcontainer:noble AS developer
|
|
4
|
+
|
|
5
|
+
# Add any system dependencies for the developer/build environment here
|
|
6
|
+
RUN apt-get update -y && apt-get install -y --no-install-recommends \
|
|
7
|
+
graphviz \
|
|
8
|
+
libxcb-cursor0 \
|
|
9
|
+
qt6-base-dev \
|
|
10
|
+
&& apt-get dist-clean
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ophyd-async
|
|
3
|
-
Version: 0.13.
|
|
3
|
+
Version: 0.13.5
|
|
4
4
|
Summary: Asynchronous Bluesky hardware abstraction code, compatible with control systems like EPICS and Tango
|
|
5
5
|
Author-email: Tom Cobb <tom.cobb@diamond.ac.uk>
|
|
6
6
|
License: BSD 3-Clause License
|
|
@@ -58,45 +58,11 @@ Requires-Dist: aioca>=2.0a4; extra == "ca"
|
|
|
58
58
|
Provides-Extra: pva
|
|
59
59
|
Requires-Dist: p4p>=4.2.0; extra == "pva"
|
|
60
60
|
Provides-Extra: tango
|
|
61
|
-
Requires-Dist: pytango
|
|
61
|
+
Requires-Dist: pytango>=10.0.2; extra == "tango"
|
|
62
62
|
Provides-Extra: demo
|
|
63
63
|
Requires-Dist: ipython; extra == "demo"
|
|
64
64
|
Requires-Dist: matplotlib; extra == "demo"
|
|
65
65
|
Requires-Dist: pyqt6; extra == "demo"
|
|
66
|
-
Provides-Extra: dev
|
|
67
|
-
Requires-Dist: ophyd_async[sim]; extra == "dev"
|
|
68
|
-
Requires-Dist: ophyd_async[ca]; extra == "dev"
|
|
69
|
-
Requires-Dist: ophyd_async[pva]; extra == "dev"
|
|
70
|
-
Requires-Dist: ophyd_async[tango]; extra == "dev"
|
|
71
|
-
Requires-Dist: ophyd_async[demo]; extra == "dev"
|
|
72
|
-
Requires-Dist: inflection; extra == "dev"
|
|
73
|
-
Requires-Dist: import-linter; extra == "dev"
|
|
74
|
-
Requires-Dist: myst-parser; extra == "dev"
|
|
75
|
-
Requires-Dist: numpydoc; extra == "dev"
|
|
76
|
-
Requires-Dist: ophyd>=1.10.7; extra == "dev"
|
|
77
|
-
Requires-Dist: pickleshare; extra == "dev"
|
|
78
|
-
Requires-Dist: pipdeptree; extra == "dev"
|
|
79
|
-
Requires-Dist: pre-commit; extra == "dev"
|
|
80
|
-
Requires-Dist: pydata-sphinx-theme>=0.12; extra == "dev"
|
|
81
|
-
Requires-Dist: pyepics>=3.4.2; extra == "dev"
|
|
82
|
-
Requires-Dist: pyright; extra == "dev"
|
|
83
|
-
Requires-Dist: pytest; extra == "dev"
|
|
84
|
-
Requires-Dist: pytest-asyncio; extra == "dev"
|
|
85
|
-
Requires-Dist: pytest-cov; extra == "dev"
|
|
86
|
-
Requires-Dist: pytest-faulthandler; extra == "dev"
|
|
87
|
-
Requires-Dist: pytest-forked; extra == "dev"
|
|
88
|
-
Requires-Dist: pytest-rerunfailures; extra == "dev"
|
|
89
|
-
Requires-Dist: pytest-timeout; extra == "dev"
|
|
90
|
-
Requires-Dist: ruff; extra == "dev"
|
|
91
|
-
Requires-Dist: scanspec>=1.0a1; extra == "dev"
|
|
92
|
-
Requires-Dist: sphinx-autobuild; extra == "dev"
|
|
93
|
-
Requires-Dist: sphinx-autodoc2; extra == "dev"
|
|
94
|
-
Requires-Dist: sphinxcontrib-mermaid; extra == "dev"
|
|
95
|
-
Requires-Dist: sphinx-copybutton; extra == "dev"
|
|
96
|
-
Requires-Dist: sphinx-design; extra == "dev"
|
|
97
|
-
Requires-Dist: tox-direct; extra == "dev"
|
|
98
|
-
Requires-Dist: types-mock; extra == "dev"
|
|
99
|
-
Requires-Dist: types-pyyaml; extra == "dev"
|
|
100
66
|
Dynamic: license-file
|
|
101
67
|
|
|
102
68
|
[](https://github.com/bluesky/ophyd-async/actions/workflows/ci.yml)
|
|
@@ -138,3 +138,12 @@ class Sensor(StandardReadable, EpicsDevice):
|
|
|
138
138
|
value: A[SignalR[float], PvSuffix("Value"), Format.HINTED_SIGNAL]
|
|
139
139
|
mode: A[SignalRW[EnergyMode], PvSuffix("Mode"), Format.CONFIG_SIGNAL]
|
|
140
140
|
```
|
|
141
|
+
|
|
142
|
+
Note that to use `Annotated as A` with ruff name checking we recommend adding something like:
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
[tool.ruff.lint.flake8-import-conventions.extend-aliases]
|
|
146
|
+
# We often shorten "Annotated" to "A" for brevity
|
|
147
|
+
"typing.Annotated" = "A"
|
|
148
|
+
```
|
|
149
|
+
to your `pyproject.toml`.
|
|
@@ -62,7 +62,7 @@ SignalBackend <|-- TangoSignalConnector
|
|
|
62
62
|
```
|
|
63
63
|
|
|
64
64
|
If a `Device` with children is like a branch in a tree, a `Signal` is like a leaf. It has no children, but represents a single value or action in the control system. There are 4 types of signal:
|
|
65
|
-
- [](#SignalR) is a signal with a read-only value that supports the [Readable](#bluesky.protocols.Readable) and [Subscribable](#bluesky.protocols.Subscribable) protocols. It also adds the [](#SignalR.
|
|
65
|
+
- [](#SignalR) is a signal with a read-only value that supports the [Readable](#bluesky.protocols.Readable) and [Subscribable](#bluesky.protocols.Subscribable) protocols. It also adds the [](#SignalR.subscribe_reading) method that is used to interact with the Signal in the parent Device.
|
|
66
66
|
- [](#SignalW) is a signal with a write-only value that supports the [Movable](#bluesky.protocols.Movable) protocol.
|
|
67
67
|
- [](#SignalRW) is a signal with a read-write value that inherits from SignalR and SignalW and adds the [Locatable](#bluesky.protocols.Locatable) protocol
|
|
68
68
|
- [](#SignalX) is a signal that performs an action, and supports the [Triggerable](#bluesky.protocols.Triggerable) protocol
|
|
@@ -21,7 +21,7 @@ If we need to add a feature to a particular Device, or fix a bug, and it only af
|
|
|
21
21
|
|
|
22
22
|
We will be writing a test using the pytest framework which encourages fixtures to setup and teardown the Devices we wish to test. In this case we will create the `DemoMotor` from the previous tutorial:
|
|
23
23
|
|
|
24
|
-
```{literalinclude} ../../tests/epics/demo/test_epics_demo.py
|
|
24
|
+
```{literalinclude} ../../tests/unit_tests/epics/demo/test_epics_demo.py
|
|
25
25
|
:pyobject: mock_motor
|
|
26
26
|
```
|
|
27
27
|
|
|
@@ -49,7 +49,7 @@ asyncio_mode = "auto"
|
|
|
49
49
|
|
|
50
50
|
Let's test some verbs. We want to check that we can `read()` and `read_configuration()` on a `DemoMotor` while staged, and that we can still call them when unstaged:
|
|
51
51
|
|
|
52
|
-
```{literalinclude} ../../tests/epics/demo/test_epics_demo.py
|
|
52
|
+
```{literalinclude} ../../tests/unit_tests/epics/demo/test_epics_demo.py
|
|
53
53
|
:pyobject: test_read_motor
|
|
54
54
|
```
|
|
55
55
|
|
|
@@ -63,7 +63,7 @@ Some of our tests produce timestamps, instead of checking their values we use []
|
|
|
63
63
|
|
|
64
64
|
Now let's call some verbs and check that they do the right thing. We want to check that `stop()` triggers the [](#SignalX) `stop_`, waiting for it to complete:
|
|
65
65
|
|
|
66
|
-
```{literalinclude} ../../tests/epics/demo/test_epics_demo.py
|
|
66
|
+
```{literalinclude} ../../tests/unit_tests/epics/demo/test_epics_demo.py
|
|
67
67
|
:pyobject: test_motor_stopped
|
|
68
68
|
```
|
|
69
69
|
|
|
@@ -73,7 +73,7 @@ This time we use [](#get_mock_put) to get a [](#unittest.mock.Mock) that will be
|
|
|
73
73
|
|
|
74
74
|
Now let's pretend to be a progress bar and check that we get the right outputs. We want to check that `set()` will call any progress watchers with appropriate updates, and also terminate when the readback value reaches the correct value:
|
|
75
75
|
|
|
76
|
-
```{literalinclude} ../../tests/epics/demo/test_epics_demo.py
|
|
76
|
+
```{literalinclude} ../../tests/unit_tests/epics/demo/test_epics_demo.py
|
|
77
77
|
:pyobject: test_motor_moving_well
|
|
78
78
|
```
|
|
79
79
|
|
|
@@ -109,11 +109,11 @@ def RE():
|
|
|
109
109
|
|
|
110
110
|
Now you can run a plan, and check that it produces the correct bluesky documents. Let's go back to the demo and test the `DemoPointDetector` in a `bp.count` plan:
|
|
111
111
|
|
|
112
|
-
```{literalinclude} ../../tests/epics/demo/test_epics_demo.py
|
|
112
|
+
```{literalinclude} ../../tests/unit_tests/epics/demo/test_epics_demo.py
|
|
113
113
|
:pyobject: mock_point_detector
|
|
114
114
|
```
|
|
115
115
|
|
|
116
|
-
```{literalinclude} ../../tests/epics/demo/test_epics_demo.py
|
|
116
|
+
```{literalinclude} ../../tests/unit_tests/epics/demo/test_epics_demo.py
|
|
117
117
|
:pyobject: test_point_detector_in_plan
|
|
118
118
|
```
|
|
119
119
|
|