Package: release.debian.org
Severity: normal
X-Debbugs-Cc: ipyparal...@packages.debian.org
Control: affects -1 + src:ipyparallel
User: release.debian....@packages.debian.org
Usertags: unblock

Please unblock package ipyparallel

I'm tryng to get old python3-entrypoints
out of Trixie and we are almost there.

There's an AUTORM pending for a lot of other
packages and I'd like to get this settled.


[ Reason ]
ipyparallel autopkgtest is quite flaky as usual

[ Impact ]
(What is the impact for the user if the unblock isn't granted?)
One more confusing old library ends up in Trixie

[ Tests ]
autopkgtest succeeded for most architectures

[ Risks ]
Patch from upstream; 1 dependency dropped.

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing

[ Other info ]
python3-entrypoints reverse deps in Testing:
 python3-ipyparallel
 python3-papermill
 python3-testbook

unblock ipyparallel/8.8.0-5
diff -Nru ipyparallel-8.8.0/debian/changelog ipyparallel-8.8.0/debian/changelog
--- ipyparallel-8.8.0/debian/changelog  2024-10-30 15:15:26.000000000 +0100
+++ ipyparallel-8.8.0/debian/changelog  2025-05-14 00:45:36.000000000 +0200
@@ -1,3 +1,10 @@
+ipyparallel (8.8.0-5) unstable; urgency=medium
+
+  * Team upload.
+  * Remove usage of python3-entrypoints using upstream patch.
+
+ -- Alexandre Detiste <tc...@debian.org>  Wed, 14 May 2025 00:45:36 +0200
+
 ipyparallel (8.8.0-4) unstable; urgency=medium
 
   * Team upload.
diff -Nru ipyparallel-8.8.0/debian/control ipyparallel-8.8.0/debian/control
--- ipyparallel-8.8.0/debian/control    2024-10-30 13:10:18.000000000 +0100
+++ ipyparallel-8.8.0/debian/control    2025-05-14 00:45:36.000000000 +0200
@@ -17,7 +17,6 @@
  python3-dateutil,
  python3-decorator,
  python3-doc <!nodoc>,
- python3-entrypoints,
  python3-hatchling,
  python3-ipykernel,
  python3-ipython,
diff -Nru 
ipyparallel-8.8.0/debian/patches/7989cac274a8451dce05e9ff8f258d6da992a032.patch 
ipyparallel-8.8.0/debian/patches/7989cac274a8451dce05e9ff8f258d6da992a032.patch
--- 
ipyparallel-8.8.0/debian/patches/7989cac274a8451dce05e9ff8f258d6da992a032.patch 
    1970-01-01 01:00:00.000000000 +0100
+++ 
ipyparallel-8.8.0/debian/patches/7989cac274a8451dce05e9ff8f258d6da992a032.patch 
    2025-05-14 00:45:36.000000000 +0200
@@ -0,0 +1,169 @@
+From 7989cac274a8451dce05e9ff8f258d6da992a032 Mon Sep 17 00:00:00 2001
+From: Min RK <benjami...@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",
diff -Nru ipyparallel-8.8.0/debian/patches/series 
ipyparallel-8.8.0/debian/patches/series
--- ipyparallel-8.8.0/debian/patches/series     2024-10-30 15:14:49.000000000 
+0100
+++ ipyparallel-8.8.0/debian/patches/series     2025-05-14 00:45:36.000000000 
+0200
@@ -4,3 +4,4 @@
 mark_async_test_xfail.patch
 fix_docs
 0006-Define-asyncio_default_fixture_loop_scope-for-pytest.patch
+7989cac274a8451dce05e9ff8f258d6da992a032.patch

Reply via email to