From 74fb01363ea11c528b24cf48bbf95d71b6c31b71 Mon Sep 17 00:00:00 2001 From: "Jens W. Klein" Date: Tue, 12 Mar 2024 23:30:26 +0100 Subject: [PATCH] use from packaging.requirements import Requirement instead of pkg_resources.Requirement --- CHANGES.md | 6 +++--- pyproject.toml | 2 +- src/mxdev/config.py | 6 +++--- src/mxdev/entry_points.py | 4 ++-- src/mxdev/hooks.py | 1 - src/mxdev/processing.py | 10 +++++----- src/mxdev/vcs/common.py | 13 +++---------- 7 files changed, 17 insertions(+), 25 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index bd280b8..99db67a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,9 +2,9 @@ ## 4.0.2 (unreleased) - -- Nothing changed yet. - +- Fix #42: deprecated use of `pkg_resoures` to load entry points and parse requirements. + This enables mxdev to work on Python 3.12, where `pkg_resources` is no longer installed by default in virtual_envs. + [jensens] ## 4.0.1 (2024-03-01) diff --git a/pyproject.toml b/pyproject.toml index e4ad27b..d55863a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", ] -dependencies = [] +dependencies = ["packaging"] dynamic = ["readme"] [project.optional-dependencies] diff --git a/src/mxdev/config.py b/src/mxdev/config.py index eb0bbfd..4b61d9b 100644 --- a/src/mxdev/config.py +++ b/src/mxdev/config.py @@ -1,8 +1,8 @@ from .including import read_with_included from .logging import logger +from packaging.requirements import Requirement import os -import pkg_resources import typing @@ -55,11 +55,11 @@ def __init__( self.overrides = {} for line in raw_overrides.split("\n"): try: - parsed = pkg_resources.Requirement.parse(line) + parsed = Requirement(line) except Exception: logger.error(f"Can not parse override: {line}") continue - self.overrides[parsed.key] = line + self.overrides[parsed.name] = line raw_ignores = settings.get("ignores", "").strip() self.ignore_keys = [] diff --git a/src/mxdev/entry_points.py b/src/mxdev/entry_points.py index d48ea34..6d610f4 100644 --- a/src/mxdev/entry_points.py +++ b/src/mxdev/entry_points.py @@ -20,8 +20,8 @@ def load_eps_by_group(group: str) -> list: eps_base = entry_points() if group not in eps_base: return [] - eps = eps_base[group] + eps = eps_base[group] # type: ignore # XXX: for some reasons entry points are loaded twice. not sure if this # is a glitch when installing with uv or something related to # importlib.metadata.entry_points - return list(eps) # type: ignore + return list(set(eps)) # type: ignore diff --git a/src/mxdev/hooks.py b/src/mxdev/hooks.py index a5de768..cfad663 100644 --- a/src/mxdev/hooks.py +++ b/src/mxdev/hooks.py @@ -32,7 +32,6 @@ def load_hooks() -> list: def read_hooks(state: State, hooks: typing.List[Hook]) -> None: for hook in hooks: - breakpoint() hook.read(state) diff --git a/src/mxdev/processing.py b/src/mxdev/processing.py index 13be0a3..00f3d87 100644 --- a/src/mxdev/processing.py +++ b/src/mxdev/processing.py @@ -1,11 +1,11 @@ from .logging import logger from .state import State from .vcs.common import WorkingCopies +from packaging.requirements import Requirement from pathlib import Path from urllib import parse from urllib import request -import pkg_resources import typing @@ -49,15 +49,15 @@ def process_line( variety="r", ) try: - parsed = pkg_resources.Requirement.parse(line) + parsed = Requirement(line) except Exception: pass else: - if parsed.key in package_keys: + if parsed.name in package_keys: line = f"# {line.strip()} -> mxdev disabled (source)\n" - if variety == "c" and parsed.key in override_keys: + if variety == "c" and parsed.name in override_keys: line = f"# {line.strip()} -> mxdev disabled (override)\n" - if variety == "c" and parsed.key in ignore_keys: + if variety == "c" and parsed.name in ignore_keys: line = f"# {line.strip()} -> mxdev disabled (ignore)\n" if variety == "c": return [], [line] diff --git a/src/mxdev/vcs/common.py b/src/mxdev/vcs/common.py index 46f6b0c..c5aeb2d 100644 --- a/src/mxdev/vcs/common.py +++ b/src/mxdev/vcs/common.py @@ -147,23 +147,16 @@ def get_workingcopytypes() -> typing.Dict[str, typing.Type[BaseWorkingCopy]]: if _workingcopytypes: return _workingcopytypes group = "mxdev.workingcopytypes" - addons = {} + addons: dict[str, typing.Type[BaseWorkingCopy]] = {} for entrypoint in load_eps_by_group(group): key = entrypoint.name workingcopytype = entrypoint.load() - if not entrypoint.dist: - continue - if entrypoint.dist.name == "mxdev": - _workingcopytypes[key] = workingcopytype - continue if key in addons: logger.error( - f"There already is a working copy type addon registered for '{key}'." + f"Duplicate workingcopy types registration '{key}' at " + f"{entrypoint.value} can not override {addons[key]}" ) sys.exit(1) - logger.info( - f"Overwriting '{key}' with addon from '{entrypoint.dist.project_name}'." - ) addons[key] = workingcopytype _workingcopytypes.update(addons) return _workingcopytypes