Esempio n. 1
0
 def _apply_wildcards(newitems,
                      olditems,
                      wildcards,
                      wildcards_obj,
                      concretize=apply_wildcards,
                      ruleio=None):
     for name, item in olditems.allitems():
         start = len(newitems)
         if callable(item):
             item = item(wildcards_obj)
             if not_iterable(item):
                 item = [item]
             for item_ in item:
                 if not isinstance(item_, str):
                     raise RuleException(
                         "Input function did not return str or list of str.",
                         rule=self)
                 concrete = concretize(item_, wildcards)
                 newitems.append(concrete)
                 if ruleio is not None:
                     ruleio[concrete] = item_
         else:
             if not_iterable(item):
                 item = [item]
             for item_ in item:
                 concrete = concretize(item_, wildcards)
                 newitems.append(concrete)
                 if ruleio is not None:
                     ruleio[concrete] = item_
         if name:
             newitems.set_name(name, start, end=len(newitems))
Esempio n. 2
0
 def _apply_wildcards(
     newitems,
     olditems,
     wildcards,
     wildcards_obj,
     concretize = apply_wildcards,
     ruleio = None):
     for name, item in olditems.allitems():
         start = len(newitems)
         if callable(item):
             item = item(wildcards_obj)
             if not_iterable(item):
                 item = [item]
             for item_ in item:
                 if not isinstance(item_, str):
                     raise RuleException("Input function did not return str or list of str.", rule=self)
                 concrete = concretize(item_, wildcards)
                 newitems.append(concrete)
                 if ruleio is not None:
                     ruleio[concrete] = item_
         else:
             if not_iterable(item):
                 item = [item]
             for item_ in item:
                 concrete = concretize(item_, wildcards)
                 newitems.append(concrete)
                 if ruleio is not None:
                     ruleio[concrete] = item_
         if name:
             newitems.set_name(name, start, end=len(newitems))
Esempio n. 3
0
 def target(self, paths):
     if not_iterable(paths):
         path = paths
         path = path if os.path.isabs(path) else os.path.join(
             self.workdir, path)
         return flag(path, "subworkflow", self)
     return [self.target(path) for path in paths]
Esempio n. 4
0
    def _apply_wildcards(self, newitems, olditems, wildcards,
                         concretize=apply_wildcards,
                         check_return_type=True,
                         mapping=None,
                         no_flattening=False,
                         aux_params=None):
        if aux_params is None:
            aux_params = dict()
        for name, item in olditems.allitems():
            start = len(newitems)
            is_iterable = True

            if callable(item):
                item = self.apply_input_function(item, wildcards, **aux_params)

            if not_iterable(item) or no_flattening:
                item = [item]
                is_iterable = False
            for item_ in item:
                if check_return_type and not isinstance(item_, str):
                    raise WorkflowError("Function did not return str or list "
                                        "of str.", rule=self)
                concrete = concretize(item_, wildcards)
                newitems.append(concrete)
                if mapping is not None:
                    mapping[concrete] = item_

            if name:
                newitems.set_name(
                    name, start,
                    end=len(newitems) if is_iterable else None)
Esempio n. 5
0
        def _apply_wildcards(newitems,
                             olditems,
                             wildcards,
                             wildcards_obj,
                             concretize=apply_wildcards,
                             check_return_type=check_string_type,
                             ruleio=None,
                             no_flattening=False):
            for name, item in olditems.allitems():
                start = len(newitems)
                is_iterable = True

                if callable(item):
                    try:
                        item = item(wildcards_obj)
                    except (Exception, BaseException) as e:
                        raise InputFunctionException(e,
                                                     rule=self,
                                                     wildcards=wildcards)

                if not_iterable(item) or no_flattening:
                    item = [item]
                    is_iterable = False
                for item_ in item:
                    check_return_type(item_)
                    concrete = concretize(item_, wildcards)
                    newitems.append(concrete)
                    if ruleio is not None:
                        ruleio[concrete] = item_

                if name:
                    newitems.set_name(
                        name,
                        start,
                        end=len(newitems) if is_iterable else None)
Esempio n. 6
0
def format_cli_pos_arg(value, quote=True):
    if isinstance(value, dict):
        return join_cli_args(repr(f"{key}={val}") for key, val in value.items())
    elif not_iterable(value):
        return repr(value)
    else:
        return join_cli_args(repr(v) for v in value)
Esempio n. 7
0
        def _apply_wildcards(newitems, olditems, wildcards, wildcards_obj,
                             concretize=apply_wildcards,
                             check_return_type=check_string_type,
                             ruleio=None,
                             no_flattening=False):
            for name, item in olditems.allitems():
                start = len(newitems)
                is_iterable = True

                if callable(item):
                    try:
                        item = item(wildcards_obj)
                    except (Exception, BaseException) as e:
                        raise InputFunctionException(e, rule=self, wildcards=wildcards)

                if not_iterable(item) or no_flattening:
                    item = [item]
                    is_iterable = False
                for item_ in item:
                    check_return_type(item_)
                    concrete = concretize(item_, wildcards)
                    newitems.append(concrete)
                    if ruleio is not None:
                        ruleio[concrete] = item_

                if name:
                    newitems.set_name(
                        name, start,
                        end=len(newitems) if is_iterable else None)
