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

1""" 

2Jinja2 environment and extensions loading. 

3 

4Source: https://github.com/cookiecutter/cookiecutter 

5""" 

6 

7import sys 

8 

9from jinja2 import StrictUndefined 

10from jinja2.nativetypes import NativeEnvironment 

11 

12 

13class ExtensionLoaderMixin: 

14 """ 

15 Mixin providing sane loading of extensions specified in a given context. 

16 """ 

17 

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 [] 

26 

27 # Add template path to sys.path for loading 

28 if path is not None: 

29 sys.path.append(path) 

30 

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}') 

35 

36 

37class StrictNativeEnvironment(ExtensionLoaderMixin, NativeEnvironment): 

38 """ 

39 Create strict Jinja2 environment. 

40 

41 Jinja2 environment will raise error on undefined variable in template- 

42 rendering context. 

43 """ 

44 

45 def __init__(self, *_args, **kwargs): 

46 """ 

47 Set the standard Cookiecutter StrictEnvironment. 

48 

49 Also loading extensions defined in mk-scaffold 'extensions' key. 

50 """ 

51 super().__init__(**kwargs) 

52 self.undefined = StrictUndefined