mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
Allow multiple collections to be fed to a multi data parameter in one reduction step. Fixes #750 and will really simplify certain classes of tools. Rebased original with fixes for rerun of such reductions. Manually tested workflow execution and everything seems fine. The workflow editor already thought this was possible, so that is another bug corrected by this enhancement. To run the associated API test, execute the following command: ./run_tests.sh -with_framework_test_tools -api test/api/test_tools.py:ToolsTestCase.test_reduce_multiple_lists_on_multi_data Conflicts: static/maps/mvc/dataset/dataset-choice.js.map static/maps/mvc/form/form-select-content.js.map static/scripts/mvc/form/form-select-content.js
221 lines
8.5 KiB
Python
221 lines
8.5 KiB
Python
from galaxy import model
|
|
from galaxy.util import bunch
|
|
|
|
from .test_parameter_parsing import BaseParameterTestCase
|
|
|
|
|
|
class DataToolParameterTestCase( BaseParameterTestCase ):
|
|
|
|
def test_to_python_none_values( self ):
|
|
assert None is self.param.to_python( None, self.app )
|
|
assert 'None' == self.param.to_python( 'None', self.app )
|
|
assert '' == self.param.to_python( '', self.app )
|
|
|
|
def test_to_python_hda( self ):
|
|
hda = self._new_hda()
|
|
as_python = self.param.to_python( hda.id, self.app )
|
|
assert hda == as_python
|
|
|
|
def test_to_python_multi_hdas( self ):
|
|
hda1 = self._new_hda()
|
|
hda2 = self._new_hda()
|
|
as_python = self.param.to_python( "%s,%s" % ( hda1.id, hda2.id ), self.app )
|
|
assert as_python == [ hda1, hda2 ]
|
|
|
|
def test_to_python_multi_none( self ):
|
|
self.multiple = True
|
|
hda = self._new_hda()
|
|
# Selection is Optional. may be selected with other stuff,
|
|
# not sure the UI should really allow this but easy enough
|
|
# to just filter it out.
|
|
self.assertEquals([hda], self.param.to_python( '%s,None' % hda.id, self.app ))
|
|
|
|
def test_field_filter_on_types( self ):
|
|
hda1 = MockHistoryDatasetAssociation( name="hda1", id=1 )
|
|
hda2 = MockHistoryDatasetAssociation( name="hda2", id=2 )
|
|
self.stub_active_datasets( hda1, hda2 )
|
|
field = self._simple_field()
|
|
assert len( field.options ) == 2
|
|
assert field.options[ 0 ][ 0 ] == "1: hda1"
|
|
assert field.options[ 1 ][ 0 ] == "2: hda2"
|
|
|
|
assert field.options[ 1 ][ 2 ] # Last one selected
|
|
assert not field.options[ 0 ][ 2 ] # Others not selected
|
|
|
|
hda2.datatype_matches = False
|
|
field = self._simple_field()
|
|
assert len( field.options ) == 1
|
|
assert field.options[ 0 ][ 2 ] is True # Last one selected
|
|
|
|
def test_field_display_hidden_hdas_only_if_selected( self ):
|
|
hda1 = MockHistoryDatasetAssociation( name="hda1", id=1 )
|
|
hda2 = MockHistoryDatasetAssociation( name="hda2", id=2 )
|
|
self.stub_active_datasets( hda1, hda2 )
|
|
hda1.visible = False
|
|
hda2.visible = False
|
|
field = self._simple_field( value=hda2 )
|
|
self.assertEquals( len( field.options ), 1 ) # hda1 not an option, not visible or selected
|
|
assert field.options[ 0 ][ 0 ] == "2: (hidden) hda2"
|
|
|
|
def test_field_implicit_conversion_new( self ):
|
|
hda1 = MockHistoryDatasetAssociation( name="hda1", id=1 )
|
|
hda1.datatype_matches = False
|
|
hda1.conversion_destination = ( "tabular", None )
|
|
self.stub_active_datasets( hda1 )
|
|
field = self._simple_field()
|
|
assert len( field.options ) == 1
|
|
assert field.options[ 0 ][ 0 ] == "1: (as tabular) hda1"
|
|
assert field.options[ 0 ][ 1 ] == 1
|
|
|
|
def test_field_implicit_conversion_existing( self ):
|
|
hda1 = MockHistoryDatasetAssociation( name="hda1", id=1 )
|
|
hda1.datatype_matches = False
|
|
hda1.conversion_destination = ( "tabular", MockHistoryDatasetAssociation( name="hda1converted", id=2 ) )
|
|
self.stub_active_datasets( hda1 )
|
|
field = self._simple_field()
|
|
assert len( field.options ) == 1
|
|
assert field.options[ 0 ][ 0 ] == "1: (as tabular) hda1"
|
|
# This is difference with previous test, value is existing
|
|
# hda id not new one.
|
|
assert field.options[ 0 ][ 1 ] == 2
|
|
|
|
def test_field_multiple( self ):
|
|
self.multiple = True
|
|
field = self._simple_field()
|
|
assert field.multiple
|
|
|
|
def test_field_empty_selection( self ):
|
|
field = self._simple_field()
|
|
assert len( field.options ) == 0
|
|
|
|
def test_field_empty_selection_optional( self ):
|
|
self.optional = True
|
|
field = self._simple_field()
|
|
assert len( field.options ) == 1
|
|
option = field.options[ 0 ]
|
|
assert option[ 0 ] == "Selection is Optional"
|
|
assert option[ 1 ] == "None"
|
|
assert option[ 2 ] is True
|
|
|
|
def test_get_initial_value_prevents_repeats( self ):
|
|
hda1 = MockHistoryDatasetAssociation( name="hda1", id=1 )
|
|
hda2 = MockHistoryDatasetAssociation( name="hda2", id=2 )
|
|
self.stub_active_datasets( hda1, hda2 )
|
|
already_used = []
|
|
assert hda2 == self.param.get_initial_value_from_history_prevent_repeats( self.trans, {}, already_used )
|
|
assert hda1 == self.param.get_initial_value_from_history_prevent_repeats( self.trans, {}, already_used )
|
|
|
|
def test_get_initial_value_is_empty_string_if_no_match( self ):
|
|
hda1 = MockHistoryDatasetAssociation( name="hda1", id=1 )
|
|
hda1.visible = False
|
|
hda2 = MockHistoryDatasetAssociation( name="hda2", id=2 )
|
|
hda2.visible = False
|
|
self.stub_active_datasets( hda1, hda2 )
|
|
assert '' == self.param.get_initial_value( self.trans, {} )
|
|
|
|
def test_get_initial_none_when_optional( self ):
|
|
self.optional = True
|
|
hda1 = MockHistoryDatasetAssociation( name="hda1", id=1 )
|
|
hda2 = MockHistoryDatasetAssociation( name="hda2", id=2 )
|
|
self.stub_active_datasets( hda1, hda2 )
|
|
assert self.param.get_initial_value( self.trans, {} ) is None
|
|
|
|
def test_get_initial_with_previously_converted_data( self ):
|
|
hda1 = MockHistoryDatasetAssociation( name="hda1", id=1 )
|
|
hda1.datatype_matches = False
|
|
converted = MockHistoryDatasetAssociation( name="hda1converted", id=2 )
|
|
hda1.conversion_destination = ( "tabular", converted )
|
|
self.stub_active_datasets( hda1 )
|
|
assert converted == self.param.get_initial_value( self.trans, {} )
|
|
|
|
def test_get_initial_with_to_be_converted_data( self ):
|
|
hda1 = MockHistoryDatasetAssociation( name="hda1", id=1 )
|
|
hda1.datatype_matches = False
|
|
hda1.conversion_destination = ( "tabular", None )
|
|
self.stub_active_datasets( hda1 )
|
|
assert hda1 == self.param.get_initial_value( self.trans, {} )
|
|
|
|
def _new_hda( self ):
|
|
hda = model.HistoryDatasetAssociation()
|
|
hda.visible = True
|
|
hda.dataset = model.Dataset()
|
|
self.app.model.context.add( hda )
|
|
self.app.model.context.flush( )
|
|
return hda
|
|
|
|
def setUp( self ):
|
|
super(DataToolParameterTestCase, self).setUp()
|
|
self.test_history = model.History()
|
|
self.app.model.context.add( self.test_history )
|
|
self.app.model.context.flush()
|
|
self.trans = bunch.Bunch(
|
|
app=self.app,
|
|
get_history=lambda **k: self.test_history,
|
|
get_current_user_roles=lambda: [],
|
|
workflow_building_mode=False,
|
|
webapp=bunch.Bunch( name="galaxy" ),
|
|
)
|
|
self.multiple = False
|
|
self.optional = False
|
|
self._param = None
|
|
|
|
def stub_active_datasets( self, *hdas ):
|
|
self.test_history._active_datasets_children_and_roles = hdas
|
|
|
|
def _simple_field( self, **kwds ):
|
|
field = self.param.get_html_field( trans=self.trans, **kwds )
|
|
if hasattr( field, "primary_field" ):
|
|
field = field.primary_field
|
|
return field
|
|
|
|
@property
|
|
def param( self ):
|
|
if not self._param:
|
|
multi_text = ""
|
|
if self.multiple:
|
|
multi_text = 'multiple="True"'
|
|
optional_text = ""
|
|
if self.optional:
|
|
optional_text = 'optional="True"'
|
|
template_xml = '''<param name="data2" type="data" ext="txt" %s %s></param>'''
|
|
param_str = template_xml % ( multi_text, optional_text )
|
|
self._param = self._parameter_for( tool=self.mock_tool, xml=param_str )
|
|
|
|
return self._param
|
|
|
|
|
|
class MockHistoryDatasetAssociation( object ):
|
|
""" Fake HistoryDatasetAssociation stubbed out for testing matching and
|
|
stuff like that.
|
|
"""
|
|
|
|
def __init__( self, test_dataset=None, name="Test Dataset", id=1 ):
|
|
if not test_dataset:
|
|
test_dataset = model.Dataset()
|
|
self.states = model.HistoryDatasetAssociation.states
|
|
self.deleted = False
|
|
self.dataset = test_dataset
|
|
self.visible = True
|
|
self.datatype_matches = True
|
|
self.conversion_destination = ( None, None )
|
|
self.datatype = bunch.Bunch(
|
|
matches_any=lambda formats: self.datatype_matches,
|
|
)
|
|
self.dbkey = "hg19"
|
|
self.implicitly_converted_parent_datasets = False
|
|
|
|
self.name = name
|
|
self.hid = id
|
|
self.id = id
|
|
self.children = []
|
|
|
|
@property
|
|
def state( self ):
|
|
return self.dataset.state
|
|
|
|
def get_dbkey( self ):
|
|
return self.dbkey
|
|
|
|
def find_conversion_destination( self, formats ):
|
|
return self.conversion_destination
|