Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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
Ejemplo n.º 7
0
    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
Ejemplo n.º 8
0
    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
Ejemplo n.º 9
0
    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
Ejemplo n.º 10
0
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)))
Ejemplo n.º 11
0
    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