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",
)