コード例 #1
0
ファイル: jobs.py プロジェクト: tianyabeef/gutMicrobiome
 def shadowed_path(self, f):
     """ Get the shadowed path of IOFile f. """
     if not self.shadow_dir:
         return f
     f_ = IOFile(os.path.join(self.shadow_dir, f), self.rule)
     f_.clone_flags(f)
     return f_
コード例 #2
0
ファイル: jobs.py プロジェクト: vineetbansal/snakemake
 def shadowed_path(self, f):
     """ Get the shadowed path of IOFile f. """
     if not self.shadow_dir:
         return f
     f_ = IOFile(os.path.join(self.shadow_dir, f), self.rule)
     f_.clone_flags(f)
     return f_
コード例 #3
0
 def update_wildcard_constraints(self):
     for i in range(len(self.output)):
         item = self.output[i]
         newitem = IOFile(self._update_item_wildcard_constraints(
             self.output[i]), rule=self)
         # the updated item has to have the same flags
         newitem.clone_flags(item)
         self.output[i] = newitem
コード例 #4
0
ファイル: jobs.py プロジェクト: vineetbansal/snakemake
 def expanded_output(self):
     """ Iterate over output files while dynamic output is expanded. """
     for f, f_ in zip(self.output, self.rule.output):
         if f in self.dynamic_output:
             expansion = self.expand_dynamic(f_)
             if not expansion:
                 yield f_
             for f, _ in expansion:
                 file_to_yield = IOFile(f, self.rule)
                 file_to_yield.clone_flags(f_)
                 yield file_to_yield
         else:
             yield f
コード例 #5
0
ファイル: jobs.py プロジェクト: tianyabeef/gutMicrobiome
 def expanded_output(self):
     """ Iterate over output files while dynamic output is expanded. """
     for f, f_ in zip(self.output, self.rule.output):
         if f in self.dynamic_output:
             expansion = self.expand_dynamic(f_)
             if not expansion:
                 yield f_
             for f, _ in expansion:
                 file_to_yield = IOFile(f, self.rule)
                 file_to_yield.clone_flags(f_)
                 yield file_to_yield
         else:
             yield f
コード例 #6
0
ファイル: rules.py プロジェクト: mw55309/snakemake
    def dynamic_branch(self, wildcards, input=True):
        def get_io(rule):
            return ((rule.input, rule.dynamic_input) if input else
                    (rule.output, rule.dynamic_output))

        def partially_expand(f, wildcards):
            """Expand the wildcards in f from the ones present in wildcards

            This is done by replacing all wildcard delimiters by `{{` or `}}`
            that are not in `wildcards.keys()`.
            """
            # perform the partial expansion from f's string representation
            s = str(f).replace("{", "{{").replace("}", "}}")
            for key in wildcards.keys():
                s = s.replace("{{{{{}}}}}".format(key), "{{{}}}".format(key))
            # build result
            anno_s = AnnotatedString(s)
            anno_s.flags = f.flags
            return IOFile(anno_s, f.rule)

        io, dynamic_io = get_io(self)

        branch = Rule(self)
        io_, dynamic_io_ = get_io(branch)

        expansion = collections.defaultdict(list)
        for i, f in enumerate(io):
            if f in dynamic_io:
                f = partially_expand(f, wildcards)
                try:
                    for e in reversed(expand(str(f), zip, **wildcards)):
                        # need to clone the flags so intermediate
                        # dynamic remote file paths are expanded and
                        # removed appropriately
                        ioFile = IOFile(e, rule=branch)
                        ioFile.clone_flags(f)
                        expansion[i].append(ioFile)
                except KeyError:
                    return None

        # replace the dynamic files with the expanded files
        replacements = [(i, io[i], e)
                        for i, e in reversed(list(expansion.items()))]
        for i, old, exp in replacements:
            dynamic_io_.remove(old)
            io_._insert_items(i, exp)

        if not input:
            for i, old, exp in replacements:
                if old in branch.temp_output:
                    branch.temp_output.discard(old)
                    branch.temp_output.update(exp)
                if old in branch.protected_output:
                    branch.protected_output.discard(old)
                    branch.protected_output.update(exp)
                if old in branch.touch_output:
                    branch.touch_output.discard(old)
                    branch.touch_output.update(exp)

            branch.wildcard_names.clear()
            non_dynamic_wildcards = dict((name, values[0])
                                         for name, values in wildcards.items()
                                         if len(set(values)) == 1)
            # TODO have a look into how to concretize dependencies here
            branch._input, _, branch.dependencies = branch.expand_input(
                non_dynamic_wildcards)
            branch._output, _ = branch.expand_output(non_dynamic_wildcards)

            resources = branch.expand_resources(non_dynamic_wildcards,
                                                branch._input, 1)
            branch._params = branch.expand_params(
                non_dynamic_wildcards,
                branch._input,
                branch._output,
                resources,
                omit_callable=True,
            )
            branch.resources = dict(resources.items())

            branch._log = branch.expand_log(non_dynamic_wildcards)
            branch._benchmark = branch.expand_benchmark(non_dynamic_wildcards)
            branch._conda_env = branch.expand_conda_env(non_dynamic_wildcards)
            return branch, non_dynamic_wildcards
        return branch
