Skip to content

Commit

Permalink
feat: new global config option to explicitly disable plugins
Browse files Browse the repository at this point in the history
  • Loading branch information
jtpavlock committed Sep 24, 2022
1 parent 522221c commit 88d6bab
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 14 deletions.
3 changes: 3 additions & 0 deletions docs/getting_started.rst
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ Most configuration options reside in their relevant plugin, however there are th
``default_plugins = ["add", "edit", "info", "ls", "move", "musicbrainz", "rm", "write"]``
Overrides the list of default plugins.

``disable_plugins = []``
List of any plugins to explicitly disable.

.. _library_path config option:

``library_path = "~/Music"``
Expand Down
18 changes: 10 additions & 8 deletions moe/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import logging
import os
import re
from contextlib import suppress
from pathlib import Path
from types import ModuleType
from typing import NamedTuple, Optional, Union, cast
Expand All @@ -36,7 +35,7 @@

log = logging.getLogger("moe.config")

DEFAULT_PLUGINS = (
DEFAULT_PLUGINS = {
"add",
"cli",
"duplicate",
Expand All @@ -48,7 +47,7 @@
"musicbrainz",
"remove",
"write",
)
}
CORE_PLUGINS = {
"config": "moe.config",
"album": "moe.library.album",
Expand Down Expand Up @@ -181,7 +180,8 @@ def _my_func(
def add_config_validator(settings: dynaconf.base.LazySettings):
"""Validate move plugin configuration settings."""
validators = [
dynaconf.Validator("DEFAULT_PLUGINS", default=list(DEFAULT_PLUGINS)),
dynaconf.Validator("DEFAULT_PLUGINS", default=DEFAULT_PLUGINS),
dynaconf.Validator("DISABLE_PLUGINS", default=set()),
dynaconf.Validator("LIBRARY_PATH", default="~/Music"),
]
settings.validators.register(*validators)
Expand Down Expand Up @@ -359,12 +359,14 @@ def _setup_plugins(self, core_plugins: dict[str, str] = CORE_PLUGINS):
self.pm.hook.add_config_validator(settings=self.settings)
self._validate_settings()

config_plugins = self.settings.default_plugins
config_plugins = set(self.settings.default_plugins) - set(
self.settings.disable_plugins
)

# the 'import' plugin maps to the 'moe_import' package
with suppress(ValueError):
import_index = config_plugins.index("import")
config_plugins[import_index] = "moe_import"
if "import" in config_plugins:
config_plugins.remove("import")
config_plugins.add("moe_import")

if "cli" in config_plugins:
self.pm.register(importlib.import_module("moe.cli"), name="cli")
Expand Down
15 changes: 9 additions & 6 deletions tests/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,21 +58,24 @@ def test_config_plugins(self, tmp_config):
Note:
The config, track, album, and extra "plugins" will always be registered.
"""
config = tmp_config(settings='default_plugins = ["cli", "list"]')
tmp_config(
settings="""default_plugins = ["cli", "list"]
disable_plugins = ["list"]"""
)

plugins = list(CORE_PLUGINS) + ["cli", "list"]
for plugin_name, plugin_module in config.pm.list_name_plugin():
plugins = list(CORE_PLUGINS) + ["cli"]
for plugin_name, plugin_module in config.CONFIG.pm.list_name_plugin():
assert plugin_name in plugins
assert plugin_module

for plugin in plugins:
assert config.pm.has_plugin(plugin)
assert config.CONFIG.pm.has_plugin(plugin)

def test_extra_plugins(self, tmp_config):
"""Any given additional plugins are also registered."""
config = tmp_config(extra_plugins=[ExtraPlugin(TestPlugins, "config_plugin")])
tmp_config(extra_plugins=[ExtraPlugin(TestPlugins, "config_plugin")])

assert config.pm.has_plugin("config_plugin")
assert config.CONFIG.pm.has_plugin("config_plugin")


class ConfigPlugin:
Expand Down

0 comments on commit 88d6bab

Please sign in to comment.