def get_all_help(cli_ctx, skip=True): invoker = cli_ctx.invocation help_ctx = cli_ctx.help_cls(cli_ctx) if not invoker: raise CLIError('CLI context does not contain invocation.') parser_keys = [] parser_values = [] sub_parser_keys = [] sub_parser_values = [] _store_parsers(invoker.parser, parser_keys, parser_values, sub_parser_keys, sub_parser_values) for cmd, parser in zip(parser_keys, parser_values): if cmd not in sub_parser_keys: sub_parser_keys.append(cmd) sub_parser_values.append(parser) help_files = [] help_errors = {} for cmd, parser in zip(sub_parser_keys, sub_parser_values): try: help_ctx.update_loaders_with_help_file_contents(cmd.split()) help_file = CliGroupHelpFile(help_ctx, cmd, parser) if _is_group(parser) \ else CliCommandHelpFile(help_ctx, cmd, parser) help_file.load(parser) help_files.append(help_file) except Exception as ex: # pylint: disable=broad-except if skip: logger.warning("Skipping '%s': %s", cmd, ex) else: help_errors[cmd] = "Error '{}': {}".format(cmd, ex) if help_errors: raise CLIError(help_errors) help_files = sorted(help_files, key=lambda x: x.command) return help_files
def get_all_help(cli_ctx): invoker = cli_ctx.invocation help_ctx = cli_ctx.help_cls(cli_ctx) if not invoker: raise CLIError('CLI context does not contain invocation.') parser_keys = [] parser_values = [] sub_parser_keys = [] sub_parser_values = [] _store_parsers(invoker.parser, parser_keys, parser_values, sub_parser_keys, sub_parser_values) for cmd, parser in zip(parser_keys, parser_values): if cmd not in sub_parser_keys: sub_parser_keys.append(cmd) sub_parser_values.append(parser) help_files = [] for cmd, parser in zip(sub_parser_keys, sub_parser_values): if cmd in loaded_helps: try: help_file = CliGroupHelpFile(help_ctx, cmd, parser) if _is_group(parser) \ else CliCommandHelpFile(help_ctx, cmd, parser) help_file.load(parser) help_files.append(help_file) except Exception as ex: # pylint: disable=broad-except print("Skipped '{}' due to '{}'".format(cmd, ex)) help_files = sorted(help_files, key=lambda x: x.command) assert {help_file.command for help_file in help_files} == set(loaded_helps.keys()) print("Loaded {} help files".format(len(help_files))) return help_files
def get_all_help(cli_ctx): invoker = cli_ctx.invocation help_ctx = cli_ctx.help_cls(cli_ctx) if not invoker: raise CLIError('CLI context does not contain invocation.') parser_keys = [] parser_values = [] sub_parser_keys = [] sub_parser_values = [] _store_parsers(invoker.parser, parser_keys, parser_values, sub_parser_keys, sub_parser_values) for cmd, parser in zip(parser_keys, parser_values): if cmd not in sub_parser_keys: sub_parser_keys.append(cmd) sub_parser_values.append(parser) help_files = [] for cmd, parser in zip(sub_parser_keys, sub_parser_values): try: help_ctx.update_loaders_with_help_file_contents(cmd.split()) help_file = CliGroupHelpFile(help_ctx, cmd, parser) if _is_group(parser) \ else CliCommandHelpFile(help_ctx, cmd, parser) help_file.load(parser) help_files.append(help_file) except Exception as ex: # pylint: disable=broad-except print("Skipped '{}' due to '{}'".format(cmd, ex)) help_files = sorted(help_files, key=lambda x: x.command) return help_files
def get_help_files(cli_ctx): invoker = cli_ctx.invocation_cls( cli_ctx=cli_ctx, commands_loader_cls=cli_ctx.commands_loader_cls, parser_cls=cli_ctx.parser_cls, help_cls=cli_ctx.help_cls) cli_ctx.invocation = invoker cmd_table = invoker.commands_loader.load_command_table(None) for command in cmd_table: invoker.commands_loader.load_arguments(command) invoker.parser.load_command_table(invoker.commands_loader.command_table) parser_keys = [] parser_values = [] sub_parser_keys = [] sub_parser_values = [] _store_parsers(invoker.parser, parser_keys, parser_values, sub_parser_keys, sub_parser_values) for cmd, parser in zip(parser_keys, parser_values): if cmd not in sub_parser_keys: sub_parser_keys.append(cmd) sub_parser_values.append(parser) help_files = [] for cmd, parser in zip(sub_parser_keys, sub_parser_values): try: help_file = GroupHelpFile( cmd, parser) if _is_group(parser) else CliCommandHelpFile( cmd, parser) help_file.load(parser) help_files.append(help_file) except Exception as ex: print("Skipped '{}' due to '{}'".format(cmd, ex)) help_files = sorted(help_files, key=lambda x: x.command) return help_files
def test_help_loads(self): from azure.cli.core.commands.arm import add_id_parameters import knack.events as events cli = TestCli() parser_dict = {} cli = TestCli() try: cli.invoke(['-h']) except SystemExit: pass cmd_tbl = cli.invocation.commands_loader.command_table cli.invocation.parser.load_command_table(cmd_tbl) for cmd in cmd_tbl: try: cmd_tbl[cmd].loader.command_name = cmd cmd_tbl[cmd].loader.load_arguments(cmd) except KeyError: pass cli.register_event(events.EVENT_INVOKER_CMD_TBL_LOADED, add_id_parameters) cli.raise_event(events.EVENT_INVOKER_CMD_TBL_LOADED, command_table=cmd_tbl) cli.invocation.parser.load_command_table(cmd_tbl) _store_parsers(cli.invocation.parser, parser_dict) for name, parser in parser_dict.items(): try: help_file = GroupHelpFile( name, parser) if _is_group(parser) else CliCommandHelpFile( name, parser) help_file.load(parser) except Exception as ex: raise HelpAuthoringException('{}, {}'.format(name, ex))
def test_help_loads(self): from azure.cli.core.commands.arm import register_global_subscription_argument, register_ids_argument import knack.events as events parser_dict = {} cli = DummyCli() help_ctx = cli.help_cls(cli) try: cli.invoke(['-h']) except SystemExit: pass cmd_tbl = cli.invocation.commands_loader.command_table cli.invocation.parser.load_command_table(cli.invocation.commands_loader) for cmd in cmd_tbl: try: cmd_tbl[cmd].loader.command_name = cmd cmd_tbl[cmd].loader.load_arguments(cmd) except KeyError: pass cli.register_event(events.EVENT_INVOKER_POST_CMD_TBL_CREATE, register_global_subscription_argument) cli.register_event(events.EVENT_INVOKER_POST_CMD_TBL_CREATE, register_ids_argument) cli.raise_event(events.EVENT_INVOKER_CMD_TBL_LOADED, command_table=cmd_tbl) cli.invocation.parser.load_command_table(cli.invocation.commands_loader) _store_parsers(cli.invocation.parser, parser_dict) # TODO: do we want to update this as it doesn't actually load all help. # We do have a CLI linter which does indeed load all help. for name, parser in parser_dict.items(): try: help_file = GroupHelpFile(help_ctx, name, parser) if _is_group(parser) \ else CliCommandHelpFile(help_ctx, name, parser) help_file.load(parser) except Exception as ex: raise HelpAuthoringException('{}, {}'.format(name, ex))
def get_extension_help_files(cli_ctx): invoker = cli_ctx.invocation_cls(cli_ctx=cli_ctx, commands_loader_cls=cli_ctx.commands_loader_cls, parser_cls=cli_ctx.parser_cls, help_cls=cli_ctx.help_cls) cli_ctx.invocation = invoker cmd_table = invoker.commands_loader.load_command_table(None) # Filter the command table to only get commands from extensions cmd_table = {k: v for k, v in cmd_table.items() if isinstance(v.command_source, ExtensionCommandSource)} invoker.commands_loader.command_table = cmd_table print('FOUND {} command(s) from the extension.'.format(len(cmd_table))) for cmd_name in cmd_table: invoker.commands_loader.load_arguments(cmd_name) invoker.parser.load_command_table(invoker.commands_loader.command_table) parser_keys = [] parser_values = [] sub_parser_keys = [] sub_parser_values = [] _store_parsers(invoker.parser, parser_keys, parser_values, sub_parser_keys, sub_parser_values) for cmd, parser in zip(parser_keys, parser_values): if cmd not in sub_parser_keys: sub_parser_keys.append(cmd) sub_parser_values.append(parser) help_files = [] for cmd, parser in zip(sub_parser_keys, sub_parser_values): try: help_file = GroupHelpFile(cmd, parser) if _is_group(parser) else CliCommandHelpFile(cmd, parser) help_file.load(parser) help_files.append(help_file) except Exception as ex: print("Skipped '{}' due to '{}'".format(cmd, ex)) help_files = sorted(help_files, key=lambda x: x.command) return help_files
def get_extension_help_files(cli_ctx): # 1. Create invoker and load command table and arguments. Remember to turn off applicability check. invoker = cli_ctx.invocation_cls( cli_ctx=cli_ctx, commands_loader_cls=cli_ctx.commands_loader_cls, parser_cls=cli_ctx.parser_cls, help_cls=cli_ctx.help_cls) cli_ctx.invocation = invoker invoker.commands_loader.skip_applicability = True cmd_table = invoker.commands_loader.load_command_table(None) # turn off applicability check for all loaders for loaders in invoker.commands_loader.cmd_to_loader_map.values(): for loader in loaders: loader.skip_applicability = True # filter the command table to only get commands from extensions cmd_table = { k: v for k, v in cmd_table.items() if isinstance(v.command_source, ExtensionCommandSource) } invoker.commands_loader.command_table = cmd_table print('FOUND {} command(s) from the extension.'.format(len(cmd_table))) for cmd_name in cmd_table: invoker.commands_loader.load_arguments(cmd_name) invoker.parser.load_command_table(invoker.commands_loader) # 2. Now load applicable help files parser_keys = [] parser_values = [] sub_parser_keys = [] sub_parser_values = [] _store_parsers(invoker.parser, parser_keys, parser_values, sub_parser_keys, sub_parser_values) for cmd, parser in zip(parser_keys, parser_values): if cmd not in sub_parser_keys: sub_parser_keys.append(cmd) sub_parser_values.append(parser) help_ctx = cli_ctx.help_cls(cli_ctx=cli_ctx) help_files = [] for cmd, parser in zip(sub_parser_keys, sub_parser_values): try: help_file = GroupHelpFile(help_ctx, cmd, parser) if _is_group(parser) \ else CliCommandHelpFile(help_ctx, cmd, parser) help_file.load(parser) help_files.append(help_file) except Exception as ex: print("Skipped '{}' due to '{}'".format(cmd, ex)) help_files = sorted(help_files, key=lambda x: x.command) return help_files