From af5e3e3a5b8da4b89b9726792ce7ea04215c3469 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Sun, 21 Jun 2026 16:10:48 -0700 Subject: [PATCH] Lazy-load plugins when listing them Keep plugin entrypoints from loading at module import time, but preserve the existing behavior of get_plugins() by loading entrypoints the first time plugins are listed outside tests. --- sqlite_utils/plugins.py | 1 + tests/test_plugins.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/sqlite_utils/plugins.py b/sqlite_utils/plugins.py index 4b44513..0aff7ff 100644 --- a/sqlite_utils/plugins.py +++ b/sqlite_utils/plugins.py @@ -18,6 +18,7 @@ def ensure_plugins_loaded() -> None: def get_plugins() -> List[Dict[str, Union[str, List[str]]]]: + ensure_plugins_loaded() plugins: List[Dict[str, Union[str, List[str]]]] = [] plugin_to_distinfo = dict(pm.list_plugin_distinfo()) for plugin in pm.get_plugins(): diff --git a/tests/test_plugins.py b/tests/test_plugins.py index 1d459c9..c793e32 100644 --- a/tests/test_plugins.py +++ b/tests/test_plugins.py @@ -2,6 +2,7 @@ from click.testing import CliRunner import click import importlib import pytest +import sys from sqlite_utils import cli, Database, hookimpl, plugins @@ -16,6 +17,36 @@ def _supports_pragma_function_list(): db.close() +def test_get_plugins_loads_setuptools_entrypoints_once(monkeypatch): + calls = [] + monkeypatch.delattr(sys, "_called_from_test", raising=False) + monkeypatch.setattr(plugins, "_plugins_loaded", False) + monkeypatch.setattr( + plugins.pm, + "load_setuptools_entrypoints", + lambda group: calls.append(group) or 0, + ) + + plugins.get_plugins() + plugins.get_plugins() + + assert calls == ["sqlite_utils"] + + +def test_get_plugins_does_not_load_setuptools_entrypoints_in_tests(monkeypatch): + calls = [] + monkeypatch.setattr(sys, "_called_from_test", True, raising=False) + monkeypatch.setattr(plugins, "_plugins_loaded", False) + monkeypatch.setattr( + plugins.pm, + "load_setuptools_entrypoints", + lambda group: calls.append(group) or 0, + ) + + assert plugins.get_plugins() == [] + assert calls == [] + + def test_register_commands(): importlib.reload(cli) assert plugins.get_plugins() == []