Skip to content

Commit bf9ec5c

Browse files
authored
Fix: Improve error message for invalid template variables in virtualenvs.prompt (#10648)
1 parent 3970d11 commit bf9ec5c

File tree

2 files changed

+44
-4
lines changed

2 files changed

+44
-4
lines changed

src/poetry/utils/env/env_manager.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from cleo.io.null_io import NullIO
2020
from poetry.core.constraints.version import Version
2121

22+
from poetry.console.exceptions import PoetryConsoleError
2223
from poetry.toml.file import TOMLFile
2324
from poetry.utils._compat import WINDOWS
2425
from poetry.utils._compat import encode
@@ -441,10 +442,20 @@ def create_venv(
441442
venv = venv_path / name
442443

443444
if venv_prompt is not None:
444-
venv_prompt = venv_prompt.format(
445-
project_name=self._poetry.package.name or "virtualenv",
446-
python_version=python.minor_version.to_string(),
447-
)
445+
try:
446+
venv_prompt = venv_prompt.format(
447+
project_name=self._poetry.package.name or "virtualenv",
448+
python_version=python.minor_version.to_string(),
449+
)
450+
except KeyError as e:
451+
raise PoetryConsoleError(
452+
f"Invalid template variable '{e.args[0]}' in 'virtualenvs.prompt' setting.\n"
453+
f"Valid variables are: {{project_name}}, {{python_version}}"
454+
) from e
455+
except ValueError as e:
456+
raise PoetryConsoleError(
457+
f"Invalid template string in 'virtualenvs.prompt' setting: {e}"
458+
) from e
448459

449460
if not venv.exists():
450461
if create_venv is False:

tests/utils/env/test_env_manager.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
from poetry.core.constraints.version import Version
1515

16+
from poetry.config.config import Config
17+
from poetry.console.exceptions import PoetryConsoleError
1618
from poetry.toml.file import TOMLFile
1719
from poetry.utils.env import GET_BASE_PREFIX
1820
from poetry.utils.env import GET_PYTHON_VERSION_ONELINER
@@ -1302,3 +1304,30 @@ def test_generate_env_name_uses_real_path(
13021304
venv_name1 = EnvManager.generate_env_name("simple-project", "the_real_dir")
13031305
venv_name2 = EnvManager.generate_env_name("simple-project", "linked_dir")
13041306
assert venv_name1 == venv_name2
1307+
1308+
1309+
def test_create_venv_invalid_prompt_template_variable(
1310+
manager: EnvManager, poetry: Poetry, config: Config
1311+
) -> None:
1312+
config.merge({"virtualenvs": {"prompt": "{project_name}-{invalid_var}"}})
1313+
1314+
with pytest.raises(PoetryConsoleError) as exc_info:
1315+
manager.create_venv()
1316+
1317+
assert "Invalid template variable 'invalid_var'" in str(exc_info.value)
1318+
assert "Valid variables are: {project_name}, {python_version}" in str(
1319+
exc_info.value
1320+
)
1321+
1322+
1323+
def test_create_venv_malformed_prompt_template(
1324+
manager: EnvManager, poetry: Poetry, config: Config
1325+
) -> None:
1326+
config.merge({"virtualenvs": {"prompt": "{project_name"}}) # Missing closing brace
1327+
1328+
with pytest.raises(PoetryConsoleError) as exc_info:
1329+
manager.create_venv()
1330+
1331+
assert "Invalid template string in 'virtualenvs.prompt' setting" in str(
1332+
exc_info.value
1333+
)

0 commit comments

Comments
 (0)