From 0247fbfe2d7421d2514bd1416607d9d281e0dae2 Mon Sep 17 00:00:00 2001 From: "Sode, Adedamola (DLSLtd,RAL,LSCI)" Date: Thu, 4 Jun 2026 08:55:18 +0000 Subject: [PATCH 1/5] Moved logging, and removed old supportyaml model; modified tests. --- src/techui_builder/__main__.py | 12 +++++++++++ src/techui_builder/main_app.py | 11 ---------- src/techui_builder/models.py | 29 +------------------------- src/techui_builder/schema_generator.py | 4 ++-- tests/test_cli.py | 2 +- tests/test_models.py | 29 ++++++++++---------------- 6 files changed, 27 insertions(+), 60 deletions(-) diff --git a/src/techui_builder/__main__.py b/src/techui_builder/__main__.py index 980e57cd..1a721e9f 100644 --- a/src/techui_builder/__main__.py +++ b/src/techui_builder/__main__.py @@ -1,9 +1,11 @@ """Interface for ``python -m techui_builder``.""" import logging +from typing import Annotated import typer +from techui_builder._logger import log_level from techui_builder._version import __version__ from techui_builder.generate_jsonmap import app as generate_jsonmap_app from techui_builder.main_app import app as main_app @@ -54,6 +56,16 @@ def _( is_eager=True, help="Show version of techui-builder and exit", ), + loglevel: Annotated[ + str, + typer.Option( + "--log-level", + "-l", + help="Set log level to INFO, DEBUG, WARNING, ERROR or CRITICAL", + case_sensitive=False, + callback=log_level, + ), + ] = "INFO", ): """Boilerplate callback function to allow for --version CLI option""" pass diff --git a/src/techui_builder/main_app.py b/src/techui_builder/main_app.py index 8cd6f06f..319782d6 100644 --- a/src/techui_builder/main_app.py +++ b/src/techui_builder/main_app.py @@ -4,7 +4,6 @@ import typer -from techui_builder._logger import log_level from techui_builder.autofill import Autofiller from techui_builder.builder import Builder @@ -76,16 +75,6 @@ def main( Path | None, typer.Argument(help="Override for template bob file location."), ] = None, - loglevel: Annotated[ - str, - typer.Option( - "--log-level", - "-l", - help="Set log level to INFO, DEBUG, WARNING, ERROR or CRITICAL", - case_sensitive=False, - callback=log_level, - ), - ] = "INFO", ) -> None: """Default function called from cmd line tool.""" diff --git a/src/techui_builder/models.py b/src/techui_builder/models.py index 20130b4e..53e5c3b8 100644 --- a/src/techui_builder/models.py +++ b/src/techui_builder/models.py @@ -1,13 +1,11 @@ import logging import re -from typing import Annotated, Any, Literal +from typing import Annotated, Any from pydantic import ( BaseModel, ConfigDict, Field, - RootModel, - StringConstraints, computed_field, field_validator, model_validator, @@ -235,31 +233,6 @@ class TechUi(BaseModel): techui-support mapping models """ -BobPath = Annotated[ - str, StringConstraints(pattern=r"^(?:[A-Za-z0-9_.-]+/)*[A-Za-z0-9_.-]+\.bob$") -] -# Must contain at least one $(NAME) macro -MacroString = Annotated[ - str, - StringConstraints(pattern=r"^[A-Za-z0-9_:\-./\s\$\(\)]+$"), -] -ScreenType = Literal["embedded", "related"] - - -class GuiComponentEntry(BaseModel): - file: BobPath - prefix: MacroString - suffix: MacroString | None = None - type: ScreenType - model_config = ConfigDict(extra="forbid") - - -GuiComponentUnion = list[GuiComponentEntry] | GuiComponentEntry - - -class GuiComponents(RootModel[dict[str, GuiComponentUnion]]): - pass - class Entity(BaseModel): """One table of IOC variables extracted from an ioc.yaml file""" diff --git a/src/techui_builder/schema_generator.py b/src/techui_builder/schema_generator.py index 303e0a0f..0bcb7e59 100644 --- a/src/techui_builder/schema_generator.py +++ b/src/techui_builder/schema_generator.py @@ -4,8 +4,8 @@ import typer from techui_builder.models import ( - GuiComponents, TechUi, + TechUiSupport, ) SCHEMAS_DIR = Path("schemas") @@ -31,5 +31,5 @@ def schema_generator() -> None: write_json_schema("techui", tu) # ibek_mapping - tu_support = GuiComponents.model_json_schema() + tu_support = TechUiSupport.model_json_schema() write_json_schema("techui.support", tu_support) diff --git a/tests/test_cli.py b/tests/test_cli.py index 526ce775..75d020e2 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -7,6 +7,7 @@ from typer.testing import CliRunner from techui_builder.__main__ import app +from techui_builder._logger import log_level from techui_builder.generate_jsonmap import app as generate_jsonmap_app # from techui_builder.main_app import app as main_app @@ -14,7 +15,6 @@ default_bobfile, find_bob, find_dirs, - log_level, main, ) from techui_builder.schema_generator import app as schema_app diff --git a/tests/test_models.py b/tests/test_models.py index a31d73ff..bf495104 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -3,8 +3,7 @@ from techui_builder.models import ( Beamline, Component, - GuiComponentEntry, - GuiComponents, + SupportEntity, ) @@ -29,9 +28,11 @@ def component() -> Component: @pytest.fixture -def gui_components() -> GuiComponentEntry: - return GuiComponentEntry( - file="digitelMpc/digitelMpcIonp.bob", prefix="$(P)", type="embedded" +def support_entity() -> SupportEntity: + return SupportEntity( + prefix="{{ P }}", + macros=["P"], + screens=[{"file": "digitelMpc/digitelMpcIonp.bob", "type": "embedded"}], ) @@ -67,16 +68,8 @@ def test_component_bad_prefix(): Component(prefix="Test 2", label="BAD_PREFIX") -def test_gui_component_entry(gui_components: GuiComponentEntry): - assert gui_components.file == "digitelMpc/digitelMpcIonp.bob" - assert gui_components.prefix == "$(P)" - assert gui_components.type == "embedded" - - -def test_gui_components_object(gui_components: GuiComponentEntry): - gc = GuiComponents({"digitelMpc.digitelMpcIonp": [gui_components]}) - entry = gc.root["digitelMpc.digitelMpcIonp"][0] # type: ignore - assert entry.file == "digitelMpc/digitelMpcIonp.bob" - - assert entry.prefix == "$(P)" - assert entry.type == "embedded" +def test_gui_component_entry(support_entity: SupportEntity): + assert support_entity.prefix == "{{ P }}" + assert support_entity.macros == ["P"] + assert support_entity.screens[0]["file"] == "digitelMpc/digitelMpcIonp.bob" + assert support_entity.screens[0]["type"] == "embedded" From f5558518518e59a432ce557a8bbeb48218cda8db Mon Sep 17 00:00:00 2001 From: "Sode, Adedamola (DLSLtd,RAL,LSCI)" Date: Thu, 4 Jun 2026 12:25:44 +0000 Subject: [PATCH 2/5] Made recommended changes --- src/techui_builder/generate_jsonmap.py | 15 --------------- src/techui_builder/status.py | 2 +- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/src/techui_builder/generate_jsonmap.py b/src/techui_builder/generate_jsonmap.py index 65ca1ea4..5bff961b 100644 --- a/src/techui_builder/generate_jsonmap.py +++ b/src/techui_builder/generate_jsonmap.py @@ -10,16 +10,11 @@ from lxml import etree, objectify from lxml.objectify import ObjectifiedElement -from techui_builder._logger import Logger from techui_builder.models import TechUi logger_ = logging.getLogger(__name__) -def log_level(level: str): - Logger(level) - - app = typer.Typer( pretty_exceptions_show_locals=False, context_settings={"allow_interspersed_args": True}, @@ -474,16 +469,6 @@ def generate_jsonmap( Path, typer.Argument(help="Top level bobfile to generate json mapping from."), ], - loglevel: Annotated[ - str, - typer.Option( - "--log-level", - "-l", - help="Set log level to INFO, DEBUG, WARNING, ERROR or CRITICAL", - case_sensitive=False, - callback=log_level, - ), - ] = "INFO", ) -> None: """Default function called from cmd line tool.""" jg = JsonMapGenerator(bob_path=bob_path) diff --git a/src/techui_builder/status.py b/src/techui_builder/status.py index a8f186fa..1526f539 100644 --- a/src/techui_builder/status.py +++ b/src/techui_builder/status.py @@ -15,7 +15,7 @@ app = typer.Typer( help=""" - A script for generating status PVs for a techui.yaml file. + Generate status PVs for a techui.yaml file. """, context_settings={"allow_interspersed_args": True}, ) From c59a23a220e03c78df026a7622ee48cc38d7754b Mon Sep 17 00:00:00 2001 From: "Sode, Adedamola (DLSLtd,RAL,LSCI)" Date: Thu, 4 Jun 2026 12:29:19 +0000 Subject: [PATCH 3/5] fixed tests --- tests/test_generate_jsonmap.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tests/test_generate_jsonmap.py b/tests/test_generate_jsonmap.py index 31099c34..36cc1294 100644 --- a/tests/test_generate_jsonmap.py +++ b/tests/test_generate_jsonmap.py @@ -13,18 +13,11 @@ _get_nav_tabs, # type: ignore _serialise_json_map, app, - log_level, ) runner = CliRunner() -@patch("techui_builder.generate_jsonmap.Logger") -def test_log_level(mock_logger): - log_level("INFO") - mock_logger.assert_called_once() - - def test_write_json_map_no_synoptic(json_map_generator): with pytest.raises(FileNotFoundError): json_map_generator.bob_path = Path("Synoptic") From 3591e7e214c89e2d7e380344afca4cf78f62ec71 Mon Sep 17 00:00:00 2001 From: adedamola-sode <159266178+adedamola-sode@users.noreply.github.com> Date: Thu, 4 Jun 2026 16:52:25 +0100 Subject: [PATCH 4/5] Update src/techui_builder/__main__.py updated docstring Co-authored-by: Ollie Copping --- src/techui_builder/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/techui_builder/__main__.py b/src/techui_builder/__main__.py index 1a721e9f..51753d6c 100644 --- a/src/techui_builder/__main__.py +++ b/src/techui_builder/__main__.py @@ -67,7 +67,7 @@ def _( ), ] = "INFO", ): - """Boilerplate callback function to allow for --version CLI option""" + """Boilerplate callback function to allow for --version and global --log-level CLI options""" pass From 9eed13e215dc21e539c32a44bad7cbb091f54a20 Mon Sep 17 00:00:00 2001 From: "Sode, Adedamola (DLSLtd,RAL,LSCI)" Date: Thu, 4 Jun 2026 15:57:08 +0000 Subject: [PATCH 5/5] fixed linting --- src/techui_builder/__main__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/techui_builder/__main__.py b/src/techui_builder/__main__.py index 51753d6c..52fbc057 100644 --- a/src/techui_builder/__main__.py +++ b/src/techui_builder/__main__.py @@ -67,7 +67,10 @@ def _( ), ] = "INFO", ): - """Boilerplate callback function to allow for --version and global --log-level CLI options""" + """ + Boilerplate callback function to allow for --version + and global --log-level CLI options + """ pass