From afcd1aaa6474868dee68a617d464acce4f0ab962 Mon Sep 17 00:00:00 2001 From: Hiran Wijesinghe Date: Fri, 26 Sep 2025 15:32:18 +0000 Subject: [PATCH 1/6] refactor for `EpicsCATransport` --- src/fastcs/launch.py | 56 +++---------------- src/fastcs/transport/__init__.py | 1 + src/fastcs/transport/epics/ca/adapter.py | 19 ++++--- src/fastcs/transport/epics/pva/adapter.py | 4 +- src/fastcs/transport/graphql/adapter.py | 4 +- src/fastcs/transport/rest/adapter.py | 4 +- src/fastcs/transport/tango/adapter.py | 4 +- .../transport/{adapter.py => transport.py} | 15 ++++- tests/example_softioc.py | 3 +- tests/test_launch.py | 2 +- tests/transport/epics/ca/test_softioc.py | 2 +- 11 files changed, 43 insertions(+), 71 deletions(-) rename src/fastcs/transport/{adapter.py => transport.py} (60%) diff --git a/src/fastcs/launch.py b/src/fastcs/launch.py index 11805672f..0dc3a158f 100644 --- a/src/fastcs/launch.py +++ b/src/fastcs/launch.py @@ -17,7 +17,7 @@ from .backend import Backend from .controller import Controller from .exceptions import LaunchError -from .transport.adapter import TransportAdapter +from .transport import Transport from .transport.epics.ca.options import EpicsCAOptions from .transport.epics.pva.options import EpicsPVAOptions from .transport.graphql.options import GraphQLOptions @@ -33,57 +33,15 @@ class FastCS: """For launching a controller with given transport(s).""" - def __init__( - self, - controller: Controller, - transport_options: TransportOptions, - ): + def __init__(self, controller: Controller, transports: list[Transport]): self._loop = asyncio.get_event_loop() self._controller = controller self._backend = Backend(controller, self._loop) - transport: TransportAdapter - self._transports: list[TransportAdapter] = [] - for option in transport_options: - match option: - case EpicsPVAOptions(): - from .transport.epics.pva.adapter import EpicsPVATransport - - transport = EpicsPVATransport( - self._backend.controller_api, - option, - ) - case EpicsCAOptions(): - from .transport.epics.ca.adapter import EpicsCATransport - - transport = EpicsCATransport( - self._backend.controller_api, - self._loop, - option, - ) - case TangoOptions(): - from .transport.tango.adapter import TangoTransport - - transport = TangoTransport( - self._backend.controller_api, - self._loop, - option, - ) - case RestOptions(): - from .transport.rest.adapter import RestTransport - - transport = RestTransport( - self._backend.controller_api, - option, - ) - case GraphQLOptions(): - from .transport.graphql.adapter import GraphQLTransport - - transport = GraphQLTransport( - self._backend.controller_api, - option, - ) - - self._transports.append(transport) + self._transports = transports + for transport in self._transports: + transport.initialise( + controller_api=self._backend.controller_api, loop=self._loop + ) def create_docs(self) -> None: for transport in self._transports: diff --git a/src/fastcs/transport/__init__.py b/src/fastcs/transport/__init__.py index ba051fb24..49f6d620d 100644 --- a/src/fastcs/transport/__init__.py +++ b/src/fastcs/transport/__init__.py @@ -9,3 +9,4 @@ from .rest.options import RestServerOptions as RestServerOptions from .tango.options import TangoDSROptions as TangoDSROptions from .tango.options import TangoOptions as TangoOptions +from .transport import Transport as Transport diff --git a/src/fastcs/transport/epics/ca/adapter.py b/src/fastcs/transport/epics/ca/adapter.py index b97d51cd6..ff2eefd61 100644 --- a/src/fastcs/transport/epics/ca/adapter.py +++ b/src/fastcs/transport/epics/ca/adapter.py @@ -4,28 +4,29 @@ from softioc import softioc from fastcs.controller_api import ControllerAPI -from fastcs.transport.adapter import TransportAdapter +from fastcs.transport import Transport from fastcs.transport.epics.ca.ioc import EpicsCAIOC from fastcs.transport.epics.ca.options import EpicsCAOptions from fastcs.transport.epics.docs import EpicsDocs from fastcs.transport.epics.gui import EpicsGUI -class EpicsCATransport(TransportAdapter): +class EpicsCATransport(Transport): """Channel access transport.""" - def __init__( + def __init__(self, options: EpicsCAOptions | None = None): + self._options = options or EpicsCAOptions() + + def initialise( self, controller_api: ControllerAPI, loop: asyncio.AbstractEventLoop, - options: EpicsCAOptions | None = None, ) -> None: self._controller_api = controller_api self._loop = loop - self._options = options or EpicsCAOptions() - self._pv_prefix = self.options.ca_ioc.pv_prefix + self._pv_prefix = self._options.ca_ioc.pv_prefix self._ioc = EpicsCAIOC( - self.options.ca_ioc.pv_prefix, + self._options.ca_ioc.pv_prefix, controller_api, self._options.ca_ioc, ) @@ -35,10 +36,10 @@ def options(self) -> EpicsCAOptions: return self._options def create_docs(self) -> None: - EpicsDocs(self._controller_api).create_docs(self.options.docs) + EpicsDocs(self._controller_api).create_docs(self._options.docs) def create_gui(self) -> None: - EpicsGUI(self._controller_api, self._pv_prefix).create_gui(self.options.gui) + EpicsGUI(self._controller_api, self._pv_prefix).create_gui(self._options.gui) async def serve(self) -> None: print(f"Running FastCS IOC: {self._pv_prefix}") diff --git a/src/fastcs/transport/epics/pva/adapter.py b/src/fastcs/transport/epics/pva/adapter.py index 569442e23..464ba3ab2 100644 --- a/src/fastcs/transport/epics/pva/adapter.py +++ b/src/fastcs/transport/epics/pva/adapter.py @@ -1,5 +1,5 @@ from fastcs.controller_api import ControllerAPI -from fastcs.transport.adapter import TransportAdapter +from fastcs.transport import Transport from fastcs.transport.epics.docs import EpicsDocs from fastcs.transport.epics.gui import PvaEpicsGUI from fastcs.transport.epics.pva.options import EpicsPVAOptions @@ -7,7 +7,7 @@ from .ioc import P4PIOC -class EpicsPVATransport(TransportAdapter): +class EpicsPVATransport(Transport): """PV access transport.""" def __init__( diff --git a/src/fastcs/transport/graphql/adapter.py b/src/fastcs/transport/graphql/adapter.py index e9430589b..1ffca2e4d 100644 --- a/src/fastcs/transport/graphql/adapter.py +++ b/src/fastcs/transport/graphql/adapter.py @@ -1,11 +1,11 @@ from fastcs.controller_api import ControllerAPI -from fastcs.transport.adapter import TransportAdapter +from fastcs.transport import Transport from .graphql import GraphQLServer from .options import GraphQLOptions -class GraphQLTransport(TransportAdapter): +class GraphQLTransport(Transport): """GraphQL transport.""" def __init__( diff --git a/src/fastcs/transport/rest/adapter.py b/src/fastcs/transport/rest/adapter.py index 130c73480..18f51fbad 100644 --- a/src/fastcs/transport/rest/adapter.py +++ b/src/fastcs/transport/rest/adapter.py @@ -1,11 +1,11 @@ from fastcs.controller_api import ControllerAPI -from fastcs.transport.adapter import TransportAdapter +from fastcs.transport import Transport from .options import RestOptions from .rest import RestServer -class RestTransport(TransportAdapter): +class RestTransport(Transport): """Rest Transport Adapter.""" def __init__( diff --git a/src/fastcs/transport/tango/adapter.py b/src/fastcs/transport/tango/adapter.py index 283adabcb..fa3a28837 100644 --- a/src/fastcs/transport/tango/adapter.py +++ b/src/fastcs/transport/tango/adapter.py @@ -1,13 +1,13 @@ import asyncio from fastcs.controller_api import ControllerAPI -from fastcs.transport.adapter import TransportAdapter +from fastcs.transport import Transport from .dsr import TangoDSR from .options import TangoOptions -class TangoTransport(TransportAdapter): +class TangoTransport(Transport): """Tango transport.""" def __init__( diff --git a/src/fastcs/transport/adapter.py b/src/fastcs/transport/transport.py similarity index 60% rename from src/fastcs/transport/adapter.py rename to src/fastcs/transport/transport.py index c872265da..76c1518d8 100644 --- a/src/fastcs/transport/adapter.py +++ b/src/fastcs/transport/transport.py @@ -1,9 +1,12 @@ +import asyncio from abc import ABC, abstractmethod from typing import Any +from fastcs.controller_api import ControllerAPI -class TransportAdapter(ABC): - """A base class for adapting a transport's implementation to + +class Transport(ABC): + """A base class for transport's implementation so it can be used in FastCS.""" @property @@ -26,3 +29,11 @@ def create_gui(self) -> None: @property def context(self) -> dict[str, Any]: return {} + + @abstractmethod + def initialise( + self, + controller_api: ControllerAPI, + loop: asyncio.AbstractEventLoop, + ) -> None: + pass diff --git a/tests/example_softioc.py b/tests/example_softioc.py index b73f81ad7..506dad8b1 100644 --- a/tests/example_softioc.py +++ b/tests/example_softioc.py @@ -2,6 +2,7 @@ from fastcs.controller import Controller, SubController from fastcs.datatypes import Int from fastcs.launch import FastCS +from fastcs.transport.epics.ca.adapter import EpicsCATransport from fastcs.transport.epics.ca.options import EpicsCAOptions from fastcs.transport.epics.options import EpicsIOCOptions from fastcs.wrappers import command @@ -24,7 +25,7 @@ def run(pv_prefix="SOFTIOC_TEST_DEVICE"): epics_options = EpicsCAOptions(ca_ioc=EpicsIOCOptions(pv_prefix=pv_prefix)) controller = ParentController() controller.register_sub_controller("Child", ChildController()) - fastcs = FastCS(controller, [epics_options]) + fastcs = FastCS(controller, [EpicsCATransport(epics_options)]) fastcs.run() diff --git a/tests/test_launch.py b/tests/test_launch.py index 9b1aa4b4f..6c8f2f9ae 100644 --- a/tests/test_launch.py +++ b/tests/test_launch.py @@ -151,7 +151,7 @@ def test_error_if_identical_context_in_transports(mocker: MockerFixture, data): mocker.patch("fastcs.launch.FastCS.create_gui") mocker.patch("fastcs.launch.FastCS.create_docs") mocker.patch( - "fastcs.transport.adapter.TransportAdapter.context", + "fastcs.transport.Transport.context", new_callable=mocker.PropertyMock, return_value={"controller": "test"}, ) diff --git a/tests/transport/epics/ca/test_softioc.py b/tests/transport/epics/ca/test_softioc.py index e3975618c..c861a1161 100644 --- a/tests/transport/epics/ca/test_softioc.py +++ b/tests/transport/epics/ca/test_softioc.py @@ -564,7 +564,7 @@ def test_update_datatype(mocker: MockerFixture): def test_ca_context_contains_softioc_commands(mocker: MockerFixture): - transport = EpicsCATransport(mocker.MagicMock(), mocker.MagicMock()) + transport = EpicsCATransport(mocker.MagicMock()) softioc_commands = { command: getattr(softioc, command) for command in softioc.command_names From 66568bc5641f7a57c5e5e1e8eccb2cf4e94e8e48 Mon Sep 17 00:00:00 2001 From: Hiran Wijesinghe Date: Fri, 26 Sep 2025 15:50:53 +0000 Subject: [PATCH 2/6] refactor for `EpicsPVATransport` --- src/fastcs/transport/epics/pva/adapter.py | 10 +++++++--- tests/example_p4p_ioc.py | 3 ++- tests/transport/epics/pva/test_p4p.py | 3 ++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/fastcs/transport/epics/pva/adapter.py b/src/fastcs/transport/epics/pva/adapter.py index 464ba3ab2..f9dba4aed 100644 --- a/src/fastcs/transport/epics/pva/adapter.py +++ b/src/fastcs/transport/epics/pva/adapter.py @@ -1,3 +1,5 @@ +import asyncio + from fastcs.controller_api import ControllerAPI from fastcs.transport import Transport from fastcs.transport.epics.docs import EpicsDocs @@ -10,13 +12,15 @@ class EpicsPVATransport(Transport): """PV access transport.""" - def __init__( + def __init__(self, options: EpicsPVAOptions | None = None): + self._options = options or EpicsPVAOptions() + + def initialise( self, controller_api: ControllerAPI, - options: EpicsPVAOptions | None = None, + loop: asyncio.AbstractEventLoop, ) -> None: self._controller_api = controller_api - self._options = options or EpicsPVAOptions() self._pv_prefix = self.options.pva_ioc.pv_prefix self._ioc = P4PIOC(self.options.pva_ioc.pv_prefix, controller_api) diff --git a/tests/example_p4p_ioc.py b/tests/example_p4p_ioc.py index 0736f782f..10b80fd22 100644 --- a/tests/example_p4p_ioc.py +++ b/tests/example_p4p_ioc.py @@ -10,6 +10,7 @@ from fastcs.transport.epics.options import ( EpicsIOCOptions, ) +from fastcs.transport.epics.pva.adapter import EpicsPVATransport from fastcs.transport.epics.pva.options import EpicsPVAOptions from fastcs.wrappers import command, scan @@ -82,7 +83,7 @@ def run(pv_prefix="P4P_TEST_DEVICE"): controller.register_sub_controller( "Child2", ChildController(description="another sub controller") ) - fastcs = FastCS(controller, [p4p_options]) + fastcs = FastCS(controller, [EpicsPVATransport(p4p_options)]) fastcs.run() diff --git a/tests/transport/epics/pva/test_p4p.py b/tests/transport/epics/pva/test_p4p.py index 83bdf9069..3358b3c9f 100644 --- a/tests/transport/epics/pva/test_p4p.py +++ b/tests/transport/epics/pva/test_p4p.py @@ -18,6 +18,7 @@ from fastcs.datatypes import Bool, Enum, Float, Int, String, Table, Waveform from fastcs.launch import FastCS from fastcs.transport.epics.options import EpicsIOCOptions +from fastcs.transport.epics.pva.adapter import EpicsPVATransport from fastcs.transport.epics.pva.options import EpicsPVAOptions from fastcs.wrappers import command @@ -227,7 +228,7 @@ async def test_numerical_alarms(p4p_subprocess: tuple[str, Queue]): def make_fastcs(pv_prefix: str, controller: Controller) -> FastCS: epics_options = EpicsPVAOptions(pva_ioc=EpicsIOCOptions(pv_prefix=pv_prefix)) - return FastCS(controller, [epics_options]) + return FastCS(controller, [EpicsPVATransport(epics_options)]) def test_read_signal_set(): From 113b2fa3275c8c51d0fa2f48818e89752a320a1d Mon Sep 17 00:00:00 2001 From: Hiran Wijesinghe Date: Fri, 26 Sep 2025 16:20:39 +0000 Subject: [PATCH 3/6] refactor for `GraphQLTransport` --- src/fastcs/transport/epics/ca/adapter.py | 4 +++- src/fastcs/transport/epics/pva/adapter.py | 5 ++++- src/fastcs/transport/graphql/adapter.py | 10 +++++++--- src/fastcs/transport/transport.py | 2 +- tests/transport/graphQL/test_graphql.py | 4 +++- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/fastcs/transport/epics/ca/adapter.py b/src/fastcs/transport/epics/ca/adapter.py index ff2eefd61..bbb88c27d 100644 --- a/src/fastcs/transport/epics/ca/adapter.py +++ b/src/fastcs/transport/epics/ca/adapter.py @@ -20,8 +20,10 @@ def __init__(self, options: EpicsCAOptions | None = None): def initialise( self, controller_api: ControllerAPI, - loop: asyncio.AbstractEventLoop, + loop: asyncio.AbstractEventLoop | None = None, ) -> None: + if not loop: + raise ValueError("EpicsCATransport expects a non-None loop") self._controller_api = controller_api self._loop = loop self._pv_prefix = self._options.ca_ioc.pv_prefix diff --git a/src/fastcs/transport/epics/pva/adapter.py b/src/fastcs/transport/epics/pva/adapter.py index f9dba4aed..591203ac1 100644 --- a/src/fastcs/transport/epics/pva/adapter.py +++ b/src/fastcs/transport/epics/pva/adapter.py @@ -18,8 +18,11 @@ def __init__(self, options: EpicsPVAOptions | None = None): def initialise( self, controller_api: ControllerAPI, - loop: asyncio.AbstractEventLoop, + loop: asyncio.AbstractEventLoop | None = None, ) -> None: + if not loop: + raise ValueError("EpicsPVATransport expects a non-None loop") + self._controller_api = controller_api self._pv_prefix = self.options.pva_ioc.pv_prefix self._ioc = P4PIOC(self.options.pva_ioc.pv_prefix, controller_api) diff --git a/src/fastcs/transport/graphql/adapter.py b/src/fastcs/transport/graphql/adapter.py index 1ffca2e4d..ac0c08b33 100644 --- a/src/fastcs/transport/graphql/adapter.py +++ b/src/fastcs/transport/graphql/adapter.py @@ -1,3 +1,5 @@ +import asyncio + from fastcs.controller_api import ControllerAPI from fastcs.transport import Transport @@ -8,12 +10,14 @@ class GraphQLTransport(Transport): """GraphQL transport.""" - def __init__( + def __init__(self, options: GraphQLOptions | None = None): + self._options = options or GraphQLOptions() + + def initialise( self, controller_api: ControllerAPI, - options: GraphQLOptions | None = None, + loop: asyncio.AbstractEventLoop | None = None, ): - self._options = options or GraphQLOptions() self._server = GraphQLServer(controller_api) @property diff --git a/src/fastcs/transport/transport.py b/src/fastcs/transport/transport.py index 76c1518d8..f9795202d 100644 --- a/src/fastcs/transport/transport.py +++ b/src/fastcs/transport/transport.py @@ -34,6 +34,6 @@ def context(self) -> dict[str, Any]: def initialise( self, controller_api: ControllerAPI, - loop: asyncio.AbstractEventLoop, + loop: asyncio.AbstractEventLoop | None = None, ) -> None: pass diff --git a/tests/transport/graphQL/test_graphql.py b/tests/transport/graphQL/test_graphql.py index b61f2495a..f02890917 100644 --- a/tests/transport/graphQL/test_graphql.py +++ b/tests/transport/graphQL/test_graphql.py @@ -66,7 +66,9 @@ def nest_response(path: list[str], value: Any) -> dict: def create_test_client(gql_controller_api: AssertableControllerAPI) -> TestClient: - return TestClient(GraphQLTransport(gql_controller_api)._server._app) + graphql_transport = GraphQLTransport() + graphql_transport.initialise(gql_controller_api) + return TestClient(graphql_transport._server._app) class TestGraphQLServer: From 5963423588b7ba39981d2f4829be51ae8761dc4d Mon Sep 17 00:00:00 2001 From: Hiran Wijesinghe Date: Fri, 26 Sep 2025 16:27:07 +0000 Subject: [PATCH 4/6] refactor for `RestTransport` --- src/fastcs/transport/rest/adapter.py | 9 ++++++++- tests/transport/rest/test_rest.py | 4 +++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/fastcs/transport/rest/adapter.py b/src/fastcs/transport/rest/adapter.py index 18f51fbad..d593cfce7 100644 --- a/src/fastcs/transport/rest/adapter.py +++ b/src/fastcs/transport/rest/adapter.py @@ -1,3 +1,5 @@ +import asyncio + from fastcs.controller_api import ControllerAPI from fastcs.transport import Transport @@ -10,10 +12,15 @@ class RestTransport(Transport): def __init__( self, - controller_api: ControllerAPI, options: RestOptions | None = None, ): self._options = options or RestOptions() + + def initialise( + self, + controller_api: ControllerAPI, + loop: asyncio.AbstractEventLoop | None = None, + ): self._server = RestServer(controller_api) @property diff --git a/tests/transport/rest/test_rest.py b/tests/transport/rest/test_rest.py index 79c16004a..5deaac89d 100644 --- a/tests/transport/rest/test_rest.py +++ b/tests/transport/rest/test_rest.py @@ -36,7 +36,9 @@ def rest_controller_api(class_mocker: MockerFixture): def create_test_client(rest_controller_api: ControllerAPI) -> TestClient: - return TestClient(RestTransport(rest_controller_api)._server._app) + rest_transport = RestTransport() + rest_transport.initialise(rest_controller_api) + return TestClient(rest_transport._server._app) class TestRestServer: From ab5d12173020d7f8ba1f631d467a12317aff1571 Mon Sep 17 00:00:00 2001 From: Hiran Wijesinghe Date: Fri, 26 Sep 2025 16:36:44 +0000 Subject: [PATCH 5/6] refactor for `TangoTransport` --- src/fastcs/transport/epics/ca/adapter.py | 2 +- src/fastcs/transport/epics/pva/adapter.py | 2 +- src/fastcs/transport/tango/adapter.py | 11 +++++++---- tests/transport/tango/test_dsr.py | 6 ++++-- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/fastcs/transport/epics/ca/adapter.py b/src/fastcs/transport/epics/ca/adapter.py index bbb88c27d..3684bd8de 100644 --- a/src/fastcs/transport/epics/ca/adapter.py +++ b/src/fastcs/transport/epics/ca/adapter.py @@ -22,7 +22,7 @@ def initialise( controller_api: ControllerAPI, loop: asyncio.AbstractEventLoop | None = None, ) -> None: - if not loop: + if loop is None: raise ValueError("EpicsCATransport expects a non-None loop") self._controller_api = controller_api self._loop = loop diff --git a/src/fastcs/transport/epics/pva/adapter.py b/src/fastcs/transport/epics/pva/adapter.py index 591203ac1..cee558cdd 100644 --- a/src/fastcs/transport/epics/pva/adapter.py +++ b/src/fastcs/transport/epics/pva/adapter.py @@ -20,7 +20,7 @@ def initialise( controller_api: ControllerAPI, loop: asyncio.AbstractEventLoop | None = None, ) -> None: - if not loop: + if loop is None: raise ValueError("EpicsPVATransport expects a non-None loop") self._controller_api = controller_api diff --git a/src/fastcs/transport/tango/adapter.py b/src/fastcs/transport/tango/adapter.py index fa3a28837..01e51733e 100644 --- a/src/fastcs/transport/tango/adapter.py +++ b/src/fastcs/transport/tango/adapter.py @@ -10,13 +10,16 @@ class TangoTransport(Transport): """Tango transport.""" - def __init__( + def __init__(self, options: TangoOptions | None = None): + self._options = options or TangoOptions() + + def initialise( self, controller_api: ControllerAPI, - loop: asyncio.AbstractEventLoop, - options: TangoOptions | None = None, + loop: asyncio.AbstractEventLoop | None = None, ): - self._options = options or TangoOptions() + if loop is None: + raise ValueError("TangoTransport expects a non-None loop") self._dsr = TangoDSR(controller_api, loop) @property diff --git a/tests/transport/tango/test_dsr.py b/tests/transport/tango/test_dsr.py index 2e007dcb3..1b9587f8e 100644 --- a/tests/transport/tango/test_dsr.py +++ b/tests/transport/tango/test_dsr.py @@ -50,12 +50,14 @@ def tango_controller_api(class_mocker: MockerFixture) -> AssertableControllerAPI def create_test_context(tango_controller_api: AssertableControllerAPI): - device = TangoTransport( + tango_transport = TangoTransport() + tango_transport.initialise( tango_controller_api, # This is passed to enable instantiating the transport, but tests must avoid # using via patching of functions. It will raise NotImplementedError if used. asyncio.AbstractEventLoop(), - )._dsr._device + ) + device = tango_transport._dsr._device # https://tango-controls.readthedocs.io/projects/pytango/en/v9.5.1/testing/test_context.html with DeviceTestContext(device, debug=0) as proxy: yield proxy From 497cff0aef903d966c78cac70f114ff03997fa61 Mon Sep 17 00:00:00 2001 From: Hiran Wijesinghe Date: Mon, 29 Sep 2025 14:18:24 +0000 Subject: [PATCH 6/6] CR: make `loop` required --- src/fastcs/transport/epics/ca/adapter.py | 4 +--- src/fastcs/transport/epics/pva/adapter.py | 5 +---- src/fastcs/transport/graphql/adapter.py | 2 +- src/fastcs/transport/rest/adapter.py | 2 +- src/fastcs/transport/tango/adapter.py | 2 +- src/fastcs/transport/transport.py | 2 +- tests/transport/graphQL/test_graphql.py | 3 ++- tests/transport/rest/test_rest.py | 3 ++- 8 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/fastcs/transport/epics/ca/adapter.py b/src/fastcs/transport/epics/ca/adapter.py index 3684bd8de..ff2eefd61 100644 --- a/src/fastcs/transport/epics/ca/adapter.py +++ b/src/fastcs/transport/epics/ca/adapter.py @@ -20,10 +20,8 @@ def __init__(self, options: EpicsCAOptions | None = None): def initialise( self, controller_api: ControllerAPI, - loop: asyncio.AbstractEventLoop | None = None, + loop: asyncio.AbstractEventLoop, ) -> None: - if loop is None: - raise ValueError("EpicsCATransport expects a non-None loop") self._controller_api = controller_api self._loop = loop self._pv_prefix = self._options.ca_ioc.pv_prefix diff --git a/src/fastcs/transport/epics/pva/adapter.py b/src/fastcs/transport/epics/pva/adapter.py index cee558cdd..f9dba4aed 100644 --- a/src/fastcs/transport/epics/pva/adapter.py +++ b/src/fastcs/transport/epics/pva/adapter.py @@ -18,11 +18,8 @@ def __init__(self, options: EpicsPVAOptions | None = None): def initialise( self, controller_api: ControllerAPI, - loop: asyncio.AbstractEventLoop | None = None, + loop: asyncio.AbstractEventLoop, ) -> None: - if loop is None: - raise ValueError("EpicsPVATransport expects a non-None loop") - self._controller_api = controller_api self._pv_prefix = self.options.pva_ioc.pv_prefix self._ioc = P4PIOC(self.options.pva_ioc.pv_prefix, controller_api) diff --git a/src/fastcs/transport/graphql/adapter.py b/src/fastcs/transport/graphql/adapter.py index ac0c08b33..de67e5301 100644 --- a/src/fastcs/transport/graphql/adapter.py +++ b/src/fastcs/transport/graphql/adapter.py @@ -16,7 +16,7 @@ def __init__(self, options: GraphQLOptions | None = None): def initialise( self, controller_api: ControllerAPI, - loop: asyncio.AbstractEventLoop | None = None, + loop: asyncio.AbstractEventLoop, ): self._server = GraphQLServer(controller_api) diff --git a/src/fastcs/transport/rest/adapter.py b/src/fastcs/transport/rest/adapter.py index d593cfce7..5b62d6d1b 100644 --- a/src/fastcs/transport/rest/adapter.py +++ b/src/fastcs/transport/rest/adapter.py @@ -19,7 +19,7 @@ def __init__( def initialise( self, controller_api: ControllerAPI, - loop: asyncio.AbstractEventLoop | None = None, + loop: asyncio.AbstractEventLoop, ): self._server = RestServer(controller_api) diff --git a/src/fastcs/transport/tango/adapter.py b/src/fastcs/transport/tango/adapter.py index 01e51733e..aeffc67e0 100644 --- a/src/fastcs/transport/tango/adapter.py +++ b/src/fastcs/transport/tango/adapter.py @@ -16,7 +16,7 @@ def __init__(self, options: TangoOptions | None = None): def initialise( self, controller_api: ControllerAPI, - loop: asyncio.AbstractEventLoop | None = None, + loop: asyncio.AbstractEventLoop, ): if loop is None: raise ValueError("TangoTransport expects a non-None loop") diff --git a/src/fastcs/transport/transport.py b/src/fastcs/transport/transport.py index f9795202d..76c1518d8 100644 --- a/src/fastcs/transport/transport.py +++ b/src/fastcs/transport/transport.py @@ -34,6 +34,6 @@ def context(self) -> dict[str, Any]: def initialise( self, controller_api: ControllerAPI, - loop: asyncio.AbstractEventLoop | None = None, + loop: asyncio.AbstractEventLoop, ) -> None: pass diff --git a/tests/transport/graphQL/test_graphql.py b/tests/transport/graphQL/test_graphql.py index f02890917..0b8ebf2bc 100644 --- a/tests/transport/graphQL/test_graphql.py +++ b/tests/transport/graphQL/test_graphql.py @@ -1,3 +1,4 @@ +import asyncio import copy import json from typing import Any @@ -67,7 +68,7 @@ def nest_response(path: list[str], value: Any) -> dict: def create_test_client(gql_controller_api: AssertableControllerAPI) -> TestClient: graphql_transport = GraphQLTransport() - graphql_transport.initialise(gql_controller_api) + graphql_transport.initialise(gql_controller_api, asyncio.AbstractEventLoop()) return TestClient(graphql_transport._server._app) diff --git a/tests/transport/rest/test_rest.py b/tests/transport/rest/test_rest.py index 5deaac89d..f1053f765 100644 --- a/tests/transport/rest/test_rest.py +++ b/tests/transport/rest/test_rest.py @@ -1,3 +1,4 @@ +import asyncio import enum import numpy as np @@ -37,7 +38,7 @@ def rest_controller_api(class_mocker: MockerFixture): def create_test_client(rest_controller_api: ControllerAPI) -> TestClient: rest_transport = RestTransport() - rest_transport.initialise(rest_controller_api) + rest_transport.initialise(rest_controller_api, asyncio.AbstractEventLoop()) return TestClient(rest_transport._server._app)