scripts/dump_help.py (81 lines of code) (raw):

# -------------------------------------------------------------------------------------------- # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. See License.txt in the project root for license information. # -------------------------------------------------------------------------------------------- import argparse from io import StringIO from contextlib import redirect_stdout from az_invoker import AzCliCommandInvoker # Script parser and help example_text = """Examples: Dump `az iot hub message-endpoint create eventhub` python dump_help.py iot hub message-endpoint create eventhub Dump everything within `az iot hub message-endpoint create` (will include sub-commands, such as the one above) python dump_help.py iot hub message-endpoint create Dump everything within `az iot hub message-endpoint` (will include sub-group and sub-commands, such as the one above) python dump_help.py iot hub message-endpoint """ parser = argparse.ArgumentParser( description='Prints out the help for the method given and any child method. The contents will be saved in help.md.', epilog=example_text, formatter_class=argparse.RawDescriptionHelpFormatter ) parser.add_argument('commands', type=str, nargs='+', help='Command you want help to be printed out for.') args = parser.parse_args() def get_default_cli(**kwargs): from azure.cli.core import AzCli, MainCommandsLoader from azure.cli.core.azlogging import AzCliLogging from azure.cli.core.commands import AzCliCommandInvoker from azure.cli.core.parser import AzCliCommandParser from azure.cli.core._config import GLOBAL_CONFIG_DIR, ENV_VAR_PREFIX from azure.cli.core._help import AzCliHelp from azure.cli.core._output import AzOutputProducer commands_loader_cls = kwargs.get("commands_loader_cls", MainCommandsLoader) invocation_cls = kwargs.get("invocation_cls", AzCliCommandInvoker) parser_cls = kwargs.get("parser_cls", AzCliCommandParser) logging_cls = kwargs.get("logging_cls", AzCliLogging) output_cls = kwargs.get("output_cls", AzOutputProducer) help_cls = kwargs.get("help_cls", AzCliHelp) return AzCli(cli_name='az', config_dir=GLOBAL_CONFIG_DIR, config_env_var_prefix=ENV_VAR_PREFIX, commands_loader_cls=commands_loader_cls, invocation_cls=invocation_cls, parser_cls=parser_cls, logging_cls=logging_cls, output_cls=output_cls, help_cls=help_cls) if __name__ == "__main__": output_file = StringIO() cli = get_default_cli(invocation_cls=AzCliCommandInvoker) arguments = args.commands try: with redirect_stdout(output_file): cli.invoke(arguments, out_file=None) except BaseException: file_name = "help.md" help_contents = output_file.getvalue() # Remove special characters with preview commands help_contents = help_contents.replace("\x1b[36m", "") help_contents = help_contents.replace("\x1b[0m", "") help_contents = help_contents.split("\n") search_string = "To search AI knowledge base for examples" # Remove Search AI knowledge endings search_lines = [i for i in range(len(help_contents)) if help_contents[i].startswith(search_string)] while search_lines: line = search_lines.pop() # there may be extra spaces before the To search ... start = line - 1 if help_contents[line - 2] == "": start -= 1 # The command may cut into the next line end = line + 2 if help_contents[line + 1] != "": end += 1 help_contents = help_contents[:start] + help_contents[end:] # Remove extra lines around the ``` and make sure there is one line before the header (#) header_lines = [i for i in range(len(help_contents)) if help_contents[i].startswith("#")] while header_lines: line = header_lines.pop() help_contents = help_contents[:line + 2] + help_contents[line + 3:] # Remove deprecated deprecated_lines = [i for i in range(len(help_contents)) if "deprecated" in help_contents[i].lower()] while deprecated_lines: end = deprecated_lines.pop() + 1 start = deprecated_lines.pop() help_contents = help_contents[:start] + help_contents[end:] # Add disclaimer command = ' '.join(arguments) disclaimer = [ "# Disclaimer", "You can use `-h` with any command to view these help prompts.", f"For example, `az {command} -h` will retrieve all the help prompts for `az {command}`.", "" ] help_contents = disclaimer + help_contents # Add newlines back in help_contents = "\n".join(help_contents) print(f"Writing to {file_name}") with open(file_name, "w") as f: f.write(help_contents)