From 52f2d58008ca86229d0415228ac334ea6a339aa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Gr=C3=B6nholm?= Date: Wed, 2 Nov 2022 17:14:52 +0200 Subject: [PATCH 1/4] Removed install dependency on setuptools --- docs/news.rst | 4 ++++ setup.cfg | 2 +- src/wheel/cli/convert.py | 7 +++++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/news.rst b/docs/news.rst index 8c4ce091..96cd91f6 100644 --- a/docs/news.rst +++ b/docs/news.rst @@ -1,6 +1,10 @@ Release Notes ============= +**UNRELEASED** + +- Removed install dependency on setuptools + **0.38.0 (2022-10-21)** - Dropped support for Python < 3.7 diff --git a/setup.cfg b/setup.cfg index f83f17a2..b4a7b147 100644 --- a/setup.cfg +++ b/setup.cfg @@ -32,7 +32,7 @@ package_dir= = src packages = find: python_requires = >=3.7 -install_requires = setuptools >= 57.0.0 +setup_requires = setuptools >= 45.2.0 zip_safe = False [options.packages.find] diff --git a/src/wheel/cli/convert.py b/src/wheel/cli/convert.py index 0ca66f33..1287059d 100755 --- a/src/wheel/cli/convert.py +++ b/src/wheel/cli/convert.py @@ -7,12 +7,15 @@ import zipfile from glob import iglob -from setuptools.dist import Distribution - from ..bdist_wheel import bdist_wheel from ..wheelfile import WheelFile from . import WheelError +try: + from setuptools import Distribution +except ImportError: + from distutils.dist import Distribution + egg_info_re = re.compile( r""" (?P.+?)-(?P.+?) From 99223d75ed18a0ebb202f337c7412e09676f089b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Gr=C3=B6nholm?= Date: Thu, 3 Nov 2022 00:18:21 +0200 Subject: [PATCH 2/4] Added fallback for setuptools versions older than 57 --- src/wheel/bdist_wheel.py | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/wheel/bdist_wheel.py b/src/wheel/bdist_wheel.py index 7cbd1402..14462bff 100644 --- a/src/wheel/bdist_wheel.py +++ b/src/wheel/bdist_wheel.py @@ -15,6 +15,7 @@ import warnings from collections import OrderedDict from email.generator import BytesGenerator, Generator +from glob import iglob from io import BytesIO from shutil import rmtree from sysconfig import get_config_var @@ -32,6 +33,7 @@ safe_name = pkg_resources.safe_name safe_version = pkg_resources.safe_version +setuptools_version = pkg_resources.get_distribution("setuptools").parsed_version PY_LIMITED_API_PATTERN = r"cp3\d" @@ -431,8 +433,31 @@ def _ensure_relative(self, path): @property def license_paths(self): - metadata = self.distribution.metadata - return sorted(metadata.license_files or []) + patterns = self.distribution.metadata.license_files + if setuptools_version.major >= 57: + # Setuptools has resolved any patterns to actual file names + return patterns or () + + # Fallback for older setuptools versions + if not patterns and not isinstance(patterns, list): + patterns = ("LICEN[CS]E*", "COPYING*", "NOTICE*", "AUTHORS*") + + files = set() + for pattern in patterns: + for path in iglob(pattern): + if path.endswith("~"): + log.debug( + f'ignoring license file "{path}" as it looks like a backup' + ) + continue + + if path not in files and os.path.isfile(path): + log.info( + f'adding license file "{path}" (matched pattern "{pattern}")' + ) + files.add(path) + + return files def egg2dist(self, egginfo_path, distinfo_path): """Convert an .egg-info directory into a .dist-info directory""" From 48501bb6473d9b452e05c1ec6154418de205ccbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Gr=C3=B6nholm?= Date: Thu, 3 Nov 2022 22:26:13 +0200 Subject: [PATCH 3/4] Fixed compatibility with older setuptools versions --- src/wheel/bdist_wheel.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/wheel/bdist_wheel.py b/src/wheel/bdist_wheel.py index 14462bff..168ae313 100644 --- a/src/wheel/bdist_wheel.py +++ b/src/wheel/bdist_wheel.py @@ -33,7 +33,9 @@ safe_name = pkg_resources.safe_name safe_version = pkg_resources.safe_version -setuptools_version = pkg_resources.get_distribution("setuptools").parsed_version +setuptools_major_version = int( + pkg_resources.get_distribution("setuptools").version.split(".")[0] +) PY_LIMITED_API_PATTERN = r"cp3\d" @@ -433,12 +435,12 @@ def _ensure_relative(self, path): @property def license_paths(self): - patterns = self.distribution.metadata.license_files - if setuptools_version.major >= 57: + if setuptools_major_version >= 57: # Setuptools has resolved any patterns to actual file names - return patterns or () + return self.distribution.metadata.license_files or () # Fallback for older setuptools versions + patterns = self.distribution.metadata.license_files if not patterns and not isinstance(patterns, list): patterns = ("LICEN[CS]E*", "COPYING*", "NOTICE*", "AUTHORS*") From ad44125d12708e9d51d585f251721271e20e0e89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Gr=C3=B6nholm?= Date: Fri, 4 Nov 2022 01:02:39 +0200 Subject: [PATCH 4/4] Further improved backwards compatibility --- src/wheel/bdist_wheel.py | 24 ++++++++++++++++++++---- tests/test_bdist_wheel.py | 11 +++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/wheel/bdist_wheel.py b/src/wheel/bdist_wheel.py index 168ae313..e8d9c1de 100644 --- a/src/wheel/bdist_wheel.py +++ b/src/wheel/bdist_wheel.py @@ -439,12 +439,28 @@ def license_paths(self): # Setuptools has resolved any patterns to actual file names return self.distribution.metadata.license_files or () - # Fallback for older setuptools versions - patterns = self.distribution.metadata.license_files - if not patterns and not isinstance(patterns, list): + files = set() + metadata = self.distribution.get_option_dict("metadata") + if setuptools_major_version >= 42: + # Setuptools recognizes the license_files option but does not do globbing + patterns = self.distribution.metadata.license_files + else: + # Prior to those, wheel is entirely responsible for handling license files + if "license_files" in metadata: + patterns = metadata["license_files"][1].split() + else: + patterns = () + + if "license_file" in metadata: + warnings.warn( + 'The "license_file" option is deprecated. Use "license_files" instead.', + DeprecationWarning, + ) + files.add(metadata["license_file"][1]) + + if not files and not patterns and not isinstance(patterns, list): patterns = ("LICEN[CS]E*", "COPYING*", "NOTICE*", "AUTHORS*") - files = set() for pattern in patterns: for path in iglob(pattern): if path.endswith("~"): diff --git a/tests/test_bdist_wheel.py b/tests/test_bdist_wheel.py index 2a4d777a..a9ed1080 100644 --- a/tests/test_bdist_wheel.py +++ b/tests/test_bdist_wheel.py @@ -82,6 +82,17 @@ def test_licenses_default(dummy_dist, monkeypatch, tmpdir): assert set(wf.namelist()) == DEFAULT_FILES | license_files +def test_licenses_deprecated(dummy_dist, monkeypatch, tmpdir): + dummy_dist.join("setup.cfg").write("[metadata]\nlicense_file=licenses/DUMMYFILE") + monkeypatch.chdir(dummy_dist) + subprocess.check_call( + [sys.executable, "setup.py", "bdist_wheel", "-b", str(tmpdir), "--universal"] + ) + with WheelFile("dist/dummy_dist-1.0-py2.py3-none-any.whl") as wf: + license_files = {"dummy_dist-1.0.dist-info/DUMMYFILE"} + assert set(wf.namelist()) == DEFAULT_FILES | license_files + + @pytest.mark.parametrize( "config_file, config", [