diff --git a/docs/README.md b/docs/README.md index c47284c..0905b04 100644 --- a/docs/README.md +++ b/docs/README.md @@ -25,8 +25,8 @@ optionally the following CLI flags exist for custom paths: -s, --shifter-interface-config Set default yaml config for this interface -d, --daq-config-directory Where do you want to download configs - from/where are they located - + to + --session-name Name of daq session --base-url Base URL for the interface, not used for @@ -38,8 +38,7 @@ optionally the following CLI flags exist for custom paths: --debug Set the debug log level -l, --local-config Use local config files instead of - downloading from the github, expert use - only! [flag option] + downloading. Should be a path to wherever your local configs are kept --help Show help ``` diff --git a/pyproject.toml b/pyproject.toml index 762d84d..6c38ac9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,6 @@ where = ["src"] [project.scripts] runconf-shifter-ui = "runconf_ui.apps.__main__shifter_view__:main" -py_oks_dump = "runconf_ui.apps.__main__oks_dump__:main" [project.optional-dependencies] dev = [ diff --git a/src/runconf_ui/apps/__main__oks_dump__.py b/src/runconf_ui/apps/__main__oks_dump__.py deleted file mode 100644 index 3d96adb..0000000 --- a/src/runconf_ui/apps/__main__oks_dump__.py +++ /dev/null @@ -1,31 +0,0 @@ -""" -HW: Recreation of https://github.com/DUNE-DAQ/oks/blob/develop/apps/oks_dump.cxx in python -""" - -import oks -import click -from pprint import pprint - - -@click.command() -@click.argument("file_name", type=click.Path(exists=True)) -def main(file_name: str): - """ - Main function to dump the contents of an OKS file. - :param file_name: The name of the OKS file to dump. - """ - # Create an OksKernel instance - oks_kernel = oks.OksKernel() - - oks_kernel.set_test_duplicated_objects_via_inheritance_mode(True) - oks_kernel.load_file(str(file_name)) - - for i in oks_kernel.schema_files(): - print(f"Schema file: {i}") - - for i in oks_kernel.data_files(): - print(f"Data file: {i}") - - pprint(oks_kernel.classes()["ResourceSetAND"].all_sub_classes()) - - print("OKS file loaded successfully.") diff --git a/src/runconf_ui/apps/__main__shifter_view__.py b/src/runconf_ui/apps/__main__shifter_view__.py index ee6a445..eb58ca0 100644 --- a/src/runconf_ui/apps/__main__shifter_view__.py +++ b/src/runconf_ui/apps/__main__shifter_view__.py @@ -2,8 +2,18 @@ Main application for the shifter view interface. """ -from runconf_ui.screens.shifter_view_screen import ShifterViewScreen -from runconf_ui.utils.file_cleaner import clean_old_files +import logging +import os +from dataclasses import dataclass +from datetime import datetime +from pathlib import Path +from typing import ClassVar + +import click +import pkg_resources +from rich import print +from textual.app import App + from runconf_ui.runconf_ui_configuration.shifter_config_reader import ( ShifterConfigReader, ) @@ -11,16 +21,8 @@ ShifterInterfaceState, ) from runconf_ui.screens.quit_screen import QuitScreen - -from textual.app import App -import click -from rich import print - -import os -from pathlib import Path -import logging -from datetime import datetime -import pkg_resources +from runconf_ui.screens.shifter_view_screen import ShifterViewScreen +from runconf_ui.utils.file_cleaner import clean_old_files class ShifterView(App): @@ -29,7 +31,7 @@ class ShifterView(App): """ CSS_PATH = "shifter_view.tcss" - BINDINGS = [("ctrl+q", "quit", "Quit")] + BINDINGS: ClassVar = [("ctrl+q", "quit", "Quit")] def __init__(self, *args, **kwargs): """Constructor for the ShifterView class. @@ -49,10 +51,11 @@ def __init__(self, *args, **kwargs): self._exit_message = "" # Read kwargs - use_local = kwargs.get("use_local", False) + local_config = kwargs.get("local_config", None) - if use_local: + if local_config is not None: interface_config = f"{Path(__file__).parent.absolute()}/../config_files/local_configuration.yml" + kwargs["daq_config_directory"] = local_config else: interface_config = f"{Path(__file__).parent.absolute()}/../config_files/ehn1_configuration.yml" @@ -75,7 +78,7 @@ def __init__(self, *args, **kwargs): self.application_controller = ShifterInterfaceState( apparatus=apparatus, shifter_interface_config=interface_config, - use_local=use_local, + use_local=local_config is not None, ) self._init_logger(kwargs.get("log_level", "INFO")) @@ -146,6 +149,20 @@ def exit_message(self) -> str: return self._exit_message +@dataclass +class CliArgs: + apparatus: str | None = None + session_config: str | None = None + daq_config_directory: str | None = None + session_name: str | None = None + base_url: str | None = None + operation_url: str | None = None + log_level: str = "INFO" + local_config: str | None = None + + def as_kwargs(self): + return {k: v for k, v in vars(self).items() if v is not None} + @click.command() @click.option( "-a", @@ -165,7 +182,7 @@ def exit_message(self) -> str: @click.option( "-d", "--daq-config-directory", - "download_directory", + "daq_config_directory", required=False, help="Where do you want to download configs from/where are they located", ) @@ -194,39 +211,17 @@ def exit_message(self) -> str: @click.option( "-l", "--local-config", - "use_local", + "local_config", required=False, - is_flag=True, - help="Use local config files instead of downloading from the github, expert use only!", + help="Use local config files instead of downloading from the github, should be a path to the LOCAL config repo, expert use only!", ) -def main( - apparatus, - session_config, - download_directory, - session_name, - base_url, - operation_url, - log_level, - use_local, -): +def main(**kwargs): # Slghtly complicated here, as we need to remove unused args - cli_args = { - "apparatus": apparatus, - "session_config": session_config, - "download_directory": download_directory, - "session_name": session_name, - "base_url": base_url, - "operation_url": operation_url, - "log_level": log_level, - "use_local": use_local, - } - - cli_args = {k: v for k, v in cli_args.items() if v is not None} - - app = ShifterView(**cli_args) + cli_args = CliArgs(**kwargs) + + app = ShifterView(**cli_args.as_kwargs()) app.run() print(app.exit_message()) - if __name__ == "__main__": - main() + main() \ No newline at end of file diff --git a/src/runconf_ui/configuration_manager_interfaces/local_daq_conf_manager.py b/src/runconf_ui/configuration_manager_interfaces/local_daq_conf_manager.py index 8ac9945..ff8c657 100644 --- a/src/runconf_ui/configuration_manager_interfaces/local_daq_conf_manager.py +++ b/src/runconf_ui/configuration_manager_interfaces/local_daq_conf_manager.py @@ -1,5 +1,6 @@ -from pathlib import Path import os +from pathlib import Path + from runconf_ui.configuration_manager_interfaces.management_interface import ( ManagementInterface, ) @@ -10,7 +11,6 @@ ShifterInterfaceState, ) -import logging class LocalDaqConfManager(ManagementInterface): def __init__(self, application_controller: ShifterInterfaceState): @@ -21,7 +21,7 @@ def __init__(self, application_controller: ShifterInterfaceState): self.config_directories = [ Path(p) - for p in f"{self.application_controller.shifter_interface_config.download_directory}".split( + for p in f"{self.application_controller.shifter_interface_config.daq_config_directory}".split( ":" ) ] diff --git a/src/runconf_ui/configuration_manager_interfaces/management_interface.py b/src/runconf_ui/configuration_manager_interfaces/management_interface.py index a7d69e5..3708748 100644 --- a/src/runconf_ui/configuration_manager_interfaces/management_interface.py +++ b/src/runconf_ui/configuration_manager_interfaces/management_interface.py @@ -2,17 +2,17 @@ Simple wrapper for talking to config-management """ +import logging +from abc import ABC, abstractmethod +from pathlib import Path + +import runconf_ui.daq_config_interfaces.actions.actions as ca from runconf_ui.daq_config_interfaces.daq_config_file_io.daq_config_wrapper import ( DaqConfigurationWrapper, ) from runconf_ui.runconf_ui_controllers.runconf_ui_state import ( ShifterInterfaceState, ) -import runconf_ui.daq_config_interfaces.actions.actions as ca - -import logging -from abc import ABC, abstractmethod -from pathlib import Path class ManagementInterface(ABC): @@ -56,5 +56,4 @@ def find_session(cls, file_name: str): file_sessions = ca.GetDalsOfClassAction(config_file)("Session") if file_sessions: return ca.GetAttributeAction(config_file)(file_sessions[0], "id") - else: - return None + return None diff --git a/src/runconf_ui/configuration_manager_interfaces/remote_daq_conf_manger.py b/src/runconf_ui/configuration_manager_interfaces/remote_daq_conf_manger.py index 84f7396..a90e48f 100644 --- a/src/runconf_ui/configuration_manager_interfaces/remote_daq_conf_manger.py +++ b/src/runconf_ui/configuration_manager_interfaces/remote_daq_conf_manger.py @@ -8,23 +8,22 @@ "Could not import runconftool or config_management. Please install runconftools or config_management" ) +import logging +import re +import shutil +import traceback +from pathlib import Path + +from runconf_ui.configuration_manager_interfaces.management_interface import ( + ManagementInterface, +) from runconf_ui.daq_config_interfaces.daq_config_file_io.daq_conf_path_reader import ( DaqConfPathReader, ) +from runconf_ui.exceptions import CiderInvalidRepoException from runconf_ui.runconf_ui_controllers.runconf_ui_state import ( ShifterInterfaceState, ) -from runconf_ui.configuration_manager_interfaces.management_interface import ( - ManagementInterface, -) - -import re -from pathlib import Path -import logging -import traceback -import shutil - -from runconf_ui.exceptions import CiderInvalidRepoException class RemoteDaqConfManager(ManagementInterface): @@ -41,7 +40,7 @@ def __init__(self, application_controller: ShifterInterfaceState): try: self.conf_pool = ConfPool( str( - self.application_controller.shifter_interface_config.download_directory + self.application_controller.shifter_interface_config.daq_config_directory ), apparatus=self.application_controller.apparatus, operation_url=self.application_controller.shifter_interface_config.operation_url, @@ -77,7 +76,7 @@ def open_file(self, daq_configuration: str): CiderInvalidRepoException(e) - detector_config_path = Path(self.application_controller.shifter_interface_config.download_directory) / 'runconf-ui-settings' / f"{self.application_controller.apparatus}.yml" + detector_config_path = Path(self.application_controller.shifter_interface_config.daq_config_directory) / 'runconf-ui-settings' / f"{self.application_controller.apparatus}.yml" if not detector_config_path.exists(): raise FileNotFoundError(f"Detector configuration file {detector_config_path} does not exist") @@ -92,7 +91,7 @@ def open_file(self, daq_configuration: str): return super().open_file(self.application_controller.direct_config_path) config_list = config_path_reader( - self.application_controller.shifter_interface_config.download_directory + self.application_controller.shifter_interface_config.daq_config_directory ) valid_config_files = [ @@ -138,11 +137,11 @@ def reset(self): self.conf_pool.repo.close() shutil.rmtree( - self.application_controller.shifter_interface_config.download_directory + self.application_controller.shifter_interface_config.daq_config_directory ) Path( - self.application_controller.shifter_interface_config.download_directory + self.application_controller.shifter_interface_config.daq_config_directory ).mkdir(parents=True, exist_ok=True) self.__init__(self.application_controller) diff --git a/src/runconf_ui/daq_config_interfaces/actions/action_interfaces.py b/src/runconf_ui/daq_config_interfaces/actions/action_interfaces.py index 64df953..3c7b45e 100644 --- a/src/runconf_ui/daq_config_interfaces/actions/action_interfaces.py +++ b/src/runconf_ui/daq_config_interfaces/actions/action_interfaces.py @@ -1,12 +1,12 @@ +import traceback +from abc import ABC, abstractmethod +from typing import Any + from runconf_ui.daq_config_interfaces.daq_config_file_io.daq_config_wrapper import ( DaqConfigurationWrapper, ) from runconf_ui.exceptions import CiderBadActionException -from abc import ABC, abstractmethod -from typing import Any -import traceback - # The idea here is to define an interface for actions on a configuration, # currently this is very simple but there is scope to add some complexity @@ -29,8 +29,7 @@ def action(self, *args, **kwargs): def __call__(self, *args, **kwargs) -> Any: try: - a = self.action(*args, **kwargs) - return a + return self.action(*args, **kwargs) except Exception: raise CiderBadActionException(traceback.format_exc()) diff --git a/src/runconf_ui/daq_config_interfaces/actions/actions.py b/src/runconf_ui/daq_config_interfaces/actions/actions.py index 030db81..20bb767 100644 --- a/src/runconf_ui/daq_config_interfaces/actions/actions.py +++ b/src/runconf_ui/daq_config_interfaces/actions/actions.py @@ -1,9 +1,9 @@ +import shutil + from runconf_ui.daq_config_interfaces.actions.action_interfaces import ActionInterface from runconf_ui.daq_config_interfaces.daq_config_file_io.daq_config_wrapper import ( DaqConfigurationWrapper, ) -import shutil -import logging """ A collection of simple actions on a configuration. These should take a single configuration @@ -17,8 +17,7 @@ def action(self, conf_obj_id: str, conf_obj_class: str): """ Gets DAL object from configuration """ - conf_obj = self._daq_configuration.get_dal(conf_obj_class, conf_obj_id) - return conf_obj + return self._daq_configuration.get_dal(conf_obj_class, conf_obj_id) class ChangeAttributeAction(ActionInterface): @@ -38,7 +37,7 @@ def action(self): Unload configuration """ self._daq_configuration.unload() - return None + return class UpdateDalAction(ActionInterface): @@ -57,7 +56,7 @@ def action(self, dal): Delete object from configuration """ self._daq_configuration.destroy_dal(dal) - return None + return class RenameDalAction(ActionInterface): @@ -202,7 +201,7 @@ class CommitConfigurationAction(ActionInterface): def action(self, save_message: str = ""): self._daq_configuration.commit(save_message) - return None + return # Actions for getting information diff --git a/src/runconf_ui/daq_config_interfaces/daq_config_file_io/buffer_file_manager.py b/src/runconf_ui/daq_config_interfaces/daq_config_file_io/buffer_file_manager.py index 86f4bbe..2f7813c 100644 --- a/src/runconf_ui/daq_config_interfaces/daq_config_file_io/buffer_file_manager.py +++ b/src/runconf_ui/daq_config_interfaces/daq_config_file_io/buffer_file_manager.py @@ -1,3 +1,7 @@ +import logging +import os +from pathlib import Path + from runconf_ui.daq_config_interfaces.daq_config_file_io.consolidate_daq_conf import ( ConsolidateDAQConf, ) @@ -7,9 +11,6 @@ from runconf_ui.runconf_ui_controllers.runconf_ui_state import ( ShifterInterfaceState, ) -from pathlib import Path -import os -import logging class BufferFileManager: diff --git a/src/runconf_ui/daq_config_interfaces/daq_config_file_io/consolidate_daq_conf.py b/src/runconf_ui/daq_config_interfaces/daq_config_file_io/consolidate_daq_conf.py index 5570bc8..4bc598b 100644 --- a/src/runconf_ui/daq_config_interfaces/daq_config_file_io/consolidate_daq_conf.py +++ b/src/runconf_ui/daq_config_interfaces/daq_config_file_io/consolidate_daq_conf.py @@ -1,18 +1,18 @@ -from runconf_ui.daq_config_interfaces.daq_config_file_io.daq_config_wrapper import ( - DaqConfigurationWrapper, -) +import os +import sys +from typing import Any from runconf_ui.daq_config_interfaces.actions.actions import ( - GetDalObjectAction, + CommitConfigurationAction, CopyDalAction, - GetRelatedDalsAction, GetAllDalsAction, - CommitConfigurationAction, + GetDalObjectAction, + GetRelatedDalsAction, +) +from runconf_ui.daq_config_interfaces.daq_config_file_io.daq_config_wrapper import ( + DaqConfigurationWrapper, ) -from typing import Any -import sys -import os class ConsolidateDAQConf: """ @@ -95,19 +95,19 @@ def __populate_configuration(self, configuration, dal_obj): relation_list = [] for r in related_objs: - for dal_list in list(r.values())[0]: + for dal_list in next(iter(r.values())): if not isinstance(dal_list, list): dal_list = [dal_list] if len(dal_list) == 0: - return + return None for d in dal_list: relation_list.append(d) - relation_list += list( + relation_list += next([ self.__populate_configuration(configuration, d) - for d in dal_list - )[0] + for d in dal_list] + ) return relation_list diff --git a/src/runconf_ui/daq_config_interfaces/daq_config_file_io/daq_conf_path_reader.py b/src/runconf_ui/daq_config_interfaces/daq_config_file_io/daq_conf_path_reader.py index 2d8b2d9..ccede73 100644 --- a/src/runconf_ui/daq_config_interfaces/daq_config_file_io/daq_conf_path_reader.py +++ b/src/runconf_ui/daq_config_interfaces/daq_config_file_io/daq_conf_path_reader.py @@ -1,13 +1,12 @@ +import logging +import os +from pathlib import Path + import runconf_ui.daq_config_interfaces.actions.actions as ca from runconf_ui.daq_config_interfaces.daq_config_file_io.daq_config_wrapper import ( DaqConfigurationWrapper, ) -from pathlib import Path -from typing import List -import os -import logging - class DaqConfPathReader: def get_db_from_path(self, file_path: Path) -> Path | None: @@ -36,7 +35,7 @@ def _get_number_of_sessions(self, config_file_path: str) -> int: return 0 # FILE STUFF - def __call__(self, config_directories) -> List[Path]: + def __call__(self, config_directories) -> list[Path]: """Generates a list of file options from the given directories.""" self.config_directories = config_directories diff --git a/src/runconf_ui/daq_config_interfaces/daq_config_file_io/daq_config_wrapper.py b/src/runconf_ui/daq_config_interfaces/daq_config_file_io/daq_config_wrapper.py index 75ca05d..80c0a9e 100644 --- a/src/runconf_ui/daq_config_interfaces/daq_config_file_io/daq_config_wrapper.py +++ b/src/runconf_ui/daq_config_interfaces/daq_config_file_io/daq_config_wrapper.py @@ -1,6 +1,7 @@ -import conffwk import logging +import conffwk + # import oks diff --git a/src/runconf_ui/daq_config_interfaces/daq_tree_tools/daq_conf_tree.py b/src/runconf_ui/daq_config_interfaces/daq_tree_tools/daq_conf_tree.py index 5c5b68c..19c58fd 100644 --- a/src/runconf_ui/daq_config_interfaces/daq_tree_tools/daq_conf_tree.py +++ b/src/runconf_ui/daq_config_interfaces/daq_tree_tools/daq_conf_tree.py @@ -1,16 +1,18 @@ # version focusing on caching and reduced object creation +from abc import ABC, abstractmethod + +from rich.tree import Tree + import runconf_ui.daq_config_interfaces.actions.actions as ca +from runconf_ui.exceptions import CiderBadActionException from runconf_ui.runconf_ui_configuration.object_extractors.detector_extractor import ( DetectorExtractor, ) -from runconf_ui.utils.subsystem_status import SubsystemStatus -from runconf_ui.exceptions import CiderBadActionException -from rich.tree import Tree -from abc import ABC, abstractmethod from runconf_ui.runconf_ui_controllers.runconf_ui_state import ( ShifterInterfaceState, ) +from runconf_ui.utils.subsystem_status import SubsystemStatus class DaqConfTreeBase(ABC): diff --git a/src/runconf_ui/daq_config_interfaces/daq_tree_tools/daq_full_tree.py b/src/runconf_ui/daq_config_interfaces/daq_tree_tools/daq_full_tree.py index 09b2cc2..efcdaee 100644 --- a/src/runconf_ui/daq_config_interfaces/daq_tree_tools/daq_full_tree.py +++ b/src/runconf_ui/daq_config_interfaces/daq_tree_tools/daq_full_tree.py @@ -1,11 +1,12 @@ +import logging + +from rich.tree import Tree + +import runconf_ui.daq_config_interfaces.actions.actions as ca from runconf_ui.daq_config_interfaces.daq_tree_tools.daq_conf_tree import ( DaqConfTreeBase, ) from runconf_ui.runconf_ui_controllers.runconf_ui_state import ShifterInterfaceState -from rich.tree import Tree -import runconf_ui.daq_config_interfaces.actions.actions as ca -from typing import Set, Optional -import logging class DaqFullTree(DaqConfTreeBase): @@ -68,7 +69,7 @@ def build_tree( dal_obj, is_disabled: bool = False, session_name: str = "" - ) -> Optional[Tree]: + ) -> Tree | None: """ tree building with reduced string operations and caching.""" # Use cached actions get_class_name_action = self._get_action(ca.GetClassNameAction) @@ -134,7 +135,7 @@ def build_tree( ) @property - def disabled_objs(self) -> Set: + def disabled_objs(self) -> set: """Get the set of disabled objects.""" return set(self._disabled_objs) diff --git a/src/runconf_ui/daq_config_interfaces/daq_tree_tools/daq_tree_manager.py b/src/runconf_ui/daq_config_interfaces/daq_tree_tools/daq_tree_manager.py index d2fc434..c6ef0aa 100644 --- a/src/runconf_ui/daq_config_interfaces/daq_tree_tools/daq_tree_manager.py +++ b/src/runconf_ui/daq_config_interfaces/daq_tree_tools/daq_tree_manager.py @@ -1,8 +1,10 @@ -from textual.screen import Screen -from runconf_ui.widgets.multicomponent_panel import MultiComponentEnableDisablePanel -from runconf_ui.runconf_ui_controllers.runconf_ui_state import ShifterInterfaceState import logging + +from textual.screen import Screen + from runconf_ui.daq_config_interfaces.daq_tree_tools.daq_full_tree import DaqFullTree +from runconf_ui.runconf_ui_controllers.runconf_ui_state import ShifterInterfaceState +from runconf_ui.widgets.multicomponent_panel import MultiComponentEnableDisablePanel class DaqTreeManager: diff --git a/src/runconf_ui/runconf_ui_configuration/detector_config_readers/detector_map_reader_base.py b/src/runconf_ui/runconf_ui_configuration/detector_config_readers/detector_map_reader_base.py index f425746..e8eb729 100644 --- a/src/runconf_ui/runconf_ui_configuration/detector_config_readers/detector_map_reader_base.py +++ b/src/runconf_ui/runconf_ui_configuration/detector_config_readers/detector_map_reader_base.py @@ -1,13 +1,12 @@ +import logging +from abc import ABC, abstractmethod + +from textual.widgets import Static, TabPane + from runconf_ui.runconf_ui_controllers.runconf_ui_state import ( ShifterInterfaceState, ) -from textual.widgets import TabPane, Static - -from typing import Dict -import logging -from abc import ABC, abstractmethod - class DetectorMapReaderBase(ABC): """ @@ -28,17 +27,17 @@ def __init__(self, application_controller: ShifterInterfaceState) -> None: self.append_to_panel(name, opts) @abstractmethod - def get_opts_from_controller(selfs) -> Dict: ... + def get_opts_from_controller(selfs) -> dict: ... @abstractmethod - def append_to_panel(self, name: str, opts: Dict) -> None: + def append_to_panel(self, name: str, opts: dict) -> None: """ Append a panel to the main container. This method should be implemented by subclasses to define how panels are added. """ ... - def initialise_system(self, panel_name: str, opts: Dict, panel: Static) -> TabPane: + def initialise_system(self, panel_name: str, opts: dict, panel: Static) -> TabPane: """ Initialise a system panel with the given options. """ diff --git a/src/runconf_ui/runconf_ui_configuration/detector_config_readers/generate_enable_disable_map.py b/src/runconf_ui/runconf_ui_configuration/detector_config_readers/generate_enable_disable_map.py index 80345a6..78e8e88 100644 --- a/src/runconf_ui/runconf_ui_configuration/detector_config_readers/generate_enable_disable_map.py +++ b/src/runconf_ui/runconf_ui_configuration/detector_config_readers/generate_enable_disable_map.py @@ -1,14 +1,17 @@ -from runconf_ui.widgets.multicomponent_panel import MultiComponentEnableDisablePanel +from typing import ClassVar + +from textual.containers import ScrollableContainer +from textual.widgets import Static + from runconf_ui.runconf_ui_configuration.detector_config_readers.detector_map_reader_base import ( DetectorMapReaderBase, ) -from textual.widgets import Static -from textual.containers import ScrollableContainer +from runconf_ui.widgets.multicomponent_panel import MultiComponentEnableDisablePanel class EnableDisableMapGen(DetectorMapReaderBase): - _panel_list = [] - _map_list = [] + _panel_list: ClassVar[list] = [] + _map_list: ClassVar[list] = [] def get_opts_from_controller(self) -> dict: """ diff --git a/src/runconf_ui/runconf_ui_configuration/object_extractors/adjustable_attribute_extractor.py b/src/runconf_ui/runconf_ui_configuration/object_extractors/adjustable_attribute_extractor.py index c87da02..250fc4c 100644 --- a/src/runconf_ui/runconf_ui_configuration/object_extractors/adjustable_attribute_extractor.py +++ b/src/runconf_ui/runconf_ui_configuration/object_extractors/adjustable_attribute_extractor.py @@ -1,10 +1,10 @@ -from runconf_ui.runconf_ui_controllers.runconf_ui_state import ShifterInterfaceState +import logging +import re + import runconf_ui.daq_config_interfaces.actions.actions as ca from runconf_ui.exceptions import CiderOutOfBoundsException +from runconf_ui.runconf_ui_controllers.runconf_ui_state import ShifterInterfaceState -import logging -from typing import Tuple, Union -import re class AdjustableAttributeManager: def __init__(self, application_controller: ShifterInterfaceState, **kwargs): @@ -166,6 +166,8 @@ def get_state(self, object_id: str): return attr_value + return None + def get_object_list(self) -> list[str]: """ Get the list of object IDs for which the attribute can be set. @@ -198,12 +200,10 @@ def get_tooltip(self, object_id) -> str | None: dal_obj = ca.GetDalObjectAction(self._application_controller.buffer_daq_config)( object_id, self._object_class ) - tooltip_val = ca.GetAttributeAction( + return ca.GetAttributeAction( self._application_controller.buffer_daq_config )(dal_obj, self._tooltip_var) - return tooltip_val - def get_value_label(self, object_id: str) -> str: """ Get the tooltip for the attribute value of a given object ID. @@ -250,8 +250,7 @@ def convert_from_hex(self, value: str) -> int: # Convert a hexadecimal string to an integer if value.startswith("0x"): return int(value, 16) - else: - raise ValueError(f"Invalid hexadecimal value: {value}") + raise ValueError(f"Invalid hexadecimal value: {value}") def to_dec(self, value: str) -> int: return int(value, 16) @@ -283,7 +282,7 @@ def attribute_name(self) -> str | None: def class_name(self) -> str | None: return self._object_class - def _range(self) -> Union[Tuple[float, float], Tuple[None, None]]: + def _range(self) -> tuple[float, float] | tuple[None, None]: """ Get the range of the attribute. Returns a tuple of (lower_limit, upper_limit). diff --git a/src/runconf_ui/runconf_ui_configuration/object_extractors/attribute_extractor.py b/src/runconf_ui/runconf_ui_configuration/object_extractors/attribute_extractor.py index 0287f88..13f6260 100644 --- a/src/runconf_ui/runconf_ui_configuration/object_extractors/attribute_extractor.py +++ b/src/runconf_ui/runconf_ui_configuration/object_extractors/attribute_extractor.py @@ -1,24 +1,22 @@ +import logging +import traceback + +import runconf_ui.daq_config_interfaces.actions.actions as ca +from runconf_ui.daq_config_interfaces.actions.workflows.get_objects_in_session import ( + GetSegmentAppsListAction, +) from runconf_ui.daq_config_interfaces.actions.workflows.get_set_session_attribute import ( - SetAttributeValueSessionAction, GetAttributeValueSessionAction, + SetAttributeValueSessionAction, ) +from runconf_ui.exceptions import CiderBadActionException from runconf_ui.runconf_ui_configuration.object_extractors.extractor_interfaces import ( SubsystemExtractor, ) -import runconf_ui.daq_config_interfaces.actions.actions as ca -from runconf_ui.daq_config_interfaces.actions.workflows.get_objects_in_session import ( - GetSegmentAppsListAction, -) -from runconf_ui.exceptions import CiderBadActionException -from runconf_ui.utils.subsystem_status import SubsystemStatus from runconf_ui.runconf_ui_controllers.runconf_ui_state import ( ShifterInterfaceState, ) - - -from typing import Dict -import logging -import traceback +from runconf_ui.utils.subsystem_status import SubsystemStatus class AttributeExtractor(SubsystemExtractor): @@ -29,7 +27,7 @@ class AttributeExtractor(SubsystemExtractor): def __init__( self, application_controller: ShifterInterfaceState, - subsystem: Dict, + subsystem: dict, disabled_dals=[], ): @@ -116,9 +114,8 @@ def get_state_for_obj(self, object_name: str) -> SubsystemStatus: if object_state == self._disabled_dals or object_dal in self._disabled_dals: return SubsystemStatus.DISABLED - else: - return SubsystemStatus.ENABLED + return SubsystemStatus.ENABLED except Exception: raise CiderBadActionException( diff --git a/src/runconf_ui/runconf_ui_configuration/object_extractors/component_extractor.py b/src/runconf_ui/runconf_ui_configuration/object_extractors/component_extractor.py index 50bf865..7e9647c 100644 --- a/src/runconf_ui/runconf_ui_configuration/object_extractors/component_extractor.py +++ b/src/runconf_ui/runconf_ui_configuration/object_extractors/component_extractor.py @@ -1,12 +1,12 @@ +import logging + +import runconf_ui.daq_config_interfaces.actions.actions as ca +from runconf_ui.exceptions import CiderBadActionException from runconf_ui.runconf_ui_configuration.object_extractors.extractor_interfaces import ( SubsystemExtractor, ) -import runconf_ui.daq_config_interfaces.actions.actions as ca -from runconf_ui.exceptions import CiderBadActionException from runconf_ui.utils.subsystem_status import SubsystemStatus -import logging - class ComponentExtractor(SubsystemExtractor): """ @@ -104,5 +104,4 @@ def tooltip(self) -> str: if self._is_system: return f"Enable/disable {self._system_name} component" - else: - return f"Enable/disable {self._system_id} component" + return f"Enable/disable {self._system_id} component" diff --git a/src/runconf_ui/runconf_ui_configuration/object_extractors/detector_extractor.py b/src/runconf_ui/runconf_ui_configuration/object_extractors/detector_extractor.py index ca1ba15..18fcc4f 100644 --- a/src/runconf_ui/runconf_ui_configuration/object_extractors/detector_extractor.py +++ b/src/runconf_ui/runconf_ui_configuration/object_extractors/detector_extractor.py @@ -1,33 +1,26 @@ +import logging +import re +import traceback +from collections import OrderedDict + +from runconf_ui.exceptions import ( + CiderBadActionException, + CiderInvalidConfigurationException, +) from runconf_ui.runconf_ui_configuration.object_extractors.extractor_interfaces import ( MultiItemExtractor, ) from runconf_ui.runconf_ui_configuration.object_extractors.system_extractor import ( SystemExtractor, ) -from runconf_ui.exceptions import ( - CiderBadActionException, - CiderInvalidConfigurationException, -) from runconf_ui.runconf_ui_controllers.runconf_ui_state import ( ShifterInterfaceState, ) - from runconf_ui.utils.subsystem_status import SubsystemStatus -from typing import Dict, Optional -import logging -import traceback -from collections import OrderedDict -import re - class DetectorExtractor(MultiItemExtractor): - def __init__( - self, - application_controller: ShifterInterfaceState, - detector_config: Optional[Dict], - disabled_dals=[], - ): + def __init__(self, application_controller: ShifterInterfaceState, detector_config: dict | None, disabled_dals=[]): """ Extracts the states of ALL systems present in the detector config for a given top level system (i.e. trigger). :param daq_configuration: daq_configuration object @@ -38,15 +31,14 @@ def __init__( Detector config is of the form "Detector System Name": { - - label: str # Name of the system for labelling widgets - - panel_type: # multi-system OR single system + - label: str # Name of the system for labelling widgets + - panel_type: # multi-system OR single system - Systems [ {systsem_a}, {system_b}, ... ] } - """ # Config file self._detector_config = {} @@ -56,7 +48,7 @@ def __init__( logging.debug(f"Detector configuration {detector_config}") super().__init__(application_controller, detector_config, disabled_dals) - def read_system(self, detector_config: Dict): + def read_system(self, detector_config: dict): # Read system dict if not super().read_system(detector_config): logging.error("Detector config is not valid, cannot read systems.") @@ -68,16 +60,16 @@ def read_system(self, detector_config: Dict): logging.debug(f"Detector config: {self._detector_config}") extracted_systems = detector_config.get("Systems", []) - system_name = list(detector_config.keys())[0] + system_name = next(list(detector_config.keys())) logging.debug(f"Reading system {system_name}") for s in extracted_systems: logging.debug(f"Extracting system {s}") try: - system_name = list(s.keys())[0] + system_name = next(list(s.keys())) - system_info = list(s.values())[0] + system_info = next(list(s.values())) self._system_extractors.append( SystemExtractor( diff --git a/src/runconf_ui/runconf_ui_configuration/object_extractors/extractor_interfaces.py b/src/runconf_ui/runconf_ui_configuration/object_extractors/extractor_interfaces.py index 6ac7854..9d05e7f 100644 --- a/src/runconf_ui/runconf_ui_configuration/object_extractors/extractor_interfaces.py +++ b/src/runconf_ui/runconf_ui_configuration/object_extractors/extractor_interfaces.py @@ -1,20 +1,18 @@ -from runconf_ui.exceptions import CiderBadActionException +import logging +import traceback +from abc import ABC, abstractmethod +from typing import Any + import runconf_ui.daq_config_interfaces.actions.actions as ca -from runconf_ui.utils.subsystem_status import SubsystemStatus +from runconf_ui.exceptions import CiderBadActionException from runconf_ui.runconf_ui_controllers.runconf_ui_state import ( ShifterInterfaceState, ) - -from typing import Any, Optional, Dict -from abc import ABC, abstractmethod -import logging -import traceback - +from runconf_ui.utils.subsystem_status import SubsystemStatus """ Base classes for extracting the state of a subsystem. - - Logic +Logic 1. Input dict defined as System A: @@ -192,11 +190,11 @@ def __init__( ) @property - def tooltip(self) -> Optional[str]: + def tooltip(self) -> str | None: return self._tooltip @tooltip.setter - def tooltip(self, tooltip: Optional[str]): + def tooltip(self, tooltip: str | None): self._tooltip = tooltip @property @@ -244,7 +242,7 @@ class MultiItemExtractor(ItemExtractor): def __init__( self, application_controller: ShifterInterfaceState, - system: Dict | None = None, + system: dict | None = None, disabled_dals=[], ): """ @@ -263,7 +261,7 @@ def __init__( ): self.read_system(system) - def read_system(self, system: Optional[Dict]): + def read_system(self, system: dict | None): if ( system is None or self._application_controller.buffer_daq_config is None diff --git a/src/runconf_ui/runconf_ui_configuration/object_extractors/multi_adjustable_attribute_extractor.py b/src/runconf_ui/runconf_ui_configuration/object_extractors/multi_adjustable_attribute_extractor.py index 86cdc79..f84ae13 100644 --- a/src/runconf_ui/runconf_ui_configuration/object_extractors/multi_adjustable_attribute_extractor.py +++ b/src/runconf_ui/runconf_ui_configuration/object_extractors/multi_adjustable_attribute_extractor.py @@ -1,10 +1,9 @@ -from runconf_ui.runconf_ui_configuration.object_extractors.adjustable_attribute_extractor import ( - AdjustableAttributeManager, -) - import logging from traceback import format_exc +from runconf_ui.runconf_ui_configuration.object_extractors.adjustable_attribute_extractor import ( + AdjustableAttributeManager, +) class MultiAdjustableAttributeExtractor: @@ -102,6 +101,7 @@ def get_value_label(self, object_id: str, attribute_name: str) -> str | None: and attribute_name == manager.attribute_name ): return manager.get_value_label(object_id) + return None def get_tooltip(self, object_id: str, attribute_name: str) -> str | None: """ @@ -116,6 +116,7 @@ def get_tooltip(self, object_id: str, attribute_name: str) -> str | None: and attribute_name == manager.attribute_name ): return manager.get_tooltip(object_id) + return None def lower_limit(self, object_id: str, attribute_name: str) -> float | None: """ @@ -130,6 +131,7 @@ def lower_limit(self, object_id: str, attribute_name: str) -> float | None: and attribute_name == manager.attribute_name ): return manager.lower_limit + return None def upper_limit(self, object_id: str, attribute_name: str) -> float | None: """ @@ -144,6 +146,7 @@ def upper_limit(self, object_id: str, attribute_name: str) -> float | None: and attribute_name == manager.attribute_name ): return manager.upper_limit + return None def reset_value(self, object_id: str, attribute_name: str): """ @@ -159,4 +162,4 @@ def reset_value(self, object_id: str, attribute_name: str): else: logging.debug( f"Object ID {object_id} not found in adjustable attributes." - ) + ) \ No newline at end of file diff --git a/src/runconf_ui/runconf_ui_configuration/object_extractors/relationship_extractor.py b/src/runconf_ui/runconf_ui_configuration/object_extractors/relationship_extractor.py index ccd8406..2d2a3a3 100644 --- a/src/runconf_ui/runconf_ui_configuration/object_extractors/relationship_extractor.py +++ b/src/runconf_ui/runconf_ui_configuration/object_extractors/relationship_extractor.py @@ -1,14 +1,13 @@ -from runconf_ui.runconf_ui_configuration.object_extractors.attribute_extractor import ( - AttributeExtractor, -) +import logging + import runconf_ui.daq_config_interfaces.actions.actions as ca -from runconf_ui.runconf_ui_controllers.runconf_ui_state import ShifterInterfaceState from runconf_ui.daq_config_interfaces.daq_config_file_io.daq_config_wrapper import ( DaqConfigurationWrapper, ) - -from typing import Dict, List, Optional, Union -import logging +from runconf_ui.runconf_ui_configuration.object_extractors.attribute_extractor import ( + AttributeExtractor, +) +from runconf_ui.runconf_ui_controllers.runconf_ui_state import ShifterInterfaceState class RelationshipExtractor(AttributeExtractor): @@ -21,8 +20,8 @@ class RelationshipExtractor(AttributeExtractor): def __init__( self, application_controller: ShifterInterfaceState, - subsystem: Dict, - disabled_dals: List[str] = None, + subsystem: dict, + disabled_dals: list[str] | None = None, ): """ Initialize the RelationshipExtractor. @@ -42,8 +41,8 @@ def __init__( self.disabled_state = self._find_enable_disable_state(self.disabled_state) def _get_states( - self, state: Union[str, List[str]], configuration: DaqConfigurationWrapper - ) -> Union[object, List[object]]: + self, state: str | list[str], configuration: DaqConfigurationWrapper + ) -> object | list[object]: """ Get DAL objects for the given state(s). @@ -63,8 +62,8 @@ def _get_states( ] def _find_enable_disable_state( - self, state: Union[str, List[str]] - ) -> Optional[Union[object, List[object]]]: + self, state: str | list[str] + ) -> object | list[object] | None: """ Get DALs to set relationship enable/disable state. @@ -107,5 +106,5 @@ def _find_enable_disable_state( ) except Exception as e: - logging.error(f"Failed to find enable/disable state: {str(e)}") + logging.error(f"Failed to find enable/disable state: {e!s}") return None \ No newline at end of file diff --git a/src/runconf_ui/runconf_ui_configuration/object_extractors/system_extractor.py b/src/runconf_ui/runconf_ui_configuration/object_extractors/system_extractor.py index e978856..2acfc64 100644 --- a/src/runconf_ui/runconf_ui_configuration/object_extractors/system_extractor.py +++ b/src/runconf_ui/runconf_ui_configuration/object_extractors/system_extractor.py @@ -1,26 +1,27 @@ -from runconf_ui.runconf_ui_configuration.object_extractors.extractor_interfaces import ( - MultiItemExtractor, - SubsystemExtractor, -) +import logging +import traceback +from collections.abc import Sequence + +import runconf_ui.daq_config_interfaces.actions.actions as ca +from runconf_ui.exceptions import CiderBadActionException from runconf_ui.runconf_ui_configuration.object_extractors.attribute_extractor import ( AttributeExtractor, ) from runconf_ui.runconf_ui_configuration.object_extractors.component_extractor import ( ComponentExtractor, ) +from runconf_ui.runconf_ui_configuration.object_extractors.extractor_interfaces import ( + MultiItemExtractor, + SubsystemExtractor, +) from runconf_ui.runconf_ui_configuration.object_extractors.relationship_extractor import ( RelationshipExtractor, ) -from runconf_ui.utils.subsystem_status import SubsystemStatus -from runconf_ui.exceptions import CiderBadActionException -import runconf_ui.daq_config_interfaces.actions.actions as ca from runconf_ui.runconf_ui_controllers.runconf_ui_state import ( ShifterInterfaceState, ) +from runconf_ui.utils.subsystem_status import SubsystemStatus -from typing import Dict, Sequence, Optional, List -import logging -import traceback class SystemExtractor(MultiItemExtractor): """ @@ -33,9 +34,9 @@ class SystemExtractor(MultiItemExtractor): def __init__( self, application_controller: ShifterInterfaceState, - system_name: Optional[str], - system: Optional[Dict], - disabled_dals: List = None, + system_name: str | None, + system: dict | None, + disabled_dals: list[str] | None = None, ): """ Initialize SystemExtractor. @@ -54,9 +55,9 @@ def __init__( } """ # Initialize collections - self._attributes: List[AttributeExtractor] = [] - self._components: List[ComponentExtractor] = [] - self._system_names: List[str] = [] + self._attributes: list[AttributeExtractor] = [] + self._components: list[ComponentExtractor] = [] + self._system_names: list[str] = [] # System configuration self._system_name = system_name @@ -64,10 +65,10 @@ def __init__( self._display_full_system = True # Caching for performance - self._tooltips: Dict[str, str] = {} - self._subsystems: Dict[str, List] = {} - self._component_cache: Dict[str, List] = {} - self._attribute_cache: Dict[str, List] = {} + self._tooltips: dict[str, str] = {} + self._subsystems: dict[str, list] = {} + self._component_cache: dict[str, list] = {} + self._attribute_cache: dict[str, list] = {} # Initialize tooltip for main system if self._system_name: @@ -75,7 +76,7 @@ def __init__( super().__init__(application_controller, system, disabled_dals or []) - def read_system(self, system: Dict, system_name: Optional[str] = None) -> bool: + def read_system(self, system: dict, system_name: str | None = None) -> bool: """ Read dictionary containing system information and extract state. @@ -104,7 +105,7 @@ def read_system(self, system: Dict, system_name: Optional[str] = None) -> bool: return True - def _extract_attributes(self, system: Dict) -> None: + def _extract_attributes(self, system: dict) -> None: """Extract attributes and relationships from system configuration.""" self._attributes = [] @@ -120,7 +121,7 @@ def _extract_attributes(self, system: Dict) -> None: RelationshipExtractor(self._application_controller, rel_config) ) - def _extract_components(self, system: Dict) -> None: + def _extract_components(self, system: dict) -> None: """Extract components from system configuration.""" self._components = [] @@ -130,7 +131,7 @@ def _extract_components(self, system: Dict) -> None: else: self._add_component(comp_config) - def _extract_multi_component(self, comp_config: Dict) -> None: + def _extract_multi_component(self, comp_config: dict) -> None: """Extract multiple components from a wildcard configuration.""" component_names = self.find_components_with_wildcard( comp_config["id"], comp_config["class"] @@ -148,7 +149,7 @@ def _extract_multi_component(self, comp_config: Dict) -> None: self._add_component(modified_config) - def _add_component(self, comp_config: Dict) -> None: + def _add_component(self, comp_config: dict) -> None: """Add a single component to the system.""" # Set up tooltip for separate systems extractor = ComponentExtractor(self._application_controller, comp_config) @@ -200,14 +201,14 @@ def _build_system_structure(self) -> None: logging.debug(f"System names: {self._system_names}") - def _get_components_for_system(self, system_name: str) -> List: + def _get_components_for_system(self, system_name: str) -> list: """Get components for a specific system.""" return [ comp for comp in self._components if self._subsystem_matches(comp, system_name) ] - def _get_attributes_for_system(self, system_name: str) -> List: + def _get_attributes_for_system(self, system_name: str) -> list: """Get attributes for a specific system.""" return [ attr for attr in self._attributes @@ -220,7 +221,7 @@ def _subsystem_matches(self, subsystem: SubsystemExtractor, system_name: str) -> return True return subsystem.system_name == system_name - def extract_components(self, system: Dict) -> None: + def extract_components(self, system: dict) -> None: """Legacy method name - delegates to _extract_components for compatibility.""" self._extract_components(system) @@ -230,11 +231,11 @@ def system_names(self) -> Sequence[str]: return self._system_names @property - def system_name(self) -> Optional[str]: + def system_name(self) -> str | None: """Get the main system name.""" return self._system_name - def _get_state(self, system_name: Optional[str] = None) -> Optional[SubsystemStatus]: + def _get_state(self, system_name: str | None = None) -> SubsystemStatus | None: """ Get state of the system or subsystem. @@ -256,7 +257,7 @@ def _get_state(self, system_name: Optional[str] = None) -> Optional[SubsystemSta # Get states for the target system return self._calculate_system_state(target_system) - def _is_top_level_disabled(self, system_name: Optional[str]) -> bool: + def _is_top_level_disabled(self, system_name: str | None) -> bool: """Check if system is disabled at top level.""" if system_name == self._system_name or not self._subsystem_dependent: return False @@ -302,7 +303,7 @@ def _get_subsystem_state(self) -> SubsystemStatus: # Return uniform state or partially enabled return states[0] if len(set(states)) == 1 else SubsystemStatus.PARTIALLY_ENABLED - def _set_state(self, state: SubsystemStatus, system_name: Optional[str]) -> None: + def _set_state(self, state: SubsystemStatus, system_name: str | None) -> None: """Set state for a system and its subsystems.""" target_system = system_name or self._system_name @@ -316,7 +317,7 @@ def _set_state(self, state: SubsystemStatus, system_name: Optional[str]) -> None for subsystem in group: subsystem.set_state(state) - def _set_full_system_state(self, state: SubsystemStatus, system_name: Optional[str]) -> None: + def _set_full_system_state(self, state: SubsystemStatus, system_name: str | None) -> None: """ Set state for non-subsystem components based on subsystem dependencies. @@ -345,7 +346,7 @@ def _set_full_system_state(self, state: SubsystemStatus, system_name: Optional[s if not subsystem.is_system: subsystem.set_state(effective_state) - def get_all_states(self) -> Dict[str, SubsystemStatus]: + def get_all_states(self) -> dict[str, SubsystemStatus]: """ Get the state of the system and any nested subsystems. @@ -379,7 +380,7 @@ def get_all_states(self) -> Dict[str, SubsystemStatus]: return result - def get_components(self, system_name: Optional[str] = None) -> List: + def get_components(self, system_name: str | None = None) -> list: """ Get components for a specific system. @@ -399,7 +400,7 @@ def get_components(self, system_name: Optional[str] = None) -> List: self._component_cache[cache_key] = result return result - def get_attributes(self, system_name: Optional[str] = None) -> List: + def get_attributes(self, system_name: str | None = None) -> list: """ Get attributes for a specific system. @@ -419,7 +420,7 @@ def get_attributes(self, system_name: Optional[str] = None) -> List: self._attribute_cache[cache_key] = result return result - def set_disabled_dals(self, disabled_dals: List) -> None: + def set_disabled_dals(self, disabled_dals: list) -> None: """ Set disabled DALs for the system and all subsystems. @@ -431,7 +432,7 @@ def set_disabled_dals(self, disabled_dals: List) -> None: for subsystem in self._attributes + self._components: subsystem.set_disabled_dals(disabled_dals) - def find_components_with_wildcard(self, wildcard: str, class_name: str) -> List[str]: + def find_components_with_wildcard(self, wildcard: str, class_name: str) -> list[str]: """ Find components with a wildcard pattern in the system. @@ -458,7 +459,7 @@ def find_components_with_wildcard(self, wildcard: str, class_name: str) -> List[ return matching_components - def get_tooltip(self, system_name: Optional[str] = None) -> str: + def get_tooltip(self, system_name: str | None = None) -> str: """ Get the tooltip for the system or subsystem. @@ -472,5 +473,4 @@ def get_tooltip(self, system_name: Optional[str] = None) -> str: if self._tooltips.get(system_name): return self._tooltips[system_name] - else: - return f"Enable/Disable {system_name}" + return f"Enable/Disable {system_name}" diff --git a/src/runconf_ui/runconf_ui_configuration/shifter_config_reader.py b/src/runconf_ui/runconf_ui_configuration/shifter_config_reader.py index 7498861..c4b2b17 100644 --- a/src/runconf_ui/runconf_ui_configuration/shifter_config_reader.py +++ b/src/runconf_ui/runconf_ui_configuration/shifter_config_reader.py @@ -1,14 +1,15 @@ -from runconf_ui.utils.path_or_env_check import path_or_env_check +import os import yaml -import os + +from runconf_ui.utils.path_or_env_check import path_or_env_check # Class for reading a YAML config and producing panels class ShifterConfigReader: def __init__(self, settings_config_file: str, **kwargs): - with open(settings_config_file, "r") as f: + with open(settings_config_file) as f: self._settings_config = yaml.safe_load(f) # We can get settings @@ -17,8 +18,8 @@ def __init__(self, settings_config_file: str, **kwargs): # Update with any user args general_settings.update(kwargs) - self._download_directory = path_or_env_check( - general_settings.get("download_directory", f"{os.getcwd()}/configs") + self._daq_config_directory = path_or_env_check( + general_settings.get("daq_config_directory", f"{os.getcwd()}/configs") ) # Generic settings self._default_config = path_or_env_check( @@ -46,7 +47,7 @@ def __init__(self, settings_config_file: str, **kwargs): def open_detector_config(self, detector_config_file: str): - with open(detector_config_file, "r") as f: + with open(detector_config_file) as f: self._detector_config = yaml.safe_load(f) detector_config_settings = self._detector_config.get("Settings", {}) self._classes_to_show = detector_config_settings.get("classes_to_show", []) @@ -57,7 +58,7 @@ def detector_config(self): @property def output_directory(self): - return f"{self._download_directory}/../shifter_configs/{self._session_name}" + return f"{self._daq_config_directory}/../shifter_configs/{self._session_name}" @property def default_config(self): @@ -68,12 +69,12 @@ def default_config(self, value): self._default_config = path_or_env_check(value) @property - def download_directory(self): - return self._download_directory + def daq_config_directory(self): + return self._daq_config_directory - @download_directory.setter - def download_directory(self, value): - self._download_directory = path_or_env_check(value) + @daq_config_directory.setter + def daq_config_directory(self, value): + self._daq_config_directory = path_or_env_check(value) @property def session_name(self): diff --git a/src/runconf_ui/runconf_ui_controllers/runconf_ui_state.py b/src/runconf_ui/runconf_ui_controllers/runconf_ui_state.py index e26d403..e860ff5 100644 --- a/src/runconf_ui/runconf_ui_controllers/runconf_ui_state.py +++ b/src/runconf_ui/runconf_ui_controllers/runconf_ui_state.py @@ -1,14 +1,13 @@ # Dataclass containing application state information, is global and shared across everything from dataclasses import dataclass, field -from typing import Optional from pathlib import Path -from runconf_ui.runconf_ui_configuration.shifter_config_reader import ( - ShifterConfigReader, -) from runconf_ui.daq_config_interfaces.daq_config_file_io.daq_config_wrapper import ( DaqConfigurationWrapper, ) +from runconf_ui.runconf_ui_configuration.shifter_config_reader import ( + ShifterConfigReader, +) @dataclass @@ -20,17 +19,17 @@ class ShifterInterfaceState: # YAML used to configure the interface shifter_interface_config: ShifterConfigReader # NP02/NP04 - apparatus: Optional[str] = None + apparatus: str | None = None # Do we want to use the local configuration? Only use if you're an expert! - use_local: Optional[bool] = False + use_local: bool | None = False # Currently selected configuration, not necessarily the open one - current_daq_config: Optional[str] = None + current_daq_config: str | None = None # Name of session in config - session_name: Optional[str] = None + session_name: str | None = None # Currently open configuration - buffer_daq_config: Optional[DaqConfigurationWrapper] = None + buffer_daq_config: DaqConfigurationWrapper | None = None # Configuration name we're going to save - saved_configuration: Optional[str] = None + saved_configuration: str | None = None # current state of objects current_state: dict = field(default_factory=lambda: {}) @@ -40,5 +39,5 @@ def direct_config_path(self) -> Path: Get the path to the configuration file """ return Path( - f"{self.shifter_interface_config.download_directory}/{self.shifter_interface_config.default_config}" + f"{self.shifter_interface_config.daq_config_directory}/{self.shifter_interface_config.default_config}" ) diff --git a/src/runconf_ui/screens/help_screen.py b/src/runconf_ui/screens/help_screen.py index 2b89e0a..2196a42 100644 --- a/src/runconf_ui/screens/help_screen.py +++ b/src/runconf_ui/screens/help_screen.py @@ -1,8 +1,8 @@ -from textual.widgets import Button, Static +from textwrap import dedent + from textual.containers import ScrollableContainer from textual.screen import Screen - -from textwrap import dedent +from textual.widgets import Button, Static class HelpScreen(Screen): diff --git a/src/runconf_ui/screens/popup_manager.py b/src/runconf_ui/screens/popup_manager.py index b352114..118de13 100644 --- a/src/runconf_ui/screens/popup_manager.py +++ b/src/runconf_ui/screens/popup_manager.py @@ -1,5 +1,5 @@ -from textual.screen import Screen from textual.css.query import NoMatches +from textual.screen import Screen from runconf_ui.widgets.popup_message import PopupMessage diff --git a/src/runconf_ui/screens/quit_screen.py b/src/runconf_ui/screens/quit_screen.py index a5e3a73..ac60e38 100644 --- a/src/runconf_ui/screens/quit_screen.py +++ b/src/runconf_ui/screens/quit_screen.py @@ -1,9 +1,11 @@ -from textual.widgets import Button, Label -from textual.containers import Grid -from textual.screen import Screen import logging import os from pathlib import Path + +from textual.containers import Grid +from textual.screen import Screen +from textual.widgets import Button, Label + from runconf_ui.runconf_ui_controllers.runconf_ui_state import ( ShifterInterfaceState, ) diff --git a/src/runconf_ui/screens/shifter_view_screen.py b/src/runconf_ui/screens/shifter_view_screen.py index df71d06..987fe8e 100644 --- a/src/runconf_ui/screens/shifter_view_screen.py +++ b/src/runconf_ui/screens/shifter_view_screen.py @@ -1,33 +1,32 @@ -from textual.screen import Screen -from textual.containers import ScrollableContainer, Grid -from textual.widgets import TabbedContent, TabPane, Header, Footer, Static -from textual import on - -from runconf_ui.runconf_ui_controllers.runconf_ui_state import ( - ShifterInterfaceState, -) -from runconf_ui.runconf_ui_configuration.detector_config_readers.generate_enable_disable_map import ( - EnableDisableMapGen, -) -from runconf_ui.widgets.file_select_panel import FilePanelWidget -from runconf_ui.widgets.options_panel import OptionPanel -from runconf_ui.exceptions import CiderInvalidConfigurationException +import logging +import traceback +from textual import on +from textual.containers import Grid, ScrollableContainer +from textual.screen import Screen +from textual.widgets import Footer, Header, Static, TabbedContent, TabPane -import traceback -import logging from runconf_ui.daq_config_interfaces.daq_config_file_io.buffer_file_manager import ( BufferFileManager, ) from runconf_ui.daq_config_interfaces.daq_tree_tools.daq_tree_manager import ( DaqTreeManager, ) -from runconf_ui.screens.popup_manager import PopupManager -from runconf_ui.widgets.adjustable_attribute_panel import AdjustableAttributePanel -from runconf_ui.widgets.enable_disable_base import EnableDisablePanel +from runconf_ui.exceptions import CiderInvalidConfigurationException from runconf_ui.runconf_ui_configuration.detector_config_readers.generate_adjustable_attribute_map import ( AdjustableAttributeMapGen, ) +from runconf_ui.runconf_ui_configuration.detector_config_readers.generate_enable_disable_map import ( + EnableDisableMapGen, +) +from runconf_ui.runconf_ui_controllers.runconf_ui_state import ( + ShifterInterfaceState, +) +from runconf_ui.screens.popup_manager import PopupManager +from runconf_ui.widgets.adjustable_attribute_panel import AdjustableAttributePanel +from runconf_ui.widgets.enable_disable_base import EnableDisablePanel +from runconf_ui.widgets.file_select_panel import FilePanelWidget +from runconf_ui.widgets.options_panel import OptionPanel class ShifterViewScreen(Screen): diff --git a/src/runconf_ui/utils/save_file_handler.py b/src/runconf_ui/utils/save_file_handler.py index b802b68..28f659d 100644 --- a/src/runconf_ui/utils/save_file_handler.py +++ b/src/runconf_ui/utils/save_file_handler.py @@ -1,13 +1,13 @@ -from datetime import datetime +import logging import shutil -from runconf_ui.utils.file_cleaner import clean_old_files +from datetime import datetime +from pathlib import Path + import runconf_ui.daq_config_interfaces.actions.actions as ca from runconf_ui.runconf_ui_controllers.runconf_ui_state import ( ShifterInterfaceState, ) - -from pathlib import Path -import logging +from runconf_ui.utils.file_cleaner import clean_old_files class SaveFileHandler: @@ -99,7 +99,7 @@ def generate_change_log(self, config_path): file.write(f"\n{system}\n") file.write(f"{'-' * len(system)}\n") for key, value in state.items(): - file.write(f"{key} : {str(value)}\n") + file.write(f"{key} : {value!s}\n") def __call__(self): logging.debug("Saving configuration") diff --git a/src/runconf_ui/widgets/adjustable_attribute_panel.py b/src/runconf_ui/widgets/adjustable_attribute_panel.py index 3cb3574..75d7521 100644 --- a/src/runconf_ui/widgets/adjustable_attribute_panel.py +++ b/src/runconf_ui/widgets/adjustable_attribute_panel.py @@ -1,10 +1,11 @@ +from textual.containers import ScrollableContainer +from textual.message import Message +from textual.widgets import Button, Input, Static + from runconf_ui.runconf_ui_configuration.object_extractors.multi_adjustable_attribute_extractor import ( MultiAdjustableAttributeExtractor, ) from runconf_ui.runconf_ui_controllers.runconf_ui_state import ShifterInterfaceState -from textual.widgets import Static, Input, Button -from textual.containers import ScrollableContainer -from textual.message import Message class AdjustableAttributePanel(Static): diff --git a/src/runconf_ui/widgets/enable_disable_base.py b/src/runconf_ui/widgets/enable_disable_base.py index f8ad48c..ce949b1 100644 --- a/src/runconf_ui/widgets/enable_disable_base.py +++ b/src/runconf_ui/widgets/enable_disable_base.py @@ -1,13 +1,14 @@ -from runconf_ui.utils.subsystem_status import SubsystemStatus +import logging -from textual.visual import SupportsVisual -from textual.widgets import Static, Button from textual.containers import ScrollableContainer from textual.message import Message +from textual.visual import SupportsVisual +from textual.widgets import Button, Static + from runconf_ui.runconf_ui_controllers.runconf_ui_state import ( ShifterInterfaceState, ) -import logging +from runconf_ui.utils.subsystem_status import SubsystemStatus class EnableDisablePanel(Static): diff --git a/src/runconf_ui/widgets/file_select_panel.py b/src/runconf_ui/widgets/file_select_panel.py index 1409d3e..a9ae08d 100644 --- a/src/runconf_ui/widgets/file_select_panel.py +++ b/src/runconf_ui/widgets/file_select_panel.py @@ -1,26 +1,26 @@ -from typing import Iterable, Any, List +import logging +import traceback +from collections.abc import Iterable +from pathlib import Path +from typing import Any + +from rich.console import ConsoleRenderable, RichCast +from textual import on +from textual.containers import Grid, ScrollableContainer from textual.message import Message from textual.visual import SupportsVisual -from textual.widgets import Button, Static, Select -from textual.containers import Grid, ScrollableContainer +from textual.widgets import Button, Select, Static from textual.widgets._select import NoSelection -from rich.console import ConsoleRenderable, RichCast -from textual import on - -from runconf_ui.exceptions import CiderInvalidRepoException from runconf_ui.configuration_manager_interfaces.local_daq_conf_manager import ( LocalDaqConfManager, ) from runconf_ui.configuration_manager_interfaces.remote_daq_conf_manger import ( RemoteDaqConfManager, ) +from runconf_ui.exceptions import CiderInvalidRepoException from runconf_ui.runconf_ui_controllers.runconf_ui_state import ShifterInterfaceState -from pathlib import Path -import logging -import traceback - class DAQSelectMenu(Select): def __init__( @@ -192,7 +192,7 @@ def update_version(self): def on_select_changed(self, event: Select.Changed) -> None: self.post_message(self.DAQConfigurationSelected(event.value)) - def set_options(self, options: List[str]): + def set_options(self, options: list[str]): options = [(str(Path(m).name), m) for m in options] super().set_options(options) diff --git a/src/runconf_ui/widgets/multicomponent_panel.py b/src/runconf_ui/widgets/multicomponent_panel.py index f783316..af57d9f 100644 --- a/src/runconf_ui/widgets/multicomponent_panel.py +++ b/src/runconf_ui/widgets/multicomponent_panel.py @@ -1,20 +1,19 @@ -from runconf_ui.widgets.enable_disable_base import EnableDisablePanel -from runconf_ui.runconf_ui_configuration.object_extractors.detector_extractor import ( - DetectorExtractor, -) -from runconf_ui.utils.subsystem_status import SubsystemStatus +import logging + +from textual.visual import SupportsVisual +from textual.widgets import Button from runconf_ui.daq_config_interfaces.daq_tree_tools.daq_conf_tree import ( ComponentLevelTree, ) +from runconf_ui.runconf_ui_configuration.object_extractors.detector_extractor import ( + DetectorExtractor, +) from runconf_ui.runconf_ui_controllers.runconf_ui_state import ( ShifterInterfaceState, ) - -from typing import Dict, Optional -from textual.visual import SupportsVisual -from textual.widgets import Button -import logging +from runconf_ui.utils.subsystem_status import SubsystemStatus +from runconf_ui.widgets.enable_disable_base import EnableDisablePanel class MultiComponentEnableDisablePanel(EnableDisablePanel): @@ -25,16 +24,16 @@ class MultiComponentEnableDisablePanel(EnableDisablePanel): def __init__( self, application_controller: ShifterInterfaceState, - object_list: Dict = {}, + object_list: dict = {}, build_tree: bool = True, content: str | SupportsVisual = "", *, expand: bool = False, shrink: bool = False, markup: bool = True, - name: Optional[str] = None, - id: Optional[str] = None, - classes: Optional[str] = None, + name: str | None = None, + id: str | None = None, + classes: str | None = None, disabled: bool = False, ) -> None: @@ -73,7 +72,7 @@ def __init__( logging.debug("MultiComponentEnableDisablePanel initialized.") - def generate_button_list(self) -> Dict | None: + def generate_button_list(self) -> dict | None: if ( self._application_controller.session_name is None or self._application_controller.buffer_daq_config is None diff --git a/src/runconf_ui/widgets/options_panel.py b/src/runconf_ui/widgets/options_panel.py index cd1e174..c9c0497 100644 --- a/src/runconf_ui/widgets/options_panel.py +++ b/src/runconf_ui/widgets/options_panel.py @@ -1,16 +1,16 @@ -from runconf_ui.screens.quit_screen import QuitScreen -from runconf_ui.screens.help_screen import HelpScreen -from runconf_ui.runconf_ui_controllers.runconf_ui_state import ( - ShifterInterfaceState, -) -from runconf_ui.screens.popup_manager import PopupManager +import logging from textual.containers import ScrollableContainer +from textual.message import Message from textual.visual import SupportsVisual from textual.widgets import Button, Static -from textual.message import Message -import logging +from runconf_ui.runconf_ui_controllers.runconf_ui_state import ( + ShifterInterfaceState, +) +from runconf_ui.screens.help_screen import HelpScreen +from runconf_ui.screens.popup_manager import PopupManager +from runconf_ui.screens.quit_screen import QuitScreen class OptionPanel(Static): @@ -71,7 +71,7 @@ def open_new_session( self.query_one("#create_button").disabled = disable_buttons self.query_one("#undo_changes_button").disabled = disable_buttons - def on_button_pressed(self, event: Button.Pressed): + def on_button_pressed(self, event: Button.Pressed)->None: if event.button.id == "help_button": self.app.push_screen(HelpScreen(classes="pop_up_screen")) elif event.button.id == "create_button": @@ -95,7 +95,7 @@ def on_button_pressed(self, event: Button.Pressed): timer=4.0, success=False, ) - + # Resets to base config provided elif event.button.id == "undo_changes_button": # Reset everything! @@ -108,4 +108,6 @@ def on_button_pressed(self, event: Button.Pressed): logging.debug("Quit button pressed") return self.app.action_quit() + return None + class ResetPressed(Message): ...