Source code for galaxy.tool_util.toolbox.views.interface

from abc import abstractmethod
from enum import Enum
from typing import Optional

from pydantic import (
    BaseModel,
    ConfigDict,
)

from ..panel import (
    HasPanelItems,
    panel_item_types,
    ToolPanelElements,
)


[docs]class ToolPanelViewModelType(str, Enum): default_type = "default" generic = "generic" activity = "activity" ontology = "ontology" publication = "publication" training = "training"
[docs]class ToolPanelViewModel(BaseModel): """A view of ToolPanelView objects serialized for the API.""" id: str model_class: str name: str description: Optional[str] = None view_type: ToolPanelViewModelType searchable: bool # Allow for more dynamic views that don't plug into fixed search indicies in the future... model_config = ConfigDict(protected_namespaces=())
[docs]class ToolBoxRegistry: """View of ToolBox provided to ToolPanelView to reason about tools loaded."""
[docs] @abstractmethod def has_tool(self, tool_id: str) -> bool: """Return bool indicating if tool with specified id is loaded."""
[docs] @abstractmethod def get_tool(self, tool_id: str): """Return tool with supplied tool id."""
[docs] @abstractmethod def get_workflow(self, id: str): """Return workflow from panel with supplied id."""
[docs] @abstractmethod def add_tool_to_tool_panel_view(self, tool, tool_panel_component: HasPanelItems) -> None: """Add tool to the tool panel view component (root or section)."""
[docs]class ToolPanelView:
[docs] @abstractmethod def apply_view(self, base_tool_panel: ToolPanelElements, toolbox_registry: ToolBoxRegistry) -> ToolPanelElements: """Consume tool panel state and return custom tool panel view."""
[docs] @abstractmethod def to_model(self) -> ToolPanelViewModel: """Convert abstract description to dictionary description to emit via the API."""
[docs]def walk_loaded_tools(tool_panel: ToolPanelElements, toolbox_registry: ToolBoxRegistry): for key, item_type, val in tool_panel.panel_items_iter(): if item_type == panel_item_types.TOOL: tool_id = key.replace("tool_", "", 1) if toolbox_registry.has_tool(tool_id): yield (tool_id, key, val, val.name) elif item_type == panel_item_types.SECTION: for section_key, section_item_type, section_val in val.panel_items_iter(): if section_item_type == panel_item_types.TOOL: tool_id = section_key.replace("tool_", "", 1) if toolbox_registry.has_tool(tool_id): yield (tool_id, key, section_val, val.name)