File tree Expand file tree Collapse file tree 4 files changed +35
-3
lines changed Expand file tree Collapse file tree 4 files changed +35
-3
lines changed Original file line number Diff line number Diff line change
1
+ Better error messages for ``packaging.licenses `` import errors in environments with ``packaging<24.2 ``\.
2
+ The import statement was also deferred to spare users that are not using
3
+ license expressions.
4
+
Original file line number Diff line number Diff line change @@ -102,7 +102,6 @@ core = [
102
102
103
103
# for distutils
104
104
" jaraco.functools >= 4" ,
105
- " packaging" ,
106
105
" more_itertools" ,
107
106
]
108
107
Original file line number Diff line number Diff line change 4
4
"""
5
5
6
6
import re
7
+ from typing import TYPE_CHECKING
7
8
8
9
import packaging
9
10
@@ -148,3 +149,31 @@ def safer_best_effort_version(value: str) -> str:
148
149
# See bdist_wheel.safer_verion
149
150
# TODO: Replace with only safe_version in the future (no need for best effort)
150
151
return filename_component (best_effort_version (value ))
152
+
153
+
154
+ def _missing_canonicalize_license_expression (expression : str ) -> str :
155
+ """
156
+ Defer import error to affect only users that actually use it
157
+ https://github.com/pypa/setuptools/issues/4894
158
+ >>> _missing_canonicalize_license_expression("a OR b")
159
+ Traceback (most recent call last):
160
+ ...
161
+ ImportError: ...Cannot import `packaging.licenses`...
162
+ """
163
+ raise ImportError (
164
+ "Cannot import `packaging.licenses`."
165
+ """
166
+ Setuptools>=77.0.0 requires "packaging>=24.2" to work properly.
167
+ Please make sure you have a suitable version installed.
168
+ """
169
+ )
170
+
171
+
172
+ try :
173
+ from packaging .licenses import (
174
+ canonicalize_license_expression as _canonicalize_license_expression ,
175
+ )
176
+ except ImportError : # pragma: nocover
177
+ if not TYPE_CHECKING :
178
+ # XXX: pyright is still upset even with # pyright: ignore[reportAssignmentType]
179
+ _canonicalize_license_expression = _missing_canonicalize_license_expression
Original file line number Diff line number Diff line change 12
12
from typing import TYPE_CHECKING , Any , Union
13
13
14
14
from more_itertools import partition , unique_everseen
15
- from packaging .licenses import canonicalize_license_expression
16
15
from packaging .markers import InvalidMarker , Marker
17
16
from packaging .specifiers import InvalidSpecifier , SpecifierSet
18
17
from packaging .version import Version
24
23
command as _ , # noqa: F401 # imported for side-effects
25
24
)
26
25
from ._importlib import metadata
26
+ from ._normalization import _canonicalize_license_expression
27
27
from ._path import StrPath
28
28
from ._reqs import _StrOrIter
29
29
from .config import pyprojecttoml , setupcfg
@@ -423,7 +423,7 @@ def _finalize_license_expression(self) -> None:
423
423
license_expr = self .metadata .license_expression
424
424
if license_expr :
425
425
str_ = _static .Str if _static .is_static (license_expr ) else str
426
- normalized = str_ (canonicalize_license_expression (license_expr ))
426
+ normalized = str_ (_canonicalize_license_expression (license_expr ))
427
427
if license_expr != normalized :
428
428
InformationOnly .emit (f"Normalizing '{ license_expr } ' to '{ normalized } '" )
429
429
self .metadata .license_expression = normalized
You can’t perform that action at this time.
0 commit comments