Source code for tisserande.models.nodes

"""Pydantic models for provenance graph nodes (data nodes and logic nodes)."""

from typing import Any, ClassVar, Literal
from uuid import UUID

from pydantic import BaseModel, ConfigDict, Field

from .types import NodeType


[docs] class NodeBase(BaseModel): """Base model for all graph nodes."""
[docs] type_: NodeType = Field(..., description="What type of node")
[docs] class NodeCreate(NodeBase): """Generic node creation model."""
[docs] path: str | None = Field(default=None, description="File path (for file nodes)")
[docs] config_data: dict[str, Any] | None = Field(default=None, description="Config data (for config dict nodes)")
[docs] value_float: float | None = Field(default=None, description="Float value (for parameter nodes)")
[docs] value_json: Any | None = Field(default=None, description="JSON-serializable value (for array/object nodes)")
[docs] arg_name: str | None = Field(default=None, description="Argument name in function signature")
[docs] data_file_type_name: str | None = None
[docs] data_file_type_id: int | None = None
[docs] config_file_type_name: str | None = None
[docs] config_file_type_id: int | None = None
[docs] config_dict_type_name: str | None = None
[docs] config_dict_type_id: int | None = None
[docs] parameter_name: str | None = None
[docs] parameter_id: int | None = None
[docs] array_name: str | None = None
[docs] array_id: int | None = None
[docs] class_name: str | None = None
[docs] class_id: int | None = None
[docs] python_function_name: str | None = None
[docs] python_function_id: int | None = None
[docs] member_function_name: str | None = None
[docs] member_function_id: int | None = None
[docs] shell_function_name: str | None = None
[docs] shell_function_id: int | None = None
[docs] class Node(NodeBase): """Node response model."""
[docs] model_config = ConfigDict(from_attributes=True)
[docs] col_names_for_table: ClassVar[list[str]] = ["id_", "type_", "arg_name", "execution_id"]
[docs] id_: UUID
[docs] execution_id: UUID | None = None
[docs] path: str | None = None
[docs] config_data: dict[str, Any] | None = None
[docs] value_float: float | None = None
[docs] value_json: Any | None = None
[docs] arg_name: str | None = None
[docs] data_file_type_id: int | None = None
[docs] config_file_type_id: int | None = None
[docs] config_dict_type_id: int | None = None
[docs] parameter_id: int | None = None
[docs] array_id: int | None = None
[docs] class_id: int | None = None
[docs] python_function_id: int | None = None
[docs] member_function_id: int | None = None
[docs] shell_function_id: int | None = None
# --- Typed node creation helpers ---
[docs] class DataFileNodeBase(NodeBase): """Model for a data file node."""
[docs] type_: Literal[NodeType.DATA_FILE] = NodeType.DATA_FILE
[docs] path: str = Field(..., description="Path to the data file")
[docs] class DataFileNodeCreate(DataFileNodeBase): """Fields used to create a DataFileNode."""
[docs] data_file_type_name: str | None = None
[docs] data_file_type_id: int | None = None
[docs] arg_name: str | None = None
[docs] class DataFileNode(DataFileNodeBase): """DataFileNode response model."""
[docs] model_config = ConfigDict(from_attributes=True)
[docs] col_names_for_table: ClassVar[list[str]] = ["id_", "type_", "path", "data_file_type_id"]
[docs] id_: UUID
[docs] data_file_type_id: int | None = None
[docs] execution_id: UUID | None = None
[docs] class ConfigFileNodeBase(NodeBase): """Model for a config file node."""
[docs] type_: Literal[NodeType.CONFIG_FILE] = NodeType.CONFIG_FILE
[docs] path: str = Field(..., description="Path to the config file")
[docs] class ConfigFileNodeCreate(ConfigFileNodeBase): """Fields used to create a ConfigFileNode."""
[docs] config_file_type_name: str | None = None
[docs] config_file_type_id: int | None = None
[docs] arg_name: str | None = None
[docs] class ConfigFileNode(ConfigFileNodeBase): """ConfigFileNode response model."""
[docs] model_config = ConfigDict(from_attributes=True)
[docs] col_names_for_table: ClassVar[list[str]] = ["id_", "type_", "path", "config_file_type_id"]
[docs] id_: UUID
[docs] config_file_type_id: int | None = None
[docs] execution_id: UUID | None = None
[docs] class ConfigDictNodeBase(NodeBase): """Model for a config dict node."""
[docs] type_: Literal[NodeType.CONFIG_DICT] = NodeType.CONFIG_DICT
[docs] config_data: dict[str, Any] = Field(..., description="Configuration data")
[docs] class ConfigDictNodeCreate(ConfigDictNodeBase): """Fields used to create a ConfigDictNode."""
[docs] config_dict_type_name: str | None = None
[docs] config_dict_type_id: int | None = None
[docs] arg_name: str | None = None
[docs] class ConfigDictNode(ConfigDictNodeBase): """ConfigDictNode response model."""
[docs] model_config = ConfigDict(from_attributes=True)
[docs] col_names_for_table: ClassVar[list[str]] = ["id_", "type_", "config_dict_type_id"]
[docs] id_: UUID
[docs] config_dict_type_id: int | None = None
[docs] execution_id: UUID | None = None
[docs] class ParameterNodeBase(NodeBase): """Model for a parameter node."""
[docs] type_: Literal[NodeType.PARAMETER] = NodeType.PARAMETER
[docs] value_float: float = Field(..., description="The parameter value")
[docs] class ParameterNodeCreate(ParameterNodeBase): """Fields used to create a ParameterNode."""
[docs] parameter_name: str | None = None
[docs] parameter_id: int | None = None
[docs] arg_name: str | None = None
[docs] class ParameterNode(ParameterNodeBase): """ParameterNode response model."""
[docs] model_config = ConfigDict(from_attributes=True)
[docs] col_names_for_table: ClassVar[list[str]] = ["id_", "type_", "value_float", "parameter_id"]
[docs] id_: UUID
[docs] parameter_id: int | None = None
[docs] execution_id: UUID | None = None
[docs] class ArrayNodeBase(NodeBase): """Model for an array node."""
[docs] type_: Literal[NodeType.ARRAY] = NodeType.ARRAY
[docs] value_json: list[float] | list[list[float]] = Field(..., description="The array data as nested lists")
[docs] class ArrayNodeCreate(ArrayNodeBase): """Fields used to create an ArrayNode."""
[docs] array_name: str | None = None
[docs] array_id: int | None = None
[docs] arg_name: str | None = None
[docs] class ArrayNode(ArrayNodeBase): """ArrayNode response model."""
[docs] model_config = ConfigDict(from_attributes=True)
[docs] col_names_for_table: ClassVar[list[str]] = ["id_", "type_", "array_id"]
[docs] id_: UUID
[docs] array_id: int | None = None
[docs] execution_id: UUID | None = None
[docs] class ObjectNodeBase(NodeBase): """Model for a python object node."""
[docs] type_: Literal[NodeType.OBJECT] = NodeType.OBJECT
[docs] value_json: Any = Field(default=None, description="JSON-serializable representation of the object")
[docs] class ObjectNodeCreate(ObjectNodeBase): """Fields used to create an ObjectNode."""
[docs] class_name: str | None = None
[docs] class_id: int | None = None
[docs] arg_name: str | None = None
[docs] class ObjectNode(ObjectNodeBase): """ObjectNode response model."""
[docs] model_config = ConfigDict(from_attributes=True)
[docs] col_names_for_table: ClassVar[list[str]] = ["id_", "type_", "class_id"]
[docs] id_: UUID
[docs] class_id: int | None = None
[docs] execution_id: UUID | None = None
[docs] class PythonFunctionNodeBase(NodeBase): """Model for a python function node."""
[docs] type_: Literal[NodeType.PYTHON_FUNCTION] = NodeType.PYTHON_FUNCTION
[docs] class PythonFunctionNodeCreate(PythonFunctionNodeBase): """Fields used to create a PythonFunctionNode."""
[docs] python_function_name: str | None = None
[docs] python_function_id: int | None = None
[docs] class PythonFunctionNode(PythonFunctionNodeBase): """PythonFunctionNode response model."""
[docs] model_config = ConfigDict(from_attributes=True)
[docs] col_names_for_table: ClassVar[list[str]] = ["id_", "type_", "python_function_id"]
[docs] id_: UUID
[docs] python_function_id: int | None = None
[docs] execution_id: UUID | None = None
[docs] class MemberFunctionNodeBase(NodeBase): """Model for a member function node."""
[docs] type_: Literal[NodeType.MEMBER_FUNCTION] = NodeType.MEMBER_FUNCTION
[docs] class MemberFunctionNodeCreate(MemberFunctionNodeBase): """Fields used to create a MemberFunctionNode."""
[docs] member_function_name: str | None = None
[docs] member_function_id: int | None = None
[docs] class MemberFunctionNode(MemberFunctionNodeBase): """MemberFunctionNode response model."""
[docs] model_config = ConfigDict(from_attributes=True)
[docs] col_names_for_table: ClassVar[list[str]] = ["id_", "type_", "member_function_id"]
[docs] id_: UUID
[docs] member_function_id: int | None = None
[docs] execution_id: UUID | None = None
[docs] class ShellFunctionNodeBase(NodeBase): """Model for a shell function node."""
[docs] type_: Literal[NodeType.SHELL_FUNCTION] = NodeType.SHELL_FUNCTION
[docs] class ShellFunctionNodeCreate(ShellFunctionNodeBase): """Fields used to create a ShellFunctionNode."""
[docs] shell_function_name: str | None = None
[docs] shell_function_id: int | None = None
[docs] class ShellFunctionNode(ShellFunctionNodeBase): """ShellFunctionNode response model."""
[docs] model_config = ConfigDict(from_attributes=True)
[docs] col_names_for_table: ClassVar[list[str]] = ["id_", "type_", "shell_function_id"]
[docs] id_: UUID
[docs] shell_function_id: int | None = None
[docs] execution_id: UUID | None = None