meson-python
meson-python copied to clipboard
Regressions against `pyproject-metadata==0.9.0b1` (prerelease)
As a heads up, pyproject-metadata==0.9.0b1 was released and it causes a few test regressions:
ERROR tests/test_sdist.py::test_pep621 - pyproject_metadata.ConfigurationWarning: "License" should not be multiline; indenting to avoid breakage
ERROR tests/test_wheel.py::test_contents_license_file - pyproject_metadata.ConfigurationWarning: "License" should not be multiline; indenting to avoid breakage
ERROR tests/test_wheel.py::test_entrypoints - pyproject_metadata.ConfigurationWarning: "License" should not be multiline; indenting to avoid breakage
FAILED tests/test_sdist.py::test_no_pep621 - AssertionError: assert 'Metadata-Version: 2.1\nName: library\nVersion: 1.0.0\n\n' == 'Metadata-Version: 2.1\nName: library\nVersion: 1.0.0\n'
Metadata-Version: 2.1
Name: library
Version: 1.0.0
+
FAILED tests/test_sdist.py::test_dynamic_version - AssertionError: assert 'Metadata-Version: 2.1\nName: dynamic-version\nVersion: 1.0.0\n\n' == 'Metadata-Version: 2.1\nName: dynamic-version\nVersion: 1.0.0\n'
Metadata-Version: 2.1
Name: dynamic-version
Version: 1.0.0
+
Full output
$ pytest --vl
ERROR: usage: pytest [options] [file_or_dir] [file_or_dir] [...]
pytest: error: unrecognized arguments: --vl
inifile: /tmp/meson-python/pyproject.toml
rootdir: /tmp/meson-python
(test-3-11) mgorny@pomiot /tmp/meson-python $ pytest -vvl
========================================================= test session starts =========================================================
platform linux -- Python 3.11.10, pytest-8.3.3, pluggy-1.5.0 -- /tmp/meson-python/.nox/test-3-11/bin/python
cachedir: .pytest_cache
rootdir: /tmp/meson-python
configfile: pyproject.toml
testpaths: tests
plugins: mock-3.14.0, cov-5.0.0
collected 123 items
tests/test_consistency.py::test_pyproject_dependencies PASSED [ 0%]
tests/test_editable.py::test_walk PASSED [ 1%]
tests/test_editable.py::test_nodes_tree PASSED [ 2%]
tests/test_editable.py::test_collect PASSED [ 3%]
tests/test_editable.py::test_mesonpy_meta_finder PASSED [ 4%]
tests/test_editable.py::test_mesonpy_traversable PASSED [ 4%]
tests/test_editable.py::test_resources PASSED [ 5%]
tests/test_editable.py::test_importlib_resources PASSED [ 6%]
tests/test_editable.py::test_editable_install PASSED [ 7%]
tests/test_editable.py::test_editble_reentrant PASSED [ 8%]
tests/test_editable.py::test_editable_pkgutils_walk_packages PASSED [ 8%]
tests/test_editable.py::test_custom_target_install_dir PASSED [ 9%]
tests/test_editable.py::test_editable_rebuild[-] PASSED [ 10%]
tests/test_editable.py::test_editable_rebuild[-verbose] PASSED [ 11%]
tests/test_editable.py::test_editable_rebuild[-Ccompile-args=-j1-] PASSED [ 12%]
tests/test_editable.py::test_editable_rebuild[-Ccompile-args=-j1-verbose] PASSED [ 13%]
tests/test_editable.py::test_editable_verbose PASSED [ 13%]
tests/test_editable.py::test_editable_rebuild_error[] PASSED [ 14%]
tests/test_editable.py::test_editable_rebuild_error[verbose] PASSED [ 15%]
tests/test_examples.py::test_spam PASSED [ 16%]
tests/test_metadata.py::test_package_name PASSED [ 17%]
tests/test_metadata.py::test_package_name_from_pyproject PASSED [ 17%]
tests/test_metadata.py::test_package_name_invalid PASSED [ 18%]
tests/test_metadata.py::test_unsupported_dynamic PASSED [ 19%]
tests/test_metadata.py::test_missing_version PASSED [ 20%]
tests/test_options.py::test_ndebug[] PASSED [ 21%]
tests/test_options.py::test_ndebug[-Dbuildtype=release] PASSED [ 21%]
tests/test_options.py::test_ndebug[-Dbuildtype=debug] PASSED [ 22%]
tests/test_output.py::test_use_ansi_escapes[False-env0-False] PASSED [ 23%]
tests/test_output.py::test_use_ansi_escapes[True-env1-True] PASSED [ 24%]
tests/test_output.py::test_use_ansi_escapes[False-env2-False] PASSED [ 25%]
tests/test_output.py::test_use_ansi_escapes[True-env3-False] PASSED [ 26%]
tests/test_output.py::test_use_ansi_escapes[False-env4-True] PASSED [ 26%]
tests/test_output.py::test_use_ansi_escapes[True-env5-True] PASSED [ 27%]
tests/test_output.py::test_use_ansi_escapes[True-env6-False] PASSED [ 28%]
tests/test_output.py::test_use_ansi_escapes[True-env7-True] PASSED [ 29%]
tests/test_output.py::test_use_ansi_escapes[True-env8-False] PASSED [ 30%]
tests/test_pep517.py::test_get_requires_for_build_wheel[noninja-patchelf] PASSED [ 30%]
tests/test_pep517.py::test_get_requires_for_build_wheel[noninja-nopatchelf] PASSED [ 31%]
tests/test_pep517.py::test_get_requires_for_build_wheel[oldninja-patchelf] PASSED [ 32%]
tests/test_pep517.py::test_get_requires_for_build_wheel[oldninja-nopatchelf] PASSED [ 33%]
tests/test_pep517.py::test_get_requires_for_build_wheel[newninja-patchelf] PASSED [ 34%]
tests/test_pep517.py::test_get_requires_for_build_wheel[newninja-nopatchelf] PASSED [ 34%]
tests/test_pep517.py::test_invalid_config_settings PASSED [ 35%]
tests/test_pep517.py::test_invalid_config_settings_suggest PASSED [ 36%]
tests/test_pep517.py::test_validate_config_settings_invalid PASSED [ 37%]
tests/test_pep517.py::test_validate_config_settings_repeated PASSED [ 38%]
tests/test_pep517.py::test_validate_config_settings_str PASSED [ 39%]
tests/test_pep517.py::test_validate_config_settings_list PASSED [ 39%]
tests/test_pep517.py::test_validate_config_settings_tuple PASSED [ 40%]
tests/test_pep517.py::test_get_meson_command[None] PASSED [ 41%]
tests/test_pep517.py::test_get_meson_command[meson] PASSED [ 42%]
tests/test_pep517.py::test_get_meson_command_bad_path PASSED [ 43%]
tests/test_pep517.py::test_get_meson_command_bad_python_path PASSED [ 43%]
tests/test_pep517.py::test_get_meson_command_wrong_version PASSED [ 44%]
tests/test_pep517.py::test_get_meson_command_error PASSED [ 45%]
tests/test_project.py::test_unsupported_python_version PASSED [ 46%]
tests/test_project.py::test_missing_meson_version PASSED [ 47%]
tests/test_project.py::test_missing_dynamic_version PASSED [ 47%]
tests/test_project.py::test_user_args PASSED [ 48%]
tests/test_project.py::test_unknown_user_args[top-level] PASSED [ 49%]
tests/test_project.py::test_unknown_user_args[meson-args] PASSED [ 50%]
tests/test_project.py::test_install_tags PASSED [ 51%]
tests/test_project.py::test_validate_pyproject_config_one PASSED [ 52%]
tests/test_project.py::test_validate_pyproject_config_all PASSED [ 52%]
tests/test_project.py::test_validate_pyproject_config_unknown PASSED [ 53%]
tests/test_project.py::test_validate_pyproject_config_empty PASSED [ 54%]
tests/test_project.py::test_invalid_build_dir PASSED [ 55%]
tests/test_project.py::test_compiler SKIPPED (Requires MSVC) [ 56%]
tests/test_project.py::test_archflags_envvar_parsing[-arch x86_64] SKIPPED (macOS specific test) [ 56%]
tests/test_project.py::test_archflags_envvar_parsing[-arch arm64] SKIPPED (macOS specific test) [ 57%]
tests/test_project.py::test_archflags_envvar_parsing[-arch arm64 -arch arm64] SKIPPED (macOS specific test) [ 58%]
tests/test_project.py::test_archflags_envvar_parsing_invalid[-arch arm64 -arch x86_64] SKIPPED (macOS specific test) [ 59%]
tests/test_project.py::test_archflags_envvar_parsing_invalid[-arch arm64 -DFOO=1] SKIPPED (macOS specific test) [ 60%]
tests/test_sdist.py::test_no_pep621 FAILED [ 60%]
tests/test_sdist.py::test_pep621 ERROR [ 61%]
tests/test_sdist.py::test_dynamic_version FAILED [ 62%]
tests/test_sdist.py::test_contents PASSED [ 63%]
tests/test_sdist.py::test_contents_subdirs PASSED [ 64%]
tests/test_sdist.py::test_contents_unstaged PASSED [ 65%]
tests/test_sdist.py::test_executable_bit PASSED [ 65%]
tests/test_sdist.py::test_generated_files PASSED [ 66%]
tests/test_sdist.py::test_long_path PASSED [ 67%]
tests/test_sdist.py::test_reproducible PASSED [ 68%]
tests/test_tags.py::test_wheel_tag PASSED [ 69%]
tests/test_tags.py::test_macos_platform_tag SKIPPED (macOS specific test) [ 69%]
tests/test_tags.py::test_macos_platform_tag_arm64 SKIPPED (macOS specific test) [ 70%]
tests/test_tags.py::test_python_host_platform SKIPPED (macOS specific test) [ 71%]
tests/test_tags.py::test_tag_empty_wheel PASSED [ 72%]
tests/test_tags.py::test_tag_purelib_wheel PASSED [ 73%]
tests/test_tags.py::test_tag_platlib_wheel PASSED [ 73%]
tests/test_tags.py::test_tag_stable_abi PASSED [ 74%]
tests/test_tags.py::test_tag_mixed_abi PASSED [ 75%]
tests/test_wheel.py::test_scipy_like PASSED [ 76%]
tests/test_wheel.py::test_purelib_and_platlib PASSED [ 77%]
tests/test_wheel.py::test_pure PASSED [ 78%]
tests/test_wheel.py::test_configure_data PASSED [ 78%]
tests/test_wheel.py::test_contents_license_file ERROR [ 79%]
tests/test_wheel.py::test_contents PASSED [ 80%]
tests/test_wheel.py::test_local_lib PASSED [ 81%]
tests/test_wheel.py::test_rpath PASSED [ 82%]
tests/test_wheel.py::test_uneeded_rpath PASSED [ 82%]
tests/test_wheel.py::test_executable_bit PASSED [ 83%]
tests/test_wheel.py::test_detect_wheel_tag_module PASSED [ 84%]
tests/test_wheel.py::test_detect_wheel_tag_script PASSED [ 85%]
tests/test_wheel.py::test_entrypoints ERROR [ 86%]
tests/test_wheel.py::test_top_level_modules PASSED [ 86%]
tests/test_wheel.py::test_purelib_platlib_split PASSED [ 87%]
tests/test_wheel.py::test_archflags_envvar[x86_64] SKIPPED (macOS specific test) [ 88%]
tests/test_wheel.py::test_archflags_envvar[arm64] SKIPPED (macOS specific test) [ 89%]
tests/test_wheel.py::test_subprojects PASSED [ 90%]
tests/test_wheel.py::test_skip_subprojects[--skip-subprojects] PASSED [ 91%]
tests/test_wheel.py::test_skip_subprojects[--skip-subprojects=dep] PASSED [ 91%]
tests/test_wheel.py::test_limited_api PASSED [ 92%]
tests/test_wheel.py::test_limited_api_bad PASSED [ 93%]
tests/test_wheel.py::test_limited_api_disabled PASSED [ 94%]
tests/test_wheel.py::test_install_subdir PASSED [ 95%]
tests/test_wheel.py::test_vendored_meson PASSED [ 95%]
tests/test_wheel.py::test_encoding PASSED [ 96%]
tests/test_wheel.py::test_custom_target_install_dir PASSED [ 97%]
tests/test_wheelfile.py::test_basic PASSED [ 98%]
tests/test_wheelfile.py::test_source_date_epoch PASSED [ 99%]
tests/test_wheelfile.py::test_compression PASSED [100%]
=============================================================== ERRORS ================================================================
____________________________________________________ ERROR at setup of test_pep621 ____________________________________________________
tmp_path_session = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia')
@pytest.fixture(scope='session')
def fixture(tmp_path_session):
with chdir(package_dir / package), in_git_repo_context():
> return tmp_path_session / mesonpy.build_sdist(tmp_path_session)
package = 'full-metadata'
tmp_path_session = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia')
tests/conftest.py:131:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
mesonpy/__init__.py:1047: in wrapper
return func(*args, **kwargs)
args = (PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia'),)
func = <function build_sdist at 0x7f1ed85e8fe0>
kwargs = {}
mesonpy/__init__.py:1089: in build_sdist
return project.sdist(out).name
config_settings = None
out = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia')
project = <mesonpy.Project object at 0x7f1ed5c92550>
sdist_directory = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia')
mesonpy/__init__.py:934: in sdist
metadata = bytes(self._metadata.as_rfc822())
directory = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia')
dist_name = 'full_metadata-1.2.3'
file = <ExFileObject name='/tmp/meson-python/tests/packages/full-metadata/.mesonpy-fnrhas31/meson-dist/full-metadata-1.0.0.tar.gz'>
member = <TarInfo 'full_metadata-1.2.3/PKG-INFO' at 0x7f1ed5cdc700>
meson_dist = <tarfile.TarFile object at 0x7f1ed5cb3dd0>
meson_dist_name = 'full-metadata-1.0.0'
meson_dist_path = PosixPath('/tmp/meson-python/tests/packages/full-metadata/.mesonpy-fnrhas31/meson-dist/full-metadata-1.0.0.tar.gz')
pyproject_toml_mtime = 1726233738.0
sdist = <tarfile.TarFile object at 0x7f1ed5c97490>
sdist_path = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia/full_metadata-1.2.3.tar.gz')
self = <mesonpy.Project object at 0x7f1ed5c92550>
stem = 'pyproject.toml'
.nox/test-3-11/lib/python3.11/site-packages/pyproject_metadata/__init__.py:623: in as_rfc822
self.write_to_rfc822(message)
message = <pyproject_metadata.RFC822Message object at 0x7f1ed5c974d0>
self = Metadata(name='full-metadata',
version=<Version('1.2.3')>,
description='Some package with all of the PEP 621 metadata',
license=License(text='some license\n', file=PosixPath('/tmp/meson-python/tests/packages/full-metadata/LICENSE')),
license_files=None,
readme=Readme(text='<!--\nSPDX-FileCopyrightText: 2021 The meson-python developers\n\nSPDX-License-Identifier: MIT\n-->\n\n# full-metadata\n\nAn example package with all of the PEP 621 metadata!\n', file=PosixPath('/tmp/meson-python/tests/packages/full-metadata/README.md'), content_type='text/markdown'),
requires_python=<SpecifierSet('>=3.7', prereleases=True)>,
dependencies=[<Requirement('a')>,
<Requirement('b>1')>,
<Requirement('c>2; os_name != "nt"')>],
optional_dependencies={'test': [<Requirement('d<3')>,
<Requirement('e[all]')>]},
entrypoints={'something.custom': {'example': 'example:custom'}},
authors=[('Unknown', '[email protected]'), ('Jane Doe', None)],
maintainers=[('Jane Doe', '[email protected]')],
urls={'changelog': 'https://github.com/mesonbuild/meson-python/blob/master/CHANGELOG.rst',
'documentation': 'https://readthedocs.org',
'homepage': 'https://example.com',
'repository': 'https://github.com/mesonbuild/meson-python'},
classifiers=['Development Status :: 4 - Beta',
'Programming Language :: Python'],
keywords=['full', 'metadata'],
scripts={'example-cli': 'example:cli'},
gui_scripts={'example-gui': 'example:gui'},
dynamic=[],
_metadata_version=None)
.nox/test-3-11/lib/python3.11/site-packages/pyproject_metadata/__init__.py:651: in write_to_rfc822
smart_message['License'] = self.license.text
message = <pyproject_metadata.RFC822Message object at 0x7f1ed5c974d0>
self = Metadata(name='full-metadata',
version=<Version('1.2.3')>,
description='Some package with all of the PEP 621 metadata',
license=License(text='some license\n', file=PosixPath('/tmp/meson-python/tests/packages/full-metadata/LICENSE')),
license_files=None,
readme=Readme(text='<!--\nSPDX-FileCopyrightText: 2021 The meson-python developers\n\nSPDX-License-Identifier: MIT\n-->\n\n# full-metadata\n\nAn example package with all of the PEP 621 metadata!\n', file=PosixPath('/tmp/meson-python/tests/packages/full-metadata/README.md'), content_type='text/markdown'),
requires_python=<SpecifierSet('>=3.7', prereleases=True)>,
dependencies=[<Requirement('a')>,
<Requirement('b>1')>,
<Requirement('c>2; os_name != "nt"')>],
optional_dependencies={'test': [<Requirement('d<3')>,
<Requirement('e[all]')>]},
entrypoints={'something.custom': {'example': 'example:custom'}},
authors=[('Unknown', '[email protected]'), ('Jane Doe', None)],
maintainers=[('Jane Doe', '[email protected]')],
urls={'changelog': 'https://github.com/mesonbuild/meson-python/blob/master/CHANGELOG.rst',
'documentation': 'https://readthedocs.org',
'homepage': 'https://example.com',
'repository': 'https://github.com/mesonbuild/meson-python'},
classifiers=['Development Status :: 4 - Beta',
'Programming Language :: Python'],
keywords=['full', 'metadata'],
scripts={'example-cli': 'example:cli'},
gui_scripts={'example-gui': 'example:gui'},
dynamic=[],
_metadata_version=None)
smart_message = _SmartMessageSetter(message=<pyproject_metadata.RFC822Message object at 0x7f1ed5c974d0>)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = _SmartMessageSetter(message=<pyproject_metadata.RFC822Message object at 0x7f1ed5c974d0>), name = 'License'
value = 'some license\n'
def __setitem__(self, name: str, value: str | None) -> None:
if not value:
return
if '\n' in value:
msg = f'"{name}" should not be multiline; indenting to avoid breakage'
> warnings.warn(msg, ConfigurationWarning, stacklevel=2)
E pyproject_metadata.ConfigurationWarning: "License" should not be multiline; indenting to avoid breakage
msg = '"License" should not be multiline; indenting to avoid breakage'
name = 'License'
self = _SmartMessageSetter(message=<pyproject_metadata.RFC822Message object at 0x7f1ed5c974d0>)
value = 'some license\n'
.nox/test-3-11/lib/python3.11/site-packages/pyproject_metadata/__init__.py:137: ConfigurationWarning
-------------------------------------------------------- Captured stdout setup --------------------------------------------------------
Initialized empty Git repository in /tmp/meson-python/tests/packages/full-metadata/.git/
+ meson setup /tmp/meson-python/tests/packages/full-metadata /tmp/meson-python/tests/packages/full-metadata/.mesonpy-fnrhas31 -Dbuildtype=release -Db_ndebug=if-release -Db_vscrt=md --native-file=/tmp/meson-python/tests/packages/full-metadata/.mesonpy-fnrhas31/meson-python-native-file.ini
The Meson build system
Version: 1.5.1
Source dir: /tmp/meson-python/tests/packages/full-metadata
Build dir: /tmp/meson-python/tests/packages/full-metadata/.mesonpy-fnrhas31
Build type: native build
Project name: full-metadata
Project version: 1.0.0
Host machine cpu family: x86_64
Host machine cpu: x86_64
Build targets in project: 0
full-metadata 1.0.0
User defined options
Native files: /tmp/meson-python/tests/packages/full-metadata/.mesonpy-fnrhas31/meson-python-native-file.ini
buildtype : release
b_ndebug : if-release
b_vscrt : md
Found ninja-1.12.1 at /usr/bin/ninja
+ meson dist --allow-dirty --no-tests --formats gztar
Created /tmp/meson-python/tests/packages/full-metadata/.mesonpy-fnrhas31/meson-dist/full-metadata-1.0.0.tar.gz
____________________________________________ ERROR at setup of test_contents_license_file _____________________________________________
tmp_path_session = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia')
@pytest.fixture(scope='session')
def fixture(tmp_path_session):
with chdir(package_dir / package), in_git_repo_context():
> return tmp_path_session / mesonpy.build_wheel(tmp_path_session)
package = 'license-file'
tmp_path_session = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia')
tests/conftest.py:139:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
mesonpy/__init__.py:1047: in wrapper
return func(*args, **kwargs)
args = (PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia'),)
func = <function build_wheel at 0x7f1ed85e9120>
kwargs = {}
mesonpy/__init__.py:1101: in build_wheel
return project.wheel(out).name
config_settings = None
metadata_directory = None
out = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia')
project = <mesonpy.Project object at 0x7f1ed5b1c8d0>
wheel_directory = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia')
mesonpy/__init__.py:944: in wheel
return builder.build(directory)
builder = <mesonpy._WheelBuilder object at 0x7f1ed5b1d8d0>
directory = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia')
self = <mesonpy.Project object at 0x7f1ed5b1c8d0>
mesonpy/__init__.py:464: in build
self._wheel_write_metadata(whl)
directory = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia')
self = <mesonpy._WheelBuilder object at 0x7f1ed5b1d8d0>
wheel_file = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia/license_file-1.0.0-py3-none-any.whl')
whl = <mesonpy._wheelfile.WheelFileWriter object at 0x7f1ed5b1da50>
mesonpy/__init__.py:452: in _wheel_write_metadata
whl.writestr(f'{self._distinfo_dir}/METADATA', bytes(self._metadata.as_rfc822()))
self = <mesonpy._WheelBuilder object at 0x7f1ed5b1d8d0>
whl = <mesonpy._wheelfile.WheelFileWriter object at 0x7f1ed5b1da50>
.nox/test-3-11/lib/python3.11/site-packages/pyproject_metadata/__init__.py:623: in as_rfc822
self.write_to_rfc822(message)
message = <pyproject_metadata.RFC822Message object at 0x7f1ed5b1d350>
self = Metadata(name='license-file',
version=<Version('1.0.0')>,
description=None,
license=License(text='Hello!\n', file=PosixPath('/tmp/meson-python/tests/packages/license-file/something/LICENSE.custom')),
license_files=None,
readme=None,
requires_python=None,
dependencies=[],
optional_dependencies={},
entrypoints={},
authors=[],
maintainers=[],
urls={},
classifiers=[],
keywords=[],
scripts={},
gui_scripts={},
dynamic=[],
_metadata_version=None)
.nox/test-3-11/lib/python3.11/site-packages/pyproject_metadata/__init__.py:651: in write_to_rfc822
smart_message['License'] = self.license.text
message = <pyproject_metadata.RFC822Message object at 0x7f1ed5b1d350>
self = Metadata(name='license-file',
version=<Version('1.0.0')>,
description=None,
license=License(text='Hello!\n', file=PosixPath('/tmp/meson-python/tests/packages/license-file/something/LICENSE.custom')),
license_files=None,
readme=None,
requires_python=None,
dependencies=[],
optional_dependencies={},
entrypoints={},
authors=[],
maintainers=[],
urls={},
classifiers=[],
keywords=[],
scripts={},
gui_scripts={},
dynamic=[],
_metadata_version=None)
smart_message = _SmartMessageSetter(message=<pyproject_metadata.RFC822Message object at 0x7f1ed5b1d350>)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = _SmartMessageSetter(message=<pyproject_metadata.RFC822Message object at 0x7f1ed5b1d350>), name = 'License', value = 'Hello!\n'
def __setitem__(self, name: str, value: str | None) -> None:
if not value:
return
if '\n' in value:
msg = f'"{name}" should not be multiline; indenting to avoid breakage'
> warnings.warn(msg, ConfigurationWarning, stacklevel=2)
E pyproject_metadata.ConfigurationWarning: "License" should not be multiline; indenting to avoid breakage
msg = '"License" should not be multiline; indenting to avoid breakage'
name = 'License'
self = _SmartMessageSetter(message=<pyproject_metadata.RFC822Message object at 0x7f1ed5b1d350>)
value = 'Hello!\n'
.nox/test-3-11/lib/python3.11/site-packages/pyproject_metadata/__init__.py:137: ConfigurationWarning
-------------------------------------------------------- Captured stdout setup --------------------------------------------------------
Initialized empty Git repository in /tmp/meson-python/tests/packages/license-file/.git/
+ meson setup /tmp/meson-python/tests/packages/license-file /tmp/meson-python/tests/packages/license-file/.mesonpy-zchwqh4l -Dbuildtype=release -Db_ndebug=if-release -Db_vscrt=md --native-file=/tmp/meson-python/tests/packages/license-file/.mesonpy-zchwqh4l/meson-python-native-file.ini
The Meson build system
Version: 1.5.1
Source dir: /tmp/meson-python/tests/packages/license-file
Build dir: /tmp/meson-python/tests/packages/license-file/.mesonpy-zchwqh4l
Build type: native build
Project name: license-file
Project version: 1.0.0
Host machine cpu family: x86_64
Host machine cpu: x86_64
Build targets in project: 0
license-file 1.0.0
User defined options
Native files: /tmp/meson-python/tests/packages/license-file/.mesonpy-zchwqh4l/meson-python-native-file.ini
buildtype : release
b_ndebug : if-release
b_vscrt : md
Found ninja-1.12.1 at /usr/bin/ninja
+ /usr/bin/ninja
ninja: no work to do.
_________________________________________________ ERROR at setup of test_entrypoints __________________________________________________
tmp_path_session = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia')
@pytest.fixture(scope='session')
def fixture(tmp_path_session):
with chdir(package_dir / package), in_git_repo_context():
> return tmp_path_session / mesonpy.build_wheel(tmp_path_session)
package = 'full-metadata'
tmp_path_session = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia')
tests/conftest.py:139:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
mesonpy/__init__.py:1047: in wrapper
return func(*args, **kwargs)
args = (PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia'),)
func = <function build_wheel at 0x7f1ed85e9120>
kwargs = {}
mesonpy/__init__.py:1101: in build_wheel
return project.wheel(out).name
config_settings = None
metadata_directory = None
out = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia')
project = <mesonpy.Project object at 0x7f1ed5b1c6d0>
wheel_directory = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia')
mesonpy/__init__.py:944: in wheel
return builder.build(directory)
builder = <mesonpy._WheelBuilder object at 0x7f1ed5b1d0d0>
directory = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia')
self = <mesonpy.Project object at 0x7f1ed5b1c6d0>
mesonpy/__init__.py:464: in build
self._wheel_write_metadata(whl)
directory = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia')
self = <mesonpy._WheelBuilder object at 0x7f1ed5b1d0d0>
wheel_file = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia/full_metadata-1.2.3-py3-none-any.whl')
whl = <mesonpy._wheelfile.WheelFileWriter object at 0x7f1ed5b02890>
mesonpy/__init__.py:452: in _wheel_write_metadata
whl.writestr(f'{self._distinfo_dir}/METADATA', bytes(self._metadata.as_rfc822()))
self = <mesonpy._WheelBuilder object at 0x7f1ed5b1d0d0>
whl = <mesonpy._wheelfile.WheelFileWriter object at 0x7f1ed5b02890>
.nox/test-3-11/lib/python3.11/site-packages/pyproject_metadata/__init__.py:623: in as_rfc822
self.write_to_rfc822(message)
message = <pyproject_metadata.RFC822Message object at 0x7f1ed5bcf310>
self = Metadata(name='full-metadata',
version=<Version('1.2.3')>,
description='Some package with all of the PEP 621 metadata',
license=License(text='some license\n', file=PosixPath('/tmp/meson-python/tests/packages/full-metadata/LICENSE')),
license_files=None,
readme=Readme(text='<!--\nSPDX-FileCopyrightText: 2021 The meson-python developers\n\nSPDX-License-Identifier: MIT\n-->\n\n# full-metadata\n\nAn example package with all of the PEP 621 metadata!\n', file=PosixPath('/tmp/meson-python/tests/packages/full-metadata/README.md'), content_type='text/markdown'),
requires_python=<SpecifierSet('>=3.7', prereleases=True)>,
dependencies=[<Requirement('a')>,
<Requirement('b>1')>,
<Requirement('c>2; os_name != "nt"')>],
optional_dependencies={'test': [<Requirement('d<3')>,
<Requirement('e[all]')>]},
entrypoints={'something.custom': {'example': 'example:custom'}},
authors=[('Unknown', '[email protected]'), ('Jane Doe', None)],
maintainers=[('Jane Doe', '[email protected]')],
urls={'changelog': 'https://github.com/mesonbuild/meson-python/blob/master/CHANGELOG.rst',
'documentation': 'https://readthedocs.org',
'homepage': 'https://example.com',
'repository': 'https://github.com/mesonbuild/meson-python'},
classifiers=['Development Status :: 4 - Beta',
'Programming Language :: Python'],
keywords=['full', 'metadata'],
scripts={'example-cli': 'example:cli'},
gui_scripts={'example-gui': 'example:gui'},
dynamic=[],
_metadata_version=None)
.nox/test-3-11/lib/python3.11/site-packages/pyproject_metadata/__init__.py:651: in write_to_rfc822
smart_message['License'] = self.license.text
message = <pyproject_metadata.RFC822Message object at 0x7f1ed5bcf310>
self = Metadata(name='full-metadata',
version=<Version('1.2.3')>,
description='Some package with all of the PEP 621 metadata',
license=License(text='some license\n', file=PosixPath('/tmp/meson-python/tests/packages/full-metadata/LICENSE')),
license_files=None,
readme=Readme(text='<!--\nSPDX-FileCopyrightText: 2021 The meson-python developers\n\nSPDX-License-Identifier: MIT\n-->\n\n# full-metadata\n\nAn example package with all of the PEP 621 metadata!\n', file=PosixPath('/tmp/meson-python/tests/packages/full-metadata/README.md'), content_type='text/markdown'),
requires_python=<SpecifierSet('>=3.7', prereleases=True)>,
dependencies=[<Requirement('a')>,
<Requirement('b>1')>,
<Requirement('c>2; os_name != "nt"')>],
optional_dependencies={'test': [<Requirement('d<3')>,
<Requirement('e[all]')>]},
entrypoints={'something.custom': {'example': 'example:custom'}},
authors=[('Unknown', '[email protected]'), ('Jane Doe', None)],
maintainers=[('Jane Doe', '[email protected]')],
urls={'changelog': 'https://github.com/mesonbuild/meson-python/blob/master/CHANGELOG.rst',
'documentation': 'https://readthedocs.org',
'homepage': 'https://example.com',
'repository': 'https://github.com/mesonbuild/meson-python'},
classifiers=['Development Status :: 4 - Beta',
'Programming Language :: Python'],
keywords=['full', 'metadata'],
scripts={'example-cli': 'example:cli'},
gui_scripts={'example-gui': 'example:gui'},
dynamic=[],
_metadata_version=None)
smart_message = _SmartMessageSetter(message=<pyproject_metadata.RFC822Message object at 0x7f1ed5bcf310>)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = _SmartMessageSetter(message=<pyproject_metadata.RFC822Message object at 0x7f1ed5bcf310>), name = 'License'
value = 'some license\n'
def __setitem__(self, name: str, value: str | None) -> None:
if not value:
return
if '\n' in value:
msg = f'"{name}" should not be multiline; indenting to avoid breakage'
> warnings.warn(msg, ConfigurationWarning, stacklevel=2)
E pyproject_metadata.ConfigurationWarning: "License" should not be multiline; indenting to avoid breakage
msg = '"License" should not be multiline; indenting to avoid breakage'
name = 'License'
self = _SmartMessageSetter(message=<pyproject_metadata.RFC822Message object at 0x7f1ed5bcf310>)
value = 'some license\n'
.nox/test-3-11/lib/python3.11/site-packages/pyproject_metadata/__init__.py:137: ConfigurationWarning
-------------------------------------------------------- Captured stdout setup --------------------------------------------------------
Initialized empty Git repository in /tmp/meson-python/tests/packages/full-metadata/.git/
+ meson setup /tmp/meson-python/tests/packages/full-metadata /tmp/meson-python/tests/packages/full-metadata/.mesonpy-qtu327ta -Dbuildtype=release -Db_ndebug=if-release -Db_vscrt=md --native-file=/tmp/meson-python/tests/packages/full-metadata/.mesonpy-qtu327ta/meson-python-native-file.ini
The Meson build system
Version: 1.5.1
Source dir: /tmp/meson-python/tests/packages/full-metadata
Build dir: /tmp/meson-python/tests/packages/full-metadata/.mesonpy-qtu327ta
Build type: native build
Project name: full-metadata
Project version: 1.0.0
Host machine cpu family: x86_64
Host machine cpu: x86_64
Build targets in project: 0
full-metadata 1.0.0
User defined options
Native files: /tmp/meson-python/tests/packages/full-metadata/.mesonpy-qtu327ta/meson-python-native-file.ini
buildtype : release
b_ndebug : if-release
b_vscrt : md
Found ninja-1.12.1 at /usr/bin/ninja
+ /usr/bin/ninja
ninja: no work to do.
============================================================== FAILURES ===============================================================
___________________________________________________________ test_no_pep621 ____________________________________________________________
sdist_library = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia/library-1.0.0.tar.gz')
def test_no_pep621(sdist_library):
with tarfile.open(sdist_library, 'r:gz') as sdist:
sdist_pkg_info = sdist.extractfile('library-1.0.0/PKG-INFO').read().decode()
> assert sdist_pkg_info == textwrap.dedent('''\
Metadata-Version: 2.1
Name: library
Version: 1.0.0
''')
E AssertionError: assert 'Metadata-Version: 2.1\nName: library\nVersion: 1.0.0\n\n' == 'Metadata-Version: 2.1\nName: library\nVersion: 1.0.0\n'
E
E Metadata-Version: 2.1
E Name: library
E Version: 1.0.0
E +
sdist = <tarfile.TarFile object at 0x7f1ed5cb29d0>
sdist_library = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia/library-1.0.0.tar.gz')
sdist_pkg_info = 'Metadata-Version: 2.1\nName: library\nVersion: 1.0.0\n\n'
tests/test_sdist.py:25: AssertionError
-------------------------------------------------------- Captured stdout setup --------------------------------------------------------
Initialized empty Git repository in /tmp/meson-python/tests/packages/library/.git/
+ meson setup /tmp/meson-python/tests/packages/library /tmp/meson-python/tests/packages/library/.mesonpy-d_83134r -Dbuildtype=release -Db_ndebug=if-release -Db_vscrt=md --native-file=/tmp/meson-python/tests/packages/library/.mesonpy-d_83134r/meson-python-native-file.ini
The Meson build system
Version: 1.5.1
Source dir: /tmp/meson-python/tests/packages/library
Build dir: /tmp/meson-python/tests/packages/library/.mesonpy-d_83134r
Build type: native build
Project name: library
Project version: 1.0.0
C compiler for the host machine: sccache cc (gcc 14.2.1 "cc (Gentoo 14.2.1_p20240817 p4) 14.2.1 20240817")
C linker for the host machine: cc ld.bfd 2.43
Host machine cpu family: x86_64
Host machine cpu: x86_64
Build targets in project: 2
library 1.0.0
User defined options
Native files: /tmp/meson-python/tests/packages/library/.mesonpy-d_83134r/meson-python-native-file.ini
buildtype : release
b_ndebug : if-release
b_vscrt : md
Found ninja-1.12.1 at /usr/bin/ninja
+ meson dist --allow-dirty --no-tests --formats gztar
Created /tmp/meson-python/tests/packages/library/.mesonpy-d_83134r/meson-dist/library-1.0.0.tar.gz
________________________________________________________ test_dynamic_version _________________________________________________________
sdist_dynamic_version = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia/dynamic_version-1.0.0.tar.gz')
def test_dynamic_version(sdist_dynamic_version):
with tarfile.open(sdist_dynamic_version, 'r:gz') as sdist:
sdist_pkg_info = sdist.extractfile('dynamic_version-1.0.0/PKG-INFO').read().decode()
> assert sdist_pkg_info == textwrap.dedent('''\
Metadata-Version: 2.1
Name: dynamic-version
Version: 1.0.0
''')
E AssertionError: assert 'Metadata-Version: 2.1\nName: dynamic-version\nVersion: 1.0.0\n\n' == 'Metadata-Version: 2.1\nName: dynamic-version\nVersion: 1.0.0\n'
E
E Metadata-Version: 2.1
E Name: dynamic-version
E Version: 1.0.0
E +
sdist = <tarfile.TarFile object at 0x7f1ed5f6bd90>
sdist_dynamic_version = PosixPath('/tmp/pytest-of-mgorny/pytest-2/test0/mesonpy-test-swc0ohia/dynamic_version-1.0.0.tar.gz')
sdist_pkg_info = 'Metadata-Version: 2.1\nName: dynamic-version\nVersion: 1.0.0\n\n'
tests/test_sdist.py:82: AssertionError
-------------------------------------------------------- Captured stdout setup --------------------------------------------------------
Initialized empty Git repository in /tmp/meson-python/tests/packages/dynamic-version/.git/
+ meson setup /tmp/meson-python/tests/packages/dynamic-version /tmp/meson-python/tests/packages/dynamic-version/.mesonpy-kxn8g8xt -Dbuildtype=release -Db_ndebug=if-release -Db_vscrt=md --native-file=/tmp/meson-python/tests/packages/dynamic-version/.mesonpy-kxn8g8xt/meson-python-native-file.ini
The Meson build system
Version: 1.5.1
Source dir: /tmp/meson-python/tests/packages/dynamic-version
Build dir: /tmp/meson-python/tests/packages/dynamic-version/.mesonpy-kxn8g8xt
Build type: native build
Project name: dynamic-version
Project version: 1.0.0
Host machine cpu family: x86_64
Host machine cpu: x86_64
Build targets in project: 0
dynamic-version 1.0.0
User defined options
Native files: /tmp/meson-python/tests/packages/dynamic-version/.mesonpy-kxn8g8xt/meson-python-native-file.ini
buildtype : release
b_ndebug : if-release
b_vscrt : md
Found ninja-1.12.1 at /usr/bin/ninja
+ meson dist --allow-dirty --no-tests --formats gztar
Created /tmp/meson-python/tests/packages/dynamic-version/.mesonpy-kxn8g8xt/meson-dist/dynamic-version-1.0.0.tar.gz
======================================================= short test summary info =======================================================
SKIPPED [1] tests/test_project.py:204: Requires MSVC
SKIPPED [3] tests/test_project.py:216: macOS specific test
SKIPPED [2] tests/test_project.py:233: macOS specific test
SKIPPED [1] tests/test_tags.py:47: macOS specific test
SKIPPED [1] tests/test_tags.py:59: macOS specific test
SKIPPED [1] tests/test_tags.py:69: macOS specific test
SKIPPED [2] tests/test_wheel.py:251: macOS specific test
ERROR tests/test_sdist.py::test_pep621 - pyproject_metadata.ConfigurationWarning: "License" should not be multiline; indenting to avoid breakage
ERROR tests/test_wheel.py::test_contents_license_file - pyproject_metadata.ConfigurationWarning: "License" should not be multiline; indenting to avoid breakage
ERROR tests/test_wheel.py::test_entrypoints - pyproject_metadata.ConfigurationWarning: "License" should not be multiline; indenting to avoid breakage
FAILED tests/test_sdist.py::test_no_pep621 - AssertionError: assert 'Metadata-Version: 2.1\nName: library\nVersion: 1.0.0\n\n' == 'Metadata-Version: 2.1\nName: library\nVersion: 1.0.0\n'
Metadata-Version: 2.1
Name: library
Version: 1.0.0
+
FAILED tests/test_sdist.py::test_dynamic_version - AssertionError: assert 'Metadata-Version: 2.1\nName: dynamic-version\nVersion: 1.0.0\n\n' == 'Metadata-Version: 2.1\nName: dynamic-version\nVersion: 1.0.0\n'
Metadata-Version: 2.1
Name: dynamic-version
Version: 1.0.0
+
=================================== 2 failed, 107 passed, 11 skipped, 3 errors in 68.85s (0:01:08) ====================================
To reproduce, I've first ran nox, then entered the venv and issued pip install -U --pre pyproject-metadata. This is on top of 04e00668ae869ab42579cc5bfa8264d0475e83fc.
Okay, looks like more problems are to be expected. E.g. while building matplotlib==3.9.2:
raceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "/usr/lib/python3.11/site-packages/gpep517/__main__.py", line 443, in <module>
sys.exit(main())
^^^^^^
File "/usr/lib/python3.11/site-packages/gpep517/__main__.py", line 439, in main
return func(args)
^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/gpep517/__main__.py", line 229, in build_wheel
print(build_wheel_impl(args, args.wheel_dir), file=out)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/gpep517/__main__.py", line 221, in build_wheel_impl
wheel_name = backend.build_wheel(str(wheel_dir), args.config_json)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/mesonpy/__init__.py", line 1020, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/mesonpy/__init__.py", line 1074, in build_wheel
return project.wheel(out).name
^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/mesonpy/__init__.py", line 925, in wheel
return builder.build(directory)
^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/site-packages/mesonpy/__init__.py", line 463, in build
self._wheel_write_metadata(whl)
File "/usr/lib/python3.11/site-packages/mesonpy/__init__.py", line 451, in _wheel_write_metadata
whl.writestr(f'{self._distinfo_dir}/METADATA', bytes(self._metadata.as_rfc822()))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/email/message.py", line 194, in __bytes__
return self.as_bytes()
^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/email/message.py", line 208, in as_bytes
g.flatten(self, unixfrom=unixfrom)
File "/usr/lib/python3.11/email/generator.py", line 117, in flatten
self._write(msg)
File "/usr/lib/python3.11/email/generator.py", line 182, in _write
self._dispatch(msg)
File "/usr/lib/python3.11/email/generator.py", line 219, in _dispatch
meth(msg)
File "/usr/lib/python3.11/email/generator.py", line 446, in _handle_text
super(BytesGenerator,self)._handle_text(msg)
File "/usr/lib/python3.11/email/generator.py", line 263, in _handle_text
self._write_lines(payload)
File "/usr/lib/python3.11/email/generator.py", line 156, in _write_lines
self.write(line)
File "/usr/lib/python3.11/email/generator.py", line 420, in write
self._fp.write(s.encode('ascii', 'surrogateescape'))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeEncodeError: 'ascii' codec can't encode character '\u2014' in position 61: ordinal not in range(128)
meson-python: warning: "License" should not be multiline; indenting to avoid breakage
There is no regression in meson-python. The test failures are just the test being too strict in what they check for and tripping on a slight change in serialization format in pyproject-metadata. The build failure is a problem in pyproject-metadata that has already been reported pypa/pyproject-metadata#149 Thanks for testing, but in general, you must expect bugs in testing pre-releases. Reporting these bugs to down-stream projects is very seldom useful.
Reporting these bugs to down-stream projects is very seldom useful.
Prereleases are made so that a small number of people, willing to live on the edge, can find bugs before releasing to everyone. Reporting is always useful, unless the issue is already known. (Maybe not to every project involved, though, pyproject-metadata would be enough in this case ;) )
I would feed very bad if when I make a pre-release of meson-python that contains a bug, people goes around reporting it to every project that uses meson-python as a build backend. As I wrote, reporting bugs in a pre-release of dependency to the projects using it is very often unnecessary.
I'm sorry, the traceback didn't mention pyproject-metadata anywhere, so it seemed reasonable to report it here first.
The original test regression is valid: we've changed the whitespace slightly to better match the email module's output. The other two are being fixed.
The warning and ascii error should be fixed. The spacing comparison in the tests still needs to be handled here, though.
Since we now have a CI job testing against pyproject-metadata 0.9.0rc1, I think this can be closed right?
I think so too.