5
5
import json
6
6
import logging
7
7
import os
8
+ import re
8
9
from argparse import SUPPRESS
9
10
from collections import OrderedDict
10
11
from contextlib import contextmanager
11
12
from pathlib import Path
12
13
from tempfile import NamedTemporaryFile
13
14
14
15
import pytest
15
- from jinja2 import Environment , Template , meta
16
16
from jsonschema import Draft6Validator
17
17
from jsonschema .exceptions import ValidationError
18
18
@@ -116,10 +116,26 @@ def get_cloudformation_exports(region_name, endpoint_url, role_arn, profile_name
116
116
return exports
117
117
118
118
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 ))
123
139
if variables :
124
140
exports = get_cloudformation_exports (
125
141
region_name , endpoint_url , role_arn , profile_name
@@ -132,8 +148,7 @@ def render_jinja(overrides_string, region_name, endpoint_url, role_arn, profile_
132
148
)
133
149
LOG .warning (invalid_exports_message , invalid_exports )
134
150
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 ))
137
152
else :
138
153
to_return = json .loads (overrides_string )
139
154
return to_return
@@ -158,7 +173,7 @@ def get_overrides(root, region_name, endpoint_url, role_arn, profile_name):
158
173
path = root / "overrides.json"
159
174
try :
160
175
with path .open ("r" , encoding = "utf-8" ) as f :
161
- overrides_raw = render_jinja (
176
+ overrides_raw = render_template (
162
177
f .read (), region_name , endpoint_url , role_arn , profile_name
163
178
)
164
179
except FileNotFoundError :
@@ -195,7 +210,7 @@ def get_hook_overrides(root, region_name, endpoint_url, role_arn, profile_name):
195
210
path = root / "overrides.json"
196
211
try :
197
212
with path .open ("r" , encoding = "utf-8" ) as f :
198
- overrides_raw = render_jinja (
213
+ overrides_raw = render_template (
199
214
f .read (), region_name , endpoint_url , role_arn , profile_name
200
215
)
201
216
except FileNotFoundError :
@@ -264,7 +279,7 @@ def get_inputs(root, region_name, endpoint_url, value, role_arn, profile_name):
264
279
265
280
file_path = path / file
266
281
with file_path .open ("r" , encoding = "utf-8" ) as f :
267
- overrides_raw = render_jinja (
282
+ overrides_raw = render_template (
268
283
f .read (), region_name , endpoint_url , role_arn , profile_name
269
284
)
270
285
overrides = {}
0 commit comments