Coverage for src / jinja / environment.py: 100%
17 statements
« prev ^ index » next coverage.py v7.12.0, created at 2025-11-21 16:36 +0000
« prev ^ index » next coverage.py v7.12.0, created at 2025-11-21 16:36 +0000
1"""
2Jinja2 environment and extensions loading.
4Source: https://github.com/cookiecutter/cookiecutter
5"""
7import sys
9from jinja2 import StrictUndefined
10from jinja2.nativetypes import NativeEnvironment
13class ExtensionLoaderMixin:
14 """
15 Mixin providing sane loading of extensions specified in a given context.
16 """
18 def __init__(self, *_args, extensions=None, path=None, **kwargs):
19 """
20 Initialize the Jinja2 Environment object while loading extensions.
21 """
22 _extensions = [
23 "jinja2_time.TimeExtension",
24 ]
25 _extensions += extensions or []
27 # Add template path to sys.path for loading
28 if path is not None:
29 sys.path.append(path)
31 try:
32 super().__init__(extensions=_extensions, **kwargs)
33 except ModuleNotFoundError as err:
34 sys.exit(f'error: failed to load extensions from "{path}" directory: {err}')
37class StrictNativeEnvironment(ExtensionLoaderMixin, NativeEnvironment):
38 """
39 Create strict Jinja2 environment.
41 Jinja2 environment will raise error on undefined variable in template-
42 rendering context.
43 """
45 def __init__(self, *_args, **kwargs):
46 """
47 Set the standard Cookiecutter StrictEnvironment.
49 Also loading extensions defined in mk-scaffold 'extensions' key.
50 """
51 super().__init__(**kwargs)
52 self.undefined = StrictUndefined