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)