Files
galaxy/test/unit/tool_util/test_required_files.py
T
John Chilton 48df4b910d Systematic handling of remotely required tool files.
- Allow tools to define "pulsar file action"-like paths for files to include and exclude during remote job setup.
- Package up a list of defaults for older tools.
2021-08-10 14:04:32 -04:00

171 lines
5.0 KiB
Python

import os
from pathlib import Path
from .test_parsing import BaseLoaderTestCase
SCRIPT_DIRECTORY = os.path.abspath(os.path.dirname(__file__))
TEST_TOOL_DIRECTORIES = os.path.join(SCRIPT_DIRECTORY, "tool_directories")
TOOL_REQUIRED_FILES_XML_1 = """
<tool name="required_files_1" id="required_files_1" version="0.1.0">
<command>foo</command>
<required_files>
<include path="my_script.R" />
</required_files>
<inputs>
<input type="text" label="Text to parse." name="input1" />
</inputs>
<outputs>
<output type="integer" name="out1" from="output" />
</outputs>
</tool>
"""
TOOL_REQUIRED_FILES_XML_2 = """
<tool name="required_files_1" id="required_files_1" version="0.1.0">
<command>foo</command>
<required_files>
<include path="*.R" type="glob" />
<exclude path="other_script.R" />
</required_files>
<inputs>
<input type="text" label="Text to parse." name="input1" />
</inputs>
<outputs>
<output type="integer" name="out1" from="output" />
</outputs>
</tool>
"""
TOOL_REQUIRED_FILES_XML_3 = """
<tool name="required_files_1" id="required_files_1" version="0.1.0">
<command>foo</command>
<required_files>
<include path="*.R" type="glob" />
</required_files>
<inputs>
<input type="text" label="Text to parse." name="input1" />
</inputs>
<outputs>
<output type="integer" name="out1" from="output" />
</outputs>
</tool>
"""
TOOL_REQUIRED_FILES_XML_4 = """
<tool name="required_files_1" id="required_files_1" version="0.1.0">
<command>foo</command>
<required_files>
<include path=".*R" type="regex" />
<exclude path="other_script*" type="glob" />
</required_files>
<inputs>
<input type="text" label="Text to parse." name="input1" />
</inputs>
<outputs>
<output type="integer" name="out1" from="output" />
</outputs>
</tool>
"""
TOOL_REQUIRED_FILES_XML_DISABLED_DEFAULT_EXCLUSIONS = """
<tool name="required_files_1" id="required_files_1" version="0.1.0">
<command>foo</command>
<required_files extend_default_excludes="false">
<include path="*.R" type="glob" />
</required_files>
<inputs>
<input type="text" label="Text to parse." name="input1" />
</inputs>
<outputs>
<output type="integer" name="out1" from="output" />
</outputs>
</tool>
"""
class BaseRequiredFilesTestCase(BaseLoaderTestCase):
source_file_name = "required_files.xml"
def _required_files(self, tool_directory: str):
tool_source = self._tool_source
required_files = tool_source.parse_required_files()
return required_files.find_required_files(tool_directory)
# directly include just one file that is there
class RequiredFiles1TestCase(BaseRequiredFilesTestCase):
source_contents = TOOL_REQUIRED_FILES_XML_1
def test_expected_files(self):
files = self._required_files(os.path.join(TEST_TOOL_DIRECTORIES, "r-tool-dir"))
assert len(files) == 1
assert "my_script.R" in files
# include a glob and exclude a file in the glob
class RequiredFiles2TestCase(BaseRequiredFilesTestCase):
source_contents = TOOL_REQUIRED_FILES_XML_2
def test_expected_files(self):
files = self._required_files(os.path.join(TEST_TOOL_DIRECTORIES, "r-tool-dir"))
assert len(files) == 1
assert "my_script.R" in files
# include a glob with multiple matches
class RequiredFiles3TestCase(BaseRequiredFilesTestCase):
source_contents = TOOL_REQUIRED_FILES_XML_3
def test_expected_files(self):
files = self._required_files(os.path.join(TEST_TOOL_DIRECTORIES, "r-tool-dir"))
assert len(files) == 2
assert "my_script.R" in files
assert "other_script.R" in files
# include a file with regex and exclude with glob
class RequiredFiles4TestCase(BaseRequiredFilesTestCase):
source_contents = TOOL_REQUIRED_FILES_XML_4
def test_expected_files(self):
files = self._required_files(os.path.join(TEST_TOOL_DIRECTORIES, "r-tool-dir"))
assert len(files) == 1
assert "my_script.R" in files
class HgExcludedByDefaultTestCase(BaseRequiredFilesTestCase):
source_contents = TOOL_REQUIRED_FILES_XML_3
def test_expected_files(self):
repo_dir = setup_dir_with_repo(self.temp_directory)
files = self._required_files(repo_dir)
assert len(files) == 1
assert "my_script.R" in files
class HgExclusionDisabledTestCase(BaseRequiredFilesTestCase):
source_contents = TOOL_REQUIRED_FILES_XML_DISABLED_DEFAULT_EXCLUSIONS
def test_expected_files(self):
repo_dir = setup_dir_with_repo(self.temp_directory)
files = self._required_files(repo_dir)
assert len(files) == 2
assert "my_script.R" in files
assert ".hg/index.R" in files
def setup_dir_with_repo(tmp_dir):
repo = os.path.join(tmp_dir, "repo")
os.makedirs(repo)
hg = os.path.join(repo, ".hg")
os.makedirs(hg)
Path(hg, "index.R").touch()
Path(repo, "my_script.R").touch()
return repo