Skip to content

Commit ad62b99

Browse files
committed
Allow passing jinja configuration and extensions
1 parent cbe2719 commit ad62b99

File tree

5 files changed

+38
-9
lines changed

5 files changed

+38
-9
lines changed

src/tui_forms/_api.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,16 @@ def create_renderer(
1414
renderer: str,
1515
schema: dict[str, Any],
1616
root_key: str = "",
17+
jinja_config: dict[str, Any] | None = None,
18+
jinja_extensions: list[str] | None = None,
1719
) -> BaseRenderer:
1820
"""Return a renderer configured with the parsed form, ready to call render().
1921
2022
:param renderer: Name of the renderer to use (e.g. ``"stdlib"``, ``"rich"``).
2123
:param schema: The already-loaded JSONSchema dict describing the form.
2224
:param root_key: Optional key to nest all answers under in the returned dict.
25+
:param jinja_config: Optional dict with configuration to be passed to Jinja2.
26+
:param jinja_extensions: Optional list with extensions that need to be loaded.
2327
:raises ValueError: If the requested renderer name is not available.
2428
:raises jsonschema.ValidationError: If the schema does not conform to the
2529
expected form structure.
@@ -32,4 +36,4 @@ def create_renderer(
3236
f"Renderer {renderer!r} not found. Available renderers: {available}"
3337
)
3438
frm = jsonschema_to_form(schema, root_key=root_key)
35-
return renderers[renderer](frm)
39+
return renderers[renderer](frm, config=jinja_config, extensions=jinja_extensions)

src/tui_forms/renderer/base.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,20 @@ class BaseRenderer(ABC):
2121
_form: form.Form
2222
_env: Environment
2323

24-
def __init__(self, frm: form.Form, config: dict[str, Any] | None = None) -> None:
24+
def __init__(
25+
self,
26+
frm: form.Form,
27+
config: dict[str, Any] | None = None,
28+
extensions: list[str] | None = None,
29+
) -> None:
2530
"""Initialise the renderer.
2631
2732
:param frm: The form to render.
2833
:param config: Optional Jinja2 environment configuration.
34+
:param extensions: Optional list of extensions to be loaded.
2935
"""
3036
self._form = frm
31-
self._env: Environment = create_environment(config)
37+
self._env: Environment = create_environment(config, extensions=extensions)
3238

3339
def render(self) -> dict[str, Any]:
3440
"""Render the form and return the collected answers.

src/tui_forms/renderer/cookiecutter.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,19 @@ class CookiecutterRenderer(BaseRenderer):
1111

1212
name: str = "cookiecutter"
1313

14-
def __init__(self, form: Any, config: dict[str, Any] | None = None) -> None:
14+
def __init__(
15+
self,
16+
form: Any,
17+
config: dict[str, Any] | None = None,
18+
extensions: list[str] | None = None,
19+
) -> None:
1520
"""Initialise the renderer.
1621
1722
:param form: The form to render.
1823
:param config: Optional Jinja2 environment configuration.
24+
:param extensions: Optional list of extensions to be loaded.
1925
"""
20-
super().__init__(form, config)
26+
super().__init__(form, config, extensions=extensions)
2127
self._console = Console()
2228

2329
def _build_inline_prompt(

src/tui_forms/renderer/rich.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,19 @@ class RichRenderer(BaseRenderer):
1919

2020
name: str = "rich"
2121

22-
def __init__(self, form: Form, config: dict[str, Any] | None = None) -> None:
22+
def __init__(
23+
self,
24+
form: Form,
25+
config: dict[str, Any] | None = None,
26+
extensions: list[str] | None = None,
27+
) -> None:
2328
"""Initialise the renderer with a shared Rich Console.
2429
2530
:param form: The form to render.
2631
:param config: Optional Jinja2 environment configuration.
32+
:param extensions: Optional list of extensions to be loaded.
2733
"""
28-
super().__init__(form, config)
34+
super().__init__(form, config, extensions=extensions)
2935
self._console = Console()
3036

3137
def _show_panel(

src/tui_forms/utils/template.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,25 @@
22
from typing import Any
33

44

5-
def create_environment(config: dict[str, Any] | None) -> Environment:
5+
def create_environment(
6+
config: dict[str, Any] | None, extensions: list[str] | None = None
7+
) -> Environment:
68
"""Create a Jinja2 Environment from an optional configuration dict.
79
810
:param config: Optional config dict; the ``jinja2_environment`` key is
911
merged into the Environment constructor kwargs if present.
1012
:return: A configured Jinja2 Environment.
1113
"""
1214
env_kwargs: dict[str, Any] = {}
15+
extensions = extensions if extensions else []
1316
if config is not None:
1417
env_kwargs.update(config.get("jinja2_environment", {}))
1518
env_kwargs.pop("autoescape", None)
16-
return Environment(autoescape=True, **env_kwargs)
19+
try:
20+
env = Environment(autoescape=True, extensions=extensions, **env_kwargs)
21+
except ImportError as err:
22+
raise RuntimeError(f"Unable to load extension: {err}") from err
23+
return env
1724

1825

1926
def render_variable(

0 commit comments

Comments
 (0)