diff --git a/lib/galaxy/tools/verify/interactor.py b/lib/galaxy/tools/verify/interactor.py index 30f912fd90f..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...} 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')