lazy toolbox: honor exact version requests in the short-id fallback

This commit is contained in:
mvdbeek
2026-07-28 17:27:47 +02:00
parent 8c3d327dec
commit 57dfeaf9f8
2 changed files with 24 additions and 2 deletions
+7 -2
View File
@@ -1106,8 +1106,13 @@ class LazyToolBox(ToolBox):
candidates: list[tuple[tuple[int, Any], Tool]] = []
for guid in sorted(self._shed_short_id_to_guids[tool_id]):
loaded = self._load_tool_on_demand(guid, tool_version)
if loaded is None and tool_version:
# Unknown version on this guid — try its default.
if loaded is None and tool_version and not exact:
# Unknown version on this guid — try its default. Honor
# ``exact``: like the guid path above and eager
# ``AbstractToolBox.get_tool`` (``elif exact: continue``),
# a specific-version request must not substitute another
# version, so skip this candidate when exact and the
# requested version isn't available.
default_entry = self._tool_index.entries.get(guid)
if default_entry is not None:
loaded = self._load_tool_on_demand(guid, default_entry.version or None)
+17
View File
@@ -638,3 +638,20 @@ def test_guid_sibling_versions_reset_on_in_place_removal():
assert set(box._index_versions_for(f"{prefix}/0.20.1")) == {"0.20.1", "0.23.2"}
box._remove_tool_in_memory(f"{prefix}/0.23.2")
assert box._index_versions_for(f"{prefix}/0.20.1") == ["0.20.1"]
def test_get_tool_short_id_missing_version_honors_exact():
box = _registry_box()
guid = "toolshed.example.com/repos/owner/repo/cat/1.0"
box._tool_index.add_entry(_entry(id=guid, version="1.0"))
box._shed_short_id_to_guids = {"cat": {guid}}
default_tool = _stub(_entry(id=guid, version="1.0"))
def load(tool_id, tool_version=None):
if tool_id == guid and tool_version in (None, "1.0"):
return default_tool
return None
box._load_tool_on_demand = load
assert box.get_tool("cat", tool_version="9.9", exact=True) is None
assert box.get_tool("cat", tool_version="9.9", exact=False) is default_tool