diff --git a/poetry.lock b/poetry.lock index 64e272c30..170c2d4f4 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]] diff --git a/src/poetry/core/factory.py b/src/poetry/core/factory.py index 5e74991e3..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 @@ -20,6 +21,8 @@ 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 @@ -197,9 +200,11 @@ 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 = build or {} + package.build_config = cast("BuildConfigSpec", build) if "include" in config: package.include = [] @@ -212,8 +217,7 @@ def configure_package( if formats and not isinstance(formats, list): 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..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,7 @@ def _module(self) -> Module: formats = include.get("format", []) if ( - formats + len(formats) > 0 and 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 fad048258..e20041c24 100644 --- a/src/poetry/core/packages/project_package.py +++ b/src/poetry/core/packages/project_package.py @@ -3,20 +3,38 @@ import warnings from typing import TYPE_CHECKING -from typing import Any +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.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]}, + ) + + class PackageSpec(TypedDict): + include: str + to: str + format: list[SupportedPackageFormats] + + class IncludeSpec(TypedDict): + path: str + format: list[SupportedPackageFormats] class ProjectPackage(Package): @@ -39,10 +57,10 @@ 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.packages: Sequence[Mapping[str, Any]] = [] - self.include: Sequence[Mapping[str, Any]] = [] - self.exclude: Sequence[Mapping[str, Any]] = [] + self.build_config: BuildConfigSpec = {} + self.packages: Sequence[PackageSpec] = [] + self.include: Sequence[IncludeSpec] = [] + self.exclude: Sequence[IncludeSpec] = [] self.custom_urls: Mapping[str, str] = {} if self._python_versions == "*":