diff --git a/lib/galaxy/tools/verify/interactor.py b/lib/galaxy/tools/verify/interactor.py index 73e81dd2252..08f67ec690f 100644 --- a/lib/galaxy/tools/verify/interactor.py +++ b/lib/galaxy/tools/verify/interactor.py @@ -12,6 +12,7 @@ from collections import OrderedDict from json import dumps from logging import getLogger +from packaging.version import parse as parse_version, Version try: from nose.tools import nottest except ImportError: @@ -98,9 +99,20 @@ class GalaxyInteractorApi(object): if kwds.get('user_api_key_is_admin_key', False): self.master_api_key = self.api_key self.keep_outputs_dir = kwds["keep_outputs_dir"] + self._target_galaxy_version = None self.uploads = {} + @property + def target_galaxy_version(self): + if self._target_galaxy_version is None: + self._target_galaxy_version = parse_version(self._get('version').json()['version_major']) + return self._target_galaxy_version + + @property + def supports_test_data_download(self): + return self.target_galaxy_version >= Version("19.01") + def __get_user_key(self, user_key, admin_key, test_user=None): if not test_user: test_user = "test@bx.psu.edu" @@ -259,16 +271,29 @@ class GalaxyInteractorApi(object): @nottest def test_data_download(self, tool_id, filename, mode='file'): - response = self._get("tools/%s/test_data_download?filename=%s" % (tool_id, filename), admin=True) - assert response.status_code == 200 - if mode == 'file': - return response.content - elif mode == 'directory': - prefix = os.path.basename(filename) - path = tempfile.mkdtemp(prefix=prefix) - with tarfile.open(fileobj=BytesIO(response.content)) as tar_contents: - tar_contents.extractall(path=path) - return path + if self.supports_test_data_download: + response = self._get("tools/%s/test_data_download?filename=%s" % (tool_id, filename), admin=True) + assert response.status_code == 200 + if mode == 'file': + return response.content + elif mode == 'directory': + prefix = os.path.basename(filename) + path = tempfile.mkdtemp(prefix=prefix) + with tarfile.open(fileobj=BytesIO(response.content)) as tar_contents: + tar_contents.extractall(path=path) + return path + else: + # We can only use local data + response = self._get("tools/%s/test_data_path?filename=%s" % (tool_id, filename), admin=True) + assert response.status_code == 200 + file_name = response.json() + if mode == 'file': + return open(file_name, mode='rb') + elif mode == 'directory': + # Make a copy, since we are going to clean up the returned path + path = tempfile.mkdtemp() + shutil.copytree(file_name, path) + return path def __output_id(self, output_data): # Allow data structure coming out of tools API - {id: , output_name: , etc...} @@ -677,7 +702,7 @@ def _verify_extra_files_content(extra_files, hda_id, dataset_fetcher, test_data_ shutil.rmtree(path) -def verify_tool(tool_id, galaxy_interactor, resource_parameters=None, register_job_data=None, test_index=0, tool_version=None, quiet=False): +def verify_tool(tool_id, galaxy_interactor, resource_parameters=None, register_job_data=None, test_index=0, tool_version=None, quiet=False, test_history=None): if resource_parameters is None: resource_parameters = {} tool_test_dicts = galaxy_interactor.get_tool_tests(tool_id, tool_version=tool_version) @@ -686,7 +711,8 @@ def verify_tool(tool_id, galaxy_interactor, resource_parameters=None, register_j _handle_def_errors(testdef) - test_history = galaxy_interactor.new_history() + if test_history is None: + test_history = galaxy_interactor.new_history() stage_data_in_history(galaxy_interactor, tool_id, testdef.test_data(), test_history) diff --git a/test/api/test_galaxy_interactor.py b/test/api/test_galaxy_interactor.py new file mode 100644 index 00000000000..f3458e08f3b --- /dev/null +++ b/test/api/test_galaxy_interactor.py @@ -0,0 +1,13 @@ +# Test galaxy interactor + +from packaging.version import Version + +from base import api # noqa: I100,I202 + + +class GalaxyInteractorBackwardCompatTestCase(api.ApiTestCase): + + def test_local_test_data_download(self): + self.galaxy_interactor._target_galaxy_version = Version("18.09") + assert self.galaxy_interactor.supports_test_data_download is False + assert self.galaxy_interactor.test_data_download(tool_id='cat1', filename='1.bed').readline().startswith('chr1\t147962192\t147962580')