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