import tempfile import os from galaxy.tools.parameters.basic import SelectToolParameter from galaxy.tools.parameters.basic import DrillDownSelectToolParameter from galaxy.tools.parameters.basic import IntegerToolParameter from galaxy.tools.wrappers import RawObjectWrapper from galaxy.tools.wrappers import SelectToolParameterWrapper from galaxy.tools.wrappers import InputValueWrapper from galaxy.tools.wrappers import DatasetFilenameWrapper from galaxy.jobs.datasets import DatasetPath from galaxy.util.bunch import Bunch from xml.etree.ElementTree import XML from galaxy.datatypes.metadata import MetadataSpecCollection def with_mock_tool(func): def call(): test_directory = tempfile.mkdtemp() app = MockApp(test_directory) tool = MockTool(app) return func(tool) call.__name__ = func.__name__ return call @with_mock_tool def test_select_wrapper_simple_options(tool): xml = XML(''' ''') parameter = SelectToolParameter( tool, xml ) wrapper = SelectToolParameterWrapper( parameter, "x", tool.app ) assert str(wrapper) == "x" assert wrapper.name == "blah" assert wrapper.value_label == "I am X" @with_mock_tool def test_select_wrapper_with_drilldown(tool): parameter = _drilldown_parameter(tool) wrapper = SelectToolParameterWrapper( parameter, ["option3"], tool.app ) assert str(wrapper) == "option3", str(wrapper) @with_mock_tool def test_select_wrapper_option_file(tool): parameter = _setup_blast_tool(tool) wrapper = SelectToolParameterWrapper( parameter, "val2", tool.app ) assert str(wrapper) == "val2" assert wrapper.fields.name == "name2" assert wrapper.fields.path == "path2" @with_mock_tool def test_select_wrapper_multiple(tool): parameter = _setup_blast_tool(tool, multiple=True) wrapper = SelectToolParameterWrapper( parameter, ["val1", "val2"], tool.app ) assert str(wrapper) == "val1,val2" assert wrapper.fields.name == "name1,name2" @with_mock_tool def test_select_wrapper_with_path_rewritting(tool): parameter = _setup_blast_tool(tool, multiple=True) wrapper = SelectToolParameterWrapper( parameter, ["val1", "val2"], tool.app, other_values={}, path_rewriter=lambda v: "Rewrite<%s>" % v ) assert wrapper.fields.path == "Rewrite,Rewrite" def test_raw_object_wrapper(): obj = Bunch(x=4) wrapper = RawObjectWrapper(obj) assert wrapper.x == 4 assert wrapper false_wrapper = RawObjectWrapper(False) assert not false_wrapper @with_mock_tool def test_input_value_wrapper(tool): parameter = IntegerToolParameter( tool, XML( '' ) ) wrapper = InputValueWrapper( parameter, "5" ) assert str( wrapper ) == "5" def test_dataset_wrapper(): dataset = MockDataset() wrapper = DatasetFilenameWrapper(dataset) assert str( wrapper ) == MOCK_DATASET_PATH assert wrapper.file_name == MOCK_DATASET_PATH assert wrapper.ext == MOCK_DATASET_EXT def test_dataset_wrapper_false_path(): dataset = MockDataset() new_path = "/new/path/dataset_123.dat" wrapper = DatasetFilenameWrapper(dataset, dataset_path=Bunch(false_path=new_path)) assert str( wrapper ) == new_path assert wrapper.file_name == new_path def test_dataset_false_extra_files_path(): dataset = MockDataset() wrapper = DatasetFilenameWrapper(dataset) assert wrapper.extra_files_path == MOCK_DATASET_EXTRA_FILES_PATH new_path = "/new/path/dataset_123.dat" dataset_path = DatasetPath(123, MOCK_DATASET_PATH, false_path=new_path) wrapper = DatasetFilenameWrapper(dataset, dataset_path=dataset_path) # Setting false_path is not enough to override assert wrapper.extra_files_path == MOCK_DATASET_EXTRA_FILES_PATH new_files_path = "/new/path/dataset_123_files" dataset_path = DatasetPath(123, MOCK_DATASET_PATH, false_path=new_path, false_extra_files_path=new_files_path) wrapper = DatasetFilenameWrapper(dataset, dataset_path=dataset_path) assert wrapper.extra_files_path == new_files_path def _drilldown_parameter(tool): xml = XML( ''' ''' ) parameter = DrillDownSelectToolParameter( tool, xml ) return parameter def _setup_blast_tool(tool, multiple=False): tool.app.write_test_tool_data("blastdb.loc", "val1\tname1\tpath1\nval2\tname2\tpath2\n") xml = XML( ''' ''' % multiple ) parameter = SelectToolParameter( tool, xml ) return parameter MOCK_DATASET_PATH = "/galaxy/database/files/001/dataset_123.dat" MOCK_DATASET_EXTRA_FILES_PATH = "/galaxy/database/files/001/dataset_123.dat" MOCK_DATASET_EXT = "bam" class MockDataset(object): def __init__(self): self.metadata = MetadataSpecCollection({}) self.file_name = MOCK_DATASET_PATH self.extra_files_path = MOCK_DATASET_EXTRA_FILES_PATH self.ext = MOCK_DATASET_EXT class MockTool(object): def __init__(self, app): self.app = app self.options = Bunch(sanitize=False) class MockApp(object): def __init__(self, test_directory): self.config = Bunch(tool_data_path=test_directory) def write_test_tool_data(self, name, contents): path = os.path.join(self.config.tool_data_path, name) open(path, "w").write(contents)