diff --git a/dotbot/dispatcher.py b/dotbot/dispatcher.py index f89683d..7fb06c5 100644 --- a/dotbot/dispatcher.py +++ b/dotbot/dispatcher.py @@ -18,7 +18,10 @@ class Dispatcher: ): self._log = Messenger() self._setup_context(base_directory, options) - plugins = plugins or [] + if plugins == None: + plugins = Plugin.__subclasses__() + else: + plugins = plugins or [] self._plugins = [plugin(self._context) for plugin in plugins] self._only = only self._skip = skip diff --git a/tests/dotbot_plugin_dispatch.py b/tests/dotbot_plugin_dispatch.py new file mode 100644 index 0000000..de630e6 --- /dev/null +++ b/tests/dotbot_plugin_dispatch.py @@ -0,0 +1,17 @@ +"""Test that a plugin can call dispatcher for subtasks. + +The plugin calls dispatch with his data. +""" + +import os.path + +import dotbot + + +class Dispatch(dotbot.Plugin): + def can_handle(self, directive): + return directive == "dispatch" + + def handle(self, directive, data): + dispatcher = dotbot.dispatcher.Dispatcher(self._context.base_directory()) + return dispatcher.dispatch(data) diff --git a/tests/test_dispatcher.py b/tests/test_dispatcher.py new file mode 100644 index 0000000..53c7c02 --- /dev/null +++ b/tests/test_dispatcher.py @@ -0,0 +1,22 @@ +import os +import shutil + +import pytest + + +def test_plugin_dispatcher(capfd, home, dotfiles, run_dotbot): + """Verify that plugins can call dispatcher without explicitly specifying plugins.""" + + dotfiles.makedirs("plugins") + plugin_file = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "dotbot_plugin_dispatch.py" + ) + shutil.copy(plugin_file, os.path.join(dotfiles.directory, "plugins", "dispatch.py")) + dotfiles.write_config( + [ + {"dispatch": [{"create": ["~/a"]}]}, + ] + ) + run_dotbot("--plugin-dir", os.path.join(dotfiles.directory, "plugins")) + + assert os.path.exists(os.path.join(home, "a"))