From 7373c485ce80d732379585997d1b64a7a6cf714b Mon Sep 17 00:00:00 2001 From: Eva Lott Date: Fri, 21 Mar 2025 09:23:46 +0000 Subject: [PATCH] feature: gui and docs can be `None` in a transport Allows for optional creation of gui and docs. --- src/fastcs/launch.py | 4 +-- src/fastcs/transport/epics/ca/options.py | 4 +-- src/fastcs/transport/epics/gui.py | 6 +++- src/fastcs/transport/epics/pva/options.py | 4 +-- tests/data/schema.json | 40 ++++++++++++++++++++--- 5 files changed, 47 insertions(+), 11 deletions(-) diff --git a/src/fastcs/launch.py b/src/fastcs/launch.py index 0234bbe4d..7e132cf9a 100644 --- a/src/fastcs/launch.py +++ b/src/fastcs/launch.py @@ -83,12 +83,12 @@ def __init__( def create_docs(self) -> None: for transport in self._transports: - if hasattr(transport.options, "docs"): + if getattr(transport.options, "docs", None) is not None: transport.create_docs() def create_gui(self) -> None: for transport in self._transports: - if hasattr(transport.options, "gui"): + if getattr(transport.options, "gui", None) is not None: transport.create_gui() def run(self): diff --git a/src/fastcs/transport/epics/ca/options.py b/src/fastcs/transport/epics/ca/options.py index 8d642e958..ff76a7079 100644 --- a/src/fastcs/transport/epics/ca/options.py +++ b/src/fastcs/transport/epics/ca/options.py @@ -11,6 +11,6 @@ class EpicsCAOptions: """Options for the EPICS CA transport.""" - docs: EpicsDocsOptions = field(default_factory=EpicsDocsOptions) - gui: EpicsGUIOptions = field(default_factory=EpicsGUIOptions) + docs: EpicsDocsOptions | None = None + gui: EpicsGUIOptions | None = None ioc: EpicsIOCOptions = field(default_factory=EpicsIOCOptions) diff --git a/src/fastcs/transport/epics/gui.py b/src/fastcs/transport/epics/gui.py index d08f8ce5e..35ae09ec0 100644 --- a/src/fastcs/transport/epics/gui.py +++ b/src/fastcs/transport/epics/gui.py @@ -25,7 +25,7 @@ from fastcs.attributes import Attribute, AttrR, AttrRW, AttrW from fastcs.controller_api import ControllerAPI from fastcs.cs_methods import Command -from fastcs.datatypes import Bool, Enum, Float, Int, String, Waveform +from fastcs.datatypes import Bool, Enum, Float, Int, String, Table, Waveform from fastcs.exceptions import FastCSException from fastcs.util import snake_to_pascal @@ -56,6 +56,8 @@ def _get_read_widget(attribute: AttrR) -> ReadWidgetUnion | None: return TextRead(format=TextFormat.string) case Waveform(): return None + case Table(): + return None case datatype: raise FastCSException(f"Unsupported type {type(datatype)}: {datatype}") @@ -74,6 +76,8 @@ def _get_write_widget(attribute: AttrW) -> WriteWidgetUnion | None: ) case Waveform(): return None + case Table(): + return None case datatype: raise FastCSException(f"Unsupported type {type(datatype)}: {datatype}") diff --git a/src/fastcs/transport/epics/pva/options.py b/src/fastcs/transport/epics/pva/options.py index 4d884fd9b..b9de3b66f 100644 --- a/src/fastcs/transport/epics/pva/options.py +++ b/src/fastcs/transport/epics/pva/options.py @@ -11,6 +11,6 @@ class EpicsPVAOptions: """Options for the EPICS PVA transport.""" - docs: EpicsDocsOptions = field(default_factory=EpicsDocsOptions) - gui: EpicsGUIOptions = field(default_factory=EpicsGUIOptions) + docs: EpicsDocsOptions | None = None + gui: EpicsGUIOptions | None = None ioc: EpicsIOCOptions = field(default_factory=EpicsIOCOptions) diff --git a/tests/data/schema.json b/tests/data/schema.json index 0057af1e2..1aa4a5059 100644 --- a/tests/data/schema.json +++ b/tests/data/schema.json @@ -3,10 +3,26 @@ "EpicsCAOptions": { "properties": { "docs": { - "$ref": "#/$defs/EpicsDocsOptions" + "anyOf": [ + { + "$ref": "#/$defs/EpicsDocsOptions" + }, + { + "type": "null" + } + ], + "default": null }, "gui": { - "$ref": "#/$defs/EpicsGUIOptions" + "anyOf": [ + { + "$ref": "#/$defs/EpicsGUIOptions" + }, + { + "type": "null" + } + ], + "default": null }, "ioc": { "$ref": "#/$defs/EpicsIOCOptions" @@ -83,10 +99,26 @@ "EpicsPVAOptions": { "properties": { "docs": { - "$ref": "#/$defs/EpicsDocsOptions" + "anyOf": [ + { + "$ref": "#/$defs/EpicsDocsOptions" + }, + { + "type": "null" + } + ], + "default": null }, "gui": { - "$ref": "#/$defs/EpicsGUIOptions" + "anyOf": [ + { + "$ref": "#/$defs/EpicsGUIOptions" + }, + { + "type": "null" + } + ], + "default": null }, "ioc": { "$ref": "#/$defs/EpicsIOCOptions"