1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
From 7989cac274a8451dce05e9ff8f258d6da992a032 Mon Sep 17 00:00:00 2001
From: Min RK <benjaminrk@gmail.com>
Date: Tue, 2 Jul 2024 14:09:42 +0200
Subject: [PATCH] trade entrypoints for importlib_metadata
--- a/ipyparallel/cluster/app.py
+++ b/ipyparallel/cluster/app.py
@@ -11,7 +11,6 @@
import sys
from functools import partial
-import entrypoints
import zmq
from IPython.core.profiledir import ProfileDir
from traitlets import Bool, CaselessStrEnum, Dict, Integer, List, default
@@ -20,6 +19,7 @@
from ipyparallel._version import __version__
from ipyparallel.apps.baseapp import BaseParallelApplication, base_aliases, base_flags
from ipyparallel.cluster import Cluster, ClusterManager, clean_cluster_files
+from ipyparallel.traitlets import entry_points
from ipyparallel.util import abbreviate_profile_dir
# -----------------------------------------------------------------------------
@@ -339,13 +339,14 @@
launcher_classes = []
for kind in ('controller', 'engine'):
group_name = f'ipyparallel.{kind}_launchers'
- group = entrypoints.get_group_named(group_name)
- for key, value in group.items():
+ group = entry_points(group=group_name)
+ for entrypoint in group:
+ key = entrypoint.name
try:
- cls = value.load()
+ cls = entrypoint.load()
except Exception as e:
self.log.error(
- f"Failed to load entrypoint {group_name}: {key} = {value}\n{e}"
+ f"Failed to load entrypoint {group_name}: {key} = {entrypoint.value}\n{e}"
)
else:
launcher_classes.append(cls)
--- a/ipyparallel/cluster/launcher.py
+++ b/ipyparallel/cluster/launcher.py
@@ -23,7 +23,6 @@
from tempfile import TemporaryDirectory
from textwrap import indent
-import entrypoints
import psutil
from IPython.utils.path import ensure_dir_exists, get_home_dir
from IPython.utils.text import EvalFormatter
@@ -42,6 +41,7 @@
)
from traitlets.config.configurable import LoggingConfigurable
+from ..traitlets import entry_points
from ..util import shlex_join
from ._winhpcjob import IPControllerJob, IPControllerTask, IPEngineSetJob, IPEngineTask
@@ -2533,16 +2533,16 @@
group_name = 'ipyparallel.controller_launchers'
else:
raise ValueError(f"kind must be 'engine' or 'controller', not {kind!r}")
- group = entrypoints.get_group_named(group_name)
+ group = entry_points(group=group_name)
# make it case-insensitive
- registry = {key.lower(): value for key, value in group.items()}
+ registry = {entrypoint.name.lower(): entrypoint for entrypoint in group}
return registry[name.lower()].load()
@lru_cache
def abbreviate_launcher_class(cls):
"""Abbreviate a launcher class back to its entrypoint name"""
- cls_key = f"{cls.__module__}.{cls.__name__}"
+ cls_key = f"{cls.__module__}:{cls.__name__}"
# allow entrypoint_name attribute in case the definition module
# is not the same as the 'import' module
if getattr(cls, 'entrypoint_name', None):
@@ -2550,8 +2550,8 @@
for kind in ('controller', 'engine'):
group_name = f'ipyparallel.{kind}_launchers'
- group = entrypoints.get_group_named(group_name)
- for key, value in group.items():
- if f"{value.module_name}.{value.object_name}" == cls_key:
- return key.lower()
+ group = entry_points(group=group_name)
+ for entrypoint in group:
+ if entrypoint.value == cls_key:
+ return entrypoint.name.lower()
return cls_key
--- a/ipyparallel/tests/test_launcher.py
+++ b/ipyparallel/tests/test_launcher.py
@@ -10,11 +10,11 @@
import time
from subprocess import Popen
-import entrypoints
import pytest
from traitlets.config import Config
from ipyparallel.cluster import launcher as launcher_mod
+from ipyparallel.traitlets import entry_points
# -------------------------------------------------------------------------------
# TestCase Mixins
@@ -156,9 +156,10 @@
@pytest.mark.parametrize("kind", ("controller", "engine"))
def test_entrypoints(kind):
group_name = f"ipyparallel.{kind}_launchers"
- group = entrypoints.get_group_named(group_name)
+ group = entry_points(group=group_name)
assert len(group) > 2
- for key, entrypoint in group.items():
+ for entrypoint in group:
+ key = entrypoint.name
# verify entrypoints are valid
cls = entrypoint.load()
--- a/ipyparallel/traitlets.py
+++ b/ipyparallel/traitlets.py
@@ -1,6 +1,8 @@
"""Custom ipyparallel trait types"""
-import entrypoints
+import sys
+from importlib.metadata import entry_points
+
from traitlets import List, TraitError, Type
@@ -24,9 +26,7 @@
chunks = [self._original_help]
chunks.append("Currently installed: ")
for key, entry_point in self.load_entry_points().items():
- chunks.append(
- f" - {key}: {entry_point.module_name}.{entry_point.object_name}"
- )
+ chunks.append(f" - {key}: {entry_point.value}")
return '\n'.join(chunks)
@help.setter
@@ -35,10 +35,10 @@
def load_entry_points(self):
"""Load my entry point group"""
- # load the group
- group = entrypoints.get_group_named(self.entry_point_group)
- # make it case-insensitive
- return {key.lower(): value for key, value in group.items()}
+ return {
+ entry_point.name.lower(): entry_point
+ for entry_point in entry_points(group=self.entry_point_group)
+ }
def validate(self, obj, value):
if isinstance(value, str):
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -36,7 +36,6 @@
urls = {Homepage = "https://ipython.org"}
requires-python = ">=3.8"
dependencies = [
- "entrypoints",
"decorator",
"pyzmq>=18",
"traitlets>=4.3",
|