add validation for collection parameters

This commit is contained in:
Matthias Bernt
2021-01-06 16:11:16 +01:00
parent 351ceb8abe
commit 4343014792
2 changed files with 107 additions and 28 deletions
+50 -12
View File
@@ -1619,6 +1619,18 @@ class BaseDataToolParameter(ToolParameter):
def __init__(self, tool, input_source, trans):
super().__init__(tool, input_source)
self.min = input_source.get('min')
self.max = input_source.get('max')
if self.min:
try:
self.min = int(self.min)
except ValueError:
raise ParameterValueError("attribute 'min' must be an integer", self.name)
if self.max:
try:
self.max = int(self.max)
except ValueError:
raise ParameterValueError("attribute 'max' must be an integer", self.name)
self.refresh_on_change = True
# Find datatypes_registry
if self.tool is None:
@@ -1770,18 +1782,6 @@ class DataToolParameter(BaseDataToolParameter):
self.validators.append(validation.MetadataValidator())
self._parse_formats(trans, input_source)
self.multiple = input_source.get_bool('multiple', False)
self.min = input_source.get('min')
self.max = input_source.get('max')
if self.min:
try:
self.min = int(self.min)
except ValueError:
raise ParameterValueError("attribute 'min' must be an integer", self.name)
if self.max:
try:
self.max = int(self.max)
except ValueError:
raise ParameterValueError("attribute 'max' must be an integer", self.name)
if not self.multiple and (self.min is not None):
raise ParameterValueError("cannot specify 'min' property on single data parameter. Set multiple=\"true\" to enable this option", self.name)
if not self.multiple and (self.max is not None):
@@ -2176,6 +2176,44 @@ class DataCollectionToolParameter(BaseDataToolParameter):
return display_text
def validate(self, value, trans=None):
dataset_count = 0
log.error("DataCollectionToolParameter validate %s %s" % (self.name, value))
for validator in self.validators:
def do_validate(v):
if validator.requires_dataset_metadata and v and hasattr(v, 'dataset') and v.dataset.state != galaxy.model.Dataset.states.OK:
return
else:
validator.validate(v, trans)
if not isinstance(value, list):
value = [value]
# TODO this code would be needed instead if multiple = true is possible
# if value and self.multiple:
# if not isinstance(value, list):
# value = [value]
# else:
# value = [value]
for v in value:
if isinstance(v, galaxy.model.HistoryDatasetCollectionAssociation):
for dataset_instance in v.collection.dataset_instances:
dataset_count += 1
do_validate(dataset_instance)
elif isinstance(v, galaxy.model.DatasetCollectionElement):
for dataset_instance in v.child_collection.dataset_instances:
dataset_count += 1
do_validate(dataset_instance)
else:
if value: # this covers the case of optional="true"
dataset_count += 1
do_validate(v)
if self.min is not None:
if self.min > dataset_count:
raise ValueError("At least %d datasets are required for %s" % (self.min, self.name))
if self.max is not None:
if self.max < dataset_count:
raise ValueError("At most %d datasets are required for %s" % (self.max, self.name))
return True # TODO
def to_dict(self, trans, other_values=None):
@@ -1,17 +1,58 @@
<tool id="validation_empty_dataset" name="validation_empty_dataset" version="1.0.0">
<command><![CDATA[
echo 'Hello World' > out1
]]></command>
<inputs>
<param name="input1" type="data" label="non-empty input">
<validator type="empty_dataset" />
</param>
</inputs>
<outputs>
<data name="out_file1" from_work_dir="out1" />
</outputs>
<tests>
</tests>
<help>
</help>
<tool id="validation_empty_dataset" name="validation_empty_dataset">
<command>
echo "Hello World";
</command>
<inputs>
<param name="input1" type="data" optional="true" label="non-empty input">
<validator type="empty_dataset" />
</param>
<param name="input_mult" type="data" multiple="true" optional="true" label="non-empty input">
<validator type="empty_dataset" />
</param>
<param name="input_collection" type="data_collection" collection_type="list:paired" optional="true" label="non-empty input">
<validator type="empty_dataset" />
</param>
</inputs>
<outputs>
<data name="out_file1" from_work_dir="out1" />
</outputs>
<tests>
<test expect_failure="true">
<param name="input1" value="empty.txt"/>
</test>
<test expect_failure="true">
<param name="input_mult" value="1.bed,empty.txt"/>
</test>
<test expect_failure="true">
<param name="input_collection">
<collection type="list:paired">
<element name="i1">
<collection type="paired">
<element name="forward" value="1.bed" />
<element name="reverse" value="empty.txt" />
</collection>
</element>
</collection>
</param>
</test>
<test>
<param name="input1" value="1.bed"/>
<param name="input_mult" value="1.bed,2.bed"/>
<param name="input_collection">
<collection type="list:paired">
<element name="i1">
<collection type="paired">
<element name="forward" value="1.bed" />
<element name="reverse" value="2.bed" />
</collection>
</element>
</collection>
</param>
<assert_stdout>
<has_text text="Hello World"/>
</assert_stdout>
</test>
</tests>
<help>
</help>
</tool>