Loading lib/galaxy/tool_util/verify/interactor.py +61 −26 Original line number Diff line number Diff line Loading @@ -138,6 +138,12 @@ ToolTestDict = Union[ValidToolTestDict, InvalidToolTestDict] ToolTestDictsT = List[ToolTestDict] class PathOrLocation(NamedTuple): name: str path: Optional[str] location: Optional[str] def stage_data_in_history( galaxy_interactor: "GalaxyInteractorApi", tool_id: str, Loading Loading @@ -560,8 +566,41 @@ class GalaxyInteractorApi: composite_data = test_data["composite_data"] if composite_data: tool_input["composite_data"] = composite_data tool_input["composite_data"] = [ self._get_path_or_location( fname=fname_, test_data={}, tool_id=tool_id, tool_version=tool_version, force_path_paste=force_path_paste, ).path for fname_ in composite_data ] else: assert fname, "File path is required and cannot be empty string" path_or_location = self._get_path_or_location( fname, test_data, tool_id, tool_version=tool_version, mode="file" if tool_input["class"].lower() == "file" else "directory", ) if path_or_location.path: tool_input["path"] = path_or_location.path if path_or_location.location: tool_input["location"] = path_or_location.location tool_input["name"] = os.path.basename(path_or_location.name) return tool_input def _get_path_or_location( self, fname: str, test_data: Dict[str, Any], tool_id: str, tool_version: Optional[str] = None, force_path_paste: bool = False, mode: Literal["file", "directory"] = "file", ) -> PathOrLocation: file_name = None file_name_exists = False location = self._ensure_valid_location_in(test_data) Loading @@ -569,25 +608,21 @@ class GalaxyInteractorApi: file_name = self.test_data_path(tool_id, fname, tool_version=tool_version) file_name_exists = os.path.exists(file_name) if not file_name_exists and location is not None: name = location tool_input["location"] = location return PathOrLocation(name=location, location=location, path=None) else: name = fname if force_path_paste: if file_name is None: file_name = self.test_data_path(tool_id, fname, tool_version=tool_version) tool_input["location"] = f"file://{file_name}" return PathOrLocation(name=fname, location=f"file://{file_name}", path=None) else: mode = "file" if tool_input["class"].lower() == "file" else "directory" tool_input["path"] = path = self.test_data_download( path = self.test_data_download( tool_id, fname, is_output=False, tool_version=tool_version, mode=mode, path_only=True ) assert isinstance(path, str) # Downloaded directories contain root directory if path and mode == "directory": tool_input["path"] = path if mode == "file" else os.path.join(path, fname) name = os.path.basename(name) tool_input["name"] = name return tool_input path = os.path.join(path, fname) return PathOrLocation(name=fname, location=None, path=path) def _ensure_valid_location_in(self, test_data: dict) -> Optional[str]: location: Optional[str] = test_data.get("location") Loading lib/galaxy/tool_util/verify/parse.py +3 −1 Original line number Diff line number Diff line Loading @@ -533,7 +533,9 @@ def _add_uploaded_dataset( required_files: RequiredFilesT, ) -> Optional[str]: if value is None: assert input_parameter.parse_optional(), f"{name} is not optional. You must provide a valid filename." assert ( input_parameter.parse_optional() or "composite_data" in extra ), f"{name} is not optional. You must provide a valid filename." return value return require_file(name, value, extra, required_files) Loading Loading
lib/galaxy/tool_util/verify/interactor.py +61 −26 Original line number Diff line number Diff line Loading @@ -138,6 +138,12 @@ ToolTestDict = Union[ValidToolTestDict, InvalidToolTestDict] ToolTestDictsT = List[ToolTestDict] class PathOrLocation(NamedTuple): name: str path: Optional[str] location: Optional[str] def stage_data_in_history( galaxy_interactor: "GalaxyInteractorApi", tool_id: str, Loading Loading @@ -560,8 +566,41 @@ class GalaxyInteractorApi: composite_data = test_data["composite_data"] if composite_data: tool_input["composite_data"] = composite_data tool_input["composite_data"] = [ self._get_path_or_location( fname=fname_, test_data={}, tool_id=tool_id, tool_version=tool_version, force_path_paste=force_path_paste, ).path for fname_ in composite_data ] else: assert fname, "File path is required and cannot be empty string" path_or_location = self._get_path_or_location( fname, test_data, tool_id, tool_version=tool_version, mode="file" if tool_input["class"].lower() == "file" else "directory", ) if path_or_location.path: tool_input["path"] = path_or_location.path if path_or_location.location: tool_input["location"] = path_or_location.location tool_input["name"] = os.path.basename(path_or_location.name) return tool_input def _get_path_or_location( self, fname: str, test_data: Dict[str, Any], tool_id: str, tool_version: Optional[str] = None, force_path_paste: bool = False, mode: Literal["file", "directory"] = "file", ) -> PathOrLocation: file_name = None file_name_exists = False location = self._ensure_valid_location_in(test_data) Loading @@ -569,25 +608,21 @@ class GalaxyInteractorApi: file_name = self.test_data_path(tool_id, fname, tool_version=tool_version) file_name_exists = os.path.exists(file_name) if not file_name_exists and location is not None: name = location tool_input["location"] = location return PathOrLocation(name=location, location=location, path=None) else: name = fname if force_path_paste: if file_name is None: file_name = self.test_data_path(tool_id, fname, tool_version=tool_version) tool_input["location"] = f"file://{file_name}" return PathOrLocation(name=fname, location=f"file://{file_name}", path=None) else: mode = "file" if tool_input["class"].lower() == "file" else "directory" tool_input["path"] = path = self.test_data_download( path = self.test_data_download( tool_id, fname, is_output=False, tool_version=tool_version, mode=mode, path_only=True ) assert isinstance(path, str) # Downloaded directories contain root directory if path and mode == "directory": tool_input["path"] = path if mode == "file" else os.path.join(path, fname) name = os.path.basename(name) tool_input["name"] = name return tool_input path = os.path.join(path, fname) return PathOrLocation(name=fname, location=None, path=path) def _ensure_valid_location_in(self, test_data: dict) -> Optional[str]: location: Optional[str] = test_data.get("location") Loading
lib/galaxy/tool_util/verify/parse.py +3 −1 Original line number Diff line number Diff line Loading @@ -533,7 +533,9 @@ def _add_uploaded_dataset( required_files: RequiredFilesT, ) -> Optional[str]: if value is None: assert input_parameter.parse_optional(), f"{name} is not optional. You must provide a valid filename." assert ( input_parameter.parse_optional() or "composite_data" in extra ), f"{name} is not optional. You must provide a valid filename." return value return require_file(name, value, extra, required_files) Loading