1 | import new, sys |
---|
2 | import galaxy.util |
---|
3 | import parameters |
---|
4 | from parameters import basic |
---|
5 | from parameters import grouping |
---|
6 | from elementtree.ElementTree import XML |
---|
7 | import logging |
---|
8 | |
---|
9 | log = logging.getLogger( __name__ ) |
---|
10 | |
---|
11 | class ToolTestBuilder( object ): |
---|
12 | """ |
---|
13 | Encapsulates information about a tool test, and allows creation of a |
---|
14 | dynamic TestCase class (the unittest framework is very class oriented, |
---|
15 | doing dynamic tests in this was allows better integration) |
---|
16 | """ |
---|
17 | def __init__( self, tool, name, maxseconds ): |
---|
18 | self.tool = tool |
---|
19 | self.name = name |
---|
20 | self.maxseconds = maxseconds |
---|
21 | self.required_files = [] |
---|
22 | self.inputs = [] |
---|
23 | self.outputs = [] |
---|
24 | self.error = False |
---|
25 | self.exception = None |
---|
26 | def add_param( self, name, value, extra ): |
---|
27 | try: |
---|
28 | if name not in self.tool.inputs: |
---|
29 | for input_name, input_value in self.tool.inputs.items(): |
---|
30 | if isinstance( input_value, grouping.Conditional ) or isinstance( input_value, grouping.Repeat ): |
---|
31 | self.__expand_grouping_for_data_input(name, value, extra, input_name, input_value) |
---|
32 | elif isinstance( self.tool.inputs[name], parameters.DataToolParameter ) and ( value, extra ) not in self.required_files: |
---|
33 | name_change = [ att for att in extra.get( 'edit_attributes', [] ) if att.get( 'type' ) == 'name' ] |
---|
34 | if name_change: |
---|
35 | name_change = name_change[-1].get( 'value' ) #only the last name change really matters |
---|
36 | if value is None and not name_change: |
---|
37 | assert self.tool.inputs[name].optional, '%s is not optional. You must provide a valid filename.' % name |
---|
38 | else: |
---|
39 | self.required_files.append( ( value, extra ) ) #these files will be uploaded |
---|
40 | if name_change: |
---|
41 | value = name_change #change value for select to renamed uploaded file for e.g. composite dataset |
---|
42 | except Exception, e: |
---|
43 | log.debug( "Error in add_param for %s: %s" % ( name, e ) ) |
---|
44 | self.inputs.append( ( name, value, extra ) ) |
---|
45 | def add_output( self, name, file, extra ): |
---|
46 | self.outputs.append( ( name, file, extra ) ) |
---|
47 | def __expand_grouping_for_data_input( self, name, value, extra, grouping_name, grouping_value ): |
---|
48 | # Currently handles grouping.Conditional and grouping.Repeat |
---|
49 | if isinstance( grouping_value, grouping.Conditional ): |
---|
50 | if name != grouping_value.test_param.name: |
---|
51 | for case in grouping_value.cases: |
---|
52 | for case_input_name, case_input_value in case.inputs.items(): |
---|
53 | if case_input_name == name and isinstance( case_input_value, basic.DataToolParameter ) and ( value, extra ) not in self.required_files: |
---|
54 | if value is None: |
---|
55 | assert case_input_value.optional, '%s is not optional. You must provide a valid filename.' % name |
---|
56 | else: |
---|
57 | self.required_files.append( ( value, extra ) ) |
---|
58 | return True |
---|
59 | elif isinstance( case_input_value, grouping.Conditional ): |
---|
60 | self.__expand_grouping_for_data_input(name, value, extra, case_input_name, case_input_value) |
---|
61 | elif isinstance( grouping_value, grouping.Repeat ): |
---|
62 | # FIXME: grouping.Repeat can only handle 1 repeat param element since the param name |
---|
63 | # is something like "input2" and the expanded page display is something like "queries_0|input2". |
---|
64 | # The problem is that the only param name on the page is "input2", and adding more test input params |
---|
65 | # with the same name ( "input2" ) is not yet supported in our test code ( the lat one added is the only |
---|
66 | # one used ). |
---|
67 | for input_name, input_value in grouping_value.inputs.items(): |
---|
68 | if input_name == name and isinstance( input_value, basic.DataToolParameter ) and ( value, extra ) not in self.required_files: |
---|
69 | if value is None: |
---|
70 | assert input_value.optional, '%s is not optional. You must provide a valid filename.' % name |
---|
71 | else: |
---|
72 | self.required_files.append( ( value, extra ) ) |
---|
73 | return True |
---|