55import json
66import logging
77import os
8+ import re
89from argparse import SUPPRESS
910from collections import OrderedDict
1011from contextlib import contextmanager
1112from pathlib import Path
1213from tempfile import NamedTemporaryFile
1314
1415import pytest
15- from jinja2 import Environment , Template , meta
1616from jsonschema import Draft6Validator
1717from jsonschema .exceptions import ValidationError
1818
@@ -116,10 +116,26 @@ def get_cloudformation_exports(region_name, endpoint_url, role_arn, profile_name
116116 return exports
117117
118118
119- def render_jinja (overrides_string , region_name , endpoint_url , role_arn , profile_name ):
120- env = Environment (autoescape = True )
121- parsed_content = env .parse (overrides_string )
122- variables = meta .find_undeclared_variables (parsed_content )
119+ def _stub_exports (template , exports , pattern ):
120+ def __retrieve_args (match ):
121+ try :
122+ export = str (match .group (1 )).strip ()
123+ value_to_stub = str (exports [export ])
124+ except LookupError as e :
125+ LOG .error (str (e ))
126+ raise ValueError (
127+ f"Export does not contain provided undeclared variable '{ export } '. { e } "
128+ ) from e
129+ return value_to_stub
130+
131+ return re .sub (pattern , __retrieve_args , template )
132+
133+
134+ def render_template (
135+ overrides_string , region_name , endpoint_url , role_arn , profile_name
136+ ):
137+ regex = r"{{([-A-Za-z0-9:\s]+?)}}"
138+ variables = set (str (match ).strip () for match in re .findall (regex , overrides_string ))
123139 if variables :
124140 exports = get_cloudformation_exports (
125141 region_name , endpoint_url , role_arn , profile_name
@@ -132,8 +148,7 @@ def render_jinja(overrides_string, region_name, endpoint_url, role_arn, profile_
132148 )
133149 LOG .warning (invalid_exports_message , invalid_exports )
134150 return empty_override ()
135- overrides_template = Template (overrides_string )
136- to_return = json .loads (overrides_template .render (exports ))
151+ to_return = json .loads (_stub_exports (overrides_string , exports , regex ))
137152 else :
138153 to_return = json .loads (overrides_string )
139154 return to_return
@@ -158,7 +173,7 @@ def get_overrides(root, region_name, endpoint_url, role_arn, profile_name):
158173 path = root / "overrides.json"
159174 try :
160175 with path .open ("r" , encoding = "utf-8" ) as f :
161- overrides_raw = render_jinja (
176+ overrides_raw = render_template (
162177 f .read (), region_name , endpoint_url , role_arn , profile_name
163178 )
164179 except FileNotFoundError :
@@ -195,7 +210,7 @@ def get_hook_overrides(root, region_name, endpoint_url, role_arn, profile_name):
195210 path = root / "overrides.json"
196211 try :
197212 with path .open ("r" , encoding = "utf-8" ) as f :
198- overrides_raw = render_jinja (
213+ overrides_raw = render_template (
199214 f .read (), region_name , endpoint_url , role_arn , profile_name
200215 )
201216 except FileNotFoundError :
@@ -264,7 +279,7 @@ def get_inputs(root, region_name, endpoint_url, value, role_arn, profile_name):
264279
265280 file_path = path / file
266281 with file_path .open ("r" , encoding = "utf-8" ) as f :
267- overrides_raw = render_jinja (
282+ overrides_raw = render_template (
268283 f .read (), region_name , endpoint_url , role_arn , profile_name
269284 )
270285 overrides = {}
0 commit comments