Skip to content

Commit 32ec91b

Browse files
authored
Merge pull request #585 from vshawrh/vshawfromager
fix: handle undefined variable in substitute_template
2 parents ed57538 + 28b0034 commit 32ec91b

2 files changed

Lines changed: 25 additions & 5 deletions

File tree

src/fromager/packagesettings.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -457,11 +457,20 @@ def substitute_template(value: str, template_env: dict[str, str]) -> str:
457457
for mo in _DEFAULT_PATTERN_RE.finditer(value):
458458
modict = mo.groupdict()
459459
name = modict["name"]
460-
# add to local default, keep existing default
461-
localdefault.setdefault(name, modict["default"])
462-
# remove ":-default"
463-
value = value.replace(mo.group(0), f"${{{name}}}")
464-
return string.Template(value).substitute(localdefault)
460+
default = modict["default"]
461+
# Only set the default if one is explicitly provided.
462+
# This ensures that undefined variables without defaults
463+
# will raise KeyError later
464+
if default is not None:
465+
localdefault.setdefault(name, default)
466+
# Replace ${var:-default} with ${var}
467+
value = value.replace(mo.group(0), f"${{{name}}}")
468+
try:
469+
return string.Template(value).substitute(localdefault)
470+
except KeyError as e:
471+
raise ValueError(
472+
f"Undefined environment variable {e!r} referenced in expression {value!r}"
473+
) from e
465474

466475

467476
def get_cpu_count() -> int:

tests/test_packagesettings.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,3 +468,14 @@ def test_parallel_jobs(
468468
)
469469
def test_substitute_template(value: str, template_env: dict[str, str], expected: str):
470470
assert substitute_template(value, template_env) == expected
471+
472+
473+
def test_substitute_template_key_error():
474+
# This test expects a ValueError to be raised by substitute_template
475+
with pytest.raises(ValueError) as excinfo:
476+
substitute_template("${DEFAULT:-default} ${UNKNOWN}", {})
477+
# Verify that the error message matches the expected message
478+
assert (
479+
str(excinfo.value)
480+
== "Undefined environment variable KeyError('UNKNOWN') referenced in expression '${DEFAULT} ${UNKNOWN}'"
481+
)

0 commit comments

Comments
 (0)