Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions newsfragments/4898.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Better error messages for ``packaging.licenses`` import errors in environments with ``packaging<24.2``\.
The import statement was also deferred to spare users that are not using
license expressions.

1 change: 0 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,6 @@ core = [

# for distutils
"jaraco.functools >= 4",
"packaging",
"more_itertools",
]

Expand Down
29 changes: 29 additions & 0 deletions setuptools/_normalization.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"""

import re
from typing import TYPE_CHECKING

import packaging

Expand Down Expand Up @@ -148,3 +149,31 @@ def safer_best_effort_version(value: str) -> str:
# See bdist_wheel.safer_verion
# TODO: Replace with only safe_version in the future (no need for best effort)
return filename_component(best_effort_version(value))


def _missing_canonicalize_license_expression(expression: str) -> str:
"""
Defer import error to affect only users that actually use it
https://github.com/pypa/setuptools/issues/4894
>>> _missing_canonicalize_license_expression("a OR b")
Traceback (most recent call last):
...
ImportError: ...Cannot import `packaging.licenses`...
"""
raise ImportError(
"Cannot import `packaging.licenses`."
"""
Setuptools>=77.0.0 requires "packaging>=24.2" to work properly.
Please make sure you have a suitable version installed.
"""
)


try:
from packaging.licenses import (
canonicalize_license_expression as _canonicalize_license_expression,
)
except ImportError: # pragma: nocover
if not TYPE_CHECKING:
# XXX: pyright is still upset even with # pyright: ignore[reportAssignmentType]
_canonicalize_license_expression = _missing_canonicalize_license_expression
4 changes: 2 additions & 2 deletions setuptools/dist.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
from typing import TYPE_CHECKING, Any, Union

from more_itertools import partition, unique_everseen
from packaging.licenses import canonicalize_license_expression
from packaging.markers import InvalidMarker, Marker
from packaging.specifiers import InvalidSpecifier, SpecifierSet
from packaging.version import Version
Expand All @@ -24,6 +23,7 @@
command as _, # noqa: F401 # imported for side-effects
)
from ._importlib import metadata
from ._normalization import _canonicalize_license_expression
from ._path import StrPath
from ._reqs import _StrOrIter
from .config import pyprojecttoml, setupcfg
Expand Down Expand Up @@ -423,7 +423,7 @@ def _finalize_license_expression(self) -> None:
license_expr = self.metadata.license_expression
if license_expr:
str_ = _static.Str if _static.is_static(license_expr) else str
normalized = str_(canonicalize_license_expression(license_expr))
normalized = str_(_canonicalize_license_expression(license_expr))
if license_expr != normalized:
InformationOnly.emit(f"Normalizing '{license_expr}' to '{normalized}'")
self.metadata.license_expression = normalized
Expand Down
Loading