Files
lix/tests/functional2/testlib/fixtures/formatter.py
T
2025-05-07 16:04:06 +02:00

30 lines
961 B
Python

import string
from string import Template
from typing import Dict, Type
import pytest
class BalancedTemplater(Template):
delimiter = "@"
pattern = r"@((?P<escaped>@)|(?P<named>\w+?)@|\{(?P<braced>\w+?)\}@|(?P<invalid>.*?))"
def substitute(self, mapping: Dict[str, object] | None = None, /, **kwargs) -> str:
if mapping is None:
mapping = {}
tmpl_idents = set(self.get_identifiers())
subs_idents = mapping.keys() | kwargs.keys()
errs = []
for key in subs_idents - tmpl_idents:
msg = f"Unused named argument `{key}` with value: {kwargs.get(key, mapping.get(key))}"
errs.append(KeyError(msg))
if len(errs) > 0:
msg = "Unused arguments passed to substitute"
raise ExceptionGroup(msg, errs)
return super().substitute(mapping, **kwargs)
@pytest.fixture
def balanced_templater() -> Type[string.Template]:
return BalancedTemplater