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 intervalsrandom_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 genomesliftOver_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 intervalget_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 intervalsinterval2maf.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
-
+
+
+