diff --git a/lib/galaxy/tools/__init__.py b/lib/galaxy/tools/__init__.py index 7999108b47b..2e2d932a54b 100644 --- a/lib/galaxy/tools/__init__.py +++ b/lib/galaxy/tools/__init__.py @@ -769,7 +769,7 @@ class Tool: errors[ input.name ] = old_errors[ input.name ] else: incoming_value = incoming.get( key, None ) - if ( incoming_value == 'None' or incoming_value == '?' ) and isinstance( input, SelectToolParameter ) and input.is_dynamic: + if ( incoming_value == 'None' or incoming_value == '?' ) and ( isinstance( input, SelectToolParameter ) or isinstance( input, DataToolParameter ) ) and input.is_dynamic: # FIXME: This is a HACK, but is necessary because the # values in incoming are not yet set by the user when # the select list is dynamically generated. diff --git a/lib/galaxy/tools/parameters.py b/lib/galaxy/tools/parameters.py index e1398ce2a26..48e0216e0b7 100644 --- a/lib/galaxy/tools/parameters.py +++ b/lib/galaxy/tools/parameters.py @@ -746,7 +746,8 @@ class DataToolParameter( ToolParameter ): if options is None: self.options = None else: - self.options = dynamic_options.DynamicOptions( options, parameter_type = type( self ) ) + self.options = dynamic_options.DynamicOptions( options, parameter_type=type( self ) ) + self.is_dynamic = self.options is not None def get_html_field( self, trans=None, value=None, other_values={} ): filter_key = filter_value = None @@ -756,7 +757,8 @@ class DataToolParameter( ToolParameter ): history = trans.history assert history is not None, "DataToolParameter requires a history" if value is not None: - if type( value ) != list: value = [ value ] + if type( value ) != list: + value = [ value ] field = form_builder.SelectField( self.name, self.multiple, None, self.refresh_on_change ) # CRUCIAL: the dataset_collector function needs to be local to DataToolParameter.get_html_field() def dataset_collector( datasets, parent_hid ): @@ -775,13 +777,11 @@ class DataToolParameter( ToolParameter ): dataset_collector( history.datasets, None ) some_data = bool( field.options ) if some_data: - if value is None: + if value is None or len( field.options ) == 1: # Ensure that the last item is always selected - a, b, c = field.options[-1]; field.options[-1] = a, b, True - else: - # HACK: we should just disable the form or something - field.add_option( "no data has the proper type", '' ) - if self.optional == True: + a, b, c = field.options[-1] + field.options[-1] = a, b, True + elif self.optional: field.add_option( "Selection is Optional", 'None', True ) return field @@ -823,7 +823,7 @@ class DataToolParameter( ToolParameter ): if trans.workflow_building_mode: return None if not value: - raise ValueError( "A data of the appropriate type is required" ) + raise ValueError( "History does not include a dataset of the required format / build" ) if value in [None, "None"]: temp_data = trans.app.model.Dataset( extension = 'data' ) temp_data.state = temp_data.states.OK @@ -864,6 +864,15 @@ class DataToolParameter( ToolParameter ): else: return "No dataset" + def get_dependencies( self ): + """ + Get the *names* of the other params this param depends on. + """ + if self.options: + return self.options.get_dependency_names() + else: + return [] + # class RawToolParameter( ToolParameter ): # """ # Completely nondescript parameter, HTML representation is provided as text diff --git a/lib/galaxy/tools/validation.py b/lib/galaxy/tools/validation.py index 6db57381a9e..f608913a2e8 100644 --- a/lib/galaxy/tools/validation.py +++ b/lib/galaxy/tools/validation.py @@ -146,9 +146,35 @@ class MetadataValidator( Validator ): """ Validator that checks for missing metadata """ + def __init__( self, message=None ): + self.message = message + @classmethod + def from_element( cls, elem ): + return cls( elem.get( 'message', None ) ) def validate( self, value, history=None ): if value and value.missing_meta(): - raise ValueError( "Metadata missing, click the pencil icon in the history item to edit / save the metadata attributes" ) + if self.message is None: + self.message = "Metadata missing, click the pencil icon in the history item to edit / save the metadata attributes" + raise ValueError( self.message ) + +class UnspecifiedBuildValidator( Validator ): + """ + Validator that checks for missing metadata + """ + def __init__( self, message=None ): + self.message = message + @classmethod + def from_element( cls, elem ): + return cls( elem.get( 'message', None ) ) + def validate( self, value, history=None ): + if value: + dbkey = value.metadata.dbkey + if isinstance( dbkey, list ): + dbkey = dbkey[0] + if dbkey == '?': + if self.message is None: + self.message = "Unspecified genome build, click the pencil icon in the history item to set the genome build" + raise ValueError( self.message ) class MetadataInFileColumnValidator( Validator ): """ @@ -185,6 +211,7 @@ validator_types = dict( expression=ExpressionValidator, in_range=InRangeValidator, length=LengthValidator, metadata=MetadataValidator, + unspecified_build=UnspecifiedBuildValidator, dataset_metadata_in_file=MetadataInFileColumnValidator ) def get_suite(): diff --git a/tools/encode/random_intervals1/1.0.0/random_intervals.xml b/tools/encode/random_intervals1/1.0.0/random_intervals.xml index 36420158774..3278de9d3bd 100644 --- a/tools/encode/random_intervals1/1.0.0/random_intervals.xml +++ b/tools/encode/random_intervals1/1.0.0/random_intervals.xml @@ -2,7 +2,9 @@ create a random set of intervals random_intervals_no_bits.py $regions $input2 $input1 $out_file1 $input2_chromCol $input2_startCol $input2_endCol $input1_chromCol $input1_startCol $input1_endCol $input1_strandCol $use_mask $strand_overlaps - + + + diff --git a/tools/extract/Extract_blastz_alignments1/1.0.0/extractAxt_wrapper.xml b/tools/extract/Extract_blastz_alignments1/1.0.0/extractAxt_wrapper.xml index a52912a0b48..a623d951659 100644 --- a/tools/extract/Extract_blastz_alignments1/1.0.0/extractAxt_wrapper.xml +++ b/tools/extract/Extract_blastz_alignments1/1.0.0/extractAxt_wrapper.xml @@ -4,6 +4,7 @@ + diff --git a/tools/extract/liftOver1/1.0.0/liftOver_wrapper.xml b/tools/extract/liftOver1/1.0.0/liftOver_wrapper.xml index 6d266672b69..5699397b02a 100644 --- a/tools/extract/liftOver1/1.0.0/liftOver_wrapper.xml +++ b/tools/extract/liftOver1/1.0.0/liftOver_wrapper.xml @@ -2,7 +2,9 @@ between assemblies and genomes liftOver_wrapper.py $input "$out_file1" "$out_file2" $dbkey $to_dbkey - + + + diff --git a/tools/extract/phastOdds/phastOdds_for_intervals/1.0.0/phastOdds_tool.xml b/tools/extract/phastOdds/phastOdds_for_intervals/1.0.0/phastOdds_tool.xml index 7587de985d1..2032189fdec 100644 --- a/tools/extract/phastOdds/phastOdds_for_intervals/1.0.0/phastOdds_tool.xml +++ b/tools/extract/phastOdds/phastOdds_for_intervals/1.0.0/phastOdds_tool.xml @@ -2,7 +2,9 @@ for each interval get_scores_galaxy.py $per_col ${score_file}.h5 ${score_file}.mapping.bed $input $output $input_chromCol $input_startCol $input_endCol - + + + diff --git a/tools/maf/GeneBed_Maf_Fasta2/1.0.0/genebed_maf_to_fasta.xml b/tools/maf/GeneBed_Maf_Fasta2/1.0.0/genebed_maf_to_fasta.xml index d42ddd9457e..b3b4672bc91 100644 --- a/tools/maf/GeneBed_Maf_Fasta2/1.0.0/genebed_maf_to_fasta.xml +++ b/tools/maf/GeneBed_Maf_Fasta2/1.0.0/genebed_maf_to_fasta.xml @@ -5,7 +5,9 @@ #end if - + + + diff --git a/tools/maf/Interval2Maf1/1.0.0/interval2maf.xml b/tools/maf/Interval2Maf1/1.0.0/interval2maf.xml index c37efe31496..c27343dfc08 100644 --- a/tools/maf/Interval2Maf1/1.0.0/interval2maf.xml +++ b/tools/maf/Interval2Maf1/1.0.0/interval2maf.xml @@ -6,7 +6,9 @@ #end if - + + + diff --git a/tools/maf/Interval2Maf_pairwise1/1.0.0/interval2maf_pairwise.xml b/tools/maf/Interval2Maf_pairwise1/1.0.0/interval2maf_pairwise.xml index 9ce61776274..684d832d5b5 100644 --- a/tools/maf/Interval2Maf_pairwise1/1.0.0/interval2maf_pairwise.xml +++ b/tools/maf/Interval2Maf_pairwise1/1.0.0/interval2maf_pairwise.xml @@ -2,7 +2,9 @@ given a set of genomic intervals interval2maf.py --dbkey=$input1_dbkey --chromCol=$input1_chromCol --startCol=$input1_startCol --endCol=$input1_endCol --strandCol=$input1_strandCol --mafType=$mafType --interval_file=$input1 --output_file=$out_file1 --indexLocation=/depot/data2/galaxy/maf_pairwise.loc - + + + diff --git a/tools/maf/Interval_Maf_Merged_Fasta2/1.0.0/interval_maf_to_merged_fasta.xml b/tools/maf/Interval_Maf_Merged_Fasta2/1.0.0/interval_maf_to_merged_fasta.xml index d035bf98820..d5b00def5f1 100644 --- a/tools/maf/Interval_Maf_Merged_Fasta2/1.0.0/interval_maf_to_merged_fasta.xml +++ b/tools/maf/Interval_Maf_Merged_Fasta2/1.0.0/interval_maf_to_merged_fasta.xml @@ -6,7 +6,9 @@ - + + + diff --git a/tools/maf/maf_stats1/1.0.0/maf_stats.xml b/tools/maf/maf_stats1/1.0.0/maf_stats.xml index 712cb8b766a..a0c282cde05 100644 --- a/tools/maf/maf_stats1/1.0.0/maf_stats.xml +++ b/tools/maf/maf_stats1/1.0.0/maf_stats.xml @@ -9,7 +9,9 @@ #end if - + + + diff --git a/tools/stats/aggregate_scores_in_intervals2/1.1.0/aggregate_binned_scores_in_intervals.xml b/tools/stats/aggregate_scores_in_intervals2/1.1.0/aggregate_binned_scores_in_intervals.xml index 221c551d988..9d1ec13e971 100644 --- a/tools/stats/aggregate_scores_in_intervals2/1.1.0/aggregate_binned_scores_in_intervals.xml +++ b/tools/stats/aggregate_scores_in_intervals2/1.1.0/aggregate_binned_scores_in_intervals.xml @@ -6,7 +6,9 @@ #end if - + + +