From e861e904ca7d69c244a941e5b4f84e47d02e367d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bern=C3=A1t=20G=C3=A1bor?= Date: Fri, 9 Dec 2022 19:39:54 -0800 Subject: [PATCH] Normalize extra names passed in MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bernát Gábor --- docs/changelog/2655.bugfix.rst | 1 + src/tox/tox_env/python/runner.py | 9 +++++++++ tests/tox_env/python/test_python_runner.py | 22 ++++++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 docs/changelog/2655.bugfix.rst diff --git a/docs/changelog/2655.bugfix.rst b/docs/changelog/2655.bugfix.rst new file mode 100644 index 000000000..88fa3003f --- /dev/null +++ b/docs/changelog/2655.bugfix.rst @@ -0,0 +1 @@ +Normalize extra names passed in (fixes extra groups not being picked up during installation) - by :user:`gaborbernat`. diff --git a/src/tox/tox_env/python/runner.py b/src/tox/tox_env/python/runner.py index 591633d74..785c4698d 100644 --- a/src/tox/tox_env/python/runner.py +++ b/src/tox/tox_env/python/runner.py @@ -6,6 +6,8 @@ from functools import partial from typing import Set +from packaging.utils import canonicalize_name + from tox.report import HandledError from tox.tox_env.errors import Skip from tox.tox_env.package import Package @@ -65,11 +67,18 @@ def _register_package_conf(self) -> bool: pkg_type = self.pkg_type if pkg_type == "skip": return False + + def _normalize_extras(values: set[str]) -> set[str]: + # although _ and . is allowed this will be normalized during packaging to - + # https://packaging.python.org/en/latest/specifications/dependency-specifiers/#grammar + return {canonicalize_name(v) for v in values} + self.conf.add_config( keys=["extras"], of_type=Set[str], default=set(), desc="extras to install of the target package", + post_process=_normalize_extras, ) return True diff --git a/tests/tox_env/python/test_python_runner.py b/tests/tox_env/python/test_python_runner.py index 797ad638d..93d5e4978 100644 --- a/tests/tox_env/python/test_python_runner.py +++ b/tests/tox_env/python/test_python_runner.py @@ -2,6 +2,8 @@ from pathlib import Path +import pytest + from tox.journal import EnvJournal from tox.pytest import ToxProjectCreator from tox.tox_env.package import PathPackage @@ -99,3 +101,23 @@ def test_package_temp_dir_view(tox_project: ToxProjectCreator, demo_pkg_inline: msg = f" D package {session_path} links to {Path('.pkg') / 'dist'/ wheel_name} ({project.path/ '.tox'}) " assert msg in result.out assert f" D delete package {project.path / '.tox' / session_path}" in result.out + + +@pytest.mark.parametrize( + ("extra", "used_extra"), + [ + ("d_oc", "d-oc"), + ("d-oc", "d-oc"), + ("d.oc", "d-oc"), + ], +) +def test_extras_are_normalized( + tox_project: ToxProjectCreator, + demo_pkg_inline: Path, + extra: str, + used_extra: str, +) -> None: + project = tox_project({"tox.ini": f"[testenv]\nextras={extra}"}) + result = project.run("c", "-e", "py", "--root", str(demo_pkg_inline), "-k", "extras") + result.assert_success() + assert result.out == f"[testenv:py]\nextras = {used_extra}\n"