ophyd-async 0.12.3__tar.gz → 0.13.1__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.12.3 → ophyd_async-0.13.1}/.copier-answers.yml +3 -2
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/CONTRIBUTING.md +1 -1
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/actions/install_requirements/action.yml +2 -1
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/dependabot.yml +4 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/workflows/_docs.yml +1 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/workflows/_release.yml +1 -1
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/workflows/_test.yml +1 -1
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/workflows/ci.yml +8 -17
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.pre-commit-config.yaml +1 -1
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/PKG-INFO +5 -4
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/decisions/0008-signal-types.md +2 -2
- ophyd_async-0.13.1/docs/explanations/decisions/0011-buffer-updates-camonitor.md +33 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/tutorials/installation.md +1 -1
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/pyproject.toml +18 -4
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/_version.py +16 -3
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/__init__.py +11 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_detector.py +7 -10
- ophyd_async-0.13.1/src/ophyd_async/core/_enums.py +21 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_signal.py +9 -9
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_utils.py +5 -4
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adandor/_andor.py +1 -2
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adaravis/__init__.py +1 -2
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adaravis/_aravis_controller.py +4 -4
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adaravis/_aravis_io.py +2 -12
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adcore/__init__.py +4 -2
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adcore/_core_detector.py +1 -2
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adcore/_core_io.py +60 -8
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adcore/_core_logic.py +4 -4
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adcore/_core_writer.py +10 -7
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adcore/_hdf_writer.py +12 -7
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adcore/_utils.py +38 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adkinetix/_kinetix_io.py +4 -4
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adpilatus/_pilatus.py +2 -6
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/advimba/__init__.py +0 -2
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/advimba/_vimba_controller.py +6 -9
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/advimba/_vimba_io.py +3 -10
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/core/_aioca.py +6 -2
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/core/_p4p.py +2 -3
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/core/_pvi_connector.py +1 -1
- ophyd_async-0.13.1/src/ophyd_async/epics/pmac/__init__.py +8 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/pmac/_pmac_io.py +1 -0
- ophyd_async-0.13.1/src/ophyd_async/epics/pmac/_utils.py +231 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/testing/_example_ioc.py +1 -2
- ophyd_async-0.13.1/src/ophyd_async/plan_stubs/_nd_attributes.py +48 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/plan_stubs/_settings.py +1 -1
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/tango/core/_tango_transport.py +2 -2
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/testing/_assert.py +6 -6
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/testing/_one_of_everything.py +1 -1
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async.egg-info/PKG-INFO +5 -4
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async.egg-info/SOURCES.txt +5 -1
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async.egg-info/requires.txt +2 -1
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/conftest.py +0 -17
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_detector.py +0 -17
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_device.py +1 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_watchable_async_status.py +1 -1
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/adcore/test_drivers.py +1 -1
- ophyd_async-0.13.1/tests/epics/adcore/test_plugins.py +9 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/adcore/test_writers.py +46 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/advimba/test_vimba.py +17 -21
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/conftest.py +0 -3
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/pmac/test_pmac_io.py +1 -0
- ophyd_async-0.13.1/tests/epics/pmac/test_pmac_utils.py +324 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/signal/test_signals.py +45 -2
- ophyd_async-0.13.1/tests/epics/test_areadetector_subclass_naming.py +66 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/test_motor.py +1 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/sim/test_sim_motor.py +1 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/tango/test_tango_signals.py +1 -1
- ophyd_async-0.12.3/.github/workflows/_check.yml +0 -27
- ophyd_async-0.12.3/src/ophyd_async/epics/pmac/__init__.py +0 -3
- ophyd_async-0.12.3/src/ophyd_async/plan_stubs/_nd_attributes.py +0 -74
- ophyd_async-0.12.3/tests/epics/test_areadetector_subclass_naming.py +0 -32
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.codecov.yml +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.devcontainer/devcontainer.json +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.git-blame-ignore-revs +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/ISSUE_TEMPLATE/issue.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/codeql/codeql-config.yml +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/pages/index.html +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/pages/make_switcher.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/workflows/_codeql.yml +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/workflows/_dist.yml +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/workflows/_import_with_no_extras.yml +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/workflows/_pypi.yml +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/workflows/_tox.yml +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.github/workflows/periodic.yml +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/.gitignore +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/Dockerfile +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/LICENSE +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/README.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/_static/custom.css +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/conf.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/decisions/0001-record-architecture-decisions.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/decisions/0002-switched-to-python-copier-template.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/decisions/0003-ophyd-async-migration.rst +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/decisions/0004-repository-structure.rst +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/decisions/0005-respect-black-line-length.rst +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/decisions/0006-procedural-device-definitions.rst +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/decisions/0007-subpackage-structure.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/decisions/0009-procedural-vs-declarative-devices.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/decisions/0010-docstring-format.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/decisions/COPYME +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/decisions.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/declarative-vs-procedural.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/design-goals.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/device-connection-strategies.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/devices-signals-backends.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/fly-scanning.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/plan-stubs.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations/where-device-logic.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/explanations.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/genindex.rst +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/how-to/choose-right-baseclass.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/how-to/contribute.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/how-to/derive-one-signal-from-others.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/how-to/implement-ad-detector.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/how-to/interact-with-signals.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/how-to/put-device-back.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/how-to/store-and-retrieve.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/how-to.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/images/fly_scan_collection_windows_and_frames.svg +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/images/ophyd-async-logo.svg +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/images/ophyd-favicon.svg +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/images/set_and_wait_for_other_value.excalidraw.svg +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/index.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/reference.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/tutorials/implementing-detectors.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/tutorials/implementing-devices.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/tutorials/using-devices.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/tutorials/writing-tests-for-devices.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/docs/tutorials.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/setup.cfg +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/__main__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/_docs_parser.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_derived_signal.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_derived_signal_backend.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_device.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_device_filler.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_flyer.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_hdf_dataset.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_log.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_mock_signal_backend.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_protocol.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_providers.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_readable.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_settings.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_signal_backend.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_soft_signal_backend.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_status.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_table.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/core/_yaml_settings.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adandor/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adandor/_andor_controller.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adandor/_andor_io.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adaravis/_aravis.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adcore/_jpeg_writer.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adcore/_single_trigger.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adcore/_tiff_writer.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adkinetix/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adkinetix/_kinetix.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adkinetix/_kinetix_controller.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adpilatus/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adpilatus/_pilatus_controller.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adpilatus/_pilatus_io.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adsimdetector/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adsimdetector/_sim.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adsimdetector/_sim_controller.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adsimdetector/_sim_io.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/advimba/_vimba.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/core/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/core/_epics_connector.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/core/_epics_device.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/core/_signal.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/core/_util.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/demo/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/demo/__main__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/demo/_ioc.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/demo/_motor.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/demo/_point_detector.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/demo/_point_detector_channel.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/demo/_stage.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/demo/motor.db +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/demo/point_detector.db +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/demo/point_detector_channel.db +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/eiger/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/eiger/_odin_io.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/motor.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/signal.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/testing/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/testing/_utils.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/testing/test_records.db +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/testing/test_records_pva.db +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/fastcs/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/fastcs/core.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/fastcs/eiger/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/fastcs/eiger/_eiger.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/fastcs/eiger/_eiger_controller.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/fastcs/eiger/_eiger_io.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/fastcs/odin/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/fastcs/panda/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/fastcs/panda/_block.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/fastcs/panda/_control.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/fastcs/panda/_hdf_panda.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/fastcs/panda/_table.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/fastcs/panda/_trigger.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/fastcs/panda/_writer.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/plan_stubs/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/plan_stubs/_ensure_connected.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/plan_stubs/_fly.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/plan_stubs/_panda.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/plan_stubs/_utils.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/plan_stubs/_wait_for_awaitable.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/py.typed +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/sim/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/sim/__main__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/sim/_blob_detector.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/sim/_blob_detector_controller.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/sim/_blob_detector_writer.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/sim/_mirror_horizontal.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/sim/_mirror_vertical.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/sim/_motor.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/sim/_pattern_generator.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/sim/_point_detector.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/sim/_stage.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/tango/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/tango/core/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/tango/core/_base_device.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/tango/core/_converters.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/tango/core/_signal.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/tango/core/_tango_readable.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/tango/core/_utils.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/tango/demo/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/tango/demo/_counter.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/tango/demo/_detector.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/tango/demo/_mover.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/tango/demo/_tango/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/tango/demo/_tango/_servers.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/tango/testing/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/tango/testing/_one_of_everything.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/testing/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/testing/__pytest_assert_rewrite.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/testing/_mock_signal_utils.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/testing/_single_derived.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/testing/_utils.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/testing/_wait_for_pending.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async.egg-info/dependency_links.txt +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async.egg-info/top_level.txt +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/system_tests/epics/eiger/README.md +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/system_tests/epics/eiger/start_iocs_and_run_tests.sh +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/system_tests/epics/eiger/test_eiger_system.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_auto_init_devices.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_flyer.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_log.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_mock_signal_backend.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_multi_derived_signal.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_observe.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_protocol.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_providers.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_readable.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_signal.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_single_derived_signal.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_soft_signal_backend.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_status.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_subset_enum.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_table.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/core/test_utils.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/adandor/test_andor.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/adaravis/test_aravis.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/adcore/test_cont_acq_detector.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/adcore/test_detectors.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/adcore/test_scans.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/adcore/test_single_trigger.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/adkinetix/test_kinetix.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/adpilatus/test_pilatus.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/adsimdetector/test_sim.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/demo/test_epics_demo.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/eiger/test_odin_io.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/pvi/test_pvi.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/signal/test_common.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/signal/test_yaml_save_ca.yaml +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/epics/signal/test_yaml_save_pva.yaml +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/fastcs/eiger/test_eiger_controller.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/fastcs/eiger/test_eiger_detector.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/fastcs/panda/db/panda.db +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/fastcs/panda/test_hdf_panda.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/fastcs/panda/test_panda_connect.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/fastcs/panda/test_panda_control.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/fastcs/panda/test_panda_utils.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/fastcs/panda/test_seq_table.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/fastcs/panda/test_trigger.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/fastcs/panda/test_writer.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/plan_stubs/test_ensure_connected.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/plan_stubs/test_fly.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/plan_stubs/test_settings.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/plan_stubs/test_setup.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/sim/__init__.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/sim/test_sim_blob_detector.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/tango/conftest.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/tango/context_subprocess.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/tango/test_base_device.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/tango/test_tango_transport.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/test_cli.py +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/test_data/test_yaml_config_save.yaml +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/test_data/test_yaml_save.yaml +0 -0
- {ophyd_async-0.12.3 → ophyd_async-0.13.1}/tests/test_tutorials.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Changes here will be overwritten by Copier
|
|
2
|
-
_commit:
|
|
3
|
-
_src_path:
|
|
2
|
+
_commit: 4.1.0
|
|
3
|
+
_src_path: https://github.com/DiamondLightSource/python-copier-template
|
|
4
4
|
author_email: tom.cobb@diamond.ac.uk
|
|
5
5
|
author_name: Tom Cobb
|
|
6
6
|
description: Asynchronous Bluesky hardware abstraction code, compatible with control
|
|
@@ -13,4 +13,5 @@ github_org: bluesky
|
|
|
13
13
|
package_name: ophyd_async
|
|
14
14
|
pypi: true
|
|
15
15
|
repo_name: ophyd-async
|
|
16
|
+
strict_typing: false
|
|
16
17
|
type_checker: pyright
|
|
@@ -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/4.1.0/how-to.html).
|
|
@@ -7,7 +7,7 @@ assignees: ''
|
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
Describe the bug, including a clear and concise description of the expected
|
|
10
|
+
Describe the bug, including a clear and concise description of the expected behaviour, the actual behavior and the context in which you encountered it (ideally include details of your environment).
|
|
11
11
|
|
|
12
12
|
## Steps To Reproduce
|
|
13
13
|
Steps to reproduce the behavior:
|
|
@@ -15,7 +15,8 @@ runs:
|
|
|
15
15
|
run: |
|
|
16
16
|
PYTHON_VERSION="${{ inputs.python-version }}"
|
|
17
17
|
if [ $PYTHON_VERSION == "dev" ]; then
|
|
18
|
-
|
|
18
|
+
# python version from Dockerfile, removing potential pinned sha
|
|
19
|
+
PYTHON_VERSION=$(sed -Ene "s/ARG PYTHON_VERSION=([0-9\.]+).*/\1/p" Dockerfile)
|
|
19
20
|
fi
|
|
20
21
|
echo "PYTHON_VERSION=$PYTHON_VERSION" >> "$GITHUB_ENV"
|
|
21
22
|
shell: bash
|
|
@@ -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@da05d552573ad5aba039eaac05058a918a7bf631 # v2.2.2
|
|
27
27
|
with:
|
|
28
28
|
prerelease: ${{ contains(github.ref_name, 'a') || contains(github.ref_name, 'b') || contains(github.ref_name, 'rc') }}
|
|
29
29
|
files: "*"
|
|
@@ -2,26 +2,24 @@ name: CI
|
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
tags:
|
|
8
|
+
- '*'
|
|
5
9
|
pull_request:
|
|
6
10
|
|
|
7
11
|
jobs:
|
|
8
|
-
check:
|
|
9
|
-
uses: ./.github/workflows/_check.yml
|
|
10
12
|
|
|
11
13
|
lint:
|
|
12
|
-
needs: check
|
|
13
|
-
if: needs.check.outputs.branch-pr == ''
|
|
14
14
|
uses: ./.github/workflows/_tox.yml
|
|
15
15
|
with:
|
|
16
16
|
tox: pre-commit,type-checking
|
|
17
17
|
|
|
18
18
|
test:
|
|
19
|
-
needs: check
|
|
20
|
-
if: needs.check.outputs.branch-pr == ''
|
|
21
19
|
strategy:
|
|
22
20
|
matrix:
|
|
23
21
|
runs-on: ["ubuntu-latest", "windows-latest"] # can add macos-latest
|
|
24
|
-
python-version: ["3.
|
|
22
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
25
23
|
include:
|
|
26
24
|
# Include one that runs in the dev environment
|
|
27
25
|
- runs-on: "ubuntu-latest"
|
|
@@ -35,35 +33,28 @@ jobs:
|
|
|
35
33
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
|
36
34
|
|
|
37
35
|
import_with_no_extras:
|
|
38
|
-
needs: check
|
|
39
|
-
if: needs.check.outputs.branch-pr == ''
|
|
40
36
|
uses: ./.github/workflows/_import_with_no_extras.yml
|
|
41
37
|
|
|
42
38
|
docs:
|
|
43
|
-
needs: check
|
|
44
|
-
if: needs.check.outputs.branch-pr == ''
|
|
45
39
|
uses: ./.github/workflows/_docs.yml
|
|
46
40
|
|
|
41
|
+
|
|
47
42
|
dist:
|
|
48
|
-
needs: check
|
|
49
|
-
if: needs.check.outputs.branch-pr == ''
|
|
50
43
|
uses: ./.github/workflows/_dist.yml
|
|
51
44
|
|
|
52
45
|
pypi:
|
|
46
|
+
needs: [dist, test]
|
|
53
47
|
if: github.ref_type == 'tag'
|
|
54
|
-
needs: dist
|
|
55
48
|
uses: ./.github/workflows/_pypi.yml
|
|
56
49
|
permissions:
|
|
57
50
|
id-token: write
|
|
58
51
|
|
|
59
52
|
codeql:
|
|
60
|
-
needs: check
|
|
61
|
-
if: needs.check.outputs.branch-pr == ''
|
|
62
53
|
uses: ./.github/workflows/_codeql.yml
|
|
63
54
|
|
|
64
55
|
release:
|
|
56
|
+
needs: [dist, test, docs]
|
|
65
57
|
if: github.ref_type == 'tag'
|
|
66
|
-
needs: [dist, docs]
|
|
67
58
|
uses: ./.github/workflows/_release.yml
|
|
68
59
|
permissions:
|
|
69
60
|
contents: write
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ophyd-async
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.13.1
|
|
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
|
|
@@ -35,10 +35,10 @@ License: BSD 3-Clause License
|
|
|
35
35
|
Project-URL: GitHub, https://github.com/bluesky/ophyd-async
|
|
36
36
|
Classifier: Development Status :: 3 - Alpha
|
|
37
37
|
Classifier: License :: OSI Approved :: BSD License
|
|
38
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
39
38
|
Classifier: Programming Language :: Python :: 3.11
|
|
40
39
|
Classifier: Programming Language :: Python :: 3.12
|
|
41
|
-
|
|
40
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
41
|
+
Requires-Python: >=3.11
|
|
42
42
|
Description-Content-Type: text/markdown
|
|
43
43
|
License-File: LICENSE
|
|
44
44
|
Requires-Dist: numpy
|
|
@@ -49,6 +49,7 @@ Requires-Dist: colorlog
|
|
|
49
49
|
Requires-Dist: pydantic>=2.0
|
|
50
50
|
Requires-Dist: pydantic-numpy
|
|
51
51
|
Requires-Dist: stamina>=23.1.0
|
|
52
|
+
Requires-Dist: scanspec>=1.0a1
|
|
52
53
|
Provides-Extra: sim
|
|
53
54
|
Requires-Dist: h5py; extra == "sim"
|
|
54
55
|
Provides-Extra: ca
|
|
@@ -56,7 +57,7 @@ Requires-Dist: aioca>=2.0a4; extra == "ca"
|
|
|
56
57
|
Provides-Extra: pva
|
|
57
58
|
Requires-Dist: p4p>=4.2.0; extra == "pva"
|
|
58
59
|
Provides-Extra: tango
|
|
59
|
-
Requires-Dist: pytango==10.0.
|
|
60
|
+
Requires-Dist: pytango==10.0.2; extra == "tango"
|
|
60
61
|
Provides-Extra: demo
|
|
61
62
|
Requires-Dist: ipython; extra == "demo"
|
|
62
63
|
Requires-Dist: matplotlib; extra == "demo"
|
|
@@ -54,8 +54,8 @@ Structure now read from `.value` rather than `.pvi`. Supported in FastCS. Requir
|
|
|
54
54
|
## `StrictEnum` is now requried for all strictly checked `Enums`
|
|
55
55
|
```python
|
|
56
56
|
# old
|
|
57
|
-
from enum import
|
|
58
|
-
class MyEnum(
|
|
57
|
+
from enum import StrEnum
|
|
58
|
+
class MyEnum(StrEnum):
|
|
59
59
|
ONE = "one"
|
|
60
60
|
TWO = "two"
|
|
61
61
|
# new
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# 11. Buffer updates when using `camonitor`
|
|
2
|
+
|
|
3
|
+
Date: 2025-07-30
|
|
4
|
+
|
|
5
|
+
## Status
|
|
6
|
+
|
|
7
|
+
Accepted
|
|
8
|
+
|
|
9
|
+
## Context
|
|
10
|
+
|
|
11
|
+
The ChannelAccess signal backend uses aioca.camonitor to subscribe to changes in PV values. By default it deals with backpressure by dropping excessive updates that it is too slow to handle. It also has a mode whereby it will buffer the updates, lagging behind if there are too many.
|
|
12
|
+
|
|
13
|
+
```python
|
|
14
|
+
# The following will buffer every update to the PV
|
|
15
|
+
aioca.camonitor(my_pv, all_updates=True)
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Decision
|
|
19
|
+
|
|
20
|
+
Default `all_updates` to `True` in the ChannelAccess backend, but provide a feature flag via an environment variable so it can be reverted at runtime if necessary.
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# The following should restore the old behavior
|
|
24
|
+
export OPHYD_ASYNC_EPICS_CA_KEEP_ALL_UPDATES=False
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Consequences
|
|
28
|
+
|
|
29
|
+
If backpressure is causing a problem, ophyd-async will slow down and lag behind. This is deemed to be an easier problem to spot and debug than updates being silently dropped.
|
|
30
|
+
|
|
31
|
+
It is the responsibility of IOCs to not push updates too quickly (<=10Hz) rather than the responsibility of ophyd-async to handle them. If an IOC is pushing updates too quickly, it should be fixed.
|
|
32
|
+
|
|
33
|
+
There may be unknown bugs and race conditions exposed by this change, they can be temporarily remedied by disabling the feature (see above).
|
|
@@ -7,9 +7,9 @@ name = "ophyd-async"
|
|
|
7
7
|
classifiers = [
|
|
8
8
|
"Development Status :: 3 - Alpha",
|
|
9
9
|
"License :: OSI Approved :: BSD License",
|
|
10
|
-
"Programming Language :: Python :: 3.10",
|
|
11
10
|
"Programming Language :: Python :: 3.11",
|
|
12
11
|
"Programming Language :: Python :: 3.12",
|
|
12
|
+
"Programming Language :: Python :: 3.13",
|
|
13
13
|
]
|
|
14
14
|
description = "Asynchronous Bluesky hardware abstraction code, compatible with control systems like EPICS and Tango"
|
|
15
15
|
dependencies = [
|
|
@@ -20,18 +20,19 @@ dependencies = [
|
|
|
20
20
|
"colorlog",
|
|
21
21
|
"pydantic>=2.0",
|
|
22
22
|
"pydantic-numpy",
|
|
23
|
-
"stamina>=23.1.0"
|
|
23
|
+
"stamina>=23.1.0",
|
|
24
|
+
"scanspec>=1.0a1",
|
|
24
25
|
]
|
|
25
26
|
dynamic = ["version"]
|
|
26
27
|
license.file = "LICENSE"
|
|
27
28
|
readme = "README.md"
|
|
28
|
-
requires-python = ">=3.
|
|
29
|
+
requires-python = ">=3.11"
|
|
29
30
|
|
|
30
31
|
[project.optional-dependencies]
|
|
31
32
|
sim = ["h5py"]
|
|
32
33
|
ca = ["aioca>=2.0a4"]
|
|
33
34
|
pva = ["p4p>=4.2.0"]
|
|
34
|
-
tango = ["pytango==10.0.
|
|
35
|
+
tango = ["pytango==10.0.2"]
|
|
35
36
|
demo = ["ipython", "matplotlib", "pyqt6"]
|
|
36
37
|
dev = [
|
|
37
38
|
"ophyd_async[sim]",
|
|
@@ -191,3 +192,16 @@ source_modules = [
|
|
|
191
192
|
"ophyd_async.tango.*",
|
|
192
193
|
]
|
|
193
194
|
ignore_imports = ["ophyd_async.*.testing.* -> ophyd_async.testing"]
|
|
195
|
+
|
|
196
|
+
[[tool.importlinter.contracts]]
|
|
197
|
+
name = "ophyd_async.core private modules are not to be used outside ophyd_async.core"
|
|
198
|
+
type = "forbidden"
|
|
199
|
+
forbidden_modules = ["ophyd_async.core.*"]
|
|
200
|
+
source_modules = [
|
|
201
|
+
"ophyd_async.testing",
|
|
202
|
+
"ophyd_async.plan_stubs",
|
|
203
|
+
"ophyd_async.fastcs.*",
|
|
204
|
+
"ophyd_async.epics.*",
|
|
205
|
+
"ophyd_async.tango.*",
|
|
206
|
+
]
|
|
207
|
+
allow_indirect_imports = true
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
# file generated by setuptools-scm
|
|
2
2
|
# don't change, don't track in version control
|
|
3
3
|
|
|
4
|
-
__all__ = [
|
|
4
|
+
__all__ = [
|
|
5
|
+
"__version__",
|
|
6
|
+
"__version_tuple__",
|
|
7
|
+
"version",
|
|
8
|
+
"version_tuple",
|
|
9
|
+
"__commit_id__",
|
|
10
|
+
"commit_id",
|
|
11
|
+
]
|
|
5
12
|
|
|
6
13
|
TYPE_CHECKING = False
|
|
7
14
|
if TYPE_CHECKING:
|
|
@@ -9,13 +16,19 @@ if TYPE_CHECKING:
|
|
|
9
16
|
from typing import Union
|
|
10
17
|
|
|
11
18
|
VERSION_TUPLE = Tuple[Union[int, str], ...]
|
|
19
|
+
COMMIT_ID = Union[str, None]
|
|
12
20
|
else:
|
|
13
21
|
VERSION_TUPLE = object
|
|
22
|
+
COMMIT_ID = object
|
|
14
23
|
|
|
15
24
|
version: str
|
|
16
25
|
__version__: str
|
|
17
26
|
__version_tuple__: VERSION_TUPLE
|
|
18
27
|
version_tuple: VERSION_TUPLE
|
|
28
|
+
commit_id: COMMIT_ID
|
|
29
|
+
__commit_id__: COMMIT_ID
|
|
19
30
|
|
|
20
|
-
__version__ = version = '0.
|
|
21
|
-
__version_tuple__ = version_tuple = (0,
|
|
31
|
+
__version__ = version = '0.13.1'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 13, 1)
|
|
33
|
+
|
|
34
|
+
__commit_id__ = commit_id = 'g228f25c8b'
|
|
@@ -16,6 +16,12 @@ from ._detector import (
|
|
|
16
16
|
)
|
|
17
17
|
from ._device import Device, DeviceConnector, DeviceVector, init_devices
|
|
18
18
|
from ._device_filler import DeviceFiller
|
|
19
|
+
from ._enums import (
|
|
20
|
+
EnabledDisabled,
|
|
21
|
+
EnableDisable,
|
|
22
|
+
InOut,
|
|
23
|
+
OnOff,
|
|
24
|
+
)
|
|
19
25
|
from ._flyer import FlyerController, FlyMotorInfo, StandardFlyer
|
|
20
26
|
from ._hdf_dataset import HDFDatasetDescription, HDFDocumentComposer
|
|
21
27
|
from ._log import config_ophyd_async_logging
|
|
@@ -209,4 +215,9 @@ __all__ = [
|
|
|
209
215
|
# Back compat - delete before 1.0
|
|
210
216
|
"ConfigSignal",
|
|
211
217
|
"HintedSignal",
|
|
218
|
+
# Standard enums
|
|
219
|
+
"EnabledDisabled",
|
|
220
|
+
"EnableDisable",
|
|
221
|
+
"InOut",
|
|
222
|
+
"OnOff",
|
|
212
223
|
]
|
|
@@ -84,7 +84,7 @@ class TriggerInfo(ConfinedModel):
|
|
|
84
84
|
A exposures_per_event > 1 can be useful to have exposures from a faster detector
|
|
85
85
|
able to be zipped with a single exposure from a slower detector. E.g. if
|
|
86
86
|
number_of_events=10 and exposures_per_event=5 then the detector will take
|
|
87
|
-
|
|
87
|
+
50 exposures, but publish 10 StreamDatum indices, and describe() will show a
|
|
88
88
|
shape of (5, h, w) for each.
|
|
89
89
|
Default is 1.
|
|
90
90
|
"""
|
|
@@ -104,7 +104,11 @@ class DetectorController(ABC):
|
|
|
104
104
|
|
|
105
105
|
@abstractmethod
|
|
106
106
|
def get_deadtime(self, exposure: float | None) -> float:
|
|
107
|
-
"""
|
|
107
|
+
"""Get state-independent deadtime.
|
|
108
|
+
|
|
109
|
+
For a given exposure, what is the safest minimum time between exposures that
|
|
110
|
+
can be determined without reading signals.
|
|
111
|
+
"""
|
|
108
112
|
|
|
109
113
|
@abstractmethod
|
|
110
114
|
async def prepare(self, trigger_info: TriggerInfo) -> None:
|
|
@@ -313,14 +317,7 @@ class StandardDetector(
|
|
|
313
317
|
if value.trigger != DetectorTrigger.INTERNAL and not value.deadtime:
|
|
314
318
|
msg = "Deadtime must be supplied when in externally triggered mode"
|
|
315
319
|
raise ValueError(msg)
|
|
316
|
-
|
|
317
|
-
if value.deadtime and required_deadtime > value.deadtime:
|
|
318
|
-
msg = (
|
|
319
|
-
f"Detector {self._controller} needs at least {required_deadtime}s "
|
|
320
|
-
f"deadtime, but trigger logic provides only {value.deadtime}s"
|
|
321
|
-
)
|
|
322
|
-
raise ValueError(msg)
|
|
323
|
-
elif not value.deadtime:
|
|
320
|
+
if not value.deadtime:
|
|
324
321
|
value.deadtime = self._controller.get_deadtime(value.livetime)
|
|
325
322
|
self._trigger_info = value
|
|
326
323
|
self._number_of_events_iter = iter(
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from ._utils import StrictEnum
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class OnOff(StrictEnum):
|
|
5
|
+
ON = "On"
|
|
6
|
+
OFF = "Off"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class EnableDisable(StrictEnum):
|
|
10
|
+
ENABLE = "Enable"
|
|
11
|
+
DISABLE = "Disable"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class EnabledDisabled(StrictEnum):
|
|
15
|
+
ENABLED = "Enabled"
|
|
16
|
+
DISABLED = "Disabled"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class InOut(StrictEnum):
|
|
20
|
+
IN = "In"
|
|
21
|
+
OUT = "Out"
|
|
@@ -39,8 +39,8 @@ from ._utils import (
|
|
|
39
39
|
async def _wait_for(coro: Awaitable[T], timeout: float | None, source: str) -> T:
|
|
40
40
|
try:
|
|
41
41
|
return await asyncio.wait_for(coro, timeout)
|
|
42
|
-
except
|
|
43
|
-
raise
|
|
42
|
+
except TimeoutError as e:
|
|
43
|
+
raise TimeoutError(source) from e
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
def _add_timeout(func):
|
|
@@ -492,7 +492,7 @@ async def observe_signals_value(
|
|
|
492
492
|
last_item = ()
|
|
493
493
|
while True:
|
|
494
494
|
if overall_deadline and time.monotonic() >= overall_deadline:
|
|
495
|
-
raise
|
|
495
|
+
raise TimeoutError(
|
|
496
496
|
f"observe_value was still observing signals "
|
|
497
497
|
f"{[signal.source for signal in signals]} after "
|
|
498
498
|
f"timeout {done_timeout}s"
|
|
@@ -500,8 +500,8 @@ async def observe_signals_value(
|
|
|
500
500
|
iteration_timeout = _get_iteration_timeout(timeout, overall_deadline)
|
|
501
501
|
try:
|
|
502
502
|
item = await asyncio.wait_for(q.get(), iteration_timeout)
|
|
503
|
-
except
|
|
504
|
-
raise
|
|
503
|
+
except TimeoutError as exc:
|
|
504
|
+
raise TimeoutError(
|
|
505
505
|
f"Timeout Error while waiting {iteration_timeout}s to update "
|
|
506
506
|
f"{[signal.source for signal in signals]}. "
|
|
507
507
|
f"Last observed signal and value were {last_item}"
|
|
@@ -536,8 +536,8 @@ class _ValueChecker(Generic[SignalDatatypeT]):
|
|
|
536
536
|
):
|
|
537
537
|
try:
|
|
538
538
|
await asyncio.wait_for(self._wait_for_value(signal), timeout)
|
|
539
|
-
except
|
|
540
|
-
raise
|
|
539
|
+
except TimeoutError as e:
|
|
540
|
+
raise TimeoutError(
|
|
541
541
|
f"{signal.name} didn't match {self._matcher_name} in {timeout}s, "
|
|
542
542
|
f"last value {self._last_value!r}"
|
|
543
543
|
) from e
|
|
@@ -635,8 +635,8 @@ async def set_and_wait_for_other_value(
|
|
|
635
635
|
await asyncio.wait_for(_wait_for_value(), timeout)
|
|
636
636
|
if wait_for_set_completion:
|
|
637
637
|
await status
|
|
638
|
-
except
|
|
639
|
-
raise
|
|
638
|
+
except TimeoutError as e:
|
|
639
|
+
raise TimeoutError(
|
|
640
640
|
f"{match_signal.name} value didn't match value from"
|
|
641
641
|
f" {matcher.__name__}() in {timeout}s"
|
|
642
642
|
) from e
|
|
@@ -4,7 +4,7 @@ import asyncio
|
|
|
4
4
|
import logging
|
|
5
5
|
from collections.abc import Awaitable, Callable, Iterable, Mapping, Sequence
|
|
6
6
|
from dataclasses import dataclass
|
|
7
|
-
from enum import Enum, EnumMeta
|
|
7
|
+
from enum import Enum, EnumMeta, StrEnum
|
|
8
8
|
from typing import (
|
|
9
9
|
Any,
|
|
10
10
|
Generic,
|
|
@@ -59,15 +59,15 @@ class AnyStringUppercaseNameEnumMeta(UppercaseNameEnumMeta):
|
|
|
59
59
|
return super().__call__(value, *args, **kwargs)
|
|
60
60
|
|
|
61
61
|
|
|
62
|
-
class StrictEnum(
|
|
62
|
+
class StrictEnum(StrEnum, metaclass=UppercaseNameEnumMeta):
|
|
63
63
|
"""All members should exist in the Backend, and there will be no extras."""
|
|
64
64
|
|
|
65
65
|
|
|
66
|
-
class SubsetEnum(
|
|
66
|
+
class SubsetEnum(StrEnum, metaclass=AnyStringUppercaseNameEnumMeta):
|
|
67
67
|
"""All members should exist in the Backend, but there may be extras."""
|
|
68
68
|
|
|
69
69
|
|
|
70
|
-
class SupersetEnum(
|
|
70
|
+
class SupersetEnum(StrEnum, metaclass=UppercaseNameEnumMeta):
|
|
71
71
|
"""Some members should exist in the Backend, and there should be no extras."""
|
|
72
72
|
|
|
73
73
|
|
|
@@ -243,6 +243,7 @@ def get_enum_cls(datatype: type | None) -> type[EnumTypes] | None:
|
|
|
243
243
|
"""
|
|
244
244
|
if get_origin(datatype) is Sequence:
|
|
245
245
|
datatype = get_args(datatype)[0]
|
|
246
|
+
datatype = get_origin_class(datatype)
|
|
246
247
|
if datatype and issubclass(datatype, Enum):
|
|
247
248
|
if not issubclass(datatype, EnumTypes):
|
|
248
249
|
raise TypeError(
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from collections.abc import Sequence
|
|
2
2
|
|
|
3
|
-
from ophyd_async.core import PathProvider
|
|
4
|
-
from ophyd_async.core._signal import SignalR
|
|
3
|
+
from ophyd_async.core import PathProvider, SignalR
|
|
5
4
|
from ophyd_async.epics import adcore
|
|
6
5
|
|
|
7
6
|
from ._andor_controller import Andor2Controller
|
|
@@ -5,12 +5,11 @@ https://github.com/areaDetector/ADAravis
|
|
|
5
5
|
|
|
6
6
|
from ._aravis import AravisDetector
|
|
7
7
|
from ._aravis_controller import AravisController
|
|
8
|
-
from ._aravis_io import AravisDriverIO,
|
|
8
|
+
from ._aravis_io import AravisDriverIO, AravisTriggerSource
|
|
9
9
|
|
|
10
10
|
__all__ = [
|
|
11
11
|
"AravisDetector",
|
|
12
12
|
"AravisController",
|
|
13
13
|
"AravisDriverIO",
|
|
14
|
-
"AravisTriggerMode",
|
|
15
14
|
"AravisTriggerSource",
|
|
16
15
|
]
|
{ophyd_async-0.12.3 → ophyd_async-0.13.1}/src/ophyd_async/epics/adaravis/_aravis_controller.py
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
|
|
3
|
-
from ophyd_async.core import DetectorTrigger, TriggerInfo
|
|
3
|
+
from ophyd_async.core import DetectorTrigger, OnOff, TriggerInfo
|
|
4
4
|
from ophyd_async.epics import adcore
|
|
5
5
|
|
|
6
|
-
from ._aravis_io import AravisDriverIO,
|
|
6
|
+
from ._aravis_io import AravisDriverIO, AravisTriggerSource
|
|
7
7
|
|
|
8
8
|
# The deadtime of an ADaravis controller varies depending on the exact model of camera.
|
|
9
9
|
# Ideally we would maximize performance by dynamically retrieving the deadtime at
|
|
@@ -23,14 +23,14 @@ class AravisController(adcore.ADBaseController[AravisDriverIO]):
|
|
|
23
23
|
|
|
24
24
|
if trigger_info.trigger is DetectorTrigger.INTERNAL:
|
|
25
25
|
# Set trigger mode off to ignore the trigger source
|
|
26
|
-
await self.driver.trigger_mode.set(
|
|
26
|
+
await self.driver.trigger_mode.set(OnOff.OFF)
|
|
27
27
|
elif trigger_info.trigger in {
|
|
28
28
|
DetectorTrigger.CONSTANT_GATE,
|
|
29
29
|
DetectorTrigger.EDGE_TRIGGER,
|
|
30
30
|
}:
|
|
31
31
|
# Trigger on the rising edge of Line1
|
|
32
32
|
# trigger mode must be set first and on it's own!
|
|
33
|
-
await self.driver.trigger_mode.set(
|
|
33
|
+
await self.driver.trigger_mode.set(OnOff.ON)
|
|
34
34
|
await self.driver.trigger_source.set(AravisTriggerSource.LINE1)
|
|
35
35
|
else:
|
|
36
36
|
raise ValueError(f"ADAravis does not support {trigger_info.trigger}")
|
|
@@ -1,20 +1,10 @@
|
|
|
1
1
|
from typing import Annotated as A
|
|
2
2
|
|
|
3
|
-
from ophyd_async.core import
|
|
3
|
+
from ophyd_async.core import OnOff, SignalRW, SubsetEnum
|
|
4
4
|
from ophyd_async.epics import adcore
|
|
5
5
|
from ophyd_async.epics.core import PvSuffix
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
class AravisTriggerMode(StrictEnum):
|
|
9
|
-
"""GigEVision GenICAM standard TriggerMode."""
|
|
10
|
-
|
|
11
|
-
ON = "On"
|
|
12
|
-
"""Use TriggerSource to trigger each frame"""
|
|
13
|
-
|
|
14
|
-
OFF = "Off"
|
|
15
|
-
"""Just trigger as fast as you can"""
|
|
16
|
-
|
|
17
|
-
|
|
18
8
|
class AravisTriggerSource(SubsetEnum):
|
|
19
9
|
"""Which trigger source to use when TriggerMode=On."""
|
|
20
10
|
|
|
@@ -27,5 +17,5 @@ class AravisDriverIO(adcore.ADBaseIO):
|
|
|
27
17
|
This mirrors the interface provided by ADAravis/db/aravisCamera.template.
|
|
28
18
|
"""
|
|
29
19
|
|
|
30
|
-
trigger_mode: A[SignalRW[
|
|
20
|
+
trigger_mode: A[SignalRW[OnOff], PvSuffix.rbv("TriggerMode")]
|
|
31
21
|
trigger_source: A[SignalRW[AravisTriggerSource], PvSuffix.rbv("TriggerSource")]
|
|
@@ -7,7 +7,6 @@ from ._core_detector import AreaDetector, ContAcqAreaDetector
|
|
|
7
7
|
from ._core_io import (
|
|
8
8
|
ADBaseDatasetDescriber,
|
|
9
9
|
ADBaseIO,
|
|
10
|
-
ADCallbacks,
|
|
11
10
|
ADCompression,
|
|
12
11
|
ADState,
|
|
13
12
|
NDArrayBaseIO,
|
|
@@ -18,6 +17,7 @@ from ._core_io import (
|
|
|
18
17
|
NDPluginBaseIO,
|
|
19
18
|
NDPluginCBIO,
|
|
20
19
|
NDPluginStatsIO,
|
|
20
|
+
NDROIStatIO,
|
|
21
21
|
)
|
|
22
22
|
from ._core_logic import DEFAULT_GOOD_STATES, ADBaseContAcqController, ADBaseController
|
|
23
23
|
from ._core_writer import ADWriter
|
|
@@ -33,11 +33,11 @@ from ._utils import (
|
|
|
33
33
|
NDAttributeParam,
|
|
34
34
|
NDAttributePv,
|
|
35
35
|
NDAttributePvDbrType,
|
|
36
|
+
ndattributes_to_xml,
|
|
36
37
|
)
|
|
37
38
|
|
|
38
39
|
__all__ = [
|
|
39
40
|
"ADBaseIO",
|
|
40
|
-
"ADCallbacks",
|
|
41
41
|
"ADCompression",
|
|
42
42
|
"ADBaseContAcqController",
|
|
43
43
|
"AreaDetector",
|
|
@@ -49,6 +49,7 @@ __all__ = [
|
|
|
49
49
|
"NDFileHDFIO",
|
|
50
50
|
"NDPluginBaseIO",
|
|
51
51
|
"NDPluginStatsIO",
|
|
52
|
+
"NDROIStatIO",
|
|
52
53
|
"DEFAULT_GOOD_STATES",
|
|
53
54
|
"ADBaseDatasetDescriber",
|
|
54
55
|
"ADBaseController",
|
|
@@ -66,4 +67,5 @@ __all__ = [
|
|
|
66
67
|
"NDAttributePvDbrType",
|
|
67
68
|
"NDCBFlushOnSoftTrgMode",
|
|
68
69
|
"NDPluginCBIO",
|
|
70
|
+
"ndattributes_to_xml",
|
|
69
71
|
]
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from collections.abc import Sequence
|
|
2
2
|
|
|
3
|
-
from ophyd_async.core import SignalR, StandardDetector
|
|
4
|
-
from ophyd_async.core._providers import PathProvider
|
|
3
|
+
from ophyd_async.core import PathProvider, SignalR, StandardDetector
|
|
5
4
|
|
|
6
5
|
from ._core_io import ADBaseIO, NDPluginBaseIO, NDPluginCBIO
|
|
7
6
|
from ._core_logic import ADBaseContAcqController, ADBaseControllerT
|