Added pluggy and first hook, register_commands - refs #569, #567

This commit is contained in:
Simon Willison 2023-07-22 12:04:31 -07:00
commit b379a2a0c3
11 changed files with 224 additions and 2 deletions

View file

@ -1,4 +1,6 @@
from .db import Database
from .utils import suggest_column_types
from .hookspecs import hookimpl
from .hookspecs import hookspec
__all__ = ["Database", "suggest_column_types"]
__all__ = ["Database", "suggest_column_types", "hookimpl", "hookspec"]

View file

@ -7,6 +7,7 @@ import pathlib
from runpy import run_module
import sqlite_utils
from sqlite_utils.db import AlterError, BadMultiValues, DescIndex, NoTable
from sqlite_utils.plugins import pm, get_plugins
from sqlite_utils.utils import maximize_csv_field_size_limit
from sqlite_utils import recipes
import textwrap
@ -3078,6 +3079,15 @@ def create_spatial_index(db_path, table, column_name, load_extension):
db[table].create_spatial_index(column_name)
@cli.command(name="plugins")
def plugins_list():
"List installed plugins"
click.echo(json.dumps(get_plugins(), indent=2))
pm.hook.register_commands(cli=cli)
def _render_common(title, values):
if values is None:
return ""

10
sqlite_utils/hookspecs.py Normal file
View file

@ -0,0 +1,10 @@
from pluggy import HookimplMarker
from pluggy import HookspecMarker
hookspec = HookspecMarker("sqlite_utils")
hookimpl = HookimplMarker("sqlite_utils")
@hookspec
def register_commands(cli):
"""Register additional CLI commands, e.g. 'sqlite-utils mycommand ...'"""

26
sqlite_utils/plugins.py Normal file
View file

@ -0,0 +1,26 @@
import pluggy
import sys
from . import hookspecs
pm = pluggy.PluginManager("sqlite_utils")
pm.add_hookspecs(hookspecs)
if not hasattr(sys, "_called_from_test"):
# Only load plugins if not running tests
pm.load_setuptools_entrypoints("sqlite_utils")
def get_plugins():
plugins = []
plugin_to_distinfo = dict(pm.list_plugin_distinfo())
for plugin in pm.get_plugins():
plugin_info = {
"name": plugin.__name__,
"hooks": [h.name for h in pm.get_hookcallers(plugin)],
}
distinfo = plugin_to_distinfo.get(plugin)
if distinfo:
plugin_info["version"] = distinfo.version
plugin_info["name"] = distinfo.project_name
plugins.append(plugin_info)
return plugins