From 466ddec0e4b7e3496d4e8c779986263a7943fa1c Mon Sep 17 00:00:00 2001 From: Emad Rad Date: Mon, 6 Nov 2023 20:05:01 +0330 Subject: [PATCH] fix: save configs by enable/disable plugins. before this, after enabling/disabling any plugins we should re-generate all files with tutor config save. --- ...231011_000434_codewithemad_save_configs.md | 1 + tests/commands/test_plugins.py | 10 ++++++ tutor/commands/plugins.py | 34 +++++++++++-------- 3 files changed, 30 insertions(+), 15 deletions(-) create mode 100644 changelog.d/20231011_000434_codewithemad_save_configs.md diff --git a/changelog.d/20231011_000434_codewithemad_save_configs.md b/changelog.d/20231011_000434_codewithemad_save_configs.md new file mode 100644 index 00000000000..0afbad42ead --- /dev/null +++ b/changelog.d/20231011_000434_codewithemad_save_configs.md @@ -0,0 +1 @@ +- [Improvement] You don't have to run `tutor config save` every time you enable or disable a plugin anymore. (by @CodeWithEmad) \ No newline at end of file diff --git a/tests/commands/test_plugins.py b/tests/commands/test_plugins.py index bcec79b8fe1..777261c9b81 100644 --- a/tests/commands/test_plugins.py +++ b/tests/commands/test_plugins.py @@ -42,6 +42,16 @@ def test_plugins_disable_not_installed_plugin(self) -> None: self.assertEqual(0, result.exit_code) self.assertFalse(result.exception) + def test_plugins_enable_with_no_plugin_passed(self) -> None: + result = self.invoke(["plugins", "enable"]) + self.assertEqual(1, result.exit_code) + self.assertTrue(result.exception) + + def test_plugins_disable_with_no_plugin_passed(self) -> None: + result = self.invoke(["plugins", "disable"]) + self.assertEqual(1, result.exit_code) + self.assertTrue(result.exception) + @patch.object( plugins, "iter_info", diff --git a/tutor/commands/plugins.py b/tutor/commands/plugins.py index e80b6fc33eb..f23a80e3c2c 100644 --- a/tutor/commands/plugins.py +++ b/tutor/commands/plugins.py @@ -1,6 +1,7 @@ from __future__ import annotations import os +import sys import tempfile import typing as t @@ -9,6 +10,7 @@ from tutor import config as tutor_config from tutor import exceptions, fmt, hooks, plugins, utils +from tutor.commands.config import save as config_save_command from tutor.plugins import indexes from tutor.plugins.base import PLUGINS_ROOT, PLUGINS_ROOT_ENV_VAR_NAME from tutor.types import Config @@ -133,17 +135,18 @@ def list_command(show_enabled_only: bool) -> None: @click.command(help="Enable a plugin") @click.argument("plugin_names", metavar="plugin", nargs=-1, type=PluginName()) -@click.pass_obj -def enable(context: Context, plugin_names: list[str]) -> None: - config = tutor_config.load_minimal(context.root) +@click.pass_context +def enable(context: click.Context, plugin_names: list[str]) -> None: + if not plugin_names: + fmt.echo_error("No plugin names provided.") + sys.exit(1) + config = tutor_config.load_minimal(context.obj.root) for plugin in plugin_names: plugins.load(plugin) fmt.echo_info(f"Plugin {plugin} enabled") tutor_config.save_enabled_plugins(config) - tutor_config.save_config_file(context.root, config) - fmt.echo_info( - "You should now re-generate your environment with `tutor config save`." - ) + tutor_config.save_config_file(context.obj.root, config) + context.invoke(config_save_command, env_only=True) @click.command( @@ -153,22 +156,23 @@ def enable(context: Context, plugin_names: list[str]) -> None: @click.argument( "plugin_names", metavar="plugin", nargs=-1, type=PluginName(allow_all=True) ) -@click.pass_obj -def disable(context: Context, plugin_names: list[str]) -> None: - config = tutor_config.load_minimal(context.root) +@click.pass_context +def disable(context: click.Context, plugin_names: list[str]) -> None: + if not plugin_names: + fmt.echo_error("No plugin names provided.") + sys.exit(1) + config = tutor_config.load_minimal(context.obj.root) disable_all = "all" in plugin_names disabled: list[str] = [] for plugin in tutor_config.get_enabled_plugins(config): if disable_all or plugin in plugin_names: fmt.echo_info(f"Disabling plugin {plugin}...") - hooks.Actions.PLUGIN_UNLOADED.do(plugin, context.root, config) + hooks.Actions.PLUGIN_UNLOADED.do(plugin, context.obj.root, config) disabled.append(plugin) fmt.echo_info(f"Plugin {plugin} disabled") if disabled: - tutor_config.save_config_file(context.root, config) - fmt.echo_info( - "You should now re-generate your environment with `tutor config save`." - ) + tutor_config.save_config_file(context.obj.root, config) + context.invoke(config_save_command, env_only=True) @click.command(name="update")