kopia lustrzana https://github.com/simonw/datasette
DATASETTE_LOAD_PLUGINS environment variable for loading specific plugins
Closes #2164 * Load only specified plugins for DATASETTE_LOAD_PLUGINS=datasette-one,datasette-two * Load no plugins if DATASETTE_LOAD_PLUGINS='' * Automated tests in a Bash script for DATASETTE_LOAD_PLUGINSpull/2173/head
rodzic
30b28c8367
commit
6bfe104d47
|
@ -50,3 +50,7 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
# This fails on syntax errors, or a diff was applied
|
# This fails on syntax errors, or a diff was applied
|
||||||
blacken-docs -l 60 docs/*.rst
|
blacken-docs -l 60 docs/*.rst
|
||||||
|
- name: Test DATASETTE_LOAD_PLUGINS
|
||||||
|
run: |
|
||||||
|
pip install datasette-init datasette-json-html
|
||||||
|
tests/test-datasette-load-plugins.sh
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import importlib
|
import importlib
|
||||||
|
import os
|
||||||
import pluggy
|
import pluggy
|
||||||
import pkg_resources
|
import pkg_resources
|
||||||
import sys
|
import sys
|
||||||
|
@ -22,10 +23,30 @@ DEFAULT_PLUGINS = (
|
||||||
pm = pluggy.PluginManager("datasette")
|
pm = pluggy.PluginManager("datasette")
|
||||||
pm.add_hookspecs(hookspecs)
|
pm.add_hookspecs(hookspecs)
|
||||||
|
|
||||||
if not hasattr(sys, "_called_from_test"):
|
DATASETTE_LOAD_PLUGINS = os.environ.get("DATASETTE_LOAD_PLUGINS", None)
|
||||||
|
|
||||||
|
if not hasattr(sys, "_called_from_test") and DATASETTE_LOAD_PLUGINS is None:
|
||||||
# Only load plugins if not running tests
|
# Only load plugins if not running tests
|
||||||
pm.load_setuptools_entrypoints("datasette")
|
pm.load_setuptools_entrypoints("datasette")
|
||||||
|
|
||||||
|
# Load any plugins specified in DATASETTE_LOAD_PLUGINS")
|
||||||
|
if DATASETTE_LOAD_PLUGINS is not None:
|
||||||
|
for package_name in [
|
||||||
|
name for name in DATASETTE_LOAD_PLUGINS.split(",") if name.strip()
|
||||||
|
]:
|
||||||
|
try:
|
||||||
|
distribution = pkg_resources.get_distribution(package_name)
|
||||||
|
entry_map = distribution.get_entry_map()
|
||||||
|
if "datasette" in entry_map:
|
||||||
|
for plugin_name, entry_point in entry_map["datasette"].items():
|
||||||
|
mod = entry_point.load()
|
||||||
|
pm.register(mod, name=entry_point.name)
|
||||||
|
# Ensure name can be found in plugin_to_distinfo later:
|
||||||
|
pm._plugin_distinfo.append((mod, distribution))
|
||||||
|
except pkg_resources.DistributionNotFound:
|
||||||
|
sys.stderr.write("Plugin {} could not be found\n".format(package_name))
|
||||||
|
|
||||||
|
|
||||||
# Load default plugins
|
# Load default plugins
|
||||||
for plugin in DEFAULT_PLUGINS:
|
for plugin in DEFAULT_PLUGINS:
|
||||||
mod = importlib.import_module(plugin)
|
mod = importlib.import_module(plugin)
|
||||||
|
|
|
@ -81,6 +81,60 @@ You can use the name of a package on PyPI or any of the other valid arguments to
|
||||||
datasette publish cloudrun mydb.db \
|
datasette publish cloudrun mydb.db \
|
||||||
--install=https://url-to-my-package.zip
|
--install=https://url-to-my-package.zip
|
||||||
|
|
||||||
|
|
||||||
|
.. _plugins_datasette_load_plugins:
|
||||||
|
|
||||||
|
Controlling which plugins are loaded
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
Datasette defaults to loading every plugin that is installed in the same virtual environment as Datasette itself.
|
||||||
|
|
||||||
|
You can set the ``DATASETTE_LOAD_PLUGINS`` environment variable to a comma-separated list of plugin names to load a controlled subset of plugins instead.
|
||||||
|
|
||||||
|
For example, to load just the ``datasette-vega`` and ``datasette-cluster-map`` plugins, set ``DATASETTE_LOAD_PLUGINS`` to ``datasette-vega,datasette-cluster-map``:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
export DATASETTE_LOAD_PLUGINS='datasette-vega,datasette-cluster-map'
|
||||||
|
datasette mydb.db
|
||||||
|
|
||||||
|
Or:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
DATASETTE_LOAD_PLUGINS='datasette-vega,datasette-cluster-map' \
|
||||||
|
datasette mydb.db
|
||||||
|
|
||||||
|
To disable the loading of all additional plugins, set ``DATASETTE_LOAD_PLUGINS`` to an empty string:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
export DATASETTE_LOAD_PLUGINS=''
|
||||||
|
datasette mydb.db
|
||||||
|
|
||||||
|
A quick way to test this setting is to use it with the ``datasette plugins`` command:
|
||||||
|
|
||||||
|
.. code-block:: bash
|
||||||
|
|
||||||
|
DATASETTE_LOAD_PLUGINS='datasette-vega' datasette plugins
|
||||||
|
|
||||||
|
This should output the following:
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "datasette-vega",
|
||||||
|
"static": true,
|
||||||
|
"templates": false,
|
||||||
|
"version": "0.6.2",
|
||||||
|
"hooks": [
|
||||||
|
"extra_css_urls",
|
||||||
|
"extra_js_urls"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
.. _plugins_installed:
|
.. _plugins_installed:
|
||||||
|
|
||||||
Seeing what plugins are installed
|
Seeing what plugins are installed
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# This should only run in environemnts where both
|
||||||
|
# datasette-init and datasette-json-html are installed
|
||||||
|
|
||||||
|
PLUGINS=$(datasette plugins)
|
||||||
|
echo "$PLUGINS" | jq 'any(.[]; .name == "datasette-json-html")' | \
|
||||||
|
grep -q true || ( \
|
||||||
|
echo "Test failed: datasette-json-html not found" && \
|
||||||
|
exit 1 \
|
||||||
|
)
|
||||||
|
# With the DATASETTE_LOAD_PLUGINS we should not see that
|
||||||
|
PLUGINS2=$(DATASETTE_LOAD_PLUGINS=datasette-init datasette plugins)
|
||||||
|
echo "$PLUGINS2" | jq 'any(.[]; .name == "datasette-json-html")' | \
|
||||||
|
grep -q false || ( \
|
||||||
|
echo "Test failed: datasette-json-html should not have been loaded" && \
|
||||||
|
exit 1 \
|
||||||
|
)
|
||||||
|
echo "$PLUGINS2" | jq 'any(.[]; .name == "datasette-init")' | \
|
||||||
|
grep -q true || ( \
|
||||||
|
echo "Test failed: datasette-init should have been loaded" && \
|
||||||
|
exit 1 \
|
||||||
|
)
|
||||||
|
# With DATASETTE_LOAD_PLUGINS='' we should see no plugins
|
||||||
|
PLUGINS3=$(DATASETTE_LOAD_PLUGINS='' datasette plugins)
|
||||||
|
echo "$PLUGINS3"| \
|
||||||
|
grep -q '\[\]' || ( \
|
||||||
|
echo "Test failed: datasette plugins should have returned []" && \
|
||||||
|
exit 1 \
|
||||||
|
)
|
Ładowanie…
Reference in New Issue