forked from Azure/azure-cli
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdump_command_table.py
135 lines (116 loc) · 4.8 KB
/
dump_command_table.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#---------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
#---------------------------------------------------------------------------------------------
from __future__ import print_function
import argparse
import inspect
import json
import re
import types
import sys
from azure.cli.application import Application, Configuration
class Exporter(json.JSONEncoder):
def default(self, o):#pylint: disable=method-hidden
try:
return super(Exporter, self).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:
cmd_args = list(cmd_table[cmd_name].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_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']
APPLICATION = Application(Configuration([]))
APPLICATION.register(Application.COMMAND_TABLE_LOADED, _dump_command_table)
APPLICATION.execute([''])