Skip to content

Commit

Permalink
Adding new maintenance command type to address bootstrap issues with …
Browse files Browse the repository at this point in the history
…help commands
  • Loading branch information
Jordan Mance committed Sep 19, 2021
1 parent f2b26ce commit dd8f891
Show file tree
Hide file tree
Showing 10 changed files with 96 additions and 26 deletions.
10 changes: 9 additions & 1 deletion src/figcli/commands/command_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
17 changes: 9 additions & 8 deletions src/figcli/commands/help/upgrade.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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()
Expand Down
10 changes: 5 additions & 5 deletions src/figcli/commands/help/version.py
Original file line number Diff line number Diff line change
@@ -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):
Expand Down
12 changes: 2 additions & 10 deletions src/figcli/commands/help_factory.py
Original file line number Diff line number Diff line change
@@ -1,38 +1,30 @@
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)

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.")
Empty file.
22 changes: 22 additions & 0 deletions src/figcli/commands/maintenance_context.py
Original file line number Diff line number Diff line change
@@ -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
32 changes: 32 additions & 0 deletions src/figcli/commands/maintenance_factory.py
Original file line number Diff line number Diff line change
@@ -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.")
3 changes: 2 additions & 1 deletion src/figcli/commands/types/command.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()
Expand Down
13 changes: 13 additions & 0 deletions src/figcli/commands/types/maintenance.py
Original file line number Diff line number Diff line change
@@ -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)
3 changes: 2 additions & 1 deletion src/figcli/config/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down

0 comments on commit dd8f891

Please sign in to comment.