Esempio n. 8
0
    def _apply_wildcards(
        self,
        newitems,
        olditems,
        wildcards,
        concretize=None,
        check_return_type=True,
        omit_callable=False,
        mapping=None,
        no_flattening=False,
        aux_params=None,
        apply_path_modifier=True,
        property=None,
        incomplete_checkpoint_func=lambda e: None,
        allow_unpack=True,
    ):
        if aux_params is None:
            aux_params = dict()
        for name, item in olditems._allitems():
            start = len(newitems)
            is_unpack = is_flagged(item, "unpack")
            _is_callable = is_callable(item)

            if _is_callable:
                if omit_callable:
                    continue
                item, incomplete = self.apply_input_function(
                    item,
                    wildcards,
                    incomplete_checkpoint_func=incomplete_checkpoint_func,
                    is_unpack=is_unpack,
                    **aux_params)
                if apply_path_modifier:
                    item = self.apply_path_modifier(item, property=property)

            if is_unpack and not incomplete:
                if not allow_unpack:
                    raise WorkflowError(
                        "unpack() is not allowed with params. "
                        "Simply return a dictionary which can be directly ."
                        "used, e.g. via {params[mykey]}.")
                # Sanity checks before interpreting unpack()
                if not isinstance(item, (list, dict)):
                    raise WorkflowError(
                        "Can only use unpack() on list and dict", rule=self)
                if name:
                    raise WorkflowError(
                        "Cannot combine named input file with unpack()",
                        rule=self)
                # Allow streamlined code with/without unpack
                if isinstance(item, list):
                    pairs = zip([None] * len(item), item)
                else:
                    assert isinstance(item, dict)
                    pairs = item.items()
            else:
                pairs = [(name, item)]

            for name, item in pairs:
                is_iterable = True
                if not_iterable(item) or no_flattening:
                    item = [item]
                    is_iterable = False
                for item_ in item:
                    if (check_return_type and not isinstance(item_, str)
                            and not isinstance(item_, Path)):
                        raise WorkflowError(
                            "Function did not return str or list "
                            "of str.",
                            rule=self)
                    concrete = concretize(item_, wildcards, _is_callable)
                    newitems.append(concrete)
                    if mapping is not None:
                        mapping[concrete] = item_

                if name:
                    newitems._set_name(
                        name,
                        start,
                        end=len(newitems) if is_iterable else None)
                    start = len(newitems)
Esempio n. 9
0
 def target(self, paths):
     if not_iterable(paths):
         return flag(os.path.join(self.workdir, paths), "subworkflow", self)
     return [self.target(path) for path in paths]
Esempio n. 10
0
    def _apply_wildcards(self,
                         newitems,
                         olditems,
                         wildcards,
                         concretize=apply_wildcards,
                         check_return_type=True,
                         omit_callable=False,
                         mapping=None,
                         no_flattening=False,
                         aux_params=None,
                         apply_default_remote=True):
        if aux_params is None:
            aux_params = dict()
        for name, item in olditems.allitems():
            start = len(newitems)
            is_iterable = True
            is_unpack = is_flagged(item, "unpack")

            if is_callable(item):
                if omit_callable:
                    continue
                item = self.apply_input_function(item, wildcards, **aux_params)
                if apply_default_remote:
                    item = self.apply_default_remote(item)

            if is_unpack:
                # Sanity checks before interpreting unpack()
                if not isinstance(item, (list, dict)):
                    raise WorkflowError(
                        "Can only use unpack() on list and dict", rule=self)
                if name:
                    raise WorkflowError(
                        "Cannot combine named input file with unpack()",
                        rule=self)
                # Allow streamlined code with/without unpack
                if isinstance(item, list):
                    pairs = zip([None] * len(item), item)
                else:
                    assert isinstance(item, dict)
                    pairs = item.items()
            else:
                pairs = [(name, item)]

            for name, item in pairs:
                if not_iterable(item) or no_flattening:
                    item = [item]
                    is_iterable = False
                for item_ in item:
                    if check_return_type and not isinstance(item_, str):
                        raise WorkflowError(
                            "Function did not return str or list "
                            "of str.",
                            rule=self)
                    concrete = concretize(item_, wildcards)
                    newitems.append(concrete)
                    if mapping is not None:
                        mapping[concrete] = item_

                if name:
                    newitems.set_name(
                        name,
                        start,
                        end=len(newitems) if is_iterable else None)
                    start = len(newitems)
Esempio n. 11
0
 def target(self, paths):
     if not_iterable(paths):
         return flag(os.path.join(self.workdir, paths), "subworkflow", self)
     return [self.target(path) for path in paths]