22import tempfile
33from collections import namedtuple
44from typing import (
5+ Dict ,
56 List ,
67 Optional ,
78 Tuple ,
2728 get_tool_source ,
2829 ToolSource ,
2930)
31+ from galaxy .tools .stock import stock_tool_sources
3032from tool_shed .context import (
3133 ProvidesRepositoriesContext ,
3234 SessionRequestContext ,
3638from tool_shed .webapp .search .tool_search import ToolSearch
3739from .trs import trs_tool_id_to_repository_metadata
3840
41+ STOCK_TOOL_SOURCES : Optional [Dict [str , Dict [str , ToolSource ]]] = None
42+
3943
4044def search (trans : SessionRequestContext , q : str , page : int = 1 , page_size : int = 10 ) -> dict :
4145 """
@@ -114,6 +118,18 @@ def tool_input_models_for(
114118
115119def tool_source_for (
116120 trans : ProvidesRepositoriesContext , trs_tool_id : str , tool_version : str , repository_clone_url : Optional [str ] = None
121+ ) -> ToolSource :
122+ if "~" in trs_tool_id :
123+ return _shed_tool_source_for (trans , trs_tool_id , tool_version , repository_clone_url )
124+ else :
125+ tool_source = _stock_tool_source_for (trs_tool_id , tool_version )
126+ if tool_source is None :
127+ raise ObjectNotFound ()
128+ return tool_source
129+
130+
131+ def _shed_tool_source_for (
132+ trans : ProvidesRepositoriesContext , trs_tool_id : str , tool_version : str , repository_clone_url : Optional [str ] = None
117133) -> ToolSource :
118134 rval = get_repository_metadata_tool_dict (trans , trs_tool_id , tool_version )
119135 repository_metadata , tool_version_metadata = rval
@@ -133,3 +149,24 @@ def tool_source_for(
133149 return tool_source
134150 finally :
135151 remove_dir (work_dir )
152+
153+
154+ def _stock_tool_source_for (tool_id : str , tool_version : str ) -> Optional [ToolSource ]:
155+ _init_stock_tool_sources ()
156+ assert STOCK_TOOL_SOURCES
157+ tool_version_sources = STOCK_TOOL_SOURCES .get (tool_id )
158+ if tool_version_sources is None :
159+ return None
160+ return tool_version_sources .get (tool_version )
161+
162+
163+ def _init_stock_tool_sources () -> None :
164+ global STOCK_TOOL_SOURCES
165+ if STOCK_TOOL_SOURCES is None :
166+ STOCK_TOOL_SOURCES = {}
167+ for tool_source in stock_tool_sources ():
168+ tool_id = tool_source .parse_id ()
169+ tool_version = tool_source .parse_version ()
170+ if tool_id not in STOCK_TOOL_SOURCES :
171+ STOCK_TOOL_SOURCES [tool_id ] = {}
172+ STOCK_TOOL_SOURCES [tool_id ][tool_version ] = tool_source
0 commit comments