diff --git a/lib/galaxy/tools/test.py b/lib/galaxy/tools/test.py index 9a0af2c142a..ec7c7c7d1a8 100644 --- a/lib/galaxy/tools/test.py +++ b/lib/galaxy/tools/test.py @@ -1,6 +1,7 @@ import new, sys import galaxy.util import parameters +from parameters import basic from parameters import grouping from elementtree.ElementTree import XML @@ -19,11 +20,10 @@ class ToolTestBuilder( object ): self.error = False self.exception = None def add_param( self, name, value, extra ): - # FIXME: This needs to be updated for parameter grouping support try: if name not in self.tool.inputs: for input_name, input_value in self.tool.inputs.items(): - if isinstance( input_value, grouping.Conditional ): + if isinstance( input_value, grouping.Conditional ) or isinstance( input_value, grouping.Repeat ): self.__expand_grouping_for_data_input(name, value, extra, input_name, input_value) elif isinstance( self.tool.inputs[name], parameters.DataToolParameter ): self.required_files.append( ( value, extra ) ) @@ -31,13 +31,24 @@ class ToolTestBuilder( object ): self.inputs.append( ( name, value, extra ) ) def add_output( self, name, file ): self.outputs.append( ( name, file ) ) - def __expand_grouping_for_data_input(self, name, value, extra, grouping_name, grouping_value): - if name != grouping_value.test_param.name: - for case in grouping_value.cases: - for case_input_name, case_input_value in case.inputs.items(): - if case_input_name == name and isinstance( case_input_value, parameters.DataToolParameter ): - self.required_files.append( ( value, extra ) ) - return True - elif isinstance( case_input_value, grouping.Conditional ): - self.__expand_grouping_for_data_input(name, value, extra, case_input_name, case_input_value) - + def __expand_grouping_for_data_input( self, name, value, extra, grouping_name, grouping_value ): + # Currently handles grouping.Conditional and grouping.Repeat + if isinstance( grouping_value, grouping.Conditional ): + if name != grouping_value.test_param.name: + for case in grouping_value.cases: + for case_input_name, case_input_value in case.inputs.items(): + if case_input_name == name and isinstance( case_input_value, basic.DataToolParameter ): + self.required_files.append( ( value, extra ) ) + return True + elif isinstance( case_input_value, grouping.Conditional ): + self.__expand_grouping_for_data_input(name, value, extra, case_input_name, case_input_value) + elif isinstance( grouping_value, grouping.Repeat ): + # FIXME: grouping.Repeat can only handle 1 repeat param element since the param name + # is something like "input2" and the expanded page display is something like "queries_0|input2". + # The problem is that the only param name on the page is "input2", and adding more test input params + # with the same name ( "input2" ) is not yet supported in our test code ( the lat one added is the only + # one used ). + for input_name, input_value in grouping_value.inputs.items(): + if input_name == name and isinstance( input_value, basic.DataToolParameter ): + self.required_files.append( ( value, extra ) ) + return True diff --git a/test-data/2.tabular b/test-data/2.tabular new file mode 100644 index 00000000000..1a428c30a95 --- /dev/null +++ b/test-data/2.tabular @@ -0,0 +1,10 @@ +1 68 4.1 +2 71 4.6 +3 62 3.8 +4 75 4.4 +5 58 3.2 +6 60 3.1 +7 67 3.8 +8 68 4.1 +9 71 4.3 +10 69 3.7 diff --git a/test-data/eq-cat.dat b/test-data/cat_wrapper_out1.bed similarity index 100% rename from test-data/eq-cat.dat rename to test-data/cat_wrapper_out1.bed diff --git a/test/base/twilltestcase.py b/test/base/twilltestcase.py index a3f0b0f348f..b9305c86f62 100644 --- a/test/base/twilltestcase.py +++ b/test/base/twilltestcase.py @@ -420,13 +420,16 @@ class TwillTestCase( unittest.TestCase ): def submit_form( self, form_no=0, button="runtool_btn", **kwd ): """Populates and submits a form from the keyword arguments.""" - for i, f in enumerate( self.showforms() ): - if i == form_no: - break # An HTMLForm contains a sequence of Controls. Supported control classes are: # TextControl, FileControl, ListControl, RadioControl, CheckboxControl, SelectControl, # SubmitControl, ImageControl + for i, f in enumerate( self.showforms() ): + if i == form_no: + break + # To help with debugging a tool, print out the form controls when the test fails + print "form '%s' contains the following controls ( note the values )" % f.name for i, control in enumerate( f.controls ): + print "control %d: %s" % ( i, str( control ) ) try: # Check for refresh_on_change attribute, submit a change if required if 'refresh_on_change' in control.attrs.keys(): @@ -504,10 +507,15 @@ class TwillTestCase( unittest.TestCase ): tc.code( 200 ) """Functions associated with Galaxy tools""" - def run_tool( self, tool_id, **kwd ): + def run_tool( self, tool_id, repeat_name=None, **kwd ): tool_id = tool_id.replace(" ", "+") """Runs the tool 'tool_id' and passes it the key/values from the *kwd""" self.visit_url( "%s/tool_runner/index?tool_id=%s" % (self.url, tool_id) ) + if repeat_name is not None: + repeat_button = '%s_add' % repeat_name + # Submit the "repeat" form button to add an input) + tc.submit( repeat_button ) + print "button '%s' clicked" % repeat_button tc.find( 'runtool_btn' ) self.submit_form( **kwd ) @@ -516,14 +524,10 @@ class TwillTestCase( unittest.TestCase ): tool_id = "ucsc_table_direct1" track_string = urllib.urlencode( track_params ) galaxy_url = urllib.quote_plus( "%s/tool_runner/index?" % self.url ) - self.visit_url( "http://genome.ucsc.edu/cgi-bin/hgTables?GALAXY_URL=%s&hgta_compressType=none&tool_id=%s&%s" % ( galaxy_url, tool_id, track_string ) ) tc.fv( "1","hgta_doTopSubmit", "get output" ) self.submit_form( button="get output" )#, **track_params ) - - tc.fv( "1","hgta_doGalaxyQuery", "Send query to Galaxy" ) - self.submit_form( button="Send query to Galaxy" )#, **output_params ) #AssertionError: Attempting to set field 'fbQual' to value '['whole']' in form 'None' threw exception: no matching forms! control: def wait( self, maxiter=20 ): diff --git a/test/functional/test_toolbox.py b/test/functional/test_toolbox.py index 2bb16a317ef..53fc2f77a09 100644 --- a/test/functional/test_toolbox.py +++ b/test/functional/test_toolbox.py @@ -1,5 +1,7 @@ import sys import new +from galaxy.tools.parameters import grouping +from galaxy.tools.parameters import basic from base.twilltestcase import TwillTestCase toolbox = None @@ -22,7 +24,7 @@ class ToolTestCase( TwillTestCase ): self.upload_file( fname, ftype=extra.get( 'ftype', 'auto' ), dbkey=extra.get( 'dbkey', 'hg17' ) ) print "Uploaded file: ", fname, ", ftype: ", extra.get( 'ftype', 'auto' ), ", extra: ", extra # We need to handle the case where we've uploaded a valid compressed file since the upload - # tool will have decompressed it on the fly. + # tool will have uncompressed it on the fly. all_inputs = {} for name, value, _ in self.testdef.inputs: if value: @@ -31,11 +33,16 @@ class ToolTestCase( TwillTestCase ): value = value.rstrip( end ) break all_inputs[ name ] = value - + # See if we have a grouping.Repeat element + repeat_name = None + for input_name, input_value in self.testdef.tool.inputs_by_page[0].items(): + if isinstance( input_value, grouping.Repeat ): + repeat_name = input_name + break # Do the first page page_inputs = self.__expand_grouping(self.testdef.tool.inputs_by_page[0], all_inputs) # Run the tool - self.run_tool( self.testdef.tool.id, **page_inputs ) + self.run_tool( self.testdef.tool.id, repeat_name=repeat_name, **page_inputs ) print "page_inputs (0)", page_inputs # Do other pages if they exist for i in range( 1, self.testdef.tool.npages ): @@ -52,24 +59,48 @@ class ToolTestCase( TwillTestCase ): def shortDescription( self ): return self.name - def __expand_grouping(self, tool_inputs, declared_inputs ): - from galaxy.tools.parameters import grouping + def __expand_grouping( self, tool_inputs, declared_inputs, repeat_index=0, repeat_sep='' ): expanded_inputs = {} for key, value in tool_inputs.items(): if isinstance(value, grouping.Conditional): for i, case in enumerate(value.cases): if declared_inputs[value.test_param.name] == case.value: if isinstance(case.value, str): - expanded_inputs["%s|%s" % (value.name, value.test_param.name)] = case.value.split(",") + if repeat_sep: + cond_sep = "%s%s" % ( repeat_sep, value.test_param.name ) + else: + cond_sep = "%s|%s" % ( value.name, value.test_param.name ) + expanded_inputs[ cond_sep ] = case.value.split( "," ) else: - expanded_inputs["%s|%s" % (value.name, value.test_param.name)] = case.value + if repeat_sep: + cond_sep = "%s%s" % ( repeat_sep, value.test_param.name ) + else: + cond_sep = "%s|%s" % ( value.name, value.test_param.name ) + expanded_inputs[ cond_sep ] = case.value for input_name, input_value in case.inputs.items(): if isinstance(input_value, grouping.Conditional): - expanded_inputs.update(self.__expand_grouping({input_name:input_value}), declared_inputs) + expanded_inputs.update( self.__expand_grouping( { input_name:input_value }, declared_inputs, repeat_index=repeat_index, repeat_sep=repeat_sep ) ) elif isinstance(declared_inputs[input_name], str): - expanded_inputs.update({"%s|%s" % (value.name, input_name):declared_inputs[input_name].split(",")}) + if repeat_sep: + cond_sep = "%s%s" % ( repeat_sep, input_name ) + else: + cond_sep = "%s|%s" % ( value.name, input_name ) + expanded_inputs.update( { cond_sep : declared_inputs[ input_name ].split( "," ) } ) else: - expanded_inputs.update({"%s|%s" % (value.name, input_name):declared_inputs[input_name]}) + if repeat_sep: + cond_sep = "%s%s" % ( repeat_sep, input_name ) + else: + cond_sep = "%s|%s" % ( value.name, input_name ) + expanded_inputs.update( { cond_sep : declared_inputs[ input_name ] } ) + elif isinstance( value, grouping.Repeat ): + for r_name, r_value in value.inputs.items(): + repeat_sep = "%s_%d|%s" % ( value.name, repeat_index, r_name ) + if isinstance( r_value, grouping.Conditional ): + cond_sep = repeat_sep + "|" + expanded_inputs.update( self.__expand_grouping( { r_name:r_value }, declared_inputs, repeat_index=repeat_index, repeat_sep=cond_sep ) ) + else: + expanded_inputs.update( { repeat_sep : [ declared_inputs[ r_name ] ] } ) + repeat_index += 1 elif isinstance(declared_inputs[value.name], str): expanded_inputs[value.name] = declared_inputs[value.name].split(",") else: diff --git a/tools/filters/catWrapper.xml b/tools/filters/catWrapper.xml index ab67fa04d64..5c1c557e799 100644 --- a/tools/filters/catWrapper.xml +++ b/tools/filters/catWrapper.xml @@ -1,35 +1,39 @@ - tail-to-head - - catWrapper.py - $out_file1 - $input1 - #for $q in $queries - ${q.input2} - #end for - - - - - - - - - - - - - - - + tail-to-head + + catWrapper.py + $out_file1 + $input1 + #for $q in $queries + ${q.input2} + #end for + + + + + + + + + + + + + + + + + + + .. class:: warningmark @@ -71,5 +75,5 @@ will result in the following:: chr2 100000030 200000955 P 0 + chr2 100000015 200000999 Q 0 + - + diff --git a/tools/plotting/xy_plot.xml b/tools/plotting/xy_plot.xml index 0facf68c3a2..b0481a72250 100644 --- a/tools/plotting/xy_plot.xml +++ b/tools/plotting/xy_plot.xml @@ -94,7 +94,25 @@ - + .. class:: infomark diff --git a/tools/stats/grouping.xml b/tools/stats/grouping.xml index 95439eb5daa..723a2819c69 100644 --- a/tools/stats/grouping.xml +++ b/tools/stats/grouping.xml @@ -40,17 +40,19 @@ - - + + + + + + + + - --> .. class:: infomark