Source code for alab_management.experiment_view.experiment
"""Define the format of experiment request."""
from typing import Any
from bson import BSON, ObjectId  # type: ignore
from pydantic import (
    BaseModel,
    Field,
    field_validator,
)
class _Sample(BaseModel):
    name: str = Field(pattern=r"^[^$.]+$")
    sample_id: str | None = None
    tags: list[str]
    metadata: dict[str, Any]
    @field_validator("sample_id")
    def if_provided_must_be_valid_objectid(cls, v):
        if v is None:
            return  # management will autogenerate a valid objectid
        try:
            return str(ObjectId(v))
        except Exception as exc:
            raise ValueError(
                "An experiment received over the API contained a sample with an invalid sample_id. The sample_id was "
                f"set to {v}, which is not a valid ObjectId."
            ) from exc
    @field_validator("metadata")
    def must_be_bsonable(cls, v):
        """If v is not None, we must confirm that it can be encoded to BSON."""
        try:
            BSON.encode(v)
            return v
        except Exception as exc:
            raise ValueError(
                "An experiment received over the API contained a sample with invalid metadata. The metadata was set "
                f"to {v}, which is not BSON-serializable."
            ) from exc
class _Task(BaseModel):
    type: str
    parameters: dict[str, Any]
    prev_tasks: list[int]
    samples: list[str]
    task_id: str | None = None
    @field_validator("task_id")
    def if_provided_must_be_valid_objectid(cls, v):
        if v is None:
            return  # management will autogenerate a valid objectid
        try:
            return str(ObjectId(v))
        except Exception as exc:
            raise ValueError(
                "An experiment received over the API contained a task with an invalid task_id. The task_id was set to "
                f"{v}, which is not a valid ObjectId."
            ) from exc
    @field_validator("parameters")
    def must_be_bsonable(cls, v):
        """If v is not None, we must confirm that it can be encoded to BSON."""
        try:
            BSON.encode(v)
            return v
        except Exception as exc:
            raise ValueError(
                "An experiment received over the API contained a task with invalid parameters. The parameters was set "
                f"to {v}, which is not BSON-serializable."
            ) from exc