Skip to content

Commit 9c28658

Browse files
committed
parse env vars
1 parent 08458d7 commit 9c28658

4 files changed

Lines changed: 69 additions & 8 deletions

File tree

‎lambda_gateway/__main__.py‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,17 @@ def main():
120120
# Parse opts
121121
opts = get_opts()
122122

123-
base_python_path = opts.base_python_path or os.path.curdir
123+
base_python_path = os.path.abspath(opts.base_python_path or os.path.curdir)
124124

125125
# Load env vars
126-
env_vars = load_env_vars(opts.env_vars_json)
127-
os.environ.update(env_vars)
126+
if opts.env_vars_json and opts.SAM_TEMPLATE.endswith('.ts'):
127+
sam = CDKParser(opts.SAM_TEMPLATE)
128+
mapping = sam.get_env_var_mapping()
129+
env_vars = load_env_vars(opts.env_vars_json, mapping)
130+
os.environ.update(env_vars)
131+
else:
132+
env_vars = load_env_vars(opts.env_vars_json)
133+
os.environ.update(env_vars)
128134

129135
# Load SAM Template or CDK Stack
130136
if opts.SAM_TEMPLATE.endswith('.ts'):

‎lambda_gateway/cdk.py‎

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,47 @@ def _infer_code_uri(self):
5353
m = re.search(r"Code\.fromAsset\(['\"]([^'\"]+)['\"]\)", self.ts_code)
5454
if m:
5555
return m.group(1)
56-
return '.'
56+
return '.'
57+
58+
def get_env_var_mapping(self):
59+
"""
60+
Parse getLambdaEnv function to map env var names to props keys.
61+
Returns a dict: { ENV_VAR: props_key, ... }
62+
"""
63+
mapping = {}
64+
# Find start of getLambdaEnv function
65+
m = re.search(r'function\s+getLambdaEnv\([^)]*\)\s*{', self.ts_code)
66+
if not m:
67+
m = re.search(r'def\s+getLambdaEnv\([^)]*\)\s*{', self.ts_code)
68+
if not m:
69+
return mapping
70+
start = m.end() - 1 # position of the opening brace
71+
code = self.ts_code
72+
brace_count = 0
73+
body = ''
74+
i = start
75+
while i < len(code):
76+
c = code[i]
77+
if c == '{':
78+
brace_count += 1
79+
elif c == '}':
80+
brace_count -= 1
81+
if brace_count == 0:
82+
body += c
83+
break
84+
body += c
85+
i += 1
86+
# Now parse lines for ENV_VAR: props.propsKey
87+
for line in body.splitlines():
88+
line = line.strip().rstrip(',')
89+
m2 = re.match(r'([A-Z0-9_]+)\s*:\s*props\.([a-zA-Z0-9_]+)\s*(,|$)', line)
90+
if m2:
91+
env_var, props_key = m2.group(1), m2.group(2)
92+
mapping[env_var] = props_key
93+
else:
94+
# Match lines like DDBTableName: table.tableName,
95+
m3 = re.match(r'([A-Za-z0-9_]+)\s*:\s*[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+\s*(,|$)', line)
96+
if m3:
97+
env_var = m3.group(1)
98+
mapping[env_var] = os.environ.get(env_var, "")
99+
return mapping

‎lambda_gateway/event_proxy.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def get_handler(self):
2424
if not name:
2525
raise ValueError(f"Bad handler signature '{self.handler}'")
2626
try:
27-
sys.path.append(self.base_python_path)
27+
sys.path.append(os.path.abspath(self.base_python_path))
2828
module = importlib.import_module(name)
2929
importlib.reload(module)
3030
handler = getattr(module, func)

‎lambda_gateway/sam.py‎

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from collections import namedtuple
33
from ruamel.yaml import YAML
44
import re
5+
import os
56

67
Endpoint = namedtuple("Endpoint", "CodeUri Handler Path Method")
78

@@ -38,7 +39,7 @@ def get_endpoints(self):
3839

3940
yield Endpoint(CodeUri, Handler, Path, Method)
4041

41-
def load_env_vars(env_vars_path):
42+
def load_env_vars(env_vars_path, mapping=None):
4243
if not env_vars_path:
4344
return {}
4445

@@ -61,8 +62,19 @@ def load_env_vars(env_vars_path):
6162
ts_code = re.sub(r',\s*]', ']', ts_code)
6263
# Now ts_code should be valid JSON
6364
import json
64-
env_vars = json.loads(ts_code)
65-
return env_vars
65+
config_vars = json.loads(ts_code)
66+
if mapping:
67+
env_vars = {}
68+
for env_var, props_key in mapping.items():
69+
if props_key is None:
70+
env_vars[env_var] = os.environ.get(env_var, "")
71+
elif props_key in config_vars:
72+
env_vars[env_var] = config_vars[props_key]
73+
else:
74+
env_vars[env_var] = os.environ.get(env_var, "")
75+
return env_vars
76+
else:
77+
return config_vars
6678
else:
6779
with open(env_vars_path, "rt") as f:
6880
env_vars_all = json.load(f)

0 commit comments

Comments
 (0)