Coverage for datasette/plugins.py : 82%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1import importlib
2import pluggy
3import pkg_resources
4import sys
5from . import hookspecs
7DEFAULT_PLUGINS = (
8 "datasette.publish.heroku",
9 "datasette.publish.cloudrun",
10 "datasette.facets",
11 "datasette.sql_functions",
12 "datasette.actor_auth_cookie",
13 "datasette.default_permissions",
14)
16pm = pluggy.PluginManager("datasette")
17pm.add_hookspecs(hookspecs)
19if not hasattr(sys, "_called_from_test"):
20 # Only load plugins if not running tests
21 pm.load_setuptools_entrypoints("datasette")
23# Load default plugins
24for plugin in DEFAULT_PLUGINS:
25 mod = importlib.import_module(plugin)
26 pm.register(mod, plugin)
29def get_plugins():
30 plugins = []
31 plugin_to_distinfo = dict(pm.list_plugin_distinfo())
32 for plugin in pm.get_plugins():
33 static_path = None
34 templates_path = None
35 if plugin.__name__ not in DEFAULT_PLUGINS:
36 try:
37 if pkg_resources.resource_isdir(plugin.__name__, "static"):
38 static_path = pkg_resources.resource_filename(
39 plugin.__name__, "static"
40 )
41 if pkg_resources.resource_isdir(plugin.__name__, "templates"):
42 templates_path = pkg_resources.resource_filename(
43 plugin.__name__, "templates"
44 )
45 except (KeyError, ImportError):
46 # Caused by --plugins_dir= plugins - KeyError/ImportError thrown in Py3.5
47 pass
48 plugin_info = {
49 "name": plugin.__name__,
50 "static_path": static_path,
51 "templates_path": templates_path,
52 "hooks": [h.name for h in pm.get_hookcallers(plugin)],
53 }
54 distinfo = plugin_to_distinfo.get(plugin)
55 if distinfo:
56 plugin_info["version"] = distinfo.version
57 plugin_info["name"] = distinfo.project_name
58 plugins.append(plugin_info)
59 return plugins