From 33e75a0d4c5ab68bbeecd0e3ca77c2148b2bcc99 Mon Sep 17 00:00:00 2001 From: Gary Yendell Date: Mon, 1 Dec 2025 13:11:04 +0000 Subject: [PATCH] Move controllers into their own module Update to fastcs-odin 0.7.0 --- pyproject.toml | 2 +- src/fastcs_eiger/__main__.py | 4 ++-- .../{ => controllers}/eiger_controller.py | 8 +++---- .../eiger_detector_controller.py | 2 +- .../eiger_monitor_controller.py | 2 +- .../controllers/eiger_stream_controller.py | 5 +++++ .../eiger_subsystem_controller.py | 0 .../{ => controllers}/odin/eiger_fan.py | 4 ++-- .../odin}/eiger_odin_controller.py | 4 ++-- .../{ => controllers}/odin/odin_controller.py | 6 ++--- src/fastcs_eiger/eiger_stream_controller.py | 5 ----- tests/conftest.py | 2 +- tests/system/test_eiger_introspection.py | 22 +++++++++++-------- tests/test_eiger_controller.py | 2 +- tests/test_eiger_fan_controller.py | 5 ++--- tests/test_eiger_odin_controller.py | 6 ++--- tests/test_odin_controller.py | 6 ++--- 17 files changed, 44 insertions(+), 41 deletions(-) rename src/fastcs_eiger/{ => controllers}/eiger_controller.py (92%) rename src/fastcs_eiger/{ => controllers}/eiger_detector_controller.py (94%) rename src/fastcs_eiger/{ => controllers}/eiger_monitor_controller.py (87%) create mode 100644 src/fastcs_eiger/controllers/eiger_stream_controller.py rename src/fastcs_eiger/{ => controllers}/eiger_subsystem_controller.py (100%) rename src/fastcs_eiger/{ => controllers}/odin/eiger_fan.py (87%) rename src/fastcs_eiger/{ => controllers/odin}/eiger_odin_controller.py (81%) rename src/fastcs_eiger/{ => controllers}/odin/odin_controller.py (82%) delete mode 100644 src/fastcs_eiger/eiger_stream_controller.py diff --git a/pyproject.toml b/pyproject.toml index e3131a93..2d033a71 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ description = "Eiger control system integration with FastCS" dependencies = [ "aiohttp", "fastcs[epicsca]~=0.11.3", - "fastcs-odin @ git+https://github.com/DiamondLightSource/fastcs-odin.git", + "fastcs-odin @ git+https://github.com/DiamondLightSource/fastcs-odin.git@0.7.0", "numpy", "pillow", "typer", diff --git a/src/fastcs_eiger/__main__.py b/src/fastcs_eiger/__main__.py index ec81934e..dada0e84 100644 --- a/src/fastcs_eiger/__main__.py +++ b/src/fastcs_eiger/__main__.py @@ -9,8 +9,8 @@ from fastcs.transports.epics.ca.transport import EpicsCATransport from fastcs_eiger import __version__ -from fastcs_eiger.eiger_controller import EigerController -from fastcs_eiger.eiger_odin_controller import EigerOdinController +from fastcs_eiger.controllers.eiger_controller import EigerController +from fastcs_eiger.controllers.odin.eiger_odin_controller import EigerOdinController __all__ = ["main"] diff --git a/src/fastcs_eiger/eiger_controller.py b/src/fastcs_eiger/controllers/eiger_controller.py similarity index 92% rename from src/fastcs_eiger/eiger_controller.py rename to src/fastcs_eiger/controllers/eiger_controller.py index 7449f70d..72c63156 100644 --- a/src/fastcs_eiger/eiger_controller.py +++ b/src/fastcs_eiger/controllers/eiger_controller.py @@ -8,11 +8,11 @@ from fastcs.logging import bind_logger from fastcs.methods import scan -from fastcs_eiger.eiger_detector_controller import EigerDetectorController -from fastcs_eiger.eiger_monitor_controller import EigerMonitorController +from fastcs_eiger.controllers.eiger_detector_controller import EigerDetectorController +from fastcs_eiger.controllers.eiger_monitor_controller import EigerMonitorController +from fastcs_eiger.controllers.eiger_stream_controller import EigerStreamController +from fastcs_eiger.controllers.eiger_subsystem_controller import EigerSubsystemController from fastcs_eiger.eiger_parameter import EIGER_PARAMETER_SUBSYSTEMS -from fastcs_eiger.eiger_stream_controller import EigerStreamController -from fastcs_eiger.eiger_subsystem_controller import EigerSubsystemController from fastcs_eiger.http_connection import HTTPConnection, HTTPRequestError diff --git a/src/fastcs_eiger/eiger_detector_controller.py b/src/fastcs_eiger/controllers/eiger_detector_controller.py similarity index 94% rename from src/fastcs_eiger/eiger_detector_controller.py rename to src/fastcs_eiger/controllers/eiger_detector_controller.py index 9e7c8b70..71377a1c 100644 --- a/src/fastcs_eiger/eiger_detector_controller.py +++ b/src/fastcs_eiger/controllers/eiger_detector_controller.py @@ -4,7 +4,7 @@ from fastcs.datatypes import Float from fastcs.methods import command -from fastcs_eiger.eiger_subsystem_controller import EigerSubsystemController +from fastcs_eiger.controllers.eiger_subsystem_controller import EigerSubsystemController def command_uri(key: str) -> str: diff --git a/src/fastcs_eiger/eiger_monitor_controller.py b/src/fastcs_eiger/controllers/eiger_monitor_controller.py similarity index 87% rename from src/fastcs_eiger/eiger_monitor_controller.py rename to src/fastcs_eiger/controllers/eiger_monitor_controller.py index b7e1650b..34796202 100644 --- a/src/fastcs_eiger/eiger_monitor_controller.py +++ b/src/fastcs_eiger/controllers/eiger_monitor_controller.py @@ -4,7 +4,7 @@ from fastcs.methods import scan from PIL import Image -from fastcs_eiger.eiger_subsystem_controller import EigerSubsystemController +from fastcs_eiger.controllers.eiger_subsystem_controller import EigerSubsystemController class EigerMonitorController(EigerSubsystemController): diff --git a/src/fastcs_eiger/controllers/eiger_stream_controller.py b/src/fastcs_eiger/controllers/eiger_stream_controller.py new file mode 100644 index 00000000..fe400ec5 --- /dev/null +++ b/src/fastcs_eiger/controllers/eiger_stream_controller.py @@ -0,0 +1,5 @@ +from fastcs_eiger.controllers.eiger_subsystem_controller import EigerSubsystemController + + +class EigerStreamController(EigerSubsystemController): + _subsystem = "stream" diff --git a/src/fastcs_eiger/eiger_subsystem_controller.py b/src/fastcs_eiger/controllers/eiger_subsystem_controller.py similarity index 100% rename from src/fastcs_eiger/eiger_subsystem_controller.py rename to src/fastcs_eiger/controllers/eiger_subsystem_controller.py diff --git a/src/fastcs_eiger/odin/eiger_fan.py b/src/fastcs_eiger/controllers/odin/eiger_fan.py similarity index 87% rename from src/fastcs_eiger/odin/eiger_fan.py rename to src/fastcs_eiger/controllers/odin/eiger_fan.py index 60d86507..321c76a6 100644 --- a/src/fastcs_eiger/odin/eiger_fan.py +++ b/src/fastcs_eiger/controllers/odin/eiger_fan.py @@ -1,7 +1,7 @@ from fastcs.attributes import AttrR from fastcs.datatypes import Bool -from fastcs_odin.io.status_summary_attribute_io import StatusSummaryAttributeIORef -from fastcs_odin.odin_subcontroller import OdinSubController +from fastcs_odin.controllers import OdinSubController +from fastcs_odin.io import StatusSummaryAttributeIORef from fastcs_odin.util import create_attribute diff --git a/src/fastcs_eiger/eiger_odin_controller.py b/src/fastcs_eiger/controllers/odin/eiger_odin_controller.py similarity index 81% rename from src/fastcs_eiger/eiger_odin_controller.py rename to src/fastcs_eiger/controllers/odin/eiger_odin_controller.py index 4e5ed9a5..7b4bca86 100644 --- a/src/fastcs_eiger/eiger_odin_controller.py +++ b/src/fastcs_eiger/controllers/odin/eiger_odin_controller.py @@ -2,8 +2,8 @@ from fastcs.connections import IPConnectionSettings -from fastcs_eiger.eiger_controller import EigerController -from fastcs_eiger.odin.odin_controller import OdinController +from fastcs_eiger.controllers.eiger_controller import EigerController +from fastcs_eiger.controllers.odin.odin_controller import OdinController class EigerOdinController(EigerController): diff --git a/src/fastcs_eiger/odin/odin_controller.py b/src/fastcs_eiger/controllers/odin/odin_controller.py similarity index 82% rename from src/fastcs_eiger/odin/odin_controller.py rename to src/fastcs_eiger/controllers/odin/odin_controller.py index 022b8405..3c5288ff 100644 --- a/src/fastcs_eiger/odin/odin_controller.py +++ b/src/fastcs_eiger/controllers/odin/odin_controller.py @@ -1,12 +1,12 @@ from fastcs.attributes import AttrR from fastcs.controllers import BaseController from fastcs.datatypes import Bool +from fastcs_odin.controllers import OdinController as _OdinController from fastcs_odin.http_connection import HTTPConnection -from fastcs_odin.io.status_summary_attribute_io import StatusSummaryAttributeIORef -from fastcs_odin.odin_controller import OdinController as _OdinController +from fastcs_odin.io import StatusSummaryAttributeIORef from fastcs_odin.util import OdinParameter -from fastcs_eiger.odin.eiger_fan import EigerFanAdapterController +from fastcs_eiger.controllers.odin.eiger_fan import EigerFanAdapterController class OdinController(_OdinController): diff --git a/src/fastcs_eiger/eiger_stream_controller.py b/src/fastcs_eiger/eiger_stream_controller.py deleted file mode 100644 index 9a873e7f..00000000 --- a/src/fastcs_eiger/eiger_stream_controller.py +++ /dev/null @@ -1,5 +0,0 @@ -from fastcs_eiger.eiger_subsystem_controller import EigerSubsystemController - - -class EigerStreamController(EigerSubsystemController): - _subsystem = "stream" diff --git a/tests/conftest.py b/tests/conftest.py index 310c930b..7ba84fc9 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -9,7 +9,7 @@ from fastcs.connections import IPConnectionSettings from pytest_mock import MockerFixture -from fastcs_eiger.eiger_controller import EigerController +from fastcs_eiger.controllers.eiger_controller import EigerController # Prevent pytest from catching exceptions when debugging in vscode so that break on # exception works correctly (see: https://github.com/pytest-dev/pytest/issues/7409) diff --git a/tests/system/test_eiger_introspection.py b/tests/system/test_eiger_introspection.py index 03737a1d..21771314 100644 --- a/tests/system/test_eiger_introspection.py +++ b/tests/system/test_eiger_introspection.py @@ -11,16 +11,16 @@ from pydantic import ValidationError from pytest_mock import MockerFixture -from fastcs_eiger.eiger_controller import EigerController -from fastcs_eiger.eiger_detector_controller import EigerDetectorController -from fastcs_eiger.eiger_monitor_controller import EigerMonitorController -from fastcs_eiger.eiger_parameter import EigerParameterRef, EigerParameterResponse -from fastcs_eiger.eiger_stream_controller import EigerStreamController -from fastcs_eiger.eiger_subsystem_controller import ( +from fastcs_eiger.controllers.eiger_controller import EigerController +from fastcs_eiger.controllers.eiger_detector_controller import EigerDetectorController +from fastcs_eiger.controllers.eiger_monitor_controller import EigerMonitorController +from fastcs_eiger.controllers.eiger_stream_controller import EigerStreamController +from fastcs_eiger.controllers.eiger_subsystem_controller import ( IGNORED_KEYS, MISSING_KEYS, EigerSubsystemController, ) +from fastcs_eiger.eiger_parameter import EigerParameterRef, EigerParameterResponse HERE = Path(__file__).parent @@ -156,7 +156,7 @@ async def test_threshold_mode_api_inconsistency_handled( @pytest.mark.parametrize("sim_eiger", [str(HERE / "eiger.yaml")], indirect=True) async def test_fetch_before_returning_parameters(sim_eiger, mocker: MockerFixture): # Need to mock @scan to spy controller.update() - with patch("fastcs_eiger.eiger_controller.scan"): + with patch("fastcs_eiger.controllers.eiger_controller.scan"): controller = EigerController(IPConnectionSettings("127.0.0.1", 8081)) await controller.initialise() @@ -330,9 +330,13 @@ async def test_if_min_value_provided_then_prec_set_correctly( ] with ( - patch("fastcs_eiger.eiger_controller.EIGER_PARAMETER_SUBSYSTEMS", ["detector"]), patch( - "fastcs_eiger.eiger_subsystem_controller.EIGER_PARAMETER_MODES", ["status"] + "fastcs_eiger.controllers.eiger_controller.EIGER_PARAMETER_SUBSYSTEMS", + ["detector"], + ), + patch( + "fastcs_eiger.controllers.eiger_subsystem_controller.EIGER_PARAMETER_MODES", + ["status"], ), ): await eiger_controller.initialise() diff --git a/tests/test_eiger_controller.py b/tests/test_eiger_controller.py index 7d1d1f26..20a3e02f 100644 --- a/tests/test_eiger_controller.py +++ b/tests/test_eiger_controller.py @@ -2,7 +2,7 @@ from fastcs.attributes import AttrRW from pytest_mock import MockerFixture -from fastcs_eiger.eiger_detector_controller import EigerDetectorController +from fastcs_eiger.controllers.eiger_detector_controller import EigerDetectorController from fastcs_eiger.eiger_parameter import EigerParameterRef, EigerParameterResponse diff --git a/tests/test_eiger_fan_controller.py b/tests/test_eiger_fan_controller.py index 9ccf5e28..0c6c8708 100644 --- a/tests/test_eiger_fan_controller.py +++ b/tests/test_eiger_fan_controller.py @@ -2,8 +2,7 @@ from pathlib import Path import pytest -from fastcs_odin.io.parameter_attribute_io import ParameterTreeAttributeIO -from fastcs_odin.io.status_summary_attribute_io import StatusSummaryAttributeIO +from fastcs_odin.io import ParameterTreeAttributeIO, StatusSummaryAttributeIO from fastcs_odin.util import ( OdinParameter, OdinParameterMetadata, @@ -11,7 +10,7 @@ ) from pytest_mock import MockerFixture -from fastcs_eiger.odin.eiger_fan import EigerFanAdapterController +from fastcs_eiger.controllers.odin.eiger_fan import EigerFanAdapterController HERE = Path(__file__).parent diff --git a/tests/test_eiger_odin_controller.py b/tests/test_eiger_odin_controller.py index 0359f452..030777ee 100644 --- a/tests/test_eiger_odin_controller.py +++ b/tests/test_eiger_odin_controller.py @@ -2,8 +2,8 @@ from fastcs.connections import IPConnectionSettings from pytest_mock import MockerFixture -from fastcs_eiger.eiger_odin_controller import EigerOdinController -from fastcs_eiger.odin.odin_controller import OdinController +from fastcs_eiger.controllers.odin.eiger_odin_controller import EigerOdinController +from fastcs_eiger.controllers.odin.odin_controller import OdinController @pytest.mark.asyncio @@ -17,7 +17,7 @@ async def test_eiger_odin_controller(mocker: MockerFixture): assert isinstance(controller.OD, OdinController) eiger_initialise_mock = mocker.patch( - "fastcs_eiger.eiger_controller.EigerController.initialise" + "fastcs_eiger.controllers.eiger_controller.EigerController.initialise" ) odin_initialise_mock = mocker.patch.object(controller.OD, "initialise") diff --git a/tests/test_odin_controller.py b/tests/test_odin_controller.py index ea669819..572de6b9 100644 --- a/tests/test_odin_controller.py +++ b/tests/test_odin_controller.py @@ -1,11 +1,11 @@ import pytest from fastcs.connections import IPConnectionSettings -from fastcs_odin.meta_writer import MetaWriterAdapterController +from fastcs_odin.controllers import MetaWriterAdapterController from fastcs_odin.util import OdinParameter, OdinParameterMetadata from pytest_mock import MockerFixture -from fastcs_eiger.odin.eiger_fan import EigerFanAdapterController -from fastcs_eiger.odin.odin_controller import OdinController +from fastcs_eiger.controllers.odin.eiger_fan import EigerFanAdapterController +from fastcs_eiger.controllers.odin.odin_controller import OdinController @pytest.mark.asyncio