def inputs_xml(self): predicate = self.spec.qiime_type.predicate if predicate is not None and predicate.name == 'Choices': param = make_select(self.name, self.spec, predicate.template.choices) else: param = XMLNode('param', name=self.name, type='text') if self.spec.has_default(): if self.spec.default is None: self.add_help(param) self.add_label(param) param = make_optional(param) else: param.set('value', self.spec.default) else: param.append( XMLNode( # validator type='length' fails on empty input 'validator', 'value is not None and len(value) > 0', type='expression', message='Please verify this parameter.')) self.add_help(param) self.add_label(param) return param
def make_select(name, spec, choices, display_func=str): param = XMLNode('param', name=name, type='select') default = None if spec.has_default(): if spec.default is None: param.append(XMLNode('option', 'None (Use default behavior)', value=galaxy_esc(None), selected='true')) else: default = spec.default elif len(choices) > 1: # A validator for this is added a few lines down (after options) # this is done to force the XML structure to look right param.append(XMLNode('option', 'Selection required', value=galaxy_esc(None))) if len(choices) < 5: param.set('display', 'radio') for choice in choices: option = XMLNode('option', display_func(choice), value=galaxy_esc(choice)) if choice == default: option.set('selected', 'true') param.append(option) if not spec.has_default() and len(choices) > 1: param.append(XMLNode( 'validator', f'value != {repr(galaxy_esc(None))}', type='expression', message='Please verify this parameter.')) return param
def inputs_xml(self): predicate = self.spec.qiime_type.predicate if predicate is not None and predicate.name == 'Choices': param = make_select(self.name, self.spec, predicate.template.choices) else: param = XMLNode('param', name=self.name, type='text') # sanitizer prevents default replacement with 'X' for some # punctuation characters. It appears that this sanitizing requires # an enumeration of valid characters, so supporting arbitrary # unicode will likely require a change to Galaxy itself. sanitizer = XMLNode('sanitizer') valid = XMLNode('valid', initial='string.printable') sanitizer.append(valid) param.append(sanitizer) if self.spec.has_default(): if self.spec.default is None: self.add_help(param) self.add_label(param) param = make_optional(param) else: param.set('value', self.spec.default) else: param.append(XMLNode( # validator type='length' fails on empty input 'validator', 'value is not None and len(value) > 0', type='expression', message='Please verify this parameter.')) self.add_help(param) self.add_label(param) return param
def inputs_xml(self): root = XMLNode('repeat', name=self.name, title=f'{self.name}: {str(self.spec.qiime_type)}') self.add_help(root) if not self.spec.has_default(): root.set('min', '1') conditional = XMLNode('conditional', name=galaxy_ui_var(tag='conditional', name=self.name)) select = XMLNode('param', type='select', name='type', label=f'{self.name}: {str(self.spec.qiime_type)}') select.append(XMLNode('option', 'Metadata from TSV', value='tsv', selected='true')) select.append(XMLNode('option', 'Metadata from Artifact', value='qza')) conditional.append(select) when_tsv = XMLNode('when', value='tsv') tsv = XMLNode('param', type='data', format='tabular,qiime2.tabular', name='source', label='Metadata Source') when_tsv.append(tsv) conditional.append(when_tsv) when_artifact = XMLNode('when', value='qza') artifact = XMLNode('param', type='data', format='qza', name='source', label='Metadata Source') when_artifact.append(artifact) conditional.append(when_artifact) root.append(conditional) return root
def inputs_xml(self): root = XMLNode('repeat', name=self.name, title=f'{self.name}: {str(self.spec.qiime_type)}') self.add_help(root) if not self.spec.has_default(): root.set('min', '1') to_repeat = identify_arg_case('element', self.inner_spec, self.arg) root.append(to_repeat.inputs_xml()) return root
def inputs_xml(self): param = XMLNode('param', type='data', format='qza', name=self.name) self.add_help(param) self.add_default(param) self.add_label(param) if self.multiple: param.set('multiple', 'true') options = XMLNode('options', options_filter_attribute='metadata.semantic_type') for t in self.qiime_type: options.append(XMLNode('filter', type='add_value', value=repr(t))) param.append(options) if not self.multiple: param.append(self._make_validator()) return param
def inputs_xml(self): conditional = XMLNode('conditional', name=self.name) select = XMLNode('param', type='select', name='type', label=f'{self.name}: {str(self.spec.qiime_type)}') from_tsv = XMLNode('option', 'Metadata from TSV', value='tsv') if self.spec.has_default(): select.append(XMLNode('option', 'None (default)', value='none', selected='true')) conditional.append(XMLNode('when', value='none')) else: from_tsv.set('selected', 'true') select.append(from_tsv) select.append(XMLNode('option', 'Metadata from Artifact', value='qza')) conditional.append(select) when_tsv = XMLNode('when', value='tsv') tsv1 = XMLNode('param', type='data', format='tabular,qiime2.tabular', name='source', label='Metadata Source') tsv2 = XMLNode('param', type='data_column', use_header_names='true', data_ref='source', name='column', label='Column Name') tsv2.append(XMLNode('validator', 'value != "1"', type='expression', message='The first column cannot be selected (' 'they are IDs).')) when_tsv.append(tsv1) when_tsv.append(tsv2) conditional.append(when_tsv) when_artifact = XMLNode('when', value='qza') art1 = XMLNode('param', type='data', format='qza', name='source', label='Metadata Source') art2 = XMLNode('param', type='text', name='column', label='Column Name') art2.append(XMLNode('validator', type='empty_field')) when_artifact.append(art1) when_artifact.append(art2) conditional.append(when_artifact) self.add_help(select) return conditional
def inputs_xml(self): predicate = self.spec.qiime_type.predicate if (self.spec.has_default() and type(self.spec.default) is bool and (predicate is None or len(predicate.template.choices) == 2)): param = XMLNode('param', name=self.name, type='boolean', # Not super necessary, but makes it consistent for # testing and any dynamic references truevalue=galaxy_esc(True), falsevalue=galaxy_esc(False)) if self.spec.default is True: param.set('checked', 'true') else: choices = [True, False] if predicate is not None: choices = predicate.template.choices param = make_select(self.name, self.spec, choices, lambda x: 'Yes' if x else 'No') self.add_help(param) self.add_label(param) return param
def inputs_xml(self): param = XMLNode('param', name=self.name) self.add_type(param) self.add_help(param) self.add_default(param) self.add_label(param) if not self.spec.has_default(): # trick galaxy param.set('value', '') predicate = self.spec.qiime_type.predicate if predicate is not None: if predicate.name == 'Range': if self.spec.qiime_type.name == 'Float': self.add_range(param, predicate, 0.000001) else: self.add_range(param, predicate, 1) else: print(self.spec) raise NotImplementedError return param
def _add_data_ui(root, file_attr): name = XMLNode('param', type='text', name='name') if _guess_regex(file_attr.pathspec): name.set( 'help', 'Filename to import the data as. Must match' f' regex: {_regex_xml_escape(file_attr.pathspec)}') name.append( XMLNode('validator', file_attr.pathspec, type='regex', message='This filename doesn\'t match the regex.')) else: name.set( 'help', 'Filename to import the data as. You shouldn\'t need' ' to change this unless something is wrong.') name.set('value', file_attr.pathspec) root.append(name) root.append( XMLNode('param', type='data', name='data', help=_format_help_text(file_attr.format)))
def inputs_xml(self): base_types = [] for t in self.spec.qiime_type: if t.predicate is not None and is_union(t.predicate): for pred in t.predicate.unpack_union(): base_types.append(t.duplicate(predicate=pred)) else: base_types.append(t) to_add = [] for t in base_types: if ((t.name == "Str" and t.predicate is None) or t.name == 'Float' or t.name == 'Int'): to_add.append(t) root = None if to_add: root = XMLNode('conditional', name=galaxy_ui_var(tag='conditional', name=self.name)) select = XMLNode('param', type='select', name=galaxy_ui_var(tag='select')) root.append(select) else: select = XMLNode('param', type='select', name=self.name) choices = [] for t in base_types: if t.predicate is not None and t.predicate.name == 'Choices': choices.extend(t.predicate.template.choices) elif t.name == 'Bool': choices.extend([True, False]) display = None if not self.spec.has_default(): display = 'Selection required' elif self.spec.default is None: display = 'None (Use default behavior)' if display is not None: value = galaxy_esc(None) select.append( XMLNode('option', display, value=value, selected='true')) if root is not None: when = XMLNode('when', value=value) hidden = XMLNode('param', type='hidden', name=self.name, value=value) when.append(hidden) root.append(when) for choice in choices: value = galaxy_esc(choice) option = XMLNode('option', self._display_func(choice), value=value) if self.spec.has_default() and self.spec.default == choice: option.set('selected', 'true') select.append(option) if root is not None: when = XMLNode('when', value=value) hidden = XMLNode('param', type='hidden', name=self.name, value=value) when.append(hidden) root.append(when) default = self.spec.default # NOVALUE is fine for addition in to_add: value = galaxy_ui_var(value=galaxy_esc( # Galaxy will convert % to X internally and then complain # about a lack of matching cases, so we'll just do it now str(addition).replace('%', 'X'))) option = XMLNode('option', f'Provide a value ({addition})', value=value) select.append(option) when = XMLNode('when', value=value) dispatch = { 'Float': NumericCase, 'Int': NumericCase, 'Str': StrCase } try: ParamCase = dispatch[addition.name] except KeyError: raise NotImplementedError if default in addition: spec_default = default option.set('selected', 'true') else: spec_default = self.spec.NOVALUE new_spec = self.spec.duplicate(qiime_type=addition, default=spec_default) sub_ui = ParamCase(self.name, new_spec).inputs_xml() when.append(sub_ui) root.append(when) self.add_help(select) self.add_label(select) if not self.spec.has_default(): select.append( XMLNode('validator', f'value != {repr(galaxy_esc(None))}', type='expression', message='Please verify this parameter.')) if root is None: return select else: return root