Source code for snakemake.template_rendering

from abc import ABC, abstractmethod

from snakemake.exceptions import WorkflowError


[docs] class TemplateRenderer(ABC):
[docs] def __init__(self, input, output, params, wildcards, config): if len(output) != 1: raise ValueError( "More than one output file specified for template_engine rule." ) if len(input) != 1: if "template" not in input.keys(): raise ValueError( "More than one input file specified for template engine rule, but no " "input file named as 'template'." ) else: self.input_file = input.template else: self.input_file = input[0] self.input = input self.output_file = output[0] self.params = params self.wildcards = wildcards self.config = config
@property def variables(self): return { "params": self.params, "wildcards": self.wildcards, "config": self.config, "input": self.input, } @abstractmethod def render(self): ...
[docs] def render_template(engine, input, output, params, wildcards, config, rule): try: if engine == "yte": from snakemake.template_rendering.yte import YteRenderer return YteRenderer(input, output, params, wildcards, config).render() elif engine == "jinja2": from snakemake.template_rendering.jinja2 import Jinja2Renderer return Jinja2Renderer(input, output, params, wildcards, config).render() else: raise WorkflowError( f"Unsupported template engine {engine} in rule {rule}. " "So far, only yte and jinja2 are supported." ) except Exception as e: raise WorkflowError(f"Error rendering template in rule {rule}.", e)