File tree Expand file tree Collapse file tree 5 files changed +38
-9
lines changed
Expand file tree Collapse file tree 5 files changed +38
-9
lines changed Original file line number Diff line number Diff 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 )
Original file line number Diff line number Diff 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.
Original file line number Diff line number Diff 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 (
Original file line number Diff line number Diff 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 (
Original file line number Diff line number Diff line change 22from 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
1926def render_variable (
You can’t perform that action at this time.
0 commit comments