From 3190c58b044e3477561db398a8dafed0a7d00b2b Mon Sep 17 00:00:00 2001 From: Muhammad Gibran Alfarizi Date: Thu, 6 Aug 2026 10:28:28 +0200 Subject: [PATCH] ENH: Add `update_validation_metadata()` to `ProjectFMUDirectory` --- src/fmu/settings/_fmu_dir.py | 26 ++++++++++++++++++++++- src/fmu/settings/models/project_config.py | 3 +++ tests/test_fmu_dir.py | 19 +++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/fmu/settings/_fmu_dir.py b/src/fmu/settings/_fmu_dir.py index a45c20f..6b1dc40 100644 --- a/src/fmu/settings/_fmu_dir.py +++ b/src/fmu/settings/_fmu_dir.py @@ -1,6 +1,8 @@ """Main interface for working with .fmu directory.""" +import getpass from collections.abc import Mapping +from datetime import UTC, datetime from pathlib import Path from typing import TYPE_CHECKING, Any, Final, Self, TypeAlias, cast @@ -19,7 +21,11 @@ from ._resources.lock_manager import DEFAULT_LOCK_TIMEOUT, LockManager from ._utils import path_exists, path_is_dir, path_is_file from .models._enums import CacheResource -from .models.project_config import ProjectConfig +from .models.project_config import ( + ProjectConfig, + ValidationRecord, + ValidationSource, +) from .models.user_config import UserConfig logger: Final = null_logger(__name__) @@ -341,6 +347,24 @@ def __init__( f"Using default value '{CacheManager.MIN_REVISIONS}'. Error: {e}" ) + def update_validation_metadata( + self: Self, + validation_source: ValidationSource, + ) -> None: + """Record successful validation of project configuration data. + + Args: + validation_source: Configuration data checked by the validation. + """ + record = ValidationRecord( + last_validated_at=datetime.now(UTC), + last_validated_by=getpass.getuser(), + ) + self.set_config_value( + f"validation.{validation_source}", + record.model_dump(), + ) + @property def changelog(self: Self) -> ChangelogManager: """Access the ChangelogManager.""" diff --git a/src/fmu/settings/models/project_config.py b/src/fmu/settings/models/project_config.py index 8c12380..62f4332 100644 --- a/src/fmu/settings/models/project_config.py +++ b/src/fmu/settings/models/project_config.py @@ -84,6 +84,9 @@ class ValidationRecord(BaseModel): """User who performed the last validation.""" +ValidationSource = Literal["masterdata_smda", "rms_project"] + + class ProjectValidation(BaseModel): """Validation metadata for project configuration data.""" diff --git a/tests/test_fmu_dir.py b/tests/test_fmu_dir.py index 225ebb5..85a132f 100644 --- a/tests/test_fmu_dir.py +++ b/tests/test_fmu_dir.py @@ -355,6 +355,25 @@ def test_set_config_value(fmu_dir: ProjectFMUDirectory) -> None: assert fmu_dir.config.load().version == "200.0.0" +def test_update_validation_metadata( + fmu_dir: ProjectFMUDirectory, + monkeypatch: pytest.MonkeyPatch, +) -> None: + """Tests update_validation_metadata stores a validation record.""" + monkeypatch.setattr( + "fmu.settings._fmu_dir.getpass.getuser", + lambda: "test-user", + ) + + fmu_dir.update_validation_metadata("rms_project") + + record = fmu_dir.config.load().validation.rms_project + assert record is not None + assert record.last_validated_at.tzinfo is not None + assert record.last_validated_at.utcoffset() is not None + assert record.last_validated_by == "test-user" + + def test_update_config(fmu_dir: ProjectFMUDirectory) -> None: """Tests update_config updates and saves the config for multiple values.""" updated_config = fmu_dir.update_config({"version": "2.0.0", "created_by": "user2"})