Coverage for tarjinja/strfilter.py: 100%

29 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-09-05 14:24 +0000

1import re 

2import string 

3from logging import getLogger 

4 

5from .iface import Filter 

6 

7log = getLogger(__name__) 

8 

9 

10class TemplateFilter(Filter): 

11 pattern = string.Template.pattern 

12 

13 def render(self, s: str, vals: dict) -> str: 

14 return string.Template(s).substitute(**vals) 

15 

16 def var_names(self, s: str) -> list[str]: 

17 res = set() 

18 for i in self.pattern.finditer(s): 

19 v = i.group("braced") 

20 log.debug("found %s", v) 

21 if v is not None: 

22 res.add(v) 

23 log.debug("vars: %s", res) 

24 return res 

25 

26 

27class FormatFilter(TemplateFilter): 

28 pattern = re.compile("(\\{\\{)*\\{(?P<braced>([_a-zA-Z][_a-zA-Z0-9]*))\\}(\\}\\})*") 

29 

30 def render(self, s: str, vals: dict) -> str: 

31 return s.format(**vals) 

32 

33 

34class PercentFilter(TemplateFilter): 

35 pattern = re.compile("(\\%\\%)*\\%\\((?P<braced>([_a-zA-Z][_a-zA-Z0-9]*))\\)") 

36 

37 def render(self, s: str, vals: dict) -> str: 

38 return s % vals 

39 

40 

41class FstringFilter(FormatFilter): 

42 def render(self, s: str, vals: dict) -> str: 

43 return eval("f" + repr(s), vals, {})