コード例 #7
0
ファイル: rules.py プロジェクト: tianyabeef/gutMicrobiome
    def dynamic_branch(self, wildcards, input=True):
        def get_io(rule):
            return (rule.input, rule.dynamic_input) if input else (
                rule.output, rule.dynamic_output
            )

        def partially_expand(f, wildcards):
            """Expand the wildcards in f from the ones present in wildcards

            This is done by replacing all wildcard delimiters by `{{` or `}}`
            that are not in `wildcards.keys()`.
            """
            # perform the partial expansion from f's string representation
            s = str(f).replace('{', '{{').replace('}', '}}')
            for key in wildcards.keys():
                s = s.replace('{{{{{}}}}}'.format(key),
                              '{{{}}}'.format(key))
            # build result
            anno_s = AnnotatedString(s)
            anno_s.flags = f.flags
            return IOFile(anno_s, f.rule)

        io, dynamic_io = get_io(self)

        branch = Rule(self)
        io_, dynamic_io_ = get_io(branch)

        expansion = defaultdict(list)
        for i, f in enumerate(io):
            if f in dynamic_io:
                f = partially_expand(f, wildcards)
                try:
                    for e in reversed(expand(f, zip, **wildcards)):
                        # need to clone the flags so intermediate
                        # dynamic remote file paths are expanded and
                        # removed appropriately
                        ioFile = IOFile(e, rule=branch)
                        ioFile.clone_flags(f)
                        expansion[i].append(ioFile)
                except KeyError:
                    return None

        # replace the dynamic files with the expanded files
        replacements = [(i, io[i], e)
                        for i, e in reversed(list(expansion.items()))]
        for i, old, exp in replacements:
            dynamic_io_.remove(old)
            io_.insert_items(i, exp)

        if not input:
            for i, old, exp in replacements:
                if old in branch.temp_output:
                    branch.temp_output.discard(old)
                    branch.temp_output.update(exp)
                if old in branch.protected_output:
                    branch.protected_output.discard(old)
                    branch.protected_output.update(exp)
                if old in branch.touch_output:
                    branch.touch_output.discard(old)
                    branch.touch_output.update(exp)

            branch.wildcard_names.clear()
            non_dynamic_wildcards = dict((name, values[0])
                                         for name, values in wildcards.items()
                                         if len(set(values)) == 1)
            # TODO have a look into how to concretize dependencies here
            (branch._input, branch._output, branch._params, branch._log,
             branch._benchmark, _, branch.dependencies
             ) = branch.expand_wildcards(wildcards=non_dynamic_wildcards)
            return branch, non_dynamic_wildcards
        return branch