Skip to content

Commit 08010b7

Browse files
authored
Merge TransportAdapter and TransportOptions classes into Transport (#220)
1 parent 9c2042a commit 08010b7

File tree

16 files changed

+87
-87
lines changed

16 files changed

+87
-87
lines changed

src/fastcs/launch.py

Lines changed: 7 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from .backend import Backend
1818
from .controller import Controller
1919
from .exceptions import LaunchError
20-
from .transport.adapter import TransportAdapter
20+
from .transport import Transport
2121
from .transport.epics.ca.options import EpicsCAOptions
2222
from .transport.epics.pva.options import EpicsPVAOptions
2323
from .transport.graphql.options import GraphQLOptions
@@ -33,57 +33,15 @@
3333
class FastCS:
3434
"""For launching a controller with given transport(s)."""
3535

36-
def __init__(
37-
self,
38-
controller: Controller,
39-
transport_options: TransportOptions,
40-
):
36+
def __init__(self, controller: Controller, transports: list[Transport]):
4137
self._loop = asyncio.get_event_loop()
4238
self._controller = controller
4339
self._backend = Backend(controller, self._loop)
44-
transport: TransportAdapter
45-
self._transports: list[TransportAdapter] = []
46-
for option in transport_options:
47-
match option:
48-
case EpicsPVAOptions():
49-
from .transport.epics.pva.adapter import EpicsPVATransport
50-
51-
transport = EpicsPVATransport(
52-
self._backend.controller_api,
53-
option,
54-
)
55-
case EpicsCAOptions():
56-
from .transport.epics.ca.adapter import EpicsCATransport
57-
58-
transport = EpicsCATransport(
59-
self._backend.controller_api,
60-
self._loop,
61-
option,
62-
)
63-
case TangoOptions():
64-
from .transport.tango.adapter import TangoTransport
65-
66-
transport = TangoTransport(
67-
self._backend.controller_api,
68-
self._loop,
69-
option,
70-
)
71-
case RestOptions():
72-
from .transport.rest.adapter import RestTransport
73-
74-
transport = RestTransport(
75-
self._backend.controller_api,
76-
option,
77-
)
78-
case GraphQLOptions():
79-
from .transport.graphql.adapter import GraphQLTransport
80-
81-
transport = GraphQLTransport(
82-
self._backend.controller_api,
83-
option,
84-
)
85-
86-
self._transports.append(transport)
40+
self._transports = transports
41+
for transport in self._transports:
42+
transport.initialise(
43+
controller_api=self._backend.controller_api, loop=self._loop
44+
)
8745

8846
def create_docs(self) -> None:
8947
for transport in self._transports:

src/fastcs/transport/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@
99
from .rest.options import RestServerOptions as RestServerOptions
1010
from .tango.options import TangoDSROptions as TangoDSROptions
1111
from .tango.options import TangoOptions as TangoOptions
12+
from .transport import Transport as Transport

src/fastcs/transport/epics/ca/adapter.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,29 @@
44
from softioc import softioc
55

66
from fastcs.controller_api import ControllerAPI
7-
from fastcs.transport.adapter import TransportAdapter
7+
from fastcs.transport import Transport
88
from fastcs.transport.epics.ca.ioc import EpicsCAIOC
99
from fastcs.transport.epics.ca.options import EpicsCAOptions
1010
from fastcs.transport.epics.docs import EpicsDocs
1111
from fastcs.transport.epics.gui import EpicsGUI
1212

1313

14-
class EpicsCATransport(TransportAdapter):
14+
class EpicsCATransport(Transport):
1515
"""Channel access transport."""
1616

17-
def __init__(
17+
def __init__(self, options: EpicsCAOptions | None = None):
18+
self._options = options or EpicsCAOptions()
19+
20+
def initialise(
1821
self,
1922
controller_api: ControllerAPI,
2023
loop: asyncio.AbstractEventLoop,
21-
options: EpicsCAOptions | None = None,
2224
) -> None:
2325
self._controller_api = controller_api
2426
self._loop = loop
25-
self._options = options or EpicsCAOptions()
26-
self._pv_prefix = self.options.ca_ioc.pv_prefix
27+
self._pv_prefix = self._options.ca_ioc.pv_prefix
2728
self._ioc = EpicsCAIOC(
28-
self.options.ca_ioc.pv_prefix,
29+
self._options.ca_ioc.pv_prefix,
2930
controller_api,
3031
self._options.ca_ioc,
3132
)
@@ -35,10 +36,10 @@ def options(self) -> EpicsCAOptions:
3536
return self._options
3637

3738
def create_docs(self) -> None:
38-
EpicsDocs(self._controller_api).create_docs(self.options.docs)
39+
EpicsDocs(self._controller_api).create_docs(self._options.docs)
3940

4041
def create_gui(self) -> None:
41-
EpicsGUI(self._controller_api, self._pv_prefix).create_gui(self.options.gui)
42+
EpicsGUI(self._controller_api, self._pv_prefix).create_gui(self._options.gui)
4243

4344
async def serve(self) -> None:
4445
print(f"Running FastCS IOC: {self._pv_prefix}")

src/fastcs/transport/epics/pva/adapter.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,26 @@
1+
import asyncio
2+
13
from fastcs.controller_api import ControllerAPI
2-
from fastcs.transport.adapter import TransportAdapter
4+
from fastcs.transport import Transport
35
from fastcs.transport.epics.docs import EpicsDocs
46
from fastcs.transport.epics.gui import PvaEpicsGUI
57
from fastcs.transport.epics.pva.options import EpicsPVAOptions
68

79
from .ioc import P4PIOC
810

911

10-
class EpicsPVATransport(TransportAdapter):
12+
class EpicsPVATransport(Transport):
1113
"""PV access transport."""
1214

13-
def __init__(
15+
def __init__(self, options: EpicsPVAOptions | None = None):
16+
self._options = options or EpicsPVAOptions()
17+
18+
def initialise(
1419
self,
1520
controller_api: ControllerAPI,
16-
options: EpicsPVAOptions | None = None,
21+
loop: asyncio.AbstractEventLoop,
1722
) -> None:
1823
self._controller_api = controller_api
19-
self._options = options or EpicsPVAOptions()
2024
self._pv_prefix = self.options.pva_ioc.pv_prefix
2125
self._ioc = P4PIOC(self.options.pva_ioc.pv_prefix, controller_api)
2226

src/fastcs/transport/graphql/adapter.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
1+
import asyncio
2+
13
from fastcs.controller_api import ControllerAPI
2-
from fastcs.transport.adapter import TransportAdapter
4+
from fastcs.transport import Transport
35

46
from .graphql import GraphQLServer
57
from .options import GraphQLOptions
68

79

8-
class GraphQLTransport(TransportAdapter):
10+
class GraphQLTransport(Transport):
911
"""GraphQL transport."""
1012

11-
def __init__(
13+
def __init__(self, options: GraphQLOptions | None = None):
14+
self._options = options or GraphQLOptions()
15+
16+
def initialise(
1217
self,
1318
controller_api: ControllerAPI,
14-
options: GraphQLOptions | None = None,
19+
loop: asyncio.AbstractEventLoop,
1520
):
16-
self._options = options or GraphQLOptions()
1721
self._server = GraphQLServer(controller_api)
1822

1923
@property

src/fastcs/transport/rest/adapter.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,26 @@
1+
import asyncio
2+
13
from fastcs.controller_api import ControllerAPI
2-
from fastcs.transport.adapter import TransportAdapter
4+
from fastcs.transport import Transport
35

46
from .options import RestOptions
57
from .rest import RestServer
68

79

8-
class RestTransport(TransportAdapter):
10+
class RestTransport(Transport):
911
"""Rest Transport Adapter."""
1012

1113
def __init__(
1214
self,
13-
controller_api: ControllerAPI,
1415
options: RestOptions | None = None,
1516
):
1617
self._options = options or RestOptions()
18+
19+
def initialise(
20+
self,
21+
controller_api: ControllerAPI,
22+
loop: asyncio.AbstractEventLoop,
23+
):
1724
self._server = RestServer(controller_api)
1825

1926
@property

src/fastcs/transport/tango/adapter.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
11
import asyncio
22

33
from fastcs.controller_api import ControllerAPI
4-
from fastcs.transport.adapter import TransportAdapter
4+
from fastcs.transport import Transport
55

66
from .dsr import TangoDSR
77
from .options import TangoOptions
88

99

10-
class TangoTransport(TransportAdapter):
10+
class TangoTransport(Transport):
1111
"""Tango transport."""
1212

13-
def __init__(
13+
def __init__(self, options: TangoOptions | None = None):
14+
self._options = options or TangoOptions()
15+
16+
def initialise(
1417
self,
1518
controller_api: ControllerAPI,
1619
loop: asyncio.AbstractEventLoop,
17-
options: TangoOptions | None = None,
1820
):
19-
self._options = options or TangoOptions()
21+
if loop is None:
22+
raise ValueError("TangoTransport expects a non-None loop")
2023
self._dsr = TangoDSR(controller_api, loop)
2124

2225
@property
Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
import asyncio
12
from abc import ABC, abstractmethod
23
from typing import Any
34

5+
from fastcs.controller_api import ControllerAPI
46

5-
class TransportAdapter(ABC):
6-
"""A base class for adapting a transport's implementation to
7+
8+
class Transport(ABC):
9+
"""A base class for transport's implementation
710
so it can be used in FastCS."""
811

912
@property
@@ -26,3 +29,11 @@ def create_gui(self) -> None:
2629
@property
2730
def context(self) -> dict[str, Any]:
2831
return {}
32+
33+
@abstractmethod
34+
def initialise(
35+
self,
36+
controller_api: ControllerAPI,
37+
loop: asyncio.AbstractEventLoop,
38+
) -> None:
39+
pass

tests/example_p4p_ioc.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from fastcs.transport.epics.options import (
1111
EpicsIOCOptions,
1212
)
13+
from fastcs.transport.epics.pva.adapter import EpicsPVATransport
1314
from fastcs.transport.epics.pva.options import EpicsPVAOptions
1415
from fastcs.wrappers import command, scan
1516

@@ -82,7 +83,7 @@ def run(pv_prefix="P4P_TEST_DEVICE"):
8283
controller.register_sub_controller(
8384
"Child2", ChildController(description="another sub controller")
8485
)
85-
fastcs = FastCS(controller, [p4p_options])
86+
fastcs = FastCS(controller, [EpicsPVATransport(p4p_options)])
8687
fastcs.run()
8788

8889

tests/example_softioc.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from fastcs.controller import Controller, SubController
33
from fastcs.datatypes import Int
44
from fastcs.launch import FastCS
5+
from fastcs.transport.epics.ca.adapter import EpicsCATransport
56
from fastcs.transport.epics.ca.options import EpicsCAOptions
67
from fastcs.transport.epics.options import EpicsIOCOptions
78
from fastcs.wrappers import command
@@ -24,7 +25,7 @@ def run(pv_prefix="SOFTIOC_TEST_DEVICE"):
2425
epics_options = EpicsCAOptions(ca_ioc=EpicsIOCOptions(pv_prefix=pv_prefix))
2526
controller = ParentController()
2627
controller.register_sub_controller("Child", ChildController())
27-
fastcs = FastCS(controller, [epics_options])
28+
fastcs = FastCS(controller, [EpicsCATransport(epics_options)])
2829
fastcs.run()
2930

3031

0 commit comments

Comments
 (0)