From 9d40fd7acff149a50be5ad08c2af91e565c959a3 Mon Sep 17 00:00:00 2001 From: benjamink Date: Wed, 26 Feb 2025 11:21:55 -0800 Subject: [PATCH 1/3] Add version validation and write_default method to update version in defaul ui.json files --- simpeg_drivers/uijson.py | 51 +++++++++++++++++++++++++++++++++ tests/uijson_test.py | 62 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 simpeg_drivers/uijson.py create mode 100644 tests/uijson_test.py diff --git a/simpeg_drivers/uijson.py b/simpeg_drivers/uijson.py new file mode 100644 index 00000000..a8a577f8 --- /dev/null +++ b/simpeg_drivers/uijson.py @@ -0,0 +1,51 @@ +# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +# Copyright (c) 2025 Mira Geoscience Ltd. ' +# ' +# This file is part of simpeg-drivers package. ' +# ' +# simpeg-drivers is distributed under the terms and conditions of the MIT License ' +# (see LICENSE file at the root of this source code package). ' +# ' +# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +import json +import logging + +from geoh5py.ui_json.ui_json import BaseUIJson +from pydantic import field_validator + +import simpeg_drivers + + +logger = logging.getLogger(__name__) + + +class CoreUIJson(BaseUIJson): + version: str = simpeg_drivers.__version__ + + @field_validator("version", mode="before") + @classmethod + def verify_and_update_version(cls, value: str) -> str: + version = simpeg_drivers.__version__ + if value != version: + logger.warning( + "Provided ui.json file version %s does not match the the current" + "simpeg-drivers version %s. This may lead to unpredictable" + "behavior.", + value, + version, + ) + return value + + @classmethod + def write_default(cls): + """Write the default UIJson file to disk with updated version.""" + + with open(cls.default_ui_json, encoding="utf-8") as file: + data = json.load(file) + data["version"] = simpeg_drivers.__version__ + + uijson = cls.model_construct(**data) + data = uijson.model_dump_json(indent=4) + with open(cls.default_ui_json, "w", encoding="utf-8") as file: + file.write(data) diff --git a/tests/uijson_test.py b/tests/uijson_test.py new file mode 100644 index 00000000..7de09a43 --- /dev/null +++ b/tests/uijson_test.py @@ -0,0 +1,62 @@ +# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' +# Copyright (c) 2025 Mira Geoscience Ltd. ' +# ' +# This file is part of simpeg-drivers package. ' +# ' +# simpeg-drivers is distributed under the terms and conditions of the MIT License ' +# (see LICENSE file at the root of this source code package). ' +# ' +# ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +import json +import logging +from pathlib import Path +from typing import ClassVar + +from geoh5py import Workspace + +from simpeg_drivers.uijson import CoreUIJson + + +logger = logging.getLogger(__name__) + + +def test_version_warning(tmp_path, caplog): + workspace = Workspace(tmp_path / "test.geoh5") + + with caplog.at_level(logging.WARNING): + _ = CoreUIJson( + version="0.2.0", + title="My app", + geoh5=str(workspace.h5file), + run_command="myapp.driver", + monitoring_directory="", + conda_environment="my-app", + workspace_geoh5="", + ) + + +def test_write_default(tmp_path): + default_path = tmp_path / "default.ui.json" + data = { + "version": "0.1.0", + "title": "My app", + "geoh5": "", + "run_command": "myapp.driver", + "monitoring_directory": "", + "conda_environment": "my-app", + "workspace_geoh5": "", + } + with open(default_path, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=4) + + class MyUIJson(CoreUIJson): + default_ui_json: ClassVar[Path] = default_path + version: str = "0.2.0" + + MyUIJson.write_default() + + with open(default_path, encoding="utf-8") as f: + data = json.load(f) + + assert data["version"] == "0.3.0-alpha.1" From f791443764a1b80bf770581590ea0831a65fe1b6 Mon Sep 17 00:00:00 2001 From: benk-mira <81254271+benk-mira@users.noreply.github.com> Date: Fri, 28 Feb 2025 10:50:21 -0800 Subject: [PATCH 2/3] Update tests/uijson_test.py Co-authored-by: domfournier --- tests/uijson_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/uijson_test.py b/tests/uijson_test.py index 7de09a43..ef5f7a3a 100644 --- a/tests/uijson_test.py +++ b/tests/uijson_test.py @@ -59,4 +59,4 @@ class MyUIJson(CoreUIJson): with open(default_path, encoding="utf-8") as f: data = json.load(f) - assert data["version"] == "0.3.0-alpha.1" + assert data["version"] == simpeg_drivers.__version__ From ebd32b9df97fc5c423019fdcb61e2ba7e7f78f38 Mon Sep 17 00:00:00 2001 From: benjamink Date: Fri, 28 Feb 2025 11:03:05 -0800 Subject: [PATCH 3/3] need to import simpeg-drivers --- tests/uijson_test.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/uijson_test.py b/tests/uijson_test.py index ef5f7a3a..5be5f385 100644 --- a/tests/uijson_test.py +++ b/tests/uijson_test.py @@ -15,6 +15,7 @@ from geoh5py import Workspace +import simpeg_drivers from simpeg_drivers.uijson import CoreUIJson