diff --git a/src/fastcs/demo/controller.yaml b/src/fastcs/demo/controller.yaml index 621311303..ab7485c2b 100644 --- a/src/fastcs/demo/controller.yaml +++ b/src/fastcs/demo/controller.yaml @@ -5,7 +5,7 @@ controller: port: 25565 num_ramp_controllers: 4 transport: - - gql: + - graphql: host: localhost port: 8083 log_level: info diff --git a/src/fastcs/launch.py b/src/fastcs/launch.py index 0dc3a158f..d35092519 100644 --- a/src/fastcs/launch.py +++ b/src/fastcs/launch.py @@ -2,7 +2,7 @@ import inspect import json import signal -from collections.abc import Coroutine +from collections.abc import Coroutine, Sequence from functools import partial from pathlib import Path from typing import Annotated, Any, Optional, TypeAlias, get_type_hints @@ -13,27 +13,31 @@ from ruamel.yaml import YAML from fastcs import __version__ +from fastcs.transport.epics.ca.transport import EpicsCATransport +from fastcs.transport.epics.pva.transport import EpicsPVATransport +from fastcs.transport.graphql.transport import GraphQLTransport +from fastcs.transport.rest.transport import RestTransport +from fastcs.transport.tango.transport import TangoTransport from .backend import Backend from .controller import Controller from .exceptions import LaunchError from .transport import Transport -from .transport.epics.ca.options import EpicsCAOptions -from .transport.epics.pva.options import EpicsPVAOptions -from .transport.graphql.options import GraphQLOptions -from .transport.rest.options import RestOptions -from .transport.tango.options import TangoOptions # Define a type alias for transport options -TransportOptions: TypeAlias = list[ - EpicsPVAOptions | EpicsCAOptions | TangoOptions | RestOptions | GraphQLOptions +TransportList: TypeAlias = list[ + EpicsPVATransport + | EpicsCATransport + | TangoTransport + | RestTransport + | GraphQLTransport ] class FastCS: """For launching a controller with given transport(s).""" - def __init__(self, controller: Controller, transports: list[Transport]): + def __init__(self, controller: Controller, transports: Sequence[Transport]): self._loop = asyncio.get_event_loop() self._controller = controller self._backend = Backend(controller, self._loop) @@ -45,13 +49,11 @@ def __init__(self, controller: Controller, transports: list[Transport]): def create_docs(self) -> None: for transport in self._transports: - if hasattr(transport.options, "docs"): - transport.create_docs() + transport.create_docs() def create_gui(self) -> None: for transport in self._transports: - if hasattr(transport.options, "gui"): - transport.create_gui() + transport.create_gui() def run(self): serve = asyncio.ensure_future(self.serve()) @@ -231,7 +233,7 @@ def _extract_options_model(controller_class: type[Controller]) -> type[BaseModel if len(args) == 1: fastcs_options = create_model( f"{controller_class.__name__}", - transport=(TransportOptions, ...), + transport=(TransportList, ...), __config__={"extra": "forbid"}, ) elif len(args) == 2: @@ -248,7 +250,7 @@ def _extract_options_model(controller_class: type[Controller]) -> type[BaseModel fastcs_options = create_model( f"{controller_class.__name__}", controller=(options_type, ...), - transport=(TransportOptions, ...), + transport=(TransportList, ...), __config__={"extra": "forbid"}, ) else: diff --git a/src/fastcs/transport/__init__.py b/src/fastcs/transport/__init__.py index 49f6d620d..b79ba26b0 100644 --- a/src/fastcs/transport/__init__.py +++ b/src/fastcs/transport/__init__.py @@ -1,12 +1,10 @@ -from .epics.ca.options import EpicsCAOptions as EpicsCAOptions +from .epics.ca.transport import EpicsCATransport as EpicsCATransport from .epics.options import EpicsDocsOptions as EpicsDocsOptions from .epics.options import EpicsGUIOptions as EpicsGUIOptions from .epics.options import EpicsIOCOptions as EpicsIOCOptions -from .epics.pva.options import EpicsPVAOptions as EpicsPVAOptions -from .graphql.options import GraphQLOptions as GraphQLOptions -from .graphql.options import GraphQLServerOptions as GraphQLServerOptions -from .rest.options import RestOptions as RestOptions -from .rest.options import RestServerOptions as RestServerOptions +from .epics.pva.transport import EpicsPVATransport as EpicsPVATransport +from .graphql.transport import GraphQLTransport as GraphQLTransport +from .rest.transport import RestTransport as RestTransport from .tango.options import TangoDSROptions as TangoDSROptions -from .tango.options import TangoOptions as TangoOptions +from .tango.transport import TangoTransport as TangoTransport from .transport import Transport as Transport diff --git a/src/fastcs/transport/epics/ca/adapter.py b/src/fastcs/transport/epics/ca/transport.py similarity index 62% rename from src/fastcs/transport/epics/ca/adapter.py rename to src/fastcs/transport/epics/ca/transport.py index ff2eefd61..5ffccd75d 100644 --- a/src/fastcs/transport/epics/ca/adapter.py +++ b/src/fastcs/transport/epics/ca/transport.py @@ -1,21 +1,28 @@ import asyncio +from dataclasses import dataclass, field from typing import Any from softioc import softioc from fastcs.controller_api import ControllerAPI -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 +from fastcs.transport.epics.options import ( + EpicsDocsOptions, + EpicsGUIOptions, + EpicsIOCOptions, +) +from fastcs.transport.transport import Transport +@dataclass class EpicsCATransport(Transport): """Channel access transport.""" - def __init__(self, options: EpicsCAOptions | None = None): - self._options = options or EpicsCAOptions() + docs: EpicsDocsOptions = field(default_factory=EpicsDocsOptions) + gui: EpicsGUIOptions = field(default_factory=EpicsGUIOptions) + ca_ioc: EpicsIOCOptions = field(default_factory=EpicsIOCOptions) def initialise( self, @@ -24,22 +31,14 @@ def initialise( ) -> None: self._controller_api = controller_api self._loop = loop - self._pv_prefix = self._options.ca_ioc.pv_prefix - self._ioc = EpicsCAIOC( - self._options.ca_ioc.pv_prefix, - controller_api, - self._options.ca_ioc, - ) - - @property - def options(self) -> EpicsCAOptions: - return self._options + self._pv_prefix = self.ca_ioc.pv_prefix + self._ioc = EpicsCAIOC(self.ca_ioc.pv_prefix, controller_api, self.ca_ioc) def create_docs(self) -> None: - EpicsDocs(self._controller_api).create_docs(self._options.docs) + EpicsDocs(self._controller_api).create_docs(self.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.gui) async def serve(self) -> None: print(f"Running FastCS IOC: {self._pv_prefix}") diff --git a/src/fastcs/transport/epics/pva/options.py b/src/fastcs/transport/epics/pva/options.py deleted file mode 100644 index ffc1e22d1..000000000 --- a/src/fastcs/transport/epics/pva/options.py +++ /dev/null @@ -1,16 +0,0 @@ -from dataclasses import dataclass, field - -from fastcs.transport.epics.options import ( - EpicsDocsOptions, - EpicsGUIOptions, - EpicsIOCOptions, -) - - -@dataclass -class EpicsPVAOptions: - """Options for the EPICS PVA transport.""" - - docs: EpicsDocsOptions = field(default_factory=EpicsDocsOptions) - gui: EpicsGUIOptions = field(default_factory=EpicsGUIOptions) - pva_ioc: EpicsIOCOptions = field(default_factory=EpicsIOCOptions) diff --git a/src/fastcs/transport/epics/pva/adapter.py b/src/fastcs/transport/epics/pva/transport.py similarity index 53% rename from src/fastcs/transport/epics/pva/adapter.py rename to src/fastcs/transport/epics/pva/transport.py index f9dba4aed..d89d3c52c 100644 --- a/src/fastcs/transport/epics/pva/adapter.py +++ b/src/fastcs/transport/epics/pva/transport.py @@ -1,19 +1,26 @@ import asyncio +from dataclasses import dataclass, field from fastcs.controller_api import ControllerAPI -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 +from fastcs.transport.epics.options import ( + EpicsDocsOptions, + EpicsGUIOptions, + EpicsIOCOptions, +) +from fastcs.transport.transport import Transport from .ioc import P4PIOC +@dataclass class EpicsPVATransport(Transport): """PV access transport.""" - def __init__(self, options: EpicsPVAOptions | None = None): - self._options = options or EpicsPVAOptions() + docs: EpicsDocsOptions = field(default_factory=EpicsDocsOptions) + gui: EpicsGUIOptions = field(default_factory=EpicsGUIOptions) + pva_ioc: EpicsIOCOptions = field(default_factory=EpicsIOCOptions) def initialise( self, @@ -21,19 +28,15 @@ def initialise( loop: asyncio.AbstractEventLoop, ) -> None: 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) - - @property - def options(self) -> EpicsPVAOptions: - return self._options + self._pv_prefix = self.pva_ioc.pv_prefix + self._ioc = P4PIOC(self.pva_ioc.pv_prefix, controller_api) async def serve(self) -> None: print(f"Running FastCS IOC: {self._pv_prefix}") await self._ioc.run() def create_docs(self) -> None: - EpicsDocs(self._controller_api).create_docs(self.options.docs) + EpicsDocs(self._controller_api).create_docs(self.docs) def create_gui(self) -> None: - PvaEpicsGUI(self._controller_api, self._pv_prefix).create_gui(self.options.gui) + PvaEpicsGUI(self._controller_api, self._pv_prefix).create_gui(self.gui) diff --git a/src/fastcs/transport/graphql/adapter.py b/src/fastcs/transport/graphql/adapter.py deleted file mode 100644 index de67e5301..000000000 --- a/src/fastcs/transport/graphql/adapter.py +++ /dev/null @@ -1,34 +0,0 @@ -import asyncio - -from fastcs.controller_api import ControllerAPI -from fastcs.transport import Transport - -from .graphql import GraphQLServer -from .options import GraphQLOptions - - -class GraphQLTransport(Transport): - """GraphQL transport.""" - - def __init__(self, options: GraphQLOptions | None = None): - self._options = options or GraphQLOptions() - - def initialise( - self, - controller_api: ControllerAPI, - loop: asyncio.AbstractEventLoop, - ): - self._server = GraphQLServer(controller_api) - - @property - def options(self) -> GraphQLOptions: - return self._options - - def create_docs(self) -> None: - raise NotImplementedError - - def create_gui(self) -> None: - raise NotImplementedError - - async def serve(self) -> None: - await self._server.serve(self.options.gql) diff --git a/src/fastcs/transport/graphql/options.py b/src/fastcs/transport/graphql/options.py index 3d8e85199..11162a004 100644 --- a/src/fastcs/transport/graphql/options.py +++ b/src/fastcs/transport/graphql/options.py @@ -1,4 +1,4 @@ -from dataclasses import dataclass, field +from dataclasses import dataclass @dataclass @@ -6,10 +6,3 @@ class GraphQLServerOptions: host: str = "localhost" port: int = 8080 log_level: str = "info" - - -@dataclass -class GraphQLOptions: - """Options for the GraphQL transport.""" - - gql: GraphQLServerOptions = field(default_factory=GraphQLServerOptions) diff --git a/src/fastcs/transport/graphql/transport.py b/src/fastcs/transport/graphql/transport.py new file mode 100644 index 000000000..5560ffa93 --- /dev/null +++ b/src/fastcs/transport/graphql/transport.py @@ -0,0 +1,25 @@ +import asyncio +from dataclasses import dataclass, field + +from fastcs.controller_api import ControllerAPI +from fastcs.transport.transport import Transport + +from .graphql import GraphQLServer +from .options import GraphQLServerOptions + + +@dataclass +class GraphQLTransport(Transport): + """GraphQL transport.""" + + graphql: GraphQLServerOptions = field(default_factory=GraphQLServerOptions) + + def initialise( + self, + controller_api: ControllerAPI, + loop: asyncio.AbstractEventLoop, + ): + self._server = GraphQLServer(controller_api) + + async def serve(self) -> None: + await self._server.serve(self.graphql) diff --git a/src/fastcs/transport/rest/adapter.py b/src/fastcs/transport/rest/adapter.py deleted file mode 100644 index 5b62d6d1b..000000000 --- a/src/fastcs/transport/rest/adapter.py +++ /dev/null @@ -1,37 +0,0 @@ -import asyncio - -from fastcs.controller_api import ControllerAPI -from fastcs.transport import Transport - -from .options import RestOptions -from .rest import RestServer - - -class RestTransport(Transport): - """Rest Transport Adapter.""" - - def __init__( - self, - options: RestOptions | None = None, - ): - self._options = options or RestOptions() - - def initialise( - self, - controller_api: ControllerAPI, - loop: asyncio.AbstractEventLoop, - ): - self._server = RestServer(controller_api) - - @property - def options(self) -> RestOptions: - return self._options - - def create_docs(self) -> None: - raise NotImplementedError - - def create_gui(self) -> None: - raise NotImplementedError - - async def serve(self) -> None: - await self._server.serve(self.options.rest) diff --git a/src/fastcs/transport/rest/options.py b/src/fastcs/transport/rest/options.py index 7058025e5..552e966f1 100644 --- a/src/fastcs/transport/rest/options.py +++ b/src/fastcs/transport/rest/options.py @@ -1,4 +1,4 @@ -from dataclasses import dataclass, field +from dataclasses import dataclass @dataclass @@ -6,10 +6,3 @@ class RestServerOptions: host: str = "localhost" port: int = 8080 log_level: str = "info" - - -@dataclass -class RestOptions: - """Options for the Rest transport.""" - - rest: RestServerOptions = field(default_factory=RestServerOptions) diff --git a/src/fastcs/transport/rest/transport.py b/src/fastcs/transport/rest/transport.py new file mode 100644 index 000000000..f17c860f7 --- /dev/null +++ b/src/fastcs/transport/rest/transport.py @@ -0,0 +1,25 @@ +import asyncio +from dataclasses import dataclass, field + +from fastcs.controller_api import ControllerAPI +from fastcs.transport.transport import Transport + +from .options import RestServerOptions +from .rest import RestServer + + +@dataclass +class RestTransport(Transport): + """Rest Transport Adapter.""" + + rest: RestServerOptions = field(default_factory=RestServerOptions) + + def initialise( + self, + controller_api: ControllerAPI, + loop: asyncio.AbstractEventLoop, + ): + self._server = RestServer(controller_api) + + async def serve(self) -> None: + await self._server.serve(self.rest) diff --git a/src/fastcs/transport/tango/adapter.py b/src/fastcs/transport/tango/adapter.py deleted file mode 100644 index aeffc67e0..000000000 --- a/src/fastcs/transport/tango/adapter.py +++ /dev/null @@ -1,40 +0,0 @@ -import asyncio - -from fastcs.controller_api import ControllerAPI -from fastcs.transport import Transport - -from .dsr import TangoDSR -from .options import TangoOptions - - -class TangoTransport(Transport): - """Tango transport.""" - - def __init__(self, options: TangoOptions | None = None): - self._options = options or TangoOptions() - - def initialise( - self, - controller_api: ControllerAPI, - loop: asyncio.AbstractEventLoop, - ): - if loop is None: - raise ValueError("TangoTransport expects a non-None loop") - self._dsr = TangoDSR(controller_api, loop) - - @property - def options(self) -> TangoOptions: - return self._options - - def create_docs(self) -> None: - raise NotImplementedError - - def create_gui(self) -> None: - raise NotImplementedError - - async def serve(self) -> None: - coro = asyncio.to_thread( - self._dsr.run, - self.options.dsr, - ) - await coro diff --git a/src/fastcs/transport/tango/options.py b/src/fastcs/transport/tango/options.py index 44b5db676..26f654102 100644 --- a/src/fastcs/transport/tango/options.py +++ b/src/fastcs/transport/tango/options.py @@ -1,4 +1,4 @@ -from dataclasses import dataclass, field +from dataclasses import dataclass @dataclass @@ -6,10 +6,3 @@ class TangoDSROptions: dev_name: str = "MY/DEVICE/NAME" dsr_instance: str = "MY_SERVER_INSTANCE" debug: bool = False - - -@dataclass -class TangoOptions: - """Options for the Tango transport.""" - - dsr: TangoDSROptions = field(default_factory=TangoDSROptions) diff --git a/src/fastcs/transport/tango/transport.py b/src/fastcs/transport/tango/transport.py new file mode 100644 index 000000000..044e987c8 --- /dev/null +++ b/src/fastcs/transport/tango/transport.py @@ -0,0 +1,25 @@ +import asyncio +from dataclasses import dataclass, field + +from fastcs.controller_api import ControllerAPI +from fastcs.transport.transport import Transport + +from .dsr import TangoDSR, TangoDSROptions + + +@dataclass +class TangoTransport(Transport): + """Tango transport.""" + + dsr: TangoDSROptions = field(default_factory=TangoDSROptions) + + def initialise( + self, + controller_api: ControllerAPI, + loop: asyncio.AbstractEventLoop, + ): + self._dsr = TangoDSR(controller_api, loop) + + async def serve(self) -> None: + coro = asyncio.to_thread(self._dsr.run, self.dsr) + await coro diff --git a/src/fastcs/transport/transport.py b/src/fastcs/transport/transport.py index 76c1518d8..6d1b306db 100644 --- a/src/fastcs/transport/transport.py +++ b/src/fastcs/transport/transport.py @@ -1,28 +1,23 @@ import asyncio -from abc import ABC, abstractmethod +from abc import abstractmethod +from dataclasses import dataclass from typing import Any from fastcs.controller_api import ControllerAPI -class Transport(ABC): +@dataclass +class Transport: """A base class for transport's implementation so it can be used in FastCS.""" - @property - @abstractmethod - def options(self) -> Any: - pass - @abstractmethod async def serve(self) -> None: pass - @abstractmethod def create_docs(self) -> None: pass - @abstractmethod def create_gui(self) -> None: pass diff --git a/tests/benchmarking/controller.py b/tests/benchmarking/controller.py index c873e94e5..aaad9bd12 100644 --- a/tests/benchmarking/controller.py +++ b/tests/benchmarking/controller.py @@ -2,10 +2,12 @@ from fastcs.attributes import AttrR, AttrW from fastcs.controller import Controller from fastcs.datatypes import Bool, Int -from fastcs.transport.epics.ca.options import EpicsCAOptions +from fastcs.transport.epics.ca.transport import EpicsCATransport from fastcs.transport.epics.options import EpicsIOCOptions -from fastcs.transport.rest.options import RestOptions, RestServerOptions -from fastcs.transport.tango.options import TangoDSROptions, TangoOptions +from fastcs.transport.rest.options import RestServerOptions +from fastcs.transport.rest.transport import RestTransport +from fastcs.transport.tango.options import TangoDSROptions +from fastcs.transport.tango.transport import TangoTransport class MyTestController(Controller): @@ -15,11 +17,11 @@ class MyTestController(Controller): def run(): transport_options = [ - RestOptions(rest=RestServerOptions(port=8090)), - EpicsCAOptions( + RestTransport(rest=RestServerOptions(port=8090)), + EpicsCATransport( ca_ioc=EpicsIOCOptions(pv_prefix="BENCHMARK-DEVICE"), ), - TangoOptions(dsr=TangoDSROptions(dev_name="MY/BENCHMARK/DEVICE")), + TangoTransport(dsr=TangoDSROptions(dev_name="MY/BENCHMARK/DEVICE")), ] instance = FastCS( MyTestController(), diff --git a/tests/data/config.yaml b/tests/data/config.yaml index 3f578b8ea..fe5d1c6de 100644 --- a/tests/data/config.yaml +++ b/tests/data/config.yaml @@ -3,8 +3,11 @@ transport: - ca_ioc: {} docs: {} gui: {} + - pva_ioc: {} + docs: {} + gui: {} - rest: {} - dsr: {} - - gql: {} + - graphql: {} controller: name: controller-name diff --git a/tests/data/schema.json b/tests/data/schema.json index 06b16e2ad..4f2d6f1ac 100644 --- a/tests/data/schema.json +++ b/tests/data/schema.json @@ -1,6 +1,6 @@ { "$defs": { - "EpicsCAOptions": { + "EpicsCATransport": { "properties": { "docs": { "$ref": "#/$defs/EpicsDocsOptions" @@ -12,7 +12,7 @@ "$ref": "#/$defs/EpicsIOCOptions" } }, - "title": "EpicsCAOptions", + "title": "EpicsCATransport", "type": "object" }, "EpicsDocsOptions": { @@ -80,7 +80,7 @@ "title": "EpicsIOCOptions", "type": "object" }, - "EpicsPVAOptions": { + "EpicsPVATransport": { "properties": { "docs": { "$ref": "#/$defs/EpicsDocsOptions" @@ -92,16 +92,7 @@ "$ref": "#/$defs/EpicsIOCOptions" } }, - "title": "EpicsPVAOptions", - "type": "object" - }, - "GraphQLOptions": { - "properties": { - "gql": { - "$ref": "#/$defs/GraphQLServerOptions" - } - }, - "title": "GraphQLOptions", + "title": "EpicsPVATransport", "type": "object" }, "GraphQLServerOptions": { @@ -125,13 +116,13 @@ "title": "GraphQLServerOptions", "type": "object" }, - "RestOptions": { + "GraphQLTransport": { "properties": { - "rest": { - "$ref": "#/$defs/RestServerOptions" + "graphql": { + "$ref": "#/$defs/GraphQLServerOptions" } }, - "title": "RestOptions", + "title": "GraphQLTransport", "type": "object" }, "RestServerOptions": { @@ -155,6 +146,15 @@ "title": "RestServerOptions", "type": "object" }, + "RestTransport": { + "properties": { + "rest": { + "$ref": "#/$defs/RestServerOptions" + } + }, + "title": "RestTransport", + "type": "object" + }, "SomeConfig": { "properties": { "name": { @@ -189,13 +189,13 @@ "title": "TangoDSROptions", "type": "object" }, - "TangoOptions": { + "TangoTransport": { "properties": { "dsr": { "$ref": "#/$defs/TangoDSROptions" } }, - "title": "TangoOptions", + "title": "TangoTransport", "type": "object" } }, @@ -208,19 +208,19 @@ "items": { "anyOf": [ { - "$ref": "#/$defs/EpicsPVAOptions" + "$ref": "#/$defs/EpicsPVATransport" }, { - "$ref": "#/$defs/EpicsCAOptions" + "$ref": "#/$defs/EpicsCATransport" }, { - "$ref": "#/$defs/TangoOptions" + "$ref": "#/$defs/TangoTransport" }, { - "$ref": "#/$defs/RestOptions" + "$ref": "#/$defs/RestTransport" }, { - "$ref": "#/$defs/GraphQLOptions" + "$ref": "#/$defs/GraphQLTransport" } ] }, diff --git a/tests/example_p4p_ioc.py b/tests/example_p4p_ioc.py index 10b80fd22..7b75918d7 100644 --- a/tests/example_p4p_ioc.py +++ b/tests/example_p4p_ioc.py @@ -10,8 +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.transport.epics.pva.transport import EpicsPVATransport from fastcs.wrappers import command, scan @@ -75,7 +74,6 @@ async def i(self): def run(pv_prefix="P4P_TEST_DEVICE"): - p4p_options = EpicsPVAOptions(pva_ioc=EpicsIOCOptions(pv_prefix=pv_prefix)) controller = ParentController() controller.register_sub_controller( "Child1", ChildController(description="some sub controller") @@ -83,7 +81,9 @@ def run(pv_prefix="P4P_TEST_DEVICE"): controller.register_sub_controller( "Child2", ChildController(description="another sub controller") ) - fastcs = FastCS(controller, [EpicsPVATransport(p4p_options)]) + fastcs = FastCS( + controller, [EpicsPVATransport(pva_ioc=EpicsIOCOptions(pv_prefix=pv_prefix))] + ) fastcs.run() diff --git a/tests/example_softioc.py b/tests/example_softioc.py index 506dad8b1..65c33e7bb 100644 --- a/tests/example_softioc.py +++ b/tests/example_softioc.py @@ -2,8 +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.ca.transport import EpicsCATransport from fastcs.transport.epics.options import EpicsIOCOptions from fastcs.wrappers import command @@ -22,10 +21,11 @@ async def d(self): 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, [EpicsCATransport(epics_options)]) + fastcs = FastCS( + controller, [EpicsCATransport(ca_ioc=EpicsIOCOptions(pv_prefix=pv_prefix))] + ) fastcs.run() diff --git a/tests/test_launch.py b/tests/test_launch.py index 6c8f2f9ae..c64ff72af 100644 --- a/tests/test_launch.py +++ b/tests/test_launch.py @@ -13,7 +13,7 @@ from fastcs.controller import Controller from fastcs.datatypes import Int from fastcs.exceptions import LaunchError -from fastcs.launch import TransportOptions, _launch, get_controller_schema, launch +from fastcs.launch import TransportList, _launch, get_controller_schema, launch @dataclass @@ -49,7 +49,7 @@ def __init__(self, arg: SomeConfig, too_many): def test_single_arg_schema(): target_model = create_model( "SingleArg", - transport=(TransportOptions, ...), + transport=(TransportList, ...), __config__={"extra": "forbid"}, ) target_dict = target_model.model_json_schema() @@ -66,7 +66,7 @@ def test_is_hinted_schema(data): target_model = create_model( "IsHinted", controller=(SomeConfig, ...), - transport=(TransportOptions, ...), + transport=(TransportList, ...), __config__={"extra": "forbid"}, ) target_dict = target_model.model_json_schema() diff --git a/tests/transport/epics/ca/test_softioc.py b/tests/transport/epics/ca/test_softioc.py index c861a1161..cdd3e1a12 100644 --- a/tests/transport/epics/ca/test_softioc.py +++ b/tests/transport/epics/ca/test_softioc.py @@ -20,7 +20,6 @@ from fastcs.cs_methods import Command from fastcs.datatypes import Bool, Enum, Float, Int, String, Waveform from fastcs.exceptions import FastCSError -from fastcs.transport.epics.ca.adapter import EpicsCATransport from fastcs.transport.epics.ca.ioc import ( EPICS_MAX_NAME_LENGTH, EpicsCAIOC, @@ -31,6 +30,7 @@ _create_and_link_write_pv, _make_record, ) +from fastcs.transport.epics.ca.transport import EpicsCATransport from fastcs.transport.epics.ca.util import ( record_metadata_from_attribute, record_metadata_from_datatype, diff --git a/tests/transport/epics/pva/test_p4p.py b/tests/transport/epics/pva/test_p4p.py index 3358b3c9f..7670c871f 100644 --- a/tests/transport/epics/pva/test_p4p.py +++ b/tests/transport/epics/pva/test_p4p.py @@ -18,8 +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.transport.epics.pva.transport import EpicsPVATransport from fastcs.wrappers import command @@ -227,8 +226,9 @@ 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, [EpicsPVATransport(epics_options)]) + return FastCS( + controller, [EpicsPVATransport(pva_ioc=EpicsIOCOptions(pv_prefix=pv_prefix))] + ) def test_read_signal_set(): diff --git a/tests/transport/graphQL/test_graphql.py b/tests/transport/graphQL/test_graphql.py index 0b8ebf2bc..3612d715c 100644 --- a/tests/transport/graphQL/test_graphql.py +++ b/tests/transport/graphQL/test_graphql.py @@ -16,7 +16,7 @@ from fastcs.attributes import AttrR, AttrRW, AttrW from fastcs.datatypes import Bool, Float, Int, String -from fastcs.transport.graphql.adapter import GraphQLTransport +from fastcs.transport.graphql.transport import GraphQLTransport class GraphQLController(MyTestController): diff --git a/tests/transport/rest/test_rest.py b/tests/transport/rest/test_rest.py index f1053f765..c1f45a71e 100644 --- a/tests/transport/rest/test_rest.py +++ b/tests/transport/rest/test_rest.py @@ -16,7 +16,7 @@ from fastcs.attributes import AttrR, AttrRW, AttrW from fastcs.controller_api import ControllerAPI from fastcs.datatypes import Bool, Enum, Float, Int, String, Waveform -from fastcs.transport.rest.adapter import RestTransport +from fastcs.transport.rest.transport import RestTransport class RestController(MyTestController): diff --git a/tests/transport/tango/test_dsr.py b/tests/transport/tango/test_dsr.py index 1b9587f8e..6fc35671b 100644 --- a/tests/transport/tango/test_dsr.py +++ b/tests/transport/tango/test_dsr.py @@ -16,7 +16,7 @@ from fastcs.attributes import AttrR, AttrRW, AttrW from fastcs.datatypes import Bool, Enum, Float, Int, String, Waveform -from fastcs.transport.tango.adapter import TangoTransport +from fastcs.transport.tango.transport import TangoTransport async def patch_run_threadsafe_blocking(coro, loop):