From 92e158a2baaf0f21a2f7a77c4669ec7c0dfd1fe3 Mon Sep 17 00:00:00 2001 From: David Hotham Date: Fri, 16 Sep 2022 20:46:56 +0100 Subject: [PATCH 1/2] normalize extras per PEP685 --- src/poetry/core/factory.py | 3 +++ src/poetry/core/packages/dependency.py | 10 ++++++---- src/poetry/core/packages/package.py | 2 +- src/poetry/core/packages/specification.py | 10 +++++++--- tests/masonry/builders/test_sdist.py | 6 ++++-- tests/packages/test_dependency.py | 6 ++++-- tests/packages/test_vcs_dependency.py | 14 +++++++------- tests/test_factory.py | 4 +++- 8 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/poetry/core/factory.py b/src/poetry/core/factory.py index 2e8295e01..1d56d78c7 100644 --- a/src/poetry/core/factory.py +++ b/src/poetry/core/factory.py @@ -11,6 +11,8 @@ from typing import Union from warnings import warn +from packaging.utils import canonicalize_name + from poetry.core.utils.helpers import combine_unicode from poetry.core.utils.helpers import readme_content_type @@ -176,6 +178,7 @@ def configure_package( extras = config.get("extras", {}) for extra_name, requirements in extras.items(): + extra_name = canonicalize_name(extra_name) package.extras[extra_name] = [] # Checking for dependency diff --git a/src/poetry/core/packages/dependency.py b/src/poetry/core/packages/dependency.py index e75edf319..794df2979 100644 --- a/src/poetry/core/packages/dependency.py +++ b/src/poetry/core/packages/dependency.py @@ -10,6 +10,8 @@ from typing import Iterable from typing import TypeVar +from packaging.utils import canonicalize_name + from poetry.core.constraints.generic import parse_constraint as parse_generic_constraint from poetry.core.constraints.version import VersionRangeConstraint from poetry.core.constraints.version import parse_constraint @@ -86,7 +88,7 @@ def __init__( self._transitive_python_constraint: VersionConstraint | None = None self._transitive_marker: BaseMarker | None = None - self._in_extras: list[str] = [] + self._in_extras: list[NormalizedName] = [] self._activated = not self._optional @@ -183,7 +185,7 @@ def marker(self, marker: str | BaseMarker) -> None: for or_ in markers["extra"]: for _, extra in or_: - self.in_extras.append(extra) + self.in_extras.append(canonicalize_name(extra)) # Recalculate python versions. self._python_versions = "*" @@ -218,12 +220,12 @@ def transitive_python_constraint(self) -> VersionConstraint: return self._transitive_python_constraint @property - def extras(self) -> frozenset[str]: + def extras(self) -> frozenset[NormalizedName]: # extras activated in a dependency is the same as features return self._features @property - def in_extras(self) -> list[str]: + def in_extras(self) -> list[NormalizedName]: return self._in_extras @property diff --git a/src/poetry/core/packages/package.py b/src/poetry/core/packages/package.py index 11f7cc93e..8396aa346 100644 --- a/src/poetry/core/packages/package.py +++ b/src/poetry/core/packages/package.py @@ -90,7 +90,7 @@ def __init__( self._license: License | None = None self.readmes: tuple[Path, ...] = () - self.extras: dict[str, list[Dependency]] = {} + self.extras: dict[NormalizedName, list[Dependency]] = {} self._dependency_groups: dict[str, DependencyGroup] = {} diff --git a/src/poetry/core/packages/specification.py b/src/poetry/core/packages/specification.py index 8ff0dbb39..b2dd9b076 100644 --- a/src/poetry/core/packages/specification.py +++ b/src/poetry/core/packages/specification.py @@ -6,6 +6,8 @@ from typing import Iterable from typing import TypeVar +from packaging.utils import canonicalize_name + if TYPE_CHECKING: from packaging.utils import NormalizedName @@ -37,7 +39,7 @@ def __init__( if not features: features = [] - self._features = frozenset(features) + self._features = frozenset(canonicalize_name(feature) for feature in features) @property def name(self) -> NormalizedName: @@ -78,7 +80,7 @@ def source_subdirectory(self) -> str | None: return self._source_subdirectory @property - def features(self) -> frozenset[str]: + def features(self) -> frozenset[NormalizedName]: return self._features def is_direct_origin(self) -> bool: @@ -167,7 +169,9 @@ def clone(self: T) -> T: def with_features(self: T, features: Iterable[str]) -> T: package = self.clone() - package._features = frozenset(features) + package._features = frozenset( + canonicalize_name(feature) for feature in features + ) return package diff --git a/tests/masonry/builders/test_sdist.py b/tests/masonry/builders/test_sdist.py index 66785c91f..a05a197db 100644 --- a/tests/masonry/builders/test_sdist.py +++ b/tests/masonry/builders/test_sdist.py @@ -14,6 +14,8 @@ import pytest +from packaging.utils import canonicalize_name + from poetry.core.factory import Factory from poetry.core.masonry.builders.sdist import SdistBuilder from poetry.core.masonry.utils.package_include import PackageInclude @@ -73,7 +75,7 @@ def test_convert_dependencies() -> None: assert result == (main, extras) package = ProjectPackage("foo", "1.2.3") - package.extras = {"bar": [Dependency("A", "*")]} + package.extras = {canonicalize_name("bar"): [Dependency("A", "*")]} result = SdistBuilder.convert_dependencies( package, @@ -93,7 +95,7 @@ def test_convert_dependencies() -> None: d = Dependency("D", "3.4.5", optional=True) d.python_versions = "~2.7 || ^3.4" - package.extras = {"baz": [Dependency("D", "*")]} + package.extras = {canonicalize_name("baz"): [Dependency("D", "*")]} result = SdistBuilder.convert_dependencies( package, diff --git a/tests/packages/test_dependency.py b/tests/packages/test_dependency.py index a2aef3840..38e295598 100644 --- a/tests/packages/test_dependency.py +++ b/tests/packages/test_dependency.py @@ -2,6 +2,8 @@ import pytest +from packaging.utils import canonicalize_name + from poetry.core.constraints.version.exceptions import ParseConstraintError from poetry.core.packages.dependency import Dependency from poetry.core.version.markers import parse_marker @@ -51,7 +53,7 @@ def test_to_pep_508_wilcard() -> None: def test_to_pep_508_in_extras() -> None: dependency = Dependency("Django", "^1.23") - dependency.in_extras.append("foo") + dependency.in_extras.append(canonicalize_name("foo")) result = dependency.to_pep_508() assert result == 'Django (>=1.23,<2.0); extra == "foo"' @@ -59,7 +61,7 @@ def test_to_pep_508_in_extras() -> None: result = dependency.to_pep_508(with_extras=False) assert result == "Django (>=1.23,<2.0)" - dependency.in_extras.append("bar") + dependency.in_extras.append(canonicalize_name("bar")) result = dependency.to_pep_508() assert result == 'Django (>=1.23,<2.0); extra == "foo" or extra == "bar"' diff --git a/tests/packages/test_vcs_dependency.py b/tests/packages/test_vcs_dependency.py index 5d3241dd0..7a146e2a3 100644 --- a/tests/packages/test_vcs_dependency.py +++ b/tests/packages/test_vcs_dependency.py @@ -4,6 +4,8 @@ import pytest +from packaging.utils import canonicalize_name + from poetry.core.packages.vcs_dependency import VCSDependency @@ -37,10 +39,8 @@ ), ( {"branch": "main", "directory": "sub"}, - ( - "poetry @ git+https://github.com/python-poetry/poetry.git" - "@main#subdirectory=sub" - ), + "poetry @ git+https://github.com/python-poetry/poetry.git" + "@main#subdirectory=sub", ), ], ) @@ -64,7 +64,7 @@ def test_to_pep_508_in_extras() -> None: dependency = VCSDependency( "poetry", "git", "https://github.com/python-poetry/poetry.git" ) - dependency.in_extras.append("foo") + dependency.in_extras.append(canonicalize_name("foo")) expected = ( 'poetry @ git+https://github.com/python-poetry/poetry.git ; extra == "foo"' @@ -74,7 +74,7 @@ def test_to_pep_508_in_extras() -> None: dependency = VCSDependency( "poetry", "git", "https://github.com/python-poetry/poetry.git", extras=["bar"] ) - dependency.in_extras.append("foo") + dependency.in_extras.append(canonicalize_name("foo")) expected = ( 'poetry[bar] @ git+https://github.com/python-poetry/poetry.git ; extra == "foo"' @@ -85,7 +85,7 @@ def test_to_pep_508_in_extras() -> None: dependency = VCSDependency( "poetry", "git", "https://github.com/python-poetry/poetry.git", "b;ar;" ) - dependency.in_extras.append("foo;") + dependency.in_extras.append(canonicalize_name("foo;")) expected = ( "poetry @ git+https://github.com/python-poetry/poetry.git@b;ar; ; extra ==" diff --git a/tests/test_factory.py b/tests/test_factory.py index 6415473a2..d8e493bda 100644 --- a/tests/test_factory.py +++ b/tests/test_factory.py @@ -7,6 +7,8 @@ import pytest +from packaging.utils import canonicalize_name + from poetry.core.constraints.version import parse_constraint from poetry.core.factory import Factory from poetry.core.packages.url_dependency import URLDependency @@ -342,7 +344,7 @@ def test_create_poetry_with_markers_and_extras() -> None: assert len(dependencies) == 2 assert {dependency.name for dependency in dependencies} == {"orjson"} - assert set(extras["all"]) == set(dependencies) + assert set(extras[canonicalize_name("all")]) == set(dependencies) for dependency in dependencies: assert dependency.in_extras == ["all"] assert isinstance(dependency, URLDependency) From 9f58ecf8dddbafd38a2b4f2367a5f0f1d8ff25f4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 16 Sep 2022 20:29:34 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/packages/test_vcs_dependency.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/packages/test_vcs_dependency.py b/tests/packages/test_vcs_dependency.py index 7a146e2a3..0d9d01910 100644 --- a/tests/packages/test_vcs_dependency.py +++ b/tests/packages/test_vcs_dependency.py @@ -39,8 +39,10 @@ ), ( {"branch": "main", "directory": "sub"}, - "poetry @ git+https://github.com/python-poetry/poetry.git" - "@main#subdirectory=sub", + ( + "poetry @ git+https://github.com/python-poetry/poetry.git" + "@main#subdirectory=sub" + ), ), ], )