Warning
This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
Source code for galaxy.tool_util.toolbox.lineages.interface
import threading
from typing import (
    Any,
    Dict,
    List,
)
import packaging.version
from sortedcontainers import SortedSet
from galaxy.util.tool_version import remove_version_from_guid
[docs]class ToolLineageVersion:
    """Represents a single tool in a lineage. If lineage is based
    around GUIDs that somehow encode the version (either using GUID
    or a simple tool id and a version)."""
    @property
    def id_based(self):
        """Return True if the lineage is defined by GUIDs (in this
        case the indexer of the tools (i.e. the ToolBox) should ignore
        the tool_version (because it is encoded in the GUID and managed
        externally).
        """
        return self.version is None
[docs]class ToolLineage:
    """Simple tool's loaded directly from file system with lineage
    determined solely by PEP 440 versioning scheme.
    """
    lineages_by_id: Dict[str, "ToolLineage"] = {}
    lock = threading.Lock()
[docs]    def __init__(self, tool_id, **kwds):
        self.tool_id = tool_id
        self.tool_versions = SortedSet(key=packaging.version.parse)
    @property
    def tool_ids(self) -> List[str]:
        versionless_tool_id = remove_version_from_guid(self.tool_id)
        tool_id = versionless_tool_id or self.tool_id
        return [f"{tool_id}/{version}" for version in self.tool_versions]
[docs]    @staticmethod
    def from_tool(tool) -> "ToolLineage":
        tool_id = tool.id
        lineages_by_id = ToolLineage.lineages_by_id
        with ToolLineage.lock:
            if tool_id not in lineages_by_id:
                lineages_by_id[tool_id] = ToolLineage(tool_id)
        lineage = lineages_by_id[tool_id]
        lineage.register_version(tool.version)
        return lineage
[docs]    def register_version(self, tool_version) -> None:
        assert tool_version is not None
        self.tool_versions.add(str(tool_version))
[docs]    def get_versions(self):
        """
        Return an ordered list of lineages (ToolLineageVersion) in this
        chain, from oldest to newest.
        """
        return [
            ToolLineageVersion(tool_id, tool_version)
            for tool_id, tool_version in zip(self.tool_ids, self.tool_versions)
        ]
[docs]    def get_version_ids(self, reverse=False) -> List[str]:
        if reverse:
            return list(reversed(self.tool_ids))
        return self.tool_ids
[docs]    def to_dict(self) -> Dict[str, Any]:
        return dict(
            tool_id=self.tool_id,
            tool_versions=list(self.tool_versions),
            lineage_type="stock",
        )