From 4164e3f6b80ec3fb6d6886bee3ea754ad11ee734 Mon Sep 17 00:00:00 2001 From: dylan-robins Date: Thu, 28 Mar 2024 16:15:04 +0100 Subject: [PATCH 01/10] Typing: Added TypedDicts specifying format of include and package entries. --- src/poetry/core/packages/project_package.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/poetry/core/packages/project_package.py b/src/poetry/core/packages/project_package.py index fad048258..4f8523cab 100644 --- a/src/poetry/core/packages/project_package.py +++ b/src/poetry/core/packages/project_package.py @@ -2,7 +2,7 @@ import warnings -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Literal, TypedDict from typing import Any from typing import Mapping from typing import Sequence @@ -18,6 +18,18 @@ from poetry.core.packages.package import Package from poetry.core.packages.utils.utils import create_nested_marker +SupportedPackageFormats = Literal["sdist", "wheel"] + +class PackageSpec(TypedDict): + include: str + to: str + format: list[SupportedPackageFormats] + + +class IncludeSpec(TypedDict): + path: str + format: list[SupportedPackageFormats] + class ProjectPackage(Package): def __init__( @@ -40,9 +52,9 @@ def __init__( # (For performance reasons, clone only creates a copy instead of a deep copy). self.build_config: Mapping[str, Any] = {} - self.packages: Sequence[Mapping[str, Any]] = [] - self.include: Sequence[Mapping[str, Any]] = [] - self.exclude: Sequence[Mapping[str, Any]] = [] + self.packages: Sequence[PackageSpec] = [] + self.include: Sequence[IncludeSpec] = [] + self.exclude: Sequence[IncludeSpec] = [] self.custom_urls: Mapping[str, str] = {} if self._python_versions == "*": From ab19f9bf23cb6993477a6c4373053d8eddc21ee6 Mon Sep 17 00:00:00 2001 From: dylan-robins Date: Thu, 28 Mar 2024 16:39:17 +0100 Subject: [PATCH 02/10] Typing: added BuildConfigSpec TypedDict --- src/poetry/core/packages/project_package.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/poetry/core/packages/project_package.py b/src/poetry/core/packages/project_package.py index 4f8523cab..1c940664d 100644 --- a/src/poetry/core/packages/project_package.py +++ b/src/poetry/core/packages/project_package.py @@ -18,8 +18,13 @@ from poetry.core.packages.package import Package from poetry.core.packages.utils.utils import create_nested_marker + SupportedPackageFormats = Literal["sdist", "wheel"] + +BuildConfigSpec = TypedDict("BuildConfigSpec", {"script": str, "generate-setup-file": bool}) + + class PackageSpec(TypedDict): include: str to: str @@ -51,7 +56,7 @@ def __init__( # Attributes must be immutable for clone() to be safe! # (For performance reasons, clone only creates a copy instead of a deep copy). - self.build_config: Mapping[str, Any] = {} + self.build_config: BuildConfigSpec = {} self.packages: Sequence[PackageSpec] = [] self.include: Sequence[IncludeSpec] = [] self.exclude: Sequence[IncludeSpec] = [] From 85954175335b129fb2451aacab0480b03c080e01 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 28 Mar 2024 16:17:41 +0000 Subject: [PATCH 03/10] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/poetry/core/packages/project_package.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/poetry/core/packages/project_package.py b/src/poetry/core/packages/project_package.py index 1c940664d..63a43a409 100644 --- a/src/poetry/core/packages/project_package.py +++ b/src/poetry/core/packages/project_package.py @@ -2,10 +2,11 @@ import warnings -from typing import TYPE_CHECKING, Literal, TypedDict -from typing import Any +from typing import TYPE_CHECKING +from typing import Literal from typing import Mapping from typing import Sequence +from typing import TypedDict from poetry.core.constraints.version import parse_constraint from poetry.core.version.markers import parse_marker @@ -22,7 +23,9 @@ SupportedPackageFormats = Literal["sdist", "wheel"] -BuildConfigSpec = TypedDict("BuildConfigSpec", {"script": str, "generate-setup-file": bool}) +BuildConfigSpec = TypedDict( + "BuildConfigSpec", {"script": str, "generate-setup-file": bool} +) class PackageSpec(TypedDict): From 73373898fdbeafcc9cbf869671b42c93df7c1ab2 Mon Sep 17 00:00:00 2001 From: dylan-robins Date: Thu, 28 Mar 2024 17:40:00 +0100 Subject: [PATCH 04/10] Typing: Added casts to make mypy happy --- src/poetry/core/factory.py | 7 +++++-- src/poetry/core/masonry/builders/builder.py | 3 +-- src/poetry/core/packages/project_package.py | 4 +++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/poetry/core/factory.py b/src/poetry/core/factory.py index 5e74991e3..e87987a7b 100644 --- a/src/poetry/core/factory.py +++ b/src/poetry/core/factory.py @@ -8,9 +8,12 @@ from typing import Any from typing import List from typing import Union +from typing import cast from packaging.utils import canonicalize_name +from poetry.core.packages.project_package import BuildConfigSpec +from poetry.core.packages.project_package import IncludeSpec from poetry.core.utils.helpers import combine_unicode from poetry.core.utils.helpers import readme_content_type @@ -199,7 +202,7 @@ def configure_package( build = config["build"] if not isinstance(build, dict): build = {"script": build} - package.build_config = build or {} + package.build_config = cast(BuildConfigSpec, build) or {} if "include" in config: package.include = [] @@ -213,7 +216,7 @@ def configure_package( formats = [formats] include["format"] = formats - package.include.append(include) + package.include.append(cast(IncludeSpec, include)) if "exclude" in config: package.exclude = config["exclude"] diff --git a/src/poetry/core/masonry/builders/builder.py b/src/poetry/core/masonry/builders/builder.py index a6a6fd60e..f1d2bead5 100644 --- a/src/poetry/core/masonry/builders/builder.py +++ b/src/poetry/core/masonry/builders/builder.py @@ -80,8 +80,7 @@ def _module(self) -> Module: formats = include.get("format", []) if ( - formats - and self.format + self.format and self.format not in formats and not self._ignore_packages_formats ): diff --git a/src/poetry/core/packages/project_package.py b/src/poetry/core/packages/project_package.py index 63a43a409..836fb0224 100644 --- a/src/poetry/core/packages/project_package.py +++ b/src/poetry/core/packages/project_package.py @@ -5,6 +5,7 @@ from typing import TYPE_CHECKING from typing import Literal from typing import Mapping +from typing import NotRequired from typing import Sequence from typing import TypedDict @@ -24,7 +25,8 @@ BuildConfigSpec = TypedDict( - "BuildConfigSpec", {"script": str, "generate-setup-file": bool} + "BuildConfigSpec", + {"script": NotRequired[str], "generate-setup-file": NotRequired[bool]}, ) From 0d2f762c0095eb4075523dccdd7fa2d6b566b065 Mon Sep 17 00:00:00 2001 From: dylan-robins Date: Thu, 28 Mar 2024 17:52:54 +0100 Subject: [PATCH 05/10] Fixed bug introduced in previous commit. --- src/poetry/core/masonry/builders/builder.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/poetry/core/masonry/builders/builder.py b/src/poetry/core/masonry/builders/builder.py index f1d2bead5..3718bb540 100644 --- a/src/poetry/core/masonry/builders/builder.py +++ b/src/poetry/core/masonry/builders/builder.py @@ -66,7 +66,7 @@ def _module(self) -> Module: formats = [formats] if ( - formats + len(formats) > 0 and self.format and self.format not in formats and not self._ignore_packages_formats @@ -80,7 +80,8 @@ def _module(self) -> Module: formats = include.get("format", []) if ( - self.format + len(formats) > 0 + and self.format and self.format not in formats and not self._ignore_packages_formats ): From 2abbd3cefe6521f61c5a315883c87b42f180c73e Mon Sep 17 00:00:00 2001 From: dylan-robins Date: Thu, 28 Mar 2024 18:04:39 +0100 Subject: [PATCH 06/10] Use typing_extensions to support versions [3.8, 3.11[ --- src/poetry/core/packages/project_package.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/poetry/core/packages/project_package.py b/src/poetry/core/packages/project_package.py index 836fb0224..de749d122 100644 --- a/src/poetry/core/packages/project_package.py +++ b/src/poetry/core/packages/project_package.py @@ -5,10 +5,11 @@ from typing import TYPE_CHECKING from typing import Literal from typing import Mapping -from typing import NotRequired from typing import Sequence from typing import TypedDict +from typing_extensions import NotRequired + from poetry.core.constraints.version import parse_constraint from poetry.core.version.markers import parse_marker From a77063668db2d6fd1e64d2ca565b4da3065d78c4 Mon Sep 17 00:00:00 2001 From: dylan-robins Date: Thu, 28 Mar 2024 18:06:50 +0100 Subject: [PATCH 07/10] Added typing_extensions to dependencies --- poetry.lock | 9 +++++---- pyproject.toml | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 64e272c30..37b79b51c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -696,6 +696,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, @@ -955,13 +956,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.10.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, + {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, ] [[package]] @@ -1041,4 +1042,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "f735bca440c1c1eeba822e475315a9c86fcb2cbb4f9aa3cd6920527cb9a5a55d" +content-hash = "7b6c3cce0a3510ee989278d1f866ca0eb3f95c49a6eb2017ec3ba223a482f724" diff --git a/pyproject.toml b/pyproject.toml index 02b0735ff..6bf6fd534 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,6 +24,7 @@ include = [ [tool.poetry.dependencies] python = "^3.8" +typing-extensions = "^4.10.0" [tool.poetry.group.dev.dependencies] pre-commit = ">=2.15.0" From c47aad19d42793ccc7bb466790936230f115c635 Mon Sep 17 00:00:00 2001 From: dylan-robins Date: Sun, 31 Mar 2024 13:42:46 +0200 Subject: [PATCH 08/10] Removed dependency on typing_extensions & hid uses behind `if TYPE_CHECKING` guards --- poetry.lock | 2 +- pyproject.toml | 1 - src/poetry/core/factory.py | 18 ++++++---- src/poetry/core/packages/project_package.py | 37 +++++++++------------ 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/poetry.lock b/poetry.lock index 37b79b51c..170c2d4f4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1042,4 +1042,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "7b6c3cce0a3510ee989278d1f866ca0eb3f95c49a6eb2017ec3ba223a482f724" +content-hash = "f735bca440c1c1eeba822e475315a9c86fcb2cbb4f9aa3cd6920527cb9a5a55d" diff --git a/pyproject.toml b/pyproject.toml index 6bf6fd534..02b0735ff 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,6 @@ include = [ [tool.poetry.dependencies] python = "^3.8" -typing-extensions = "^4.10.0" [tool.poetry.group.dev.dependencies] pre-commit = ">=2.15.0" diff --git a/src/poetry/core/factory.py b/src/poetry/core/factory.py index e87987a7b..0748249a4 100644 --- a/src/poetry/core/factory.py +++ b/src/poetry/core/factory.py @@ -8,21 +8,22 @@ from typing import Any from typing import List from typing import Union -from typing import cast from packaging.utils import canonicalize_name -from poetry.core.packages.project_package import BuildConfigSpec -from poetry.core.packages.project_package import IncludeSpec from poetry.core.utils.helpers import combine_unicode from poetry.core.utils.helpers import readme_content_type if TYPE_CHECKING: + from typing import cast + from packaging.utils import NormalizedName from poetry.core.packages.dependency import Dependency from poetry.core.packages.dependency_group import DependencyGroup + from poetry.core.packages.project_package import BuildConfigSpec + from poetry.core.packages.project_package import IncludeSpec from poetry.core.packages.project_package import ProjectPackage from poetry.core.poetry import Poetry from poetry.core.spdx.license import License @@ -200,9 +201,13 @@ def configure_package( if "build" in config: build = config["build"] + if not build: + build = {} if not isinstance(build, dict): build = {"script": build} - package.build_config = cast(BuildConfigSpec, build) or {} + if TYPE_CHECKING: + cast(BuildConfigSpec, build) + package.build_config = build if "include" in config: package.include = [] @@ -215,8 +220,9 @@ def configure_package( if formats and not isinstance(formats, list): formats = [formats] include["format"] = formats - - package.include.append(cast(IncludeSpec, include)) + if TYPE_CHECKING: + include = cast(IncludeSpec, include) + package.include.append(include) if "exclude" in config: package.exclude = config["exclude"] diff --git a/src/poetry/core/packages/project_package.py b/src/poetry/core/packages/project_package.py index de749d122..e20041c24 100644 --- a/src/poetry/core/packages/project_package.py +++ b/src/poetry/core/packages/project_package.py @@ -8,38 +8,33 @@ from typing import Sequence from typing import TypedDict -from typing_extensions import NotRequired - from poetry.core.constraints.version import parse_constraint +from poetry.core.packages.package import Package +from poetry.core.packages.utils.utils import create_nested_marker from poetry.core.version.markers import parse_marker if TYPE_CHECKING: + from typing_extensions import NotRequired + from poetry.core.constraints.version import Version from poetry.core.packages.dependency import Dependency -from poetry.core.packages.package import Package -from poetry.core.packages.utils.utils import create_nested_marker - - -SupportedPackageFormats = Literal["sdist", "wheel"] - - -BuildConfigSpec = TypedDict( - "BuildConfigSpec", - {"script": NotRequired[str], "generate-setup-file": NotRequired[bool]}, -) - + SupportedPackageFormats = Literal["sdist", "wheel"] -class PackageSpec(TypedDict): - include: str - to: str - format: list[SupportedPackageFormats] + BuildConfigSpec = TypedDict( + "BuildConfigSpec", + {"script": NotRequired[str], "generate-setup-file": NotRequired[bool]}, + ) + class PackageSpec(TypedDict): + include: str + to: str + format: list[SupportedPackageFormats] -class IncludeSpec(TypedDict): - path: str - format: list[SupportedPackageFormats] + class IncludeSpec(TypedDict): + path: str + format: list[SupportedPackageFormats] class ProjectPackage(Package): From f1319a7e3e9a4f07b6cb148a2c7b6ff80ee47bfd Mon Sep 17 00:00:00 2001 From: dylan-robins Date: Sun, 31 Mar 2024 13:57:55 +0200 Subject: [PATCH 09/10] Fixed typo --- src/poetry/core/factory.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/poetry/core/factory.py b/src/poetry/core/factory.py index 0748249a4..b842493f0 100644 --- a/src/poetry/core/factory.py +++ b/src/poetry/core/factory.py @@ -206,7 +206,7 @@ def configure_package( if not isinstance(build, dict): build = {"script": build} if TYPE_CHECKING: - cast(BuildConfigSpec, build) + build = cast(BuildConfigSpec, build) package.build_config = build if "include" in config: From 451c8117f0dc42e9b11a5c648284265af8fb708e Mon Sep 17 00:00:00 2001 From: dylan-robins Date: Mon, 1 Apr 2024 09:35:04 +0200 Subject: [PATCH 10/10] removed ugly `if TYPE_CHECKING` guards inside core code --- src/poetry/core/factory.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/poetry/core/factory.py b/src/poetry/core/factory.py index b842493f0..400ac481c 100644 --- a/src/poetry/core/factory.py +++ b/src/poetry/core/factory.py @@ -8,6 +8,7 @@ from typing import Any from typing import List from typing import Union +from typing import cast from packaging.utils import canonicalize_name @@ -16,8 +17,6 @@ if TYPE_CHECKING: - from typing import cast - from packaging.utils import NormalizedName from poetry.core.packages.dependency import Dependency @@ -205,9 +204,7 @@ def configure_package( build = {} if not isinstance(build, dict): build = {"script": build} - if TYPE_CHECKING: - build = cast(BuildConfigSpec, build) - package.build_config = build + package.build_config = cast("BuildConfigSpec", build) if "include" in config: package.include = [] @@ -220,9 +217,7 @@ def configure_package( if formats and not isinstance(formats, list): formats = [formats] include["format"] = formats - if TYPE_CHECKING: - include = cast(IncludeSpec, include) - package.include.append(include) + package.include.append(cast("IncludeSpec", include)) if "exclude" in config: package.exclude = config["exclude"]