8c2dc8cbc6
This is useful for plugins like dotbot-if [1] that want to instantiate their own Dispatcher. Previously, the Dispatcher found the set of available plugins on its own, but as ofb5499c7dc5
, this was changed so that plugins are passed in. Given that it has been over two years since this behavior has been broken/changed, reverting to the previous behavior of having the Dispatcher auto-load plugins might not be ideal, which is why this patch instead makes the set of plugins available via the Context for plugins to use. This was reported in the Dotbot repository [2], and earlier in dotbot-if [3]. dotbot-if is currently using a workaround [4] that was originally implemented in dotbot-ifplatform [5]. [1]: https://github.com/wonderbeyond/dotbot-if [2]: https://github.com/anishathalye/dotbot/issues/339 [3]: https://github.com/wonderbeyond/dotbot-if/issues/1 [4]: https://github.com/wonderbeyond/dotbot-if/pull/2 [5]:e35b5c0d71
186 lines
5.8 KiB
Python
186 lines
5.8 KiB
Python
import os
|
|
import shutil
|
|
|
|
import pytest
|
|
|
|
|
|
def test_except_create(capfd, home, dotfiles, run_dotbot):
|
|
"""Verify that `--except` works as intended."""
|
|
|
|
dotfiles.write_config(
|
|
[
|
|
{"create": ["~/a"]},
|
|
{
|
|
"shell": [
|
|
{"command": "echo success", "stdout": True},
|
|
]
|
|
},
|
|
]
|
|
)
|
|
run_dotbot("--except", "create")
|
|
|
|
assert not os.path.exists(os.path.join(home, "a"))
|
|
stdout = capfd.readouterr().out.splitlines()
|
|
assert any(line.startswith("success") for line in stdout)
|
|
|
|
|
|
def test_except_shell(capfd, home, dotfiles, run_dotbot):
|
|
"""Verify that `--except` works as intended."""
|
|
|
|
dotfiles.write_config(
|
|
[
|
|
{"create": ["~/a"]},
|
|
{
|
|
"shell": [
|
|
{"command": "echo failure", "stdout": True},
|
|
]
|
|
},
|
|
]
|
|
)
|
|
run_dotbot("--except", "shell")
|
|
|
|
assert os.path.exists(os.path.join(home, "a"))
|
|
stdout = capfd.readouterr().out.splitlines()
|
|
assert not any(line.startswith("failure") for line in stdout)
|
|
|
|
|
|
def test_except_multiples(capfd, home, dotfiles, run_dotbot):
|
|
"""Verify that `--except` works with multiple exceptions."""
|
|
|
|
dotfiles.write_config(
|
|
[
|
|
{"create": ["~/a"]},
|
|
{
|
|
"shell": [
|
|
{"command": "echo failure", "stdout": True},
|
|
]
|
|
},
|
|
]
|
|
)
|
|
run_dotbot("--except", "create", "shell")
|
|
|
|
assert not os.path.exists(os.path.join(home, "a"))
|
|
stdout = capfd.readouterr().out.splitlines()
|
|
assert not any(line.startswith("failure") for line in stdout)
|
|
|
|
|
|
def test_exit_on_failure(capfd, home, dotfiles, run_dotbot):
|
|
"""Verify that processing can halt immediately on failures."""
|
|
|
|
dotfiles.write_config(
|
|
[
|
|
{"create": ["~/a"]},
|
|
{"shell": ["this_is_not_a_command"]},
|
|
{"create": ["~/b"]},
|
|
]
|
|
)
|
|
with pytest.raises(SystemExit):
|
|
run_dotbot("-x")
|
|
|
|
assert os.path.isdir(os.path.join(home, "a"))
|
|
assert not os.path.isdir(os.path.join(home, "b"))
|
|
|
|
|
|
def test_only(capfd, home, dotfiles, run_dotbot):
|
|
"""Verify that `--only` works as intended."""
|
|
|
|
dotfiles.write_config(
|
|
[
|
|
{"create": ["~/a"]},
|
|
{"shell": [{"command": "echo success", "stdout": True}]},
|
|
]
|
|
)
|
|
run_dotbot("--only", "shell")
|
|
|
|
assert not os.path.exists(os.path.join(home, "a"))
|
|
stdout = capfd.readouterr().out.splitlines()
|
|
assert any(line.startswith("success") for line in stdout)
|
|
|
|
|
|
def test_only_with_defaults(capfd, home, dotfiles, run_dotbot):
|
|
"""Verify that `--only` does not suppress defaults."""
|
|
|
|
dotfiles.write_config(
|
|
[
|
|
{"defaults": {"shell": {"stdout": True}}},
|
|
{"create": ["~/a"]},
|
|
{"shell": [{"command": "echo success"}]},
|
|
]
|
|
)
|
|
run_dotbot("--only", "shell")
|
|
|
|
assert not os.path.exists(os.path.join(home, "a"))
|
|
stdout = capfd.readouterr().out.splitlines()
|
|
assert any(line.startswith("success") for line in stdout)
|
|
|
|
|
|
def test_only_with_multiples(capfd, home, dotfiles, run_dotbot):
|
|
"""Verify that `--only` works as intended."""
|
|
|
|
dotfiles.write_config(
|
|
[
|
|
{"create": ["~/a"]},
|
|
{"shell": [{"command": "echo success", "stdout": True}]},
|
|
{"link": ["~/.f"]},
|
|
]
|
|
)
|
|
run_dotbot("--only", "create", "shell")
|
|
|
|
assert os.path.isdir(os.path.join(home, "a"))
|
|
stdout = capfd.readouterr().out.splitlines()
|
|
assert any(line.startswith("success") for line in stdout)
|
|
assert not os.path.exists(os.path.join(home, ".f"))
|
|
|
|
|
|
def test_plugin_loading_file(home, dotfiles, run_dotbot):
|
|
"""Verify that plugins can be loaded by file."""
|
|
|
|
plugin_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), "dotbot_plugin_file.py")
|
|
shutil.copy(plugin_file, os.path.join(dotfiles.directory, "file.py"))
|
|
dotfiles.write_config([{"plugin_file": "~"}])
|
|
run_dotbot("--plugin", os.path.join(dotfiles.directory, "file.py"))
|
|
|
|
with open(os.path.join(home, "flag"), "r") as file:
|
|
assert file.read() == "file plugin loading works"
|
|
|
|
|
|
def test_plugin_loading_directory(home, dotfiles, run_dotbot):
|
|
"""Verify that plugins can be loaded from a directory."""
|
|
|
|
dotfiles.makedirs("plugins")
|
|
plugin_file = os.path.join(
|
|
os.path.dirname(os.path.abspath(__file__)), "dotbot_plugin_directory.py"
|
|
)
|
|
shutil.copy(plugin_file, os.path.join(dotfiles.directory, "plugins", "directory.py"))
|
|
dotfiles.write_config([{"plugin_directory": "~"}])
|
|
run_dotbot("--plugin-dir", os.path.join(dotfiles.directory, "plugins"))
|
|
|
|
with open(os.path.join(home, "flag"), "r") as file:
|
|
assert file.read() == "directory plugin loading works"
|
|
|
|
|
|
def test_disable_builtin_plugins(home, dotfiles, run_dotbot):
|
|
"""Verify that builtin plugins can be disabled."""
|
|
|
|
dotfiles.write("f", "apple")
|
|
dotfiles.write_config([{"link": {"~/.f": "f"}}])
|
|
|
|
# The link directive will be unhandled so dotbot will raise SystemExit.
|
|
with pytest.raises(SystemExit):
|
|
run_dotbot("--disable-built-in-plugins")
|
|
|
|
assert not os.path.exists(os.path.join(home, ".f"))
|
|
|
|
|
|
def test_plugin_context_plugin(capfd, home, dotfiles, run_dotbot):
|
|
"""Verify that the plugin context is available to plugins."""
|
|
|
|
plugin_file = os.path.join(
|
|
os.path.dirname(os.path.abspath(__file__)), "dotbot_plugin_context_plugin.py"
|
|
)
|
|
shutil.copy(plugin_file, os.path.join(dotfiles.directory, "plugin.py"))
|
|
dotfiles.write_config([{"dispatch": [{"shell": [{"command": "echo apple", "stdout": True}]}]}])
|
|
run_dotbot("--plugin", os.path.join(dotfiles.directory, "plugin.py"))
|
|
|
|
stdout = capfd.readouterr().out.splitlines()
|
|
assert any(line.startswith("apple") for line in stdout)
|