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 3373585..2b2b2d7 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>=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/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..542707e 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 ParseError, WheelFilename -from wheel_filename import InvalidFilenameError, parse_wheel_filename from wheel_inspect import inspect_wheel from wheel_inspect.classes import WheelFile @@ -52,13 +53,14 @@ 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) + req_name = canonicalize_name(req.name) 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 +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 InvalidFilenameError: + 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