Skip to content

Commit 9ec2016

Browse files
authored
Removed install dependency on setuptools (#483)
Also re-added the fallback for `license_paths` on setuptools versions older than 57.
1 parent 747e1f6 commit 9ec2016

File tree

5 files changed

+66
-5
lines changed

5 files changed

+66
-5
lines changed

docs/news.rst

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
Release Notes
22
=============
33

4+
**UNRELEASED**
5+
6+
- Removed install dependency on setuptools
7+
48
**0.38.0 (2022-10-21)**
59

610
- Dropped support for Python < 3.7

setup.cfg

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ package_dir=
3232
= src
3333
packages = find:
3434
python_requires = >=3.7
35-
install_requires = setuptools >= 57.0.0
35+
setup_requires = setuptools >= 45.2.0
3636
zip_safe = False
3737

3838
[options.packages.find]

src/wheel/bdist_wheel.py

+45-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import warnings
1616
from collections import OrderedDict
1717
from email.generator import BytesGenerator, Generator
18+
from glob import iglob
1819
from io import BytesIO
1920
from shutil import rmtree
2021
from zipfile import ZIP_DEFLATED, ZIP_STORED
@@ -31,6 +32,9 @@
3132

3233
safe_name = pkg_resources.safe_name
3334
safe_version = pkg_resources.safe_version
35+
setuptools_major_version = int(
36+
pkg_resources.get_distribution("setuptools").version.split(".")[0]
37+
)
3438

3539
PY_LIMITED_API_PATTERN = r"cp3\d"
3640

@@ -430,8 +434,47 @@ def _ensure_relative(self, path):
430434

431435
@property
432436
def license_paths(self):
433-
metadata = self.distribution.metadata
434-
return sorted(metadata.license_files or [])
437+
if setuptools_major_version >= 57:
438+
# Setuptools has resolved any patterns to actual file names
439+
return self.distribution.metadata.license_files or ()
440+
441+
files = set()
442+
metadata = self.distribution.get_option_dict("metadata")
443+
if setuptools_major_version >= 42:
444+
# Setuptools recognizes the license_files option but does not do globbing
445+
patterns = self.distribution.metadata.license_files
446+
else:
447+
# Prior to those, wheel is entirely responsible for handling license files
448+
if "license_files" in metadata:
449+
patterns = metadata["license_files"][1].split()
450+
else:
451+
patterns = ()
452+
453+
if "license_file" in metadata:
454+
warnings.warn(
455+
'The "license_file" option is deprecated. Use "license_files" instead.',
456+
DeprecationWarning,
457+
)
458+
files.add(metadata["license_file"][1])
459+
460+
if not files and not patterns and not isinstance(patterns, list):
461+
patterns = ("LICEN[CS]E*", "COPYING*", "NOTICE*", "AUTHORS*")
462+
463+
for pattern in patterns:
464+
for path in iglob(pattern):
465+
if path.endswith("~"):
466+
log.debug(
467+
f'ignoring license file "{path}" as it looks like a backup'
468+
)
469+
continue
470+
471+
if path not in files and os.path.isfile(path):
472+
log.info(
473+
f'adding license file "{path}" (matched pattern "{pattern}")'
474+
)
475+
files.add(path)
476+
477+
return files
435478

436479
def egg2dist(self, egginfo_path, distinfo_path):
437480
"""Convert an .egg-info directory into a .dist-info directory"""

src/wheel/cli/convert.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@
77
import zipfile
88
from glob import iglob
99

10-
from setuptools.dist import Distribution
11-
1210
from ..bdist_wheel import bdist_wheel
1311
from ..wheelfile import WheelFile
1412
from . import WheelError
1513

14+
try:
15+
from setuptools import Distribution
16+
except ImportError:
17+
from distutils.dist import Distribution
18+
1619
egg_info_re = re.compile(
1720
r"""
1821
(?P<name>.+?)-(?P<ver>.+?)

tests/test_bdist_wheel.py

+11
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,17 @@ def test_licenses_default(dummy_dist, monkeypatch, tmpdir):
8484
assert set(wf.namelist()) == DEFAULT_FILES | license_files
8585

8686

87+
def test_licenses_deprecated(dummy_dist, monkeypatch, tmpdir):
88+
dummy_dist.join("setup.cfg").write("[metadata]\nlicense_file=licenses/DUMMYFILE")
89+
monkeypatch.chdir(dummy_dist)
90+
subprocess.check_call(
91+
[sys.executable, "setup.py", "bdist_wheel", "-b", str(tmpdir), "--universal"]
92+
)
93+
with WheelFile("dist/dummy_dist-1.0-py2.py3-none-any.whl") as wf:
94+
license_files = {"dummy_dist-1.0.dist-info/DUMMYFILE"}
95+
assert set(wf.namelist()) == DEFAULT_FILES | license_files
96+
97+
8798
@pytest.mark.parametrize(
8899
"config_file, config",
89100
[

0 commit comments

Comments
 (0)