From ba8a3ad82f8723cb5179cf231a23600d0146d84a Mon Sep 17 00:00:00 2001 From: Matt Ghantous Date: Mon, 9 Feb 2026 16:17:48 -0500 Subject: [PATCH 1/4] Work with latest setuptools and wheel packages --- core-requirements.txt | 6 +++--- devpi_builder/requirements.py | 8 ++++---- devpi_builder/wheeler.py | 15 ++++++++------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/core-requirements.txt b/core-requirements.txt index 3373585..226d83b 100644 --- a/core-requirements.txt +++ b/core-requirements.txt @@ -1,8 +1,8 @@ devpi-plumber>=0.2.14 -setuptools<82 # setuptools 82 drops pkg_resources +setuptools wheel -wheel-filename<2 # wheel-filename 2 breaks imports of InvalidFilenameError, parse_wheel_filename -wheel-inspect>=1.6.0 +wheel-filename +wheel-inspect>=1.8.0 pip>=1.5.3 junit-xml>=1.9 # First version to support to_xml_report_file pip-requirements-parser>=32.0.1 diff --git a/devpi_builder/requirements.py b/devpi_builder/requirements.py index 179998a..84922c9 100644 --- a/devpi_builder/requirements.py +++ b/devpi_builder/requirements.py @@ -5,7 +5,7 @@ """ import pip_requirements_parser -import pkg_resources +from packaging.utils import canonicalize_name, canonicalize_version def _extract_project_version(requirement): @@ -61,10 +61,10 @@ def matched_by_list(package, version, requirements): :param requirements: A list of requirements as read by read_raw() :return: True if the package can be used to fulfil on of the requirements in the file, False otherwise """ - version = pkg_resources.safe_version('{}'.format(version)) - package = pkg_resources.safe_name(package) + version = canonicalize_version('{}'.format(version)) + package = canonicalize_name(package) matches = ( - package.lower() == pkg_resources.safe_name(requirement.name) and (requirement.specifier.contains(version) if requirement.specifier else 1) + package == canonicalize_name(requirement.name) and (requirement.specifier.contains(version) if requirement.specifier else True) for requirement in requirements ) return any(matches) diff --git a/devpi_builder/wheeler.py b/devpi_builder/wheeler.py index 66bc621..bb7cfe7 100644 --- a/devpi_builder/wheeler.py +++ b/devpi_builder/wheeler.py @@ -11,9 +11,10 @@ import tempfile from packaging import tags -from pkg_resources import Distribution, Requirement +from packaging.requirements import Requirement +from packaging.utils import canonicalize_name -from wheel_filename import InvalidFilenameError, parse_wheel_filename +from wheel_filename import ParseError, WheelFilename from wheel_inspect import inspect_wheel from wheel_inspect.classes import WheelFile @@ -52,13 +53,13 @@ def _matches_requirement(self, requirement, wheels): :param requirement:str : The requirement to satisfy :param wheels: List of wheels to search. """ - req = Requirement.parse(requirement) + req = Requirement(requirement) matching = [] for wheel in wheels: w = wheel.parsed_filename - dist = Distribution(project_name=self._standardize_package_name(w.project), version=w.version) - if dist in req: + name = canonicalize_name(self._standardize_package_name(w.project)) + if name == req.name and req.specifier.contains(str(w.version)): matching.append(wheel.path) return matching @@ -120,12 +121,12 @@ def is_compatible(package): Compatibility is based on https://www.python.org/dev/peps/pep-0425/ """ try: - w = parse_wheel_filename(package) + w = WheelFilename.parse(package) for systag in tags.sys_tags(): for tag in w.tag_triples(): if systag in tags.parse_tag(tag): return True - except InvalidFilenameError: + except ParseError: return False From bb0e4225b966724e349d253763abe1562c32557f Mon Sep 17 00:00:00 2001 From: Matt Ghantous Date: Mon, 9 Feb 2026 17:13:05 -0500 Subject: [PATCH 2/4] backwards compat --- core-requirements.txt | 2 +- devpi_builder/wheeler.py | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/core-requirements.txt b/core-requirements.txt index 226d83b..d8d84ee 100644 --- a/core-requirements.txt +++ b/core-requirements.txt @@ -2,7 +2,7 @@ devpi-plumber>=0.2.14 setuptools wheel wheel-filename -wheel-inspect>=1.8.0 +wheel-inspect>=1.6.0 pip>=1.5.3 junit-xml>=1.9 # First version to support to_xml_report_file pip-requirements-parser>=32.0.1 diff --git a/devpi_builder/wheeler.py b/devpi_builder/wheeler.py index bb7cfe7..7f5b588 100644 --- a/devpi_builder/wheeler.py +++ b/devpi_builder/wheeler.py @@ -14,7 +14,17 @@ from packaging.requirements import Requirement from packaging.utils import canonicalize_name -from wheel_filename import ParseError, WheelFilename +# Support both wheel-filename 1.x (Python 3.9 + wheel-inspect 1.7) and 2.x (Python 3.10+ + wheel-inspect 1.8) +try: + from wheel_filename import ParseError as _WheelParseError + from wheel_filename import WheelFilename + + def _parse_wheel_filename(filename): + return WheelFilename.parse(filename) +except ImportError: + from wheel_filename import InvalidFilenameError as _WheelParseError + from wheel_filename import parse_wheel_filename as _parse_wheel_filename + from wheel_inspect import inspect_wheel from wheel_inspect.classes import WheelFile @@ -121,12 +131,12 @@ def is_compatible(package): Compatibility is based on https://www.python.org/dev/peps/pep-0425/ """ try: - w = WheelFilename.parse(package) + w = _parse_wheel_filename(package) for systag in tags.sys_tags(): for tag in w.tag_triples(): if systag in tags.parse_tag(tag): return True - except ParseError: + except _WheelParseError: return False From d4dbcde4ce4078d9614b960123e376798064b28f Mon Sep 17 00:00:00 2001 From: Matt Ghantous Date: Mon, 9 Feb 2026 18:10:27 -0500 Subject: [PATCH 3/4] normalize req_name --- devpi_builder/wheeler.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/devpi_builder/wheeler.py b/devpi_builder/wheeler.py index 7f5b588..8657bc4 100644 --- a/devpi_builder/wheeler.py +++ b/devpi_builder/wheeler.py @@ -64,12 +64,13 @@ def _matches_requirement(self, requirement, wheels): :param wheels: List of wheels to search. """ req = Requirement(requirement) + req_name = canonicalize_name(req.name) matching = [] for wheel in wheels: w = wheel.parsed_filename name = canonicalize_name(self._standardize_package_name(w.project)) - if name == req.name and req.specifier.contains(str(w.version)): + if name == req_name and req.specifier.contains(str(w.version)): matching.append(wheel.path) return matching From c4b7ab2ffd981425938a49b900643008adcc1948 Mon Sep 17 00:00:00 2001 From: Matthias Bach Date: Thu, 8 Oct 2026 08:17:00 +0200 Subject: [PATCH 4/4] Drop obsolete packaging compatibility limits Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- CHANGELOG.rst | 14 ++++++++++++++ core-requirements.txt | 4 ++-- devpi_builder/wheeler.py | 16 +++------------- requirements.txt | 6 +++--- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index ebafefb..040a0b4 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,6 +4,20 @@ Changelog This lists the most important changes for each release. +Unreleased +========== + +Changed +------- + +* Remove the upper version limits for Setuptools and ``wheel-filename``. +* Require ``wheel-filename`` 2.0 or newer. + +Removed +------- + +* Remove the remaining use of ``pkg_resources``. + Version 7.0.0 - 2026-02-16 ========================== diff --git a/core-requirements.txt b/core-requirements.txt index d8d84ee..2b2b2d7 100644 --- a/core-requirements.txt +++ b/core-requirements.txt @@ -1,8 +1,8 @@ devpi-plumber>=0.2.14 setuptools wheel -wheel-filename -wheel-inspect>=1.6.0 +wheel-filename>=2.0 +wheel-inspect>=1.8.0 pip>=1.5.3 junit-xml>=1.9 # First version to support to_xml_report_file pip-requirements-parser>=32.0.1 diff --git a/devpi_builder/wheeler.py b/devpi_builder/wheeler.py index 8657bc4..542707e 100644 --- a/devpi_builder/wheeler.py +++ b/devpi_builder/wheeler.py @@ -13,17 +13,7 @@ from packaging import tags from packaging.requirements import Requirement from packaging.utils import canonicalize_name - -# Support both wheel-filename 1.x (Python 3.9 + wheel-inspect 1.7) and 2.x (Python 3.10+ + wheel-inspect 1.8) -try: - from wheel_filename import ParseError as _WheelParseError - from wheel_filename import WheelFilename - - def _parse_wheel_filename(filename): - return WheelFilename.parse(filename) -except ImportError: - from wheel_filename import InvalidFilenameError as _WheelParseError - from wheel_filename import parse_wheel_filename as _parse_wheel_filename +from wheel_filename import ParseError, WheelFilename from wheel_inspect import inspect_wheel from wheel_inspect.classes import WheelFile @@ -132,12 +122,12 @@ def is_compatible(package): Compatibility is based on https://www.python.org/dev/peps/pep-0425/ """ try: - w = _parse_wheel_filename(package) + w = WheelFilename.parse(package) for systag in tags.sys_tags(): for tag in w.tag_triples(): if systag in tags.parse_tag(tag): return True - except _WheelParseError: + except ParseError: return False diff --git a/requirements.txt b/requirements.txt index 73c4686..9df45f9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,7 @@ # This file is autogenerated by pip-compile with Python 3.10 # by the following command: # -# pip-compile --no-emit-index-url --no-index --strip-extras --unsafe-package=pip +# pip-compile --no-emit-index-url --strip-extras --unsafe-package=pip # anyio==4.15.1 # via httpx @@ -217,11 +217,11 @@ webob==1.8.11 # via pyramid wheel==0.48.0 # via -r core-requirements.txt -wheel-filename==1.4.2 +wheel-filename==2.1.0 # via # -r core-requirements.txt # wheel-inspect -wheel-inspect==1.7.2 +wheel-inspect==1.8.0 # via -r core-requirements.txt wrapt==2.5.0 # via deprecated