ophyd-async 0.13.5__tar.gz → 0.13.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.copier-answers.yml +1 -1
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.devcontainer/devcontainer.json +30 -15
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/CONTRIBUTING.md +1 -1
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/_dist.yml +2 -2
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/_docs.yml +2 -2
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/_pypi.yml +1 -1
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/_release.yml +2 -2
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/_test.yml +3 -15
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/_tox.yml +2 -2
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/ci.yml +2 -7
- ophyd_async-0.13.7/Dockerfile +25 -0
- {ophyd_async-0.13.5/src/ophyd_async.egg-info → ophyd_async-0.13.7}/PKG-INFO +1 -1
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/conf.py +0 -1
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/_version.py +3 -3
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_mock_signal_backend.py +7 -3
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_signal.py +2 -1
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/motor.py +18 -3
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/pmac/_pmac_io.py +10 -13
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/pmac/_pmac_trajectory.py +9 -10
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/pmac/_pmac_trajectory_generation.py +3 -0
- ophyd_async-0.13.7/src/ophyd_async/epics/pmac/_utils.py +210 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/panda/_block.py +10 -9
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/core/__init__.py +0 -2
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/core/_base_device.py +4 -1
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/demo/_counter.py +10 -3
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/demo/_mover.py +4 -3
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/testing/_mock_signal_utils.py +5 -2
- {ophyd_async-0.13.5 → ophyd_async-0.13.7/src/ophyd_async.egg-info}/PKG-INFO +1 -1
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async.egg-info/SOURCES.txt +2 -3
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/conftest.py +160 -0
- ophyd_async-0.13.7/tests/system_tests/conftest.py +11 -0
- ophyd_async-0.13.7/tests/system_tests/epics/adsim/external_dependencies.sh +32 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/epics/adsim/test_adsim_system.py +20 -4
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/tango/test_base_device.py +5 -4
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/tango/test_tango_signals.py +1 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_mock_signal_backend.py +46 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_signal.py +41 -0
- ophyd_async-0.13.7/tests/unit_tests/epics/pmac/conftest.py +93 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/pmac/test_pmac_trajectory.py +9 -8
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/pmac/test_pmac_trajectory_generation.py +111 -73
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/pmac/test_pmac_utils.py +39 -4
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/test_motor.py +6 -2
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/panda/db/panda.db +13 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/panda/test_panda_utils.py +2 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/uv.lock +200 -189
- ophyd_async-0.13.5/Dockerfile +0 -10
- ophyd_async-0.13.5/src/ophyd_async/epics/pmac/_utils.py +0 -167
- ophyd_async-0.13.5/src/ophyd_async/tango/core/_tango_readable.py +0 -15
- ophyd_async-0.13.5/tests/system_tests/epics/adsim/start_iocs.sh +0 -14
- ophyd_async-0.13.5/tests/system_tests/epics/adsim/stop_iocs.sh +0 -14
- ophyd_async-0.13.5/tests/unit_tests/epics/pmac/conftest.py +0 -34
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.codecov.yml +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.git-blame-ignore-revs +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/ISSUE_TEMPLATE/issue.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/codeql/codeql-config.yml +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/pages/index.html +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/pages/make_switcher.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/renovate.json +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/_codeql.yml +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.github/workflows/periodic.yml +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.gitignore +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.gitleaks.toml +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.gitmodules +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.pre-commit-config.yaml +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/.python-version +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/LICENSE +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/README.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/_static/custom.css +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0003-ophyd-async-migration.rst +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0004-repository-structure.rst +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0005-respect-black-line-length.rst +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0006-procedural-device-definitions.rst +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0007-subpackage-structure.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0008-signal-types.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0009-procedural-vs-declarative-devices.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0010-docstring-format.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/0011-buffer-updates-camonitor.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions/COPYME +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/decisions.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/declarative-vs-procedural.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/design-goals.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/device-connection-strategies.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/devices-signals-backends.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/fly-scanning.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/plan-stubs.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/when-to-extend-movable.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations/where-device-logic.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/explanations.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/genindex.rst +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/how-to/choose-right-baseclass.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/how-to/contribute.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/how-to/derive-one-signal-from-others.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/how-to/implement-ad-detector.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/how-to/interact-with-signals.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/how-to/put-device-back.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/how-to/store-and-retrieve.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/how-to.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/images/fly_scan_collection_windows_and_frames.svg +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/images/ophyd-async-logo.svg +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/images/ophyd-favicon.svg +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/images/set_and_wait_for_other_value.excalidraw.svg +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/index.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/reference.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/tutorials/implementing-detectors.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/tutorials/implementing-devices.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/tutorials/installation.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/tutorials/using-devices.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/tutorials/writing-tests-for-devices.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/docs/tutorials.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/pyproject.toml +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/setup.cfg +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/__main__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/_docs_parser.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_derived_signal.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_derived_signal_backend.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_detector.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_device.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_device_filler.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_enums.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_flyer.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_hdf_dataset.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_log.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_protocol.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_providers.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_readable.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_settings.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_signal_backend.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_soft_signal_backend.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_status.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_table.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_utils.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/core/_yaml_settings.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adandor/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adandor/_andor.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adandor/_andor_controller.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adandor/_andor_io.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adaravis/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adaravis/_aravis.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adaravis/_aravis_controller.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adaravis/_aravis_io.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_core_detector.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_core_io.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_core_logic.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_core_writer.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_hdf_writer.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_jpeg_writer.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_single_trigger.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_tiff_writer.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adcore/_utils.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adkinetix/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adkinetix/_kinetix.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adkinetix/_kinetix_controller.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adkinetix/_kinetix_io.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adpilatus/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adpilatus/_pilatus.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adpilatus/_pilatus_controller.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adpilatus/_pilatus_io.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adsimdetector/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adsimdetector/_sim.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adsimdetector/_sim_controller.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/adsimdetector/_sim_io.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/advimba/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/advimba/_vimba.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/advimba/_vimba_controller.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/advimba/_vimba_io.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/core/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/core/_aioca.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/core/_epics_connector.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/core/_epics_device.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/core/_p4p.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/core/_pvi_connector.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/core/_signal.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/core/_util.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/__main__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/_ioc.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/_motor.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/_point_detector.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/_point_detector_channel.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/_stage.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/motor.db +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/point_detector.db +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/demo/point_detector_channel.db +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/odin/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/odin/_odin_io.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/pmac/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/signal.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/testing/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/testing/_example_ioc.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/testing/_utils.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/testing/test_records.db +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/testing/test_records_pva.db +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/core.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/eiger/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/eiger/_eiger.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/eiger/_eiger_controller.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/eiger/_eiger_io.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/jungfrau/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/jungfrau/_controller.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/jungfrau/_jungfrau.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/jungfrau/_signals.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/jungfrau/_utils.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/odin/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/panda/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/panda/_control.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/panda/_hdf_panda.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/panda/_table.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/panda/_trigger.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/fastcs/panda/_writer.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/plan_stubs/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/plan_stubs/_ensure_connected.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/plan_stubs/_fly.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/plan_stubs/_nd_attributes.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/plan_stubs/_panda.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/plan_stubs/_settings.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/plan_stubs/_utils.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/plan_stubs/_wait_for_awaitable.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/py.typed +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/__main__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_blob_detector.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_blob_detector_controller.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_blob_detector_writer.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_mirror_horizontal.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_mirror_vertical.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_motor.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_pattern_generator.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_point_detector.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/sim/_stage.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/core/_converters.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/core/_signal.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/core/_tango_transport.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/core/_utils.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/demo/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/demo/_detector.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/demo/_tango/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/demo/_tango/_servers.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/testing/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/testing/_one_of_everything.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/tango/testing/_test_config.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/testing/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/testing/__pytest_assert_rewrite.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/testing/_assert.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/testing/_one_of_everything.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/testing/_single_derived.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/testing/_utils.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/testing/_wait_for_pending.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async.egg-info/dependency_links.txt +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async.egg-info/requires.txt +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async.egg-info/top_level.txt +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/README.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/epics/adsim/baseline.yaml +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/epics/eiger/README.md +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/epics/eiger/start_iocs_and_run_tests.sh +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/epics/eiger/test_eiger_system.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/epics/signal/test_signals.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/epics/signal/test_yaml_save_ca.yaml +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/epics/signal/test_yaml_save_pva.yaml +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/fastcs/panda/test_panda_connect.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/tango/conftest.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/tango/context_subprocess.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/tango/test_tango_transport.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/system_tests/test_tutorials.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_auto_init_devices.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_detector.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_device.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_flyer.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_log.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_multi_derived_signal.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_observe.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_protocol.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_providers.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_readable.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_single_derived_signal.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_soft_signal_backend.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_status.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_subset_enum.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_table.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_utils.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/core/test_watchable_async_status.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adandor/test_andor.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adaravis/test_aravis.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adcore/test_cont_acq_detector.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adcore/test_detectors.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adcore/test_drivers.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adcore/test_plugins.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adcore/test_scans.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adcore/test_single_trigger.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adcore/test_writers.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adkinetix/test_kinetix.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adpilatus/test_pilatus.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/adsimdetector/test_sim.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/advimba/test_vimba.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/conftest.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/demo/test_epics_demo.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/eiger/test_odin_io.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/pmac/test_pmac_io.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/pvi/test_pvi.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/signal/test_common.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/epics/test_areadetector_subclass_naming.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/eiger/test_eiger_controller.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/eiger/test_eiger_detector.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/jungfrau/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/jungfrau/test_controller.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/jungfrau/test_utils.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/panda/test_hdf_panda.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/panda/test_panda_connect_mock.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/panda/test_panda_control.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/panda/test_seq_table.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/panda/test_trigger.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/fastcs/panda/test_writer.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/plan_stubs/test_ensure_connected.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/plan_stubs/test_fly.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/plan_stubs/test_settings.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/plan_stubs/test_setup.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/sim/__init__.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/sim/test_sim_blob_detector.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/sim/test_sim_motor.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/test_branching.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/test_cli.py +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/test_data/test_yaml_config_save.yaml +0 -0
- {ophyd_async-0.13.5 → ophyd_async-0.13.7}/tests/unit_tests/test_data/test_yaml_save.yaml +0 -0
|
@@ -8,16 +8,24 @@
|
|
|
8
8
|
"remoteEnv": {
|
|
9
9
|
// Allow X11 apps to run inside the container
|
|
10
10
|
"DISPLAY": "${localEnv:DISPLAY}",
|
|
11
|
+
// Put things that allow it in the persistent cache
|
|
12
|
+
"PRE_COMMIT_HOME": "/cache/pre-commit",
|
|
13
|
+
"UV_CACHE_DIR": "/cache/uv",
|
|
14
|
+
"UV_PYTHON_CACHE_DIR": "/cache/uv-python",
|
|
15
|
+
// Make a venv that is specific for this workspace path as the cache is shared
|
|
16
|
+
"UV_PROJECT_ENVIRONMENT": "/cache/venv-for${localWorkspaceFolder}",
|
|
11
17
|
// Do the equivalent of "activate" the venv so we don't have to "uv run" everything
|
|
12
|
-
"VIRTUAL_ENV": "/
|
|
13
|
-
"PATH": "/
|
|
18
|
+
"VIRTUAL_ENV": "/cache/venv-for${localWorkspaceFolder}",
|
|
19
|
+
"PATH": "/cache/venv-for${localWorkspaceFolder}/bin:${containerEnv:PATH}",
|
|
20
|
+
// Help external service fixtures match docker compose working directory with the host
|
|
21
|
+
"EXAMPLE_SERVICES_PATH": "${localWorkspaceFolder}/example-services"
|
|
14
22
|
},
|
|
15
23
|
"customizations": {
|
|
16
24
|
"vscode": {
|
|
17
25
|
// Set *default* container specific settings.json values on container create.
|
|
18
26
|
"settings": {
|
|
19
27
|
// Use the container's python by default
|
|
20
|
-
"python.defaultInterpreterPath": "/
|
|
28
|
+
"python.defaultInterpreterPath": "/cache/venv-for${localWorkspaceFolder}/bin/python",
|
|
21
29
|
// Don't activate the venv as it is already in the PATH
|
|
22
30
|
"python.terminal.activateEnvInCurrentTerminal": false,
|
|
23
31
|
"python.terminal.activateEnvironment": false,
|
|
@@ -47,14 +55,14 @@
|
|
|
47
55
|
}
|
|
48
56
|
},
|
|
49
57
|
// Create the config folder for the bash-config feature and uv cache
|
|
50
|
-
|
|
51
|
-
// https://dev-guide.diamond.ac.uk/linux-user-environment/how-tos/disk-quota-troubleshooting
|
|
52
|
-
"initializeCommand": "mkdir -p ${localEnv:HOME}/.config/terminal-config ${localEnv:HOME}/.cache/uv",
|
|
58
|
+
"initializeCommand": "mkdir -p ${localEnv:HOME}/.config/terminal-config",
|
|
53
59
|
"runArgs": [
|
|
54
60
|
// Allow the container to access the host X11 display and EPICS CA
|
|
55
61
|
"--net=host",
|
|
56
62
|
// Make sure SELinux does not disable with access to host filesystems like tmp
|
|
57
|
-
"--security-opt=label=disable"
|
|
63
|
+
"--security-opt=label=disable",
|
|
64
|
+
// add the docker socket environment variable to the container
|
|
65
|
+
"-e=DOCKER_HOST=${localEnv:DOCKER_HOST}"
|
|
58
66
|
],
|
|
59
67
|
"mounts": [
|
|
60
68
|
// Mount in the user terminal config folder so it can be edited
|
|
@@ -63,20 +71,27 @@
|
|
|
63
71
|
"target": "/user-terminal-config",
|
|
64
72
|
"type": "bind"
|
|
65
73
|
},
|
|
66
|
-
// Keep a persistent cross container cache for uv
|
|
74
|
+
// Keep a persistent cross container cache for uv, pre-commit, and the venvs
|
|
67
75
|
{
|
|
68
|
-
"source": "
|
|
69
|
-
"target": "/
|
|
76
|
+
"source": "devcontainer-shared-cache",
|
|
77
|
+
"target": "/cache",
|
|
78
|
+
"type": "volume"
|
|
79
|
+
},
|
|
80
|
+
// Match host external services file paths (internal docker starts them on the host)
|
|
81
|
+
{
|
|
82
|
+
"source": "${localWorkspaceFolder}/example-services",
|
|
83
|
+
"target": "${localWorkspaceFolder}/example-services",
|
|
70
84
|
"type": "bind"
|
|
71
85
|
},
|
|
72
|
-
//
|
|
86
|
+
// Mount the user sockets folder
|
|
73
87
|
{
|
|
74
|
-
"
|
|
75
|
-
"
|
|
88
|
+
"source": "${localEnv:XDG_RUNTIME_DIR}",
|
|
89
|
+
"target": "${localEnv:XDG_RUNTIME_DIR}",
|
|
90
|
+
"type": "bind"
|
|
76
91
|
}
|
|
77
92
|
],
|
|
78
93
|
// Mount the parent as /workspaces so we can pip install peers as editable
|
|
79
94
|
"workspaceMount": "source=${localWorkspaceFolder}/..,target=/workspaces,type=bind",
|
|
80
|
-
// After the container is created,
|
|
81
|
-
"postCreateCommand": "uv
|
|
95
|
+
// After the container is created, recreate the venv then make pre-commit first run faster
|
|
96
|
+
"postCreateCommand": "uv venv --clear && uv sync && pre-commit install --install-hooks"
|
|
82
97
|
}
|
|
@@ -24,4 +24,4 @@ It is recommended that developers use a [vscode devcontainer](https://code.visua
|
|
|
24
24
|
|
|
25
25
|
This project was created using the [Diamond Light Source Copier Template](https://github.com/DiamondLightSource/python-copier-template) for Python projects.
|
|
26
26
|
|
|
27
|
-
For more information on common tasks like setting up a developer environment, running the tests, and setting a pre-commit hook, see the template's [How-to guides](https://diamondlightsource.github.io/python-copier-template/5.0.
|
|
27
|
+
For more information on common tasks like setting up a developer environment, running the tests, and setting a pre-commit hook, see the template's [How-to guides](https://diamondlightsource.github.io/python-copier-template/5.0.0a4/how-to.html).
|
|
@@ -7,13 +7,13 @@ jobs:
|
|
|
7
7
|
|
|
8
8
|
steps:
|
|
9
9
|
- name: Checkout
|
|
10
|
-
uses: actions/checkout@
|
|
10
|
+
uses: actions/checkout@v5
|
|
11
11
|
with:
|
|
12
12
|
# Need this to get version number from last tag
|
|
13
13
|
fetch-depth: 0
|
|
14
14
|
|
|
15
15
|
- name: Install uv
|
|
16
|
-
uses: astral-sh/setup-uv@
|
|
16
|
+
uses: astral-sh/setup-uv@v7
|
|
17
17
|
|
|
18
18
|
- name: Build sdist and wheel
|
|
19
19
|
run: >
|
|
@@ -12,7 +12,7 @@ jobs:
|
|
|
12
12
|
run: sleep 60
|
|
13
13
|
|
|
14
14
|
- name: Checkout
|
|
15
|
-
uses: actions/checkout@
|
|
15
|
+
uses: actions/checkout@v5
|
|
16
16
|
with:
|
|
17
17
|
# Need this to get version number from last tag
|
|
18
18
|
fetch-depth: 0
|
|
@@ -21,7 +21,7 @@ jobs:
|
|
|
21
21
|
run: sudo apt-get install graphviz
|
|
22
22
|
|
|
23
23
|
- name: Install uv
|
|
24
|
-
uses: astral-sh/setup-uv@
|
|
24
|
+
uses: astral-sh/setup-uv@v7
|
|
25
25
|
|
|
26
26
|
- name: Build docs
|
|
27
27
|
run: uv run --locked tox -e docs
|
|
@@ -7,7 +7,7 @@ jobs:
|
|
|
7
7
|
|
|
8
8
|
steps:
|
|
9
9
|
- name: Download artifacts
|
|
10
|
-
uses: actions/download-artifact@
|
|
10
|
+
uses: actions/download-artifact@v5
|
|
11
11
|
with:
|
|
12
12
|
merge-multiple: true
|
|
13
13
|
|
|
@@ -23,7 +23,7 @@ jobs:
|
|
|
23
23
|
- name: Create GitHub Release
|
|
24
24
|
# We pin to the SHA, not the tag, for security reasons.
|
|
25
25
|
# https://docs.github.com/en/actions/learn-github-actions/security-hardening-for-github-actions#using-third-party-actions
|
|
26
|
-
uses: softprops/action-gh-release@
|
|
26
|
+
uses: softprops/action-gh-release@6da8fa9354ddfdc4aeace5fc48d7f679b5214090 # v2.4.1
|
|
27
27
|
with:
|
|
28
28
|
prerelease: ${{ contains(github.ref_name, 'a') || contains(github.ref_name, 'b') || contains(github.ref_name, 'rc') }}
|
|
29
29
|
files: "*"
|
|
@@ -13,10 +13,6 @@ on:
|
|
|
13
13
|
type: string
|
|
14
14
|
description: The path to look for tests
|
|
15
15
|
required: true
|
|
16
|
-
needs-services:
|
|
17
|
-
type: boolean
|
|
18
|
-
description: Whether to start external services
|
|
19
|
-
required: true
|
|
20
16
|
secrets:
|
|
21
17
|
CODECOV_TOKEN:
|
|
22
18
|
required: true
|
|
@@ -32,10 +28,11 @@ jobs:
|
|
|
32
28
|
|
|
33
29
|
env:
|
|
34
30
|
COVERAGE_PROCESS_START: .coveragerc
|
|
31
|
+
EXAMPLE_SERVICES_PATH: ./example-services
|
|
35
32
|
|
|
36
33
|
steps:
|
|
37
34
|
- name: Checkout repository (with submodules)
|
|
38
|
-
uses: actions/checkout@
|
|
35
|
+
uses: actions/checkout@v5
|
|
39
36
|
with:
|
|
40
37
|
submodules: recursive
|
|
41
38
|
fetch-depth: 0
|
|
@@ -47,16 +44,7 @@ jobs:
|
|
|
47
44
|
echo "TEMP=D:\\Temp" >> $env:GITHUB_ENV
|
|
48
45
|
|
|
49
46
|
- name: Install uv
|
|
50
|
-
uses: astral-sh/setup-uv@
|
|
51
|
-
|
|
52
|
-
- if: inputs.needs-services && inputs.runs-on != 'windows-latest'
|
|
53
|
-
name: Run docker compose
|
|
54
|
-
uses: hoverkraft-tech/compose-action@v2.4.1
|
|
55
|
-
with:
|
|
56
|
-
compose-file: "./example-services/compose.yaml"
|
|
57
|
-
services: |
|
|
58
|
-
bl01t-di-cam-01
|
|
59
|
-
ca-gateway
|
|
47
|
+
uses: astral-sh/setup-uv@v7
|
|
60
48
|
|
|
61
49
|
- name: Run tests win
|
|
62
50
|
if: inputs.runs-on == 'windows-latest'
|
|
@@ -13,10 +13,10 @@ jobs:
|
|
|
13
13
|
|
|
14
14
|
steps:
|
|
15
15
|
- name: Checkout
|
|
16
|
-
uses: actions/checkout@
|
|
16
|
+
uses: actions/checkout@v5
|
|
17
17
|
|
|
18
18
|
- name: Install uv
|
|
19
|
-
uses: astral-sh/setup-uv@
|
|
19
|
+
uses: astral-sh/setup-uv@v7
|
|
20
20
|
|
|
21
21
|
- name: Run tox
|
|
22
22
|
run: uv run --locked tox -e ${{ inputs.tox }}
|
|
@@ -19,18 +19,13 @@ jobs:
|
|
|
19
19
|
matrix:
|
|
20
20
|
runs-on: ["ubuntu-latest", "windows-latest"] # can add macos-latest
|
|
21
21
|
python-version: ["3.11", "3.12", "3.13"]
|
|
22
|
-
|
|
23
|
-
- tests-path: "tests/unit_tests"
|
|
24
|
-
needs-services: false
|
|
25
|
-
- tests-path: "tests/system_tests"
|
|
26
|
-
needs-services: true
|
|
22
|
+
tests-path: ["", "tests/system_tests"]
|
|
27
23
|
fail-fast: false
|
|
28
24
|
uses: ./.github/workflows/_test.yml
|
|
29
25
|
with:
|
|
30
26
|
runs-on: ${{ matrix.runs-on }}
|
|
31
27
|
python-version: ${{ matrix.python-version }}
|
|
32
|
-
tests-path: ${{ matrix.
|
|
33
|
-
needs-services: ${{ matrix.test-config.needs-services }}
|
|
28
|
+
tests-path: ${{ matrix.tests-path }}
|
|
34
29
|
secrets:
|
|
35
30
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
|
36
31
|
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# The devcontainer should use the developer target and run as root with podman
|
|
2
|
+
# or docker with user namespaces.
|
|
3
|
+
FROM ghcr.io/diamondlightsource/ubuntu-devcontainer:noble AS developer
|
|
4
|
+
|
|
5
|
+
ENV DOCKER=docker-28.5.1
|
|
6
|
+
ENV DOCKER_COMPOSE_RELEASE_TAG=v2.40.3
|
|
7
|
+
|
|
8
|
+
# Add any system dependencies for the developer/build environment here
|
|
9
|
+
RUN apt-get update -y && apt-get install -y --no-install-recommends \
|
|
10
|
+
graphviz \
|
|
11
|
+
libxcb-cursor0 \
|
|
12
|
+
qt6-base-dev \
|
|
13
|
+
curl \
|
|
14
|
+
&& apt-get dist-clean
|
|
15
|
+
|
|
16
|
+
# install the docker ce cli binary
|
|
17
|
+
RUN curl -O https://download.docker.com/linux/static/stable/x86_64/${DOCKER}.tgz && \
|
|
18
|
+
tar xvf ${DOCKER}.tgz && \
|
|
19
|
+
cp docker/docker /usr/bin && \
|
|
20
|
+
rm -r ${DOCKER}.tgz docker
|
|
21
|
+
|
|
22
|
+
# install docker-compose plugin
|
|
23
|
+
RUN mkdir -p /usr/libexec/docker/cli-plugins/ && \
|
|
24
|
+
curl -SL https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_RELEASE_TAG}/docker-compose-linux-x86_64 -o /usr/libexec/docker/cli-plugins/docker-compose && \
|
|
25
|
+
chmod +x /usr/libexec/docker/cli-plugins/docker-compose
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ophyd-async
|
|
3
|
-
Version: 0.13.
|
|
3
|
+
Version: 0.13.7
|
|
4
4
|
Summary: Asynchronous Bluesky hardware abstraction code, compatible with control systems like EPICS and Tango
|
|
5
5
|
Author-email: Tom Cobb <tom.cobb@diamond.ac.uk>
|
|
6
6
|
License: BSD 3-Clause License
|
|
@@ -206,7 +206,6 @@ intersphinx_mapping = {
|
|
|
206
206
|
"bluesky": ("https://blueskyproject.io/bluesky/main", None),
|
|
207
207
|
"scanspec": ("https://blueskyproject.io/scanspec/main", None),
|
|
208
208
|
"numpy": ("https://numpy.org/devdocs/", None),
|
|
209
|
-
"databroker": ("https://blueskyproject.io/databroker/", None),
|
|
210
209
|
"event-model": ("https://blueskyproject.io/event-model/main", None),
|
|
211
210
|
"pytest": ("https://docs.pytest.org/en/stable/", None),
|
|
212
211
|
}
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '0.13.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 13,
|
|
31
|
+
__version__ = version = '0.13.7'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 13, 7)
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'g80ae4488a'
|
|
@@ -41,7 +41,9 @@ class MockSignalBackend(SignalBackend[SignalDatatypeT]):
|
|
|
41
41
|
@cached_property
|
|
42
42
|
def put_mock(self) -> AsyncMock:
|
|
43
43
|
"""Return the mock that will track calls to `put()`."""
|
|
44
|
-
put_mock = AsyncMock(
|
|
44
|
+
put_mock = AsyncMock(
|
|
45
|
+
name="put", spec=Callable, side_effect=lambda *_, **__: None
|
|
46
|
+
)
|
|
45
47
|
self.mock().attach_mock(put_mock, "put")
|
|
46
48
|
return put_mock
|
|
47
49
|
|
|
@@ -66,8 +68,10 @@ class MockSignalBackend(SignalBackend[SignalDatatypeT]):
|
|
|
66
68
|
return put_proceeds
|
|
67
69
|
|
|
68
70
|
async def put(self, value: SignalDatatypeT | None, wait: bool):
|
|
69
|
-
await self.put_mock(value, wait=wait)
|
|
70
|
-
|
|
71
|
+
new_value = await self.put_mock(value, wait=wait)
|
|
72
|
+
if new_value is None:
|
|
73
|
+
new_value = value
|
|
74
|
+
await self.soft_backend.put(new_value, wait=wait)
|
|
71
75
|
if wait:
|
|
72
76
|
await self.put_proceeds.wait()
|
|
73
77
|
|
|
@@ -639,9 +639,10 @@ async def set_and_wait_for_other_value(
|
|
|
639
639
|
if wait_for_set_completion:
|
|
640
640
|
await status
|
|
641
641
|
except TimeoutError as exc:
|
|
642
|
+
matcher_name = getattr(matcher, "__name__", f"<{type(matcher).__name__}>")
|
|
642
643
|
raise TimeoutError(
|
|
643
644
|
f"{match_signal.name} value didn't match value from"
|
|
644
|
-
f" {
|
|
645
|
+
f" {matcher_name}() in {timeout}s"
|
|
645
646
|
) from exc
|
|
646
647
|
|
|
647
648
|
return status
|
|
@@ -98,9 +98,12 @@ class Motor(
|
|
|
98
98
|
self.motor_done_move = epics_signal_r(int, prefix + ".DMOV")
|
|
99
99
|
self.low_limit_travel = epics_signal_rw(float, prefix + ".LLM")
|
|
100
100
|
self.high_limit_travel = epics_signal_rw(float, prefix + ".HLM")
|
|
101
|
+
self.dial_low_limit_travel = epics_signal_rw(float, prefix + ".DLLM")
|
|
102
|
+
self.dial_high_limit_travel = epics_signal_rw(float, prefix + ".DHLM")
|
|
101
103
|
self.offset_freeze_switch = epics_signal_rw(OffsetMode, prefix + ".FOFF")
|
|
102
104
|
self.high_limit_switch = epics_signal_r(int, prefix + ".HLS")
|
|
103
105
|
self.low_limit_switch = epics_signal_r(int, prefix + ".LLS")
|
|
106
|
+
self.output_link = epics_signal_r(str, prefix + ".OUT")
|
|
104
107
|
self.set_use_switch = epics_signal_rw(UseSetMode, prefix + ".SET")
|
|
105
108
|
|
|
106
109
|
# Note:cannot use epics_signal_x here, as the motor record specifies that
|
|
@@ -131,16 +134,26 @@ class Motor(
|
|
|
131
134
|
Will raise a MotorLimitsException if the given absolute positions will be
|
|
132
135
|
outside the motor soft limits.
|
|
133
136
|
"""
|
|
134
|
-
|
|
137
|
+
(
|
|
138
|
+
motor_lower_limit,
|
|
139
|
+
motor_upper_limit,
|
|
140
|
+
egu,
|
|
141
|
+
dial_lower_limit,
|
|
142
|
+
dial_upper_limit,
|
|
143
|
+
) = await asyncio.gather(
|
|
135
144
|
self.low_limit_travel.get_value(),
|
|
136
145
|
self.high_limit_travel.get_value(),
|
|
137
146
|
self.motor_egu.get_value(),
|
|
147
|
+
self.dial_low_limit_travel.get_value(),
|
|
148
|
+
self.dial_high_limit_travel.get_value(),
|
|
138
149
|
)
|
|
139
150
|
|
|
140
|
-
# EPICS motor record treats limits of 0, 0 as no limit
|
|
141
|
-
|
|
151
|
+
# EPICS motor record treats dial limits of 0, 0 as no limit
|
|
152
|
+
# Use DLLM and DHLM to check
|
|
153
|
+
if dial_lower_limit == 0 and dial_upper_limit == 0:
|
|
142
154
|
return
|
|
143
155
|
|
|
156
|
+
# Use real motor limit(i.e. HLM and LLM) to check if the move is permissible
|
|
144
157
|
if (
|
|
145
158
|
not motor_upper_limit >= abs_start_pos >= motor_lower_limit
|
|
146
159
|
or not motor_upper_limit >= abs_end_pos >= motor_lower_limit
|
|
@@ -150,6 +163,8 @@ class Motor(
|
|
|
150
163
|
f"{abs_start_pos}{egu} to "
|
|
151
164
|
f"{abs_end_pos}{egu} but motor limits are "
|
|
152
165
|
f"{motor_lower_limit}{egu} <= x <= {motor_upper_limit}{egu} "
|
|
166
|
+
f"dial limits are "
|
|
167
|
+
f"{dial_lower_limit}{egu} <= x <= {dial_upper_limit}"
|
|
153
168
|
)
|
|
154
169
|
|
|
155
170
|
@AsyncStatus.wrap
|
|
@@ -6,7 +6,8 @@ from ophyd_async.core import Array1D, Device, DeviceVector, StandardReadable
|
|
|
6
6
|
from ophyd_async.epics import motor
|
|
7
7
|
from ophyd_async.epics.core import epics_signal_r, epics_signal_rw, epics_signal_x
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
# Map the CS axis letters to their index (1 indexed)
|
|
10
|
+
CS_INDEX = {letter: index + 1 for index, letter in enumerate("ABCUVWXYZ")}
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
class PmacTrajectoryIO(StandardReadable):
|
|
@@ -20,24 +21,20 @@ class PmacTrajectoryIO(StandardReadable):
|
|
|
20
21
|
# 1 indexed CS axes so we can index into them from the compound motor input link
|
|
21
22
|
self.positions = DeviceVector(
|
|
22
23
|
{
|
|
23
|
-
i
|
|
24
|
-
|
|
25
|
-
)
|
|
26
|
-
for i, letter in enumerate(CS_LETTERS)
|
|
24
|
+
i: epics_signal_rw(Array1D[np.float64], f"{prefix}{letter}:Positions")
|
|
25
|
+
for letter, i in CS_INDEX.items()
|
|
27
26
|
}
|
|
28
27
|
)
|
|
29
28
|
self.use_axis = DeviceVector(
|
|
30
29
|
{
|
|
31
|
-
i
|
|
32
|
-
for
|
|
30
|
+
i: epics_signal_rw(bool, f"{prefix}{letter}:UseAxis")
|
|
31
|
+
for letter, i in CS_INDEX.items()
|
|
33
32
|
}
|
|
34
33
|
)
|
|
35
34
|
self.velocities = DeviceVector(
|
|
36
35
|
{
|
|
37
|
-
i
|
|
38
|
-
|
|
39
|
-
)
|
|
40
|
-
for i, letter in enumerate(CS_LETTERS)
|
|
36
|
+
i: epics_signal_rw(Array1D[np.float64], f"{prefix}{letter}:Velocities")
|
|
37
|
+
for letter, i in CS_INDEX.items()
|
|
41
38
|
}
|
|
42
39
|
)
|
|
43
40
|
self.total_points = epics_signal_r(int, f"{prefix}TotalPoints_RBV")
|
|
@@ -76,8 +73,8 @@ class PmacCoordIO(Device):
|
|
|
76
73
|
self.cs_port = epics_signal_r(str, f"{prefix}Port")
|
|
77
74
|
self.cs_axis_setpoint = DeviceVector(
|
|
78
75
|
{
|
|
79
|
-
i
|
|
80
|
-
for i in
|
|
76
|
+
i: epics_signal_rw(float, f"{prefix}M{i}:DirectDemand")
|
|
77
|
+
for i in CS_INDEX.values()
|
|
81
78
|
}
|
|
82
79
|
)
|
|
83
80
|
super().__init__(name=name)
|
|
@@ -15,10 +15,10 @@ from ophyd_async.core import (
|
|
|
15
15
|
wait_for_value,
|
|
16
16
|
)
|
|
17
17
|
from ophyd_async.epics.motor import Motor
|
|
18
|
-
|
|
19
|
-
from
|
|
20
|
-
from
|
|
21
|
-
from
|
|
18
|
+
|
|
19
|
+
from ._pmac_io import CS_INDEX, PmacIO
|
|
20
|
+
from ._pmac_trajectory_generation import PVT, Trajectory
|
|
21
|
+
from ._utils import (
|
|
22
22
|
_PmacMotorInfo,
|
|
23
23
|
calculate_ramp_position_and_duration,
|
|
24
24
|
)
|
|
@@ -131,8 +131,7 @@ class PmacTrajectoryTriggerLogic(FlyerController):
|
|
|
131
131
|
slice, path_length, motor_info, ramp_up_time
|
|
132
132
|
)
|
|
133
133
|
use_axis = {
|
|
134
|
-
|
|
135
|
-
for axis in range(len(CS_LETTERS))
|
|
134
|
+
i: (i in motor_info.motor_cs_index.values()) for i in CS_INDEX.values()
|
|
136
135
|
}
|
|
137
136
|
|
|
138
137
|
coros = [
|
|
@@ -177,14 +176,14 @@ class PmacTrajectoryTriggerLogic(FlyerController):
|
|
|
177
176
|
self, trajectory: Trajectory, motor_info: _PmacMotorInfo
|
|
178
177
|
):
|
|
179
178
|
coros = []
|
|
180
|
-
for motor,
|
|
179
|
+
for motor, cs_index in motor_info.motor_cs_index.items():
|
|
181
180
|
coros.append(
|
|
182
|
-
self.pmac.trajectory.positions[
|
|
181
|
+
self.pmac.trajectory.positions[cs_index].set(
|
|
183
182
|
trajectory.positions[motor]
|
|
184
183
|
)
|
|
185
184
|
)
|
|
186
185
|
coros.append(
|
|
187
|
-
self.pmac.trajectory.velocities[
|
|
186
|
+
self.pmac.trajectory.velocities[cs_index].set(
|
|
188
187
|
trajectory.velocities[motor]
|
|
189
188
|
)
|
|
190
189
|
)
|
|
@@ -206,7 +205,7 @@ class PmacTrajectoryTriggerLogic(FlyerController):
|
|
|
206
205
|
for motor, position in ramp_up_position.items():
|
|
207
206
|
coros.append(
|
|
208
207
|
set_and_wait_for_value(
|
|
209
|
-
coord.cs_axis_setpoint[motor_info.motor_cs_index[motor]
|
|
208
|
+
coord.cs_axis_setpoint[motor_info.motor_cs_index[motor]],
|
|
210
209
|
position,
|
|
211
210
|
set_timeout=10,
|
|
212
211
|
wait_for_set_completion=False,
|
{ophyd_async-0.13.5 → ophyd_async-0.13.7}/src/ophyd_async/epics/pmac/_pmac_trajectory_generation.py
RENAMED
|
@@ -558,6 +558,9 @@ def _get_velocity_profile(
|
|
|
558
558
|
# Check if all profiles have converged on min_time
|
|
559
559
|
if np.isclose(new_min_time, min_time):
|
|
560
560
|
for motor in motors:
|
|
561
|
+
# MIN_INTERVAL should be less than our convergence tolerance
|
|
562
|
+
# such that motors snap to the same point in the time grid
|
|
563
|
+
profiles[motor].quantize()
|
|
561
564
|
time_arrays[motor], velocity_arrays[motor] = profiles[
|
|
562
565
|
motor
|
|
563
566
|
].make_arrays()
|