Add /interop endpoint to Tool Shed tools API.

Mirror Galaxy's /api/tools/{id}/versions/{v}/interop on the Tool Shed so
galaxy-tool-cache can fetch a tool's parsed model from either service with
the same URL shape. Returns ShedParsedTool, same as the bare versioned path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
John Chilton
2026-07-11 13:14:59 -04:00
co-authored by Claude Opus 4.8
parent 8197b61f57
commit 29b35f99be
2 changed files with 27 additions and 0 deletions
@@ -70,6 +70,20 @@ class TestShedToolsApi(ShedApiTestCase):
tool_response = self.api_interactor.get(url)
tool_response.raise_for_status()
def test_tool_interop(self):
populator = self.populator
repository = populator.setup_column_maker_repo(prefix="toolinterop")
tool_id = populator.tool_guid(self, repository, "Add_a_column1")
tool_shed_base, encoded_tool_id = encode_identifier(tool_id)
url = f"tools/{encoded_tool_id}/versions/1.1.0/interop"
tool_response = self.api_interactor.get(url)
tool_response.raise_for_status()
parsed = tool_response.json()
assert parsed["id"] == "Add_a_column1"
assert parsed["version"] == "1.1.0"
assert "inputs" in parsed
assert "outputs" in parsed
def test_tool_source(self):
populator = self.populator
repository = populator.setup_column_maker_repo(prefix="toolsource")
+13
View File
@@ -155,6 +155,19 @@ class FastAPITools:
) -> ShedParsedTool:
return parsed_tool_model_cached_for(trans, tool_id, tool_version)
@router.get(
"/api/tools/{tool_id}/versions/{tool_version}/interop",
operation_id="tools__interop",
summary="Return Galaxy's meta model description of the tool's metadata, inputs, and outputs.",
)
def interop(
self,
trans: SessionRequestContext = DependsOnTrans,
tool_id: str = TOOL_ID_PATH_PARAM,
tool_version: str = TOOL_VERSION_PATH_PARAM,
) -> ShedParsedTool:
return parsed_tool_model_cached_for(trans, tool_id, tool_version)
@router.get(
"/api/tools/{tool_id}/versions/{tool_version}/parameter_request_schema",
operation_id="tools__parameter_request_schema",