diff --git a/src/fromager/pkgmetadata/pep639.py b/src/fromager/pkgmetadata/pep639.py index 53fc24a6..d0119209 100644 --- a/src/fromager/pkgmetadata/pep639.py +++ b/src/fromager/pkgmetadata/pep639.py @@ -81,6 +81,8 @@ def _trove_to_spdx(troves: list[str]) -> LicenseExpression: if mapped is None: raise ValueError(f"{trove!r} is ambiguous") trove_spdx.append(mapped) + if not trove_spdx: + raise ValueError("no classifier maps to a SPDX license expression") # join with AND return _parse_spdx(" AND ".join(trove_spdx), simplify=True) diff --git a/tests/test_pkgmetadata.py b/tests/test_pkgmetadata.py index 0eb8baac..1bb40850 100644 --- a/tests/test_pkgmetadata.py +++ b/tests/test_pkgmetadata.py @@ -108,6 +108,18 @@ def test_license_from_metadata(metadata: Metadata, expected: str) -> None: (None, None, None), (None, "invalid", None), (None, None, ["License :: OSI Approved :: BSD License"]), + # classifiers with no entry that maps to SPDX (see issue #1372) + (None, None, ["Programming Language :: Python :: 3"]), + (None, None, ["License :: OSI Approved"]), + # non-license classifier alongside an ambiguous license classifier + ( + None, + None, + [ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: BSD License", + ], + ), ], ) def test_license_from_metadata_errors(