From 974fe2f82f06a9d3f9b7155f5f1aa941dd3b69a6 Mon Sep 17 00:00:00 2001 From: Rami Abdelrazzaq Date: Sat, 7 Mar 2026 18:33:04 -0600 Subject: [PATCH] fix: defer plugin entrypoint loading until runtime Fixes simonw/sqlite-utils#713 --- sqlite_utils/cli.py | 3 ++- sqlite_utils/db.py | 3 ++- sqlite_utils/plugins.py | 9 +++++++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/sqlite_utils/cli.py b/sqlite_utils/cli.py index 9b9ee20e..470d93be 100644 --- a/sqlite_utils/cli.py +++ b/sqlite_utils/cli.py @@ -14,7 +14,7 @@ NoTable, quote_identifier, ) -from sqlite_utils.plugins import pm, get_plugins +from sqlite_utils.plugins import ensure_plugins_loaded, pm, get_plugins from sqlite_utils.utils import maximize_csv_field_size_limit from sqlite_utils import recipes import textwrap @@ -3264,6 +3264,7 @@ def plugins_list(): click.echo(json.dumps(get_plugins(), indent=2)) +ensure_plugins_loaded() pm.hook.register_commands(cli=cli) diff --git a/sqlite_utils/db.py b/sqlite_utils/db.py index aacdc893..f989bedc 100644 --- a/sqlite_utils/db.py +++ b/sqlite_utils/db.py @@ -40,7 +40,7 @@ Tuple, ) import uuid -from sqlite_utils.plugins import pm +from sqlite_utils.plugins import ensure_plugins_loaded, pm try: from sqlite_dump import iterdump # type: ignore[import-not-found] @@ -382,6 +382,7 @@ def __init__( self._registered_functions: set = set() self.use_counts_table = use_counts_table if execute_plugins: + ensure_plugins_loaded() pm.hook.prepare_connection(conn=self.conn) self.strict = strict diff --git a/sqlite_utils/plugins.py b/sqlite_utils/plugins.py index 457a9071..4b445132 100644 --- a/sqlite_utils/plugins.py +++ b/sqlite_utils/plugins.py @@ -6,10 +6,15 @@ pm: pluggy.PluginManager = pluggy.PluginManager("sqlite_utils") pm.add_hookspecs(hookspecs) +_plugins_loaded = False -if not getattr(sys, "_called_from_test", False): - # Only load plugins if not running tests + +def ensure_plugins_loaded() -> None: + global _plugins_loaded + if _plugins_loaded or getattr(sys, "_called_from_test", False): + return pm.load_setuptools_entrypoints("sqlite_utils") + _plugins_loaded = True def get_plugins() -> List[Dict[str, Union[str, List[str]]]]: