SXXXXXXX_ProjectUtility/projectutility/core/registry_models.py
2025-12-01 08:29:48 +01:00

85 lines
4.1 KiB
Python

# projectutility/core/registry_models.py
import dataclasses
from typing import List, Optional, Dict, Any
# Use frozen=True?
# If these entries are intended to be immutable after loading,
# frozen=True provides that guarantee. However, if you need to
# modify them in memory (e.g., in the ConfigWindow before saving),
# you'd need frozen=False (the default).
# Let's keep it mutable for now, as ConfigWindow modifies it.
# Consider frozen=True if you always create new objects on modification.
@dataclasses.dataclass
class ToolRegistryEntry:
"""
Represents a single tool entry definition as stored in the
'tools_registry.json' file.
This dataclass defines the expected structure and types for each
tool configured in the registry.
"""
# --- Core Required Fields ---
id: str # Unique identifier for the tool (e.g., "icon_generator_git")
display_name: str # User-friendly name shown in the GUI list
type: str # Type of the tool ('git', 'local', potentially others later)
run_command: List[str] # Base command and arguments to execute the tool
has_gui: bool # Does this tool have its own graphical interface?
# --- Optional Core Fields ---
enabled: bool = (
True # Is the tool currently enabled and discoverable? Defaults to True.
)
description: Optional[str] = None # Optional description shown in the GUI
version: Optional[str] = None # Optional version string of the tool itself
# --- Git Specific Fields (only relevant if type == 'git') ---
git_url: Optional[str] = None # URL of the Git repository to clone/update
git_ref: str = (
"main" # Default branch, tag, or commit reference to use. Defaults to 'main'.
)
local_dir_name: Optional[str] = (
None # Optional custom name for the local directory in 'managed_tools'. Defaults to 'id' if None.
)
# --- Submodule support ---
auto_update_submodules: bool = False # If true, attempt to init/update submodules automatically
submodules: Optional[List[Dict[str, Any]]] = None
# --- Parameter Definition Source ---
# For type='local', this can be an inline list of parameter dicts.
# For type='git', this can be a file path relative to the repo root.
# For type='local' without inline params, set to None or omit.
parameters: Optional[List[Dict[str, Any]]] = (
None # Inline parameter definitions (primarily for 'local' type)
)
parameters_definition_file: Optional[str] = (
None # Relative path to a JSON file defining parameters (primarily for 'git' type)
)
# --- Post-Init Validation (Optional) ---
# Uncomment and implement if you need complex validation after initialization.
# def __post_init__(self):
# """Performs validation after the object is created."""
# errors = []
# if self.type == 'git' and not self.git_url:
# errors.append(f"Tool '{self.id}': 'git_url' is required for type 'git'.")
# if not self.run_command:
# errors.append(f"Tool '{self.id}': 'run_command' cannot be empty.")
# # Add more validation rules here if needed
# # Example: Check parameter definition source consistency
# if self.parameters and self.parameters_definition_file:
# errors.append(f"Tool '{self.id}': Cannot define both inline 'parameters' and 'parameters_definition_file'. Choose one.")
# if self.type == 'local' and self.parameters_definition_file:
# errors.append(f"Tool '{self.id}': 'parameters_definition_file' is typically used for 'git' type tools, not 'local'.")
# if self.type == 'git' and self.parameters:
# errors.append(f"Tool '{self.id}': Inline 'parameters' are typically used for 'local' type tools. Use 'parameters_definition_file' for 'git'.")
# if errors:
# # Raise a single error summarizing all issues
# raise ValueError(f"Validation failed for ToolRegistryEntry '{self.id}':\n - " + "\n - ".join(errors))
# logger = logging.getLogger(__name__) # Requires logging import
# logger.debug(f"ToolRegistryEntry created for ID: {self.id}")