v0.143.0
 1import jinja2
 2from opentelemetry import trace
 3from opentelemetry.semconv.attributes.code_attributes import (
 4    CODE_FUNCTION_NAME,
 5)
 6
 7from .jinja import environment
 8
 9tracer = trace.get_tracer("plain.templates")
10
11
12class TemplateFileMissing(Exception):
13    def __str__(self) -> str:
14        if self.args:
15            return f"Template file {self.args[0]} not found"
16        else:
17            return "Template file not found"
18
19
20class Template:
21    def __init__(self, filename: str) -> None:
22        self.filename = filename
23
24        try:
25            self._jinja_template = environment.get_template(filename)
26        except jinja2.TemplateNotFound:
27            raise TemplateFileMissing(filename)
28
29    def render(self, context: dict) -> str:
30        with tracer.start_as_current_span(
31            f"render {self.filename}",
32            kind=trace.SpanKind.INTERNAL,
33            attributes={
34                CODE_FUNCTION_NAME: f"{self.__class__.__module__}.{self.__class__.__qualname__}.render",
35                "template.filename": self.filename,
36                "template.engine": "jinja2",
37            },
38        ):
39            result = self._jinja_template.render(context)
40            return result