From dd8f891095761b48337166dcd595708035e328f9 Mon Sep 17 00:00:00 2001 From: Jordan Mance Date: Sun, 19 Sep 2021 13:55:42 -0400 Subject: [PATCH] Adding new maintenance command type to address bootstrap issues with help commands --- src/figcli/commands/command_factory.py | 10 ++++++- src/figcli/commands/help/upgrade.py | 17 +++++------ src/figcli/commands/help/version.py | 10 +++---- src/figcli/commands/help_factory.py | 12 ++------ src/figcli/commands/maintenance/__init__.py | 0 src/figcli/commands/maintenance_context.py | 22 ++++++++++++++ src/figcli/commands/maintenance_factory.py | 32 +++++++++++++++++++++ src/figcli/commands/types/command.py | 3 +- src/figcli/commands/types/maintenance.py | 13 +++++++++ src/figcli/config/commands.py | 3 +- 10 files changed, 96 insertions(+), 26 deletions(-) create mode 100644 src/figcli/commands/maintenance/__init__.py create mode 100644 src/figcli/commands/maintenance_context.py create mode 100644 src/figcli/commands/maintenance_factory.py create mode 100644 src/figcli/commands/types/maintenance.py diff --git a/src/figcli/commands/command_factory.py b/src/figcli/commands/command_factory.py index 42278a9..7795c5e 100644 --- a/src/figcli/commands/command_factory.py +++ b/src/figcli/commands/command_factory.py @@ -14,6 +14,8 @@ from figcli.commands.iam_context import IAMContext from figcli.commands.iam_factory import IAMFactory from figcli.commands.factory import Factory +from figcli.commands.maintenance_context import MaintenanceContext +from figcli.commands.maintenance_factory import MaintenanceFactory from figcli.commands.ots_context import OTSContext from figcli.commands.ots_factory import OTSFactory from figcli.commands.ui_factory import UIFactory @@ -260,7 +262,13 @@ def instance(self): optional_args = self._context.find_matching_optional_arguments(help_commands) context = HelpContext(self._context.resource, self._context.command, optional_args, self._context.run_env, defaults=self._cli_defaults, role=self._context.role) - factory = HelpFactory(self._context.command, context, self._context, self.__config_service()) + factory = HelpFactory(self._context.command, context, self._context) + + elif self._context.find_matching_optional_arguments(maintenance_commands) or self._context.resource in maintenance_commands: + optional_args = self._context.find_matching_optional_arguments(maintenance_commands) + context = MaintenanceContext(self._context.resource, self._context.command, optional_args, self._context.run_env, + defaults=self._cli_defaults, role=self._context.role) + factory = MaintenanceFactory(self._context.command, context, self._context, self.__config_service()) elif self._context.command in ui_commands or self._context.resource == ui: context = CommandContext(self._context.run_env, self._context.command, defaults=self._cli_defaults) diff --git a/src/figcli/commands/help/upgrade.py b/src/figcli/commands/help/upgrade.py index b00dcd7..f750b13 100644 --- a/src/figcli/commands/help/upgrade.py +++ b/src/figcli/commands/help/upgrade.py @@ -1,6 +1,7 @@ import sys -from figcli.commands.help_context import HelpContext -from figcli.commands.types.help import HelpCommand + +from figcli.commands.maintenance_context import MaintenanceContext +from figcli.commands.types.maintenance import MaintenanceCommand from figcli.config import * from figcli.io.input import Input from figcli.io.output import Output @@ -11,17 +12,17 @@ from figcli.utils.utils import Utils -class Upgrade(HelpCommand): +class Upgrade(MaintenanceCommand): """ Drives the --version command """ - def __init__(self, help_context: HelpContext, config_service: ConfigService): - super().__init__(version, help_context.defaults.colors_enabled, help_context) + def __init__(self, maintenance_context: MaintenanceContext, config_service: ConfigService): + super().__init__(version, maintenance_context.defaults.colors_enabled, maintenance_context) self.tracker = VersionTracker(self.context.defaults, config_service) - self.upgrade_mgr = UpgradeManager(help_context.defaults.colors_enabled) - self._utils = Utils(colors_enabled=help_context.defaults.colors_enabled) - self._out = Output(colors_enabled=help_context.defaults.colors_enabled) + self.upgrade_mgr = UpgradeManager(maintenance_context.defaults.colors_enabled) + self._utils = Utils(colors_enabled=maintenance_context.defaults.colors_enabled) + self._out = Output(colors_enabled=maintenance_context.defaults.colors_enabled) def upgrade(self): latest_version: FiggyVersionDetails = self.tracker.get_version() diff --git a/src/figcli/commands/help/version.py b/src/figcli/commands/help/version.py index 06be170..579663b 100644 --- a/src/figcli/commands/help/version.py +++ b/src/figcli/commands/help/version.py @@ -1,18 +1,18 @@ -from figcli.commands.help_context import HelpContext -from figcli.commands.types.help import HelpCommand +from figcli.commands.maintenance_context import MaintenanceContext +from figcli.commands.types.maintenance import MaintenanceCommand from figcli.config import * from figcli.svcs.config import ConfigService from figcli.svcs.observability.anonymous_usage_tracker import AnonymousUsageTracker from figcli.svcs.observability.version_tracker import VersionTracker -class Version(HelpCommand): +class Version(MaintenanceCommand): """ Drives the --version command """ - def __init__(self, help_context: HelpContext, config_service: ConfigService): - super().__init__(version, help_context.defaults.colors_enabled, help_context) + def __init__(self, maint_context: MaintenanceContext, config_service: ConfigService): + super().__init__(version, maint_context.defaults.colors_enabled, maint_context) self.tracker = VersionTracker(self.context.defaults, config_service) def version(self): diff --git a/src/figcli/commands/help_factory.py b/src/figcli/commands/help_factory.py index 25cada6..c704ccd 100644 --- a/src/figcli/commands/help_factory.py +++ b/src/figcli/commands/help_factory.py @@ -1,25 +1,21 @@ from figcli.commands.factory import Factory from figcli.commands.figgy_context import FiggyContext +from figcli.commands.help.configure import Configure from figcli.commands.help.login import Login -from figcli.commands.help.upgrade import Upgrade -from figcli.commands.help.version import Version from figcli.commands.help_context import HelpContext -from figcli.commands.help.configure import Configure from figcli.config import * -from figcli.svcs.config import ConfigService from figcli.svcs.setup import FiggySetup from figcli.utils.utils import Utils, CollectionUtils class HelpFactory(Factory): - def __init__(self, command: CliCommand, context: HelpContext, figgy_context: FiggyContext, config: ConfigService): + def __init__(self, command: CliCommand, context: HelpContext, figgy_context: FiggyContext): self._command = command self._context = context self._figgy_context = figgy_context self._options = context.options self._utils = Utils(False) self._setup: FiggySetup = FiggySetup(self._figgy_context) - self._config: ConfigService = config def instance(self): return self.get(self._command) @@ -27,12 +23,8 @@ def instance(self): def get(self, command: CliCommand): if configure in self._options: return Configure(self._context, self._setup) - elif version in self._options: - return Version(self._context, self._config) elif command == login or command == sandbox: return Login(self._context, self._setup, self._figgy_context) - elif upgrade in self._options: - return Upgrade(self._context, self._config) else: self._utils.error_exit(f"{command.name} is not a valid command. You must select from: " f"[{CollectionUtils.printable_set(help_commands)}]. Try using --help for more info.") diff --git a/src/figcli/commands/maintenance/__init__.py b/src/figcli/commands/maintenance/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/figcli/commands/maintenance_context.py b/src/figcli/commands/maintenance_context.py new file mode 100644 index 0000000..29cc468 --- /dev/null +++ b/src/figcli/commands/maintenance_context.py @@ -0,0 +1,22 @@ +from typing import Optional, List, Set + +from figcli.commands.command_context import CommandContext +from figcli.models.defaults.defaults import CLIDefaults, CliCommand +from figcli.models.role import Role +from figgy.models.run_env import RunEnv + + +class MaintenanceContext(CommandContext): + """ + Contextual information for HelpCommands, including _what_ command resources were passed in. Help commands + often don't have standard "resource" or "command" blocks, instead they may ONLY have --optional parameters + """ + def __init__(self, resource: Optional[CliCommand], command: Optional[CliCommand], + options: Optional[Set[CliCommand]], run_env: Optional[RunEnv], defaults: Optional[CLIDefaults], + role: Optional[Role]): + super().__init__(run_env, resource, defaults=defaults) + + self.resource = resource + self.command = command + self.options = options + self.role = role diff --git a/src/figcli/commands/maintenance_factory.py b/src/figcli/commands/maintenance_factory.py new file mode 100644 index 0000000..f817ddf --- /dev/null +++ b/src/figcli/commands/maintenance_factory.py @@ -0,0 +1,32 @@ +from figcli.commands.factory import Factory +from figcli.commands.figgy_context import FiggyContext +from figcli.commands.help.upgrade import Upgrade +from figcli.commands.help.version import Version +from figcli.commands.maintenance_context import MaintenanceContext +from figcli.config import * +from figcli.svcs.config import ConfigService +from figcli.svcs.setup import FiggySetup +from figcli.utils.utils import Utils, CollectionUtils + + +class MaintenanceFactory(Factory): + def __init__(self, command: CliCommand, context: MaintenanceContext, figgy_context: FiggyContext, config: ConfigService): + self._command = command + self._context = context + self._figgy_context = figgy_context + self._options = context.options + self._utils = Utils(False) + self._setup: FiggySetup = FiggySetup(self._figgy_context) + self._config: ConfigService = config + + def instance(self): + return self.get(self._command) + + def get(self, command: CliCommand): + if version in self._options: + return Version(self._context, self._config) + elif upgrade in self._options: + return Upgrade(self._context, self._config) + else: + self._utils.error_exit(f"{command.name} is not a valid command. You must select from: " + f"[{CollectionUtils.printable_set(help_commands)}]. Try using --help for more info.") diff --git a/src/figcli/commands/types/command.py b/src/figcli/commands/types/command.py index 5b4a9c3..57dada6 100644 --- a/src/figcli/commands/types/command.py +++ b/src/figcli/commands/types/command.py @@ -2,6 +2,7 @@ from figcli.commands.config_context import ConfigContext from figcli.commands.help_context import HelpContext +from figcli.commands.maintenance_context import MaintenanceContext from figcli.commands.ots_context import OTSContext from figcli.config import * from figcli.config.style.terminal_factory import TerminalFactory @@ -16,7 +17,7 @@ class Command(ABC): """ def __init__(self, command_type: CliCommand, colors_enabled: bool, - context: Union[CommandContext, HelpContext, ConfigContext, OTSContext]): + context: Union[CommandContext, HelpContext, ConfigContext, OTSContext, MaintenanceContext]): self.type = command_type self.run_env = context.run_env self.c = TerminalFactory(colors_enabled).instance().get_colors() diff --git a/src/figcli/commands/types/maintenance.py b/src/figcli/commands/types/maintenance.py new file mode 100644 index 0000000..ac17c79 --- /dev/null +++ b/src/figcli/commands/types/maintenance.py @@ -0,0 +1,13 @@ +from abc import ABC + +from figcli.commands.maintenance_context import MaintenanceContext +from figcli.commands.types.command import Command + + +class MaintenanceCommand(Command, ABC): + """ + Help command class to support some commands that may not have a resource or specific command selected + """ + + def __init__(self, command_type: frozenset, colors_enabled: bool, context: MaintenanceContext): + super().__init__(command_type, colors_enabled, context) diff --git a/src/figcli/config/commands.py b/src/figcli/config/commands.py index 201d10a..3b77d54 100644 --- a/src/figcli/config/commands.py +++ b/src/figcli/config/commands.py @@ -286,7 +286,8 @@ config_commands = [sync, put, edit, delete, prune, get, share, generate, list_com, browse, audit, dump, restore, promote, validate, build_cache] iam_commands = [export, iam_restore] -help_commands = [configure, version, login, sandbox, upgrade, role] +help_commands = [configure, login, sandbox, role] +maintenance_commands = [version, upgrade] login_commands = [login, sandbox] ui_commands = [ui] ots_commands = [ots_get, ots_put]