Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 25 additions & 1 deletion src/fmu/settings/_fmu_dir.py
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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__)
Expand Down Expand Up @@ -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."""
Expand Down
3 changes: 3 additions & 0 deletions src/fmu/settings/models/project_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""

Expand Down
19 changes: 19 additions & 0 deletions tests/test_fmu_dir.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"})
Expand Down