Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion sqlite_utils/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -3264,6 +3264,7 @@ def plugins_list():
click.echo(json.dumps(get_plugins(), indent=2))


ensure_plugins_loaded()
pm.hook.register_commands(cli=cli)


Expand Down
3 changes: 2 additions & 1 deletion sqlite_utils/db.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down Expand Up @@ -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

Expand Down
10 changes: 8 additions & 2 deletions sqlite_utils/plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,19 @@

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]]]]:
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():
Expand Down
31 changes: 31 additions & 0 deletions tests/test_plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import click
import importlib
import pytest
import sys
from sqlite_utils import cli, Database, hookimpl, plugins


Expand All @@ -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() == []
Expand Down
Loading