From 4b565cbebba85ef0a6677cf28c98f182c3bb0408 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Sun, 16 Jul 2023 20:05:22 -0500 Subject: [PATCH 1/7] fix: normalize sdist names Signed-off-by: Henry Schreiner --- src/scikit_build_core/build/sdist.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/scikit_build_core/build/sdist.py b/src/scikit_build_core/build/sdist.py index 63a7a60b9..0ee64d5cc 100644 --- a/src/scikit_build_core/build/sdist.py +++ b/src/scikit_build_core/build/sdist.py @@ -8,6 +8,9 @@ import tarfile from pathlib import Path +from packaging.utils import canonicalize_name +from packaging.version import Version + from .._compat import tomllib from ..settings.metadata import get_standard_metadata from ..settings.skbuild_read_settings import SettingsReader @@ -87,7 +90,17 @@ def build_sdist( # https://github.com/FFY00/python-pyproject-metadata/pull/49 pkg_info = bytes(copy.deepcopy(metadata).as_rfc822()) - srcdirname = f"{metadata.name}-{metadata.version}" + # Only normalize SDist name if 0.5+ is requested for backwards compat + should_normalize_name = settings.minimum_version is None or Version( + settings.minimum_version + ) >= Version("0.5") + + sdist_name = ( + canonicalize_name(metadata.name).replace("-", "_") + if should_normalize_name + else metadata.name + ) + srcdirname = f"{sdist_name}-{metadata.version}" filename = f"{srcdirname}.tar.gz" sdist_dir.mkdir(parents=True, exist_ok=True) From d77ea0a734672e3185bb896b3423aca168f0597f Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Tue, 1 Aug 2023 10:15:13 -0400 Subject: [PATCH 2/7] tests: adapt to normalized names Signed-off-by: Henry Schreiner --- tests/conftest.py | 8 ++++---- tests/test_pyproject_pep517.py | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index c27887a88..09a2d96fa 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -231,10 +231,10 @@ def package_simple_pyproject_ext( ) -> PackageInfo: package = PackageInfo( "simple_pyproject_ext", - "cbf3102cf86f709dfd3f244b69e5ee3faff9e3c94c53ef85f146d9bad96660b3", - "538a8221e10c5029c78127e4169d2df622b9a88dfce12a8b63eeaaa98cda8a09", - "0dab37b48497f95c044781204b7d49c752739b32a0ef7a7a02ec987b5c4a210b", - "feeedcb0070a211d93b967fe083aa31e448842eb9b93d5e428807348e40e44e8", + "4e7316a1cc4784bd55673f80a35f89e4914636e0a217c35c7061b085675945cb", + "445bd84053106ea41fd822cb57b571a23b2bfaba5d8c5b4176aba9e07776103f", + "8e4699df8afa812d7c022a3840dfbdce5b4f0e9aac5700dbc5eeb522482f135d", + "676cca918aef5b9b4a3db1499a39e61b0cbacf5edf3379bf8e3d90fe75f01a8c", ) process_package(package, tmp_path, monkeypatch) return package diff --git a/tests/test_pyproject_pep517.py b/tests/test_pyproject_pep517.py index a351da640..96c04a14e 100644 --- a/tests/test_pyproject_pep517.py +++ b/tests/test_pyproject_pep517.py @@ -43,13 +43,13 @@ def test_pep517_sdist(): out = build_sdist("dist") (sdist,) = dist.iterdir() - assert sdist.name == "cmake-example-0.0.1.tar.gz" + assert sdist.name == "cmake_example-0.0.1.tar.gz" assert sdist == dist / out with tarfile.open(sdist) as f: file_names = set(f.getnames()) assert file_names == { - f"cmake-example-0.0.1/{x}" + f"cmake_example-0.0.1/{x}" for x in ( "CMakeLists.txt", "pyproject.toml", @@ -58,7 +58,7 @@ def test_pep517_sdist(): "LICENSE", ) } - pkg_info = f.extractfile("cmake-example-0.0.1/PKG-INFO") + pkg_info = f.extractfile("cmake_example-0.0.1/PKG-INFO") assert pkg_info pkg_info_contents = pkg_info.read().decode() assert pkg_info_contents == METADATA From be06f08cd443a744cf20c9b8e072732174bad8ee Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Tue, 1 Aug 2023 14:48:05 -0400 Subject: [PATCH 3/7] fix: patch pyproject-metadata name Signed-off-by: Henry Schreiner --- src/scikit_build_core/settings/metadata.py | 5 ++++- tests/conftest.py | 4 ++-- tests/test_pyproject_pep517.py | 8 ++++---- tests/test_pyproject_pep518.py | 8 ++++---- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/scikit_build_core/settings/metadata.py b/src/scikit_build_core/settings/metadata.py index f0462ca76..3abde119f 100644 --- a/src/scikit_build_core/settings/metadata.py +++ b/src/scikit_build_core/settings/metadata.py @@ -44,4 +44,7 @@ def get_standard_metadata( for field in fields: pyproject_dict["project"]["dynamic"].remove(field) - return StandardMetadata.from_pyproject(pyproject_dict) + metadata = StandardMetadata.from_pyproject(pyproject_dict) + # pyproject-metadata normalizes the name - see https://github.com/FFY00/python-pyproject-metadata/pull/65 + metadata.name = pyproject_dict["project"]["name"] + return metadata diff --git a/tests/conftest.py b/tests/conftest.py index 09a2d96fa..68e7b3242 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -232,8 +232,8 @@ def package_simple_pyproject_ext( package = PackageInfo( "simple_pyproject_ext", "4e7316a1cc4784bd55673f80a35f89e4914636e0a217c35c7061b085675945cb", - "445bd84053106ea41fd822cb57b571a23b2bfaba5d8c5b4176aba9e07776103f", - "8e4699df8afa812d7c022a3840dfbdce5b4f0e9aac5700dbc5eeb522482f135d", + "9e08d9661235ee1d22120248eff75a5402b0b58853cc00737434476b1cb88d36", + "04e182483cde878b6ede94e587207eca94913ef195f796c7521af006e1d2b3a0", "676cca918aef5b9b4a3db1499a39e61b0cbacf5edf3379bf8e3d90fe75f01a8c", ) process_package(package, tmp_path, monkeypatch) diff --git a/tests/test_pyproject_pep517.py b/tests/test_pyproject_pep517.py index 96c04a14e..9feda9ab1 100644 --- a/tests/test_pyproject_pep517.py +++ b/tests/test_pyproject_pep517.py @@ -23,7 +23,7 @@ """ METADATA = """\ Metadata-Version: 2.1 -Name: cmake-example +Name: cmake_example Version: 0.0.1 Requires-Python: >=3.7 Provides-Extra: test @@ -173,7 +173,7 @@ def test_pep517_wheel(virtualenv): print(entry_points == ENTRYPOINTS) assert 'Requires-Dist: pytest>=6.0; extra == "test"' in metadata assert "Metadata-Version: 2.1" in metadata - assert "Name: cmake-example" in metadata + assert "Name: cmake_example" in metadata assert "Version: 0.0.1" in metadata assert "Requires-Python: >=3.7" in metadata assert "Provides-Extra: test" in metadata @@ -221,7 +221,7 @@ def test_pep517_wheel_source_dir(virtualenv): print(entry_points == ENTRYPOINTS) assert 'Requires-Dist: pytest>=6.0; extra == "test"' in metadata assert "Metadata-Version: 2.1" in metadata - assert "Name: cmake-example" in metadata + assert "Name: cmake_example" in metadata assert "Version: 0.0.1" in metadata assert "Requires-Python: >=3.7" in metadata assert "Provides-Extra: test" in metadata @@ -268,7 +268,7 @@ def test_prepare_metdata_for_build_wheel(): metadata = build.util.project_wheel_metadata(str(Path.cwd()), isolated=False) answer = { "Metadata-Version": "2.1", - "Name": "cmake-example", + "Name": "cmake_example", "Version": "0.0.1", "Requires-Python": ">=3.7", "Provides-Extra": "test", diff --git a/tests/test_pyproject_pep518.py b/tests/test_pyproject_pep518.py index a46a98c82..40047a1f0 100644 --- a/tests/test_pyproject_pep518.py +++ b/tests/test_pyproject_pep518.py @@ -16,7 +16,7 @@ def test_pep518_sdist(package_simple_pyproject_ext): correct_metadata = textwrap.dedent( """\ Metadata-Version: 2.1 - Name: cmake-example + Name: cmake_example Version: 0.0.1 Requires-Python: >=3.7 Provides-Extra: test @@ -26,7 +26,7 @@ def test_pep518_sdist(package_simple_pyproject_ext): subprocess.run([sys.executable, "-m", "build", "--sdist"], check=True) (sdist,) = Path("dist").iterdir() - assert sdist.name == "cmake-example-0.0.1.tar.gz" + assert sdist.name == "cmake_example-0.0.1.tar.gz" if not sys.platform.startswith(("win", "cygwin")): hash = hashlib.sha256(sdist.read_bytes()).hexdigest() @@ -35,7 +35,7 @@ def test_pep518_sdist(package_simple_pyproject_ext): with tarfile.open(sdist) as f: file_names = set(f.getnames()) assert file_names == { - f"cmake-example-0.0.1/{x}" + f"cmake_example-0.0.1/{x}" for x in ( "CMakeLists.txt", "pyproject.toml", @@ -44,7 +44,7 @@ def test_pep518_sdist(package_simple_pyproject_ext): "LICENSE", ) } - pkg_info = f.extractfile("cmake-example-0.0.1/PKG-INFO") + pkg_info = f.extractfile("cmake_example-0.0.1/PKG-INFO") assert pkg_info pkg_info_contents = pkg_info.read().decode() assert correct_metadata == pkg_info_contents From 6e4812d47a329a7c76f528650a3ac9e2b022adc1 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Wed, 2 Aug 2023 12:51:57 -0400 Subject: [PATCH 4/7] tests: fix PEP 518 test & check for full normalization Signed-off-by: Henry Schreiner --- noxfile.py | 2 +- tests/conftest.py | 8 ++++---- tests/packages/simple_pyproject_ext/pyproject.toml | 2 +- tests/packages/simple_pyproject_source_dir/pyproject.toml | 2 +- tests/test_pyproject_pep517.py | 8 ++++---- tests/test_pyproject_pep518.py | 6 +++--- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/noxfile.py b/noxfile.py index cef823bbb..f0dcd15e0 100644 --- a/noxfile.py +++ b/noxfile.py @@ -60,7 +60,7 @@ def _run_tests( session.run("pytest", *run_args, *posargs, env=env) -@nox.session +@nox.session(python="3.7") def tests(session: nox.Session) -> None: """ Run the unit and regular tests. Includes coverage if --cov passed. diff --git a/tests/conftest.py b/tests/conftest.py index 68e7b3242..f965e2fb5 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -231,10 +231,10 @@ def package_simple_pyproject_ext( ) -> PackageInfo: package = PackageInfo( "simple_pyproject_ext", - "4e7316a1cc4784bd55673f80a35f89e4914636e0a217c35c7061b085675945cb", - "9e08d9661235ee1d22120248eff75a5402b0b58853cc00737434476b1cb88d36", - "04e182483cde878b6ede94e587207eca94913ef195f796c7521af006e1d2b3a0", - "676cca918aef5b9b4a3db1499a39e61b0cbacf5edf3379bf8e3d90fe75f01a8c", + "c75641407303f3f3a0fd76d24e3d12447b31286fa5d0f687c0f8f8eb804d839f", + "dc4921bdf694b1b88cb27c8e6128513e174689625447d18c1dd3353348824946", + "2a135ce826265c5c1c73ebcb603989d8e2f4bca4605ad04c6c82871b5f75840e", + "7558e1db89e62b0941671796e1a35983a0b50a0701736566ca3ae5dd9ba09846", ) process_package(package, tmp_path, monkeypatch) return package diff --git a/tests/packages/simple_pyproject_ext/pyproject.toml b/tests/packages/simple_pyproject_ext/pyproject.toml index b23fdf9df..01748c9e4 100644 --- a/tests/packages/simple_pyproject_ext/pyproject.toml +++ b/tests/packages/simple_pyproject_ext/pyproject.toml @@ -6,7 +6,7 @@ requires = [ build-backend = "scikit_build_core.build" [project] -name = "cmake_example" +name = "CMake.Example" version = "0.0.1" requires-python = ">=3.7" diff --git a/tests/packages/simple_pyproject_source_dir/pyproject.toml b/tests/packages/simple_pyproject_source_dir/pyproject.toml index 95bc8bba8..6ddac4648 100644 --- a/tests/packages/simple_pyproject_source_dir/pyproject.toml +++ b/tests/packages/simple_pyproject_source_dir/pyproject.toml @@ -9,7 +9,7 @@ build-backend = "scikit_build_core.build" cmake.source-dir = "src" [project] -name = "cmake_example" +name = "CMake.Example" version = "0.0.1" requires-python = ">=3.7" diff --git a/tests/test_pyproject_pep517.py b/tests/test_pyproject_pep517.py index 9feda9ab1..d4474b885 100644 --- a/tests/test_pyproject_pep517.py +++ b/tests/test_pyproject_pep517.py @@ -23,7 +23,7 @@ """ METADATA = """\ Metadata-Version: 2.1 -Name: cmake_example +Name: CMake.Example Version: 0.0.1 Requires-Python: >=3.7 Provides-Extra: test @@ -173,7 +173,7 @@ def test_pep517_wheel(virtualenv): print(entry_points == ENTRYPOINTS) assert 'Requires-Dist: pytest>=6.0; extra == "test"' in metadata assert "Metadata-Version: 2.1" in metadata - assert "Name: cmake_example" in metadata + assert "Name: CMake.Example" in metadata assert "Version: 0.0.1" in metadata assert "Requires-Python: >=3.7" in metadata assert "Provides-Extra: test" in metadata @@ -221,7 +221,7 @@ def test_pep517_wheel_source_dir(virtualenv): print(entry_points == ENTRYPOINTS) assert 'Requires-Dist: pytest>=6.0; extra == "test"' in metadata assert "Metadata-Version: 2.1" in metadata - assert "Name: cmake_example" in metadata + assert "Name: CMake.Example" in metadata assert "Version: 0.0.1" in metadata assert "Requires-Python: >=3.7" in metadata assert "Provides-Extra: test" in metadata @@ -268,7 +268,7 @@ def test_prepare_metdata_for_build_wheel(): metadata = build.util.project_wheel_metadata(str(Path.cwd()), isolated=False) answer = { "Metadata-Version": "2.1", - "Name": "cmake_example", + "Name": "CMake.Example", "Version": "0.0.1", "Requires-Python": ">=3.7", "Provides-Extra": "test", diff --git a/tests/test_pyproject_pep518.py b/tests/test_pyproject_pep518.py index 40047a1f0..e953797db 100644 --- a/tests/test_pyproject_pep518.py +++ b/tests/test_pyproject_pep518.py @@ -1,6 +1,5 @@ import hashlib import shutil -import subprocess import sys import tarfile import textwrap @@ -12,7 +11,7 @@ @pytest.mark.network() @pytest.mark.integration() -def test_pep518_sdist(package_simple_pyproject_ext): +def test_pep518_sdist(isolated, package_simple_pyproject_ext): correct_metadata = textwrap.dedent( """\ Metadata-Version: 2.1 @@ -24,7 +23,8 @@ def test_pep518_sdist(package_simple_pyproject_ext): """ ) - subprocess.run([sys.executable, "-m", "build", "--sdist"], check=True) + isolated.install("build[virtualenv]") + isolated.module("build", "--sdist") (sdist,) = Path("dist").iterdir() assert sdist.name == "cmake_example-0.0.1.tar.gz" From 476e5a9e0b837e633600b913e2b169c30f5476f7 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Wed, 2 Aug 2023 15:31:45 -0400 Subject: [PATCH 5/7] fix: SDist prints info too Signed-off-by: Henry Schreiner --- src/scikit_build_core/build/sdist.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/scikit_build_core/build/sdist.py b/src/scikit_build_core/build/sdist.py index 0ee64d5cc..11bedecf6 100644 --- a/src/scikit_build_core/build/sdist.py +++ b/src/scikit_build_core/build/sdist.py @@ -11,7 +11,9 @@ from packaging.utils import canonicalize_name from packaging.version import Version +from .. import __version__ from .._compat import tomllib +from .._logging import rich_print from ..settings.metadata import get_standard_metadata from ..settings.skbuild_read_settings import SettingsReader from ._file_processor import each_unignored_file @@ -71,6 +73,11 @@ def build_sdist( sdist_directory: str, config_settings: dict[str, list[str] | str] | None = None, ) -> str: + rich_print( + f"[green]***[/green] [bold][green]scikit-build-core {__version__}[/green]", + "[red](sdist)[/red]", + ) + with Path("pyproject.toml").open("rb") as f: pyproject = tomllib.load(f) From 59f9bdb3666292080089e930af7a7a051e2dedbb Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Wed, 2 Aug 2023 16:10:07 -0400 Subject: [PATCH 6/7] tests: fix one more Signed-off-by: Henry Schreiner --- tests/test_pyproject_pep518.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_pyproject_pep518.py b/tests/test_pyproject_pep518.py index e953797db..5b514a20c 100644 --- a/tests/test_pyproject_pep518.py +++ b/tests/test_pyproject_pep518.py @@ -15,7 +15,7 @@ def test_pep518_sdist(isolated, package_simple_pyproject_ext): correct_metadata = textwrap.dedent( """\ Metadata-Version: 2.1 - Name: cmake_example + Name: CMake.Example Version: 0.0.1 Requires-Python: >=3.7 Provides-Extra: test From 3576bdc9aee33ddf6fd7670bca858a204fb5b864 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Wed, 2 Aug 2023 16:16:26 -0400 Subject: [PATCH 7/7] fix: back-compat for normalizing name too Signed-off-by: Henry Schreiner --- docs/configuration.md | 10 ++++++++++ noxfile.py | 2 +- src/scikit_build_core/settings/metadata.py | 7 ++++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index 7f31239b2..74837d420 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -90,6 +90,16 @@ probably keep in sync with your build-system requirements. minimum-version = "0.2" ``` +:::{warning} + +The following behaviors are affected by `minimum-version`: + +- `minimum-version` 0.5+ (or unset) provides the original name in metadata and + properly normalized SDist names. +- `minimum-version` 0.5+ (or unset) strips binaries by default. + +::: + ## CMake and Ninja minimum versions You can select a different minimum version for CMake and Ninja. diff --git a/noxfile.py b/noxfile.py index f0dcd15e0..cef823bbb 100644 --- a/noxfile.py +++ b/noxfile.py @@ -60,7 +60,7 @@ def _run_tests( session.run("pytest", *run_args, *posargs, env=env) -@nox.session(python="3.7") +@nox.session def tests(session: nox.Session) -> None: """ Run the unit and regular tests. Includes coverage if --cov passed. diff --git a/src/scikit_build_core/settings/metadata.py b/src/scikit_build_core/settings/metadata.py index 3abde119f..bb6ba2516 100644 --- a/src/scikit_build_core/settings/metadata.py +++ b/src/scikit_build_core/settings/metadata.py @@ -2,6 +2,7 @@ from typing import Any +from packaging.version import Version from pyproject_metadata import StandardMetadata from ..settings.skbuild_model import ScikitBuildSettings @@ -46,5 +47,9 @@ def get_standard_metadata( metadata = StandardMetadata.from_pyproject(pyproject_dict) # pyproject-metadata normalizes the name - see https://github.com/FFY00/python-pyproject-metadata/pull/65 - metadata.name = pyproject_dict["project"]["name"] + # For scikit-build-core 0.5+, we keep the un-normalized name, and normalize it when using it for filenames + if settings.minimum_version is None or Version(settings.minimum_version) >= Version( + "0.5" + ): + metadata.name = pyproject_dict["project"]["name"] return metadata