scripts/dump_command_table.py (109 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 import inspect import json import re import types import sys from azure.cli.core.application import APPLICATION, Application class Exporter(json.JSONEncoder): def default(self, o):#pylint: disable=method-hidden try: return super().default(o) except TypeError: return str(o) def _dump_command_table(**kwargs): cmd_table = APPLICATION.configuration.get_command_table() cmd_list = [] if cmd_set_names is None : # if no command prefix specified, use all command table entries cmd_list = list(cmd_table.keys()) else: # if the command name matches a prefix, add it to the output list for name in cmd_table.keys(): for prefix in cmd_set_names: if name.startswith(prefix): cmd_list.append(name) break filtered_cmd_list = [] param_dict = {k : [] for k in param_names} if param_names else {} if param_names: for cmd_name in cmd_list: table_entry = cmd_table[cmd_name] table_entry.arguments.update(table_entry.arguments_loader()) cmd_args = list(table_entry.arguments.keys()) for arg in cmd_args: if arg in param_names: param_dict[arg].append(cmd_name) if cmd_name not in filtered_cmd_list: filtered_cmd_list.append(cmd_name) else: filtered_cmd_list = cmd_list table_entries = [] for cmd_name in filtered_cmd_list: table_entry = cmd_table[cmd_name] table_entry.arguments.update(table_entry.arguments_loader()) table_entries.append(_format_entry(cmd_table[cmd_name])) # output results to STDOUT result_dict = {'commands': table_entries} print(json.dumps(result_dict, indent=2, sort_keys=True)) # display summary info with STDERR print('\n===RESULTS===', file=sys.stderr) print('{} commands dumped within {} scope with {} parameters'.format(len(table_entries), cmd_set_names or '*', param_names or 'ANY'), file=sys.stderr) for param, commands in param_dict.items(): print('\nPARAM: "{}" - {} commands - scope "{}" - {}'.format( param, len(commands), _get_parameter_scope(param, commands), commands), file=sys.stderr) sys.exit(0) def _format_entry(obj): if not obj: return obj elif isinstance(obj, tuple): return [_format_entry(x) for x in list(obj)] elif isinstance(obj, PRIMITIVES): return obj elif isinstance(obj, types.FunctionType): return 'function <{}>'.format(obj.__name__) elif callable(obj): return 'callable {}'.format(type(obj)) elif isinstance(obj, dict): new_dict = {key: _format_entry(obj[key]) for key in obj.keys() if key not in IGNORE_ARGS} _process_null_values(new_dict) return new_dict elif isinstance(obj, list): new_list = [_format_entry(x) for x in obj] return new_list else: new_dict = {key: _format_entry(value) for key, value in vars(obj).items() if key not in IGNORE_ARGS} _process_null_values(new_dict) return new_dict def _get_parameter_scope(param, cmd_list): if not cmd_list: return 'N/A (NOT FOUND)' test_list = cmd_list[0].split(' ') while len(test_list) > 0: test_entry = ' '.join(test_list) all_match = True for entry in cmd_list[1:]: if test_entry not in entry: all_match = False break if not all_match: test_list.pop() else: return test_entry return '_ROOT_' def _process_null_values(dict_): if hide_nulls: null_values = [x for x in dict_.keys() if dict_[x] is None] for key in null_values: dict_.pop(key) def _dashed_to_camel(string): return string.replace('-', '_') parser = argparse.ArgumentParser(description='Command Table Parser') parser.add_argument('--commands', metavar='N', nargs='+', help='Filter by first level command (OR)') parser.add_argument('--params', metavar='N', nargs='+', help='Filter by parameters (OR)') parser.add_argument('--hide-nulls', action='store_true', default=False, help='Show null entries') args = parser.parse_args() cmd_set_names = args.commands param_names = [_dashed_to_camel(x) for x in args.params or []] hide_nulls = args.hide_nulls PRIMITIVES = (str, int, bool, float) IGNORE_ARGS = ['help', 'help_file', 'base_type', 'arguments_loader'] APPLICATION.register(Application.COMMAND_PARSER_LOADED, _dump_command_table) APPLICATION.execute([])