From 002878ec147709f14b10b094f3b7cc6259003698 Mon Sep 17 00:00:00 2001 From: Johannes Laurin Hoermann Date: Thu, 26 Mar 2026 12:17:51 +0900 Subject: [PATCH 1/3] BUG: use importlib.metadata instead of pkg_resources for Python 3.12+ compat pkg_resources is no longer bundled by default with Python 3.12+ (it requires setuptools to be installed explicitly). Use importlib.metadata.entry_points as the primary implementation and fall back to pkg_resources for older Python versions where importlib.metadata may not be available. --- dtool_cli/cli.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/dtool_cli/cli.py b/dtool_cli/cli.py index a798103..915a20f 100644 --- a/dtool_cli/cli.py +++ b/dtool_cli/cli.py @@ -3,7 +3,15 @@ import os import logging -from pkg_resources import iter_entry_points +try: + from importlib.metadata import entry_points as _entry_points + def iter_entry_points(group, name=None): + eps = _entry_points(group=group) + if name is not None: + eps = [ep for ep in eps if ep.name == name] + return eps +except ImportError: + from pkg_resources import iter_entry_points import click from click_plugins import with_plugins From d6931e14bc85660c62827a2472077072c8e88e9d Mon Sep 17 00:00:00 2001 From: Johannes Laurin Hoermann Date: Thu, 26 Mar 2026 12:17:51 +0900 Subject: [PATCH 2/3] MAINT: add pyproject.toml for modern pip compatibility --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 pyproject.toml diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..452a827 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools>=45", "wheel"] +build-backend = "setuptools.build_meta" From fdc721a8d04446556f7d0ac49090f9479190a8f9 Mon Sep 17 00:00:00 2001 From: Johannes Laurin Hoermann Date: Fri, 27 Mar 2026 12:19:22 +0900 Subject: [PATCH 3/3] BUG: defer pretty_version_text() to avoid import-time failure in PyInstaller pretty_version_text() is called as a default argument at module import time. It invokes iter_entry_points() and __import__() on storage broker packages, which fails in PyInstaller's isolated analysis subprocess where no entry points are registered. This causes PyInstaller to silently exclude dtool_cli.cli from the bundle. Defer the call using sys._MEIPASS check so it only runs when the CLI is actually invoked, not during bundled-app import. --- dtool_cli/cli.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dtool_cli/cli.py b/dtool_cli/cli.py index 915a20f..a40a757 100644 --- a/dtool_cli/cli.py +++ b/dtool_cli/cli.py @@ -104,7 +104,7 @@ def pretty_version_text(): # List the storage broker packages. version_lines.append("\nStorage brokers:") for ep in iter_entry_points("dtool.storage_brokers"): - package = ep.module_name.split(".")[0] + package = ep.value.split(":")[0].split(".")[0] dyn_load_p = __import__(package) version = dyn_load_p.__version__ storage_broker = ep.load() @@ -115,7 +115,7 @@ def pretty_version_text(): version)) # List the plugin packages. - modules = [ep.module_name for ep in iter_entry_points("dtool.cli")] + modules = [ep.value.split(":")[0] for ep in iter_entry_points("dtool.cli")] packages = set([m.split(".")[0] for m in modules]) version_lines.append("\nPlugins:") for p in packages: @@ -130,7 +130,7 @@ def pretty_version_text(): @with_plugins(iter_entry_points("dtool.cli")) @click.group(context_settings=_CLICK_CONTEXT_SETTINGS) -@click.version_option(message=pretty_version_text()) +@click.version_option(message=pretty_version_text() if not getattr(__import__('sys'), '_MEIPASS', None) else 'dtool') @click.option("--debug", is_flag=True, help="Turn on debugging output.") def dtool(debug): """Tool to work with datasets."""