From 52e83b2a2e9d80b32d6ed88eda72dafa6eaae4ca Mon Sep 17 00:00:00 2001 From: "Feng, Jiqing" Date: Tue, 15 Sep 2026 22:52:47 -0700 Subject: [PATCH] Fix egg_info.writers entry point module path The entry point points at `kernels.lockfile`, but `write_egg_lockfile` lives in `kernels.locking`; no `lockfile` module is shipped in the wheel. setuptools loads every registered `egg_info.writers` entry point when it runs `egg_info`, so with `kernels` installed any setuptools source build in the same environment fails, including builds of unrelated packages: File "setuptools/command/egg_info.py", line 304, in run writer = ep.load() ModuleNotFoundError: No module named 'kernels.lockfile' Reproducer: pip install kernels printf 'from setuptools import setup\nsetup(name="smoke", version="0.1")\n' > setup.py python setup.py egg_info PEP 517 isolated builds are unaffected, since kernels is absent from the isolated build environment. Builds using --no-build-isolation reuse the ambient setuptools and always hit it. Add a regression test that loads the entry point the way setuptools does. --- kernels/pyproject.toml | 2 +- kernels/tests/test_entry_points.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 kernels/tests/test_entry_points.py diff --git a/kernels/pyproject.toml b/kernels/pyproject.toml index b0889f86..20a04c29 100644 --- a/kernels/pyproject.toml +++ b/kernels/pyproject.toml @@ -63,7 +63,7 @@ docs = [ kernels = "kernels.cli:main" [project.entry-points."egg_info.writers"] -"kernels.lock" = "kernels.lockfile:write_egg_lockfile" +"kernels.lock" = "kernels.locking:write_egg_lockfile" [tool.maturin] module-name = "kernels._rust" diff --git a/kernels/tests/test_entry_points.py b/kernels/tests/test_entry_points.py new file mode 100644 index 00000000..67608b6a --- /dev/null +++ b/kernels/tests/test_entry_points.py @@ -0,0 +1,21 @@ +from importlib.metadata import distribution + +import pytest + + +def test_egg_info_writer_entry_point_is_importable(): + """The `egg_info.writers` entry point is loaded by setuptools during *any* + `egg_info` run in an environment where `kernels` is installed, including + builds of unrelated packages. If it points at a module that is not shipped, + every such build fails with `ModuleNotFoundError`.""" + entry_points = [ + ep for ep in distribution("kernels").entry_points if ep.group == "egg_info.writers" + ] + assert entry_points, "no egg_info.writers entry point registered" + + for ep in entry_points: + try: + writer = ep.load() + except ModuleNotFoundError as e: + pytest.fail(f"entry point {ep.name} = {ep.value!r} is not importable: {e}") + assert callable(writer)