Skip to content

Commit

Permalink
Custom Argument Groups (#711)
Browse files Browse the repository at this point in the history
* Simple implementation of custom argument groups.

* Simplify group naming.
  • Loading branch information
tjprescott authored Aug 17, 2016
1 parent 05ed581 commit 313df3c
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 16 deletions.
2 changes: 1 addition & 1 deletion src/azure/cli/commands/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def update(self, other=None, **kwargs):

class CliCommandArgument(object):

_NAMED_ARGUMENTS = ('options_list', 'validator', 'completer', 'id_part')
_NAMED_ARGUMENTS = ('options_list', 'validator', 'completer', 'id_part', 'arg_group')

def __init__(self, dest=None, argtype=None, **kwargs):
self.type = CliArgumentType(overrides=argtype, **kwargs)
Expand Down
16 changes: 12 additions & 4 deletions src/azure/cli/commands/arm.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,14 +138,20 @@ def required_values_validator(namespace):
missing_required = ' '.join((arg.options_list[0] for arg in errors))
raise CLIError('({} | {}) are required'.format(missing_required, '--ids'))

group_name = 'Resource Id'
for key, arg in command.arguments.items():
if command.arguments[key].id_part:
command.arguments[key].arg_group = group_name

command.add_argument(argparse.SUPPRESS,
'--ids',
metavar='RESOURCE_ID',
help='ID of resource',
action=split_action(command.arguments),
nargs='+',
type=ResourceId,
validator=required_values_validator)
validator=required_values_validator,
arg_group=group_name)

for command in command_table.values():
command_loaded_handler(command)
Expand Down Expand Up @@ -221,17 +227,19 @@ def __call__(self, parser, namespace, values, option_string=None):
cmd.arguments.update(set_arguments)
cmd.arguments.update(get_arguments)
cmd.arguments.pop(setter_arg_name, None)
group_name = 'Generic Update'
cmd.add_argument('properties_to_set', '--set', nargs='+', action=OrderedArgsAction, default=[],
help='Update an object by specifying a property path and value to set.'
' Example: --set property1.property2=value',
metavar='KEY=VALUE')
metavar='KEY=VALUE', arg_group=group_name)
cmd.add_argument('properties_to_add', '--add', nargs='+', action=OrderedArgsAction, default=[],
help='Add an object to a list of objects by specifying a path and key'
' value pairs. Example: --add property.list key=<value>',
metavar='LIST KEY=VALUE')
metavar='LIST KEY=VALUE', arg_group=group_name)
cmd.add_argument('properties_to_remove', '--remove', nargs='+', action=OrderedArgsAction,
default=[], help='Remove a property or an element from a list. Example: '
'--remove property.list <index>', metavar='LIST INDEX')
'--remove property.list <index>', metavar='LIST INDEX',
arg_group=group_name)
main_command_table[name] = cmd

index_regex = re.compile(r'\[(.*)\]')
Expand Down
22 changes: 17 additions & 5 deletions src/azure/cli/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
#---------------------------------------------------------------------------------------------

import argparse

import argcomplete

import azure.cli._help as _help
from azure.cli._util import CLIError

Expand Down Expand Up @@ -62,11 +64,23 @@ def load_command_table(self, command_table):
help_file=metadata.help)

argument_validators = []
argument_groups = {}
for arg in metadata.arguments.values():
if arg.validator:
argument_validators.append(arg.validator)
param = command_parser.add_argument(
*arg.options_list, **arg.options)
if arg.arg_group:
try:
group = argument_groups[arg.arg_group]
except KeyError:
# group not found so create
group_name = '{} Arguments'.format(arg.arg_group)
group = command_parser.add_argument_group(arg.arg_group, group_name)
argument_groups[arg.arg_group] = group
param = group.add_argument(
*arg.options_list, **arg.options)
else:
param = command_parser.add_argument(
*arg.options_list, **arg.options)
param.completer = arg.completer

command_parser.set_defaults(func=metadata.handler,
Expand Down Expand Up @@ -103,9 +117,7 @@ def _get_subparser(self, path):
def format_help(self):
is_group = self.is_group()
_help.show_help(self.prog.split()[1:],
(self._actions[-1]
if is_group
else self),
self._actions[-1] if is_group else self,
is_group)
self.exit()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,21 @@ def cli_storage_data_plane_command(name, operation, client_factory,
command = create_command(name, operation, transform, simple_output_query, client_factory)

# add parameters required to create a storage client
command.add_argument('account_name', '--account-name', required=False, default=None)
command.add_argument('account_key', '--account-key', required=False, default=None)
command.add_argument('connection_string', '--connection-string', required=False,
default=None, validator=validate_client_parameters)
command.add_argument('sas_token', '--sas-token', required=False, default=None)

group_name = 'Storage Account'
command.add_argument('account_name', '--account-name', required=False, default=None,
arg_group=group_name,
help='Storage account name. Must be used in conjunction with either '
'storage account key or a SAS token. Var: AZURE_STORAGE_ACCOUNT')
command.add_argument('account_key', '--account-key', required=False, default=None,
arg_group=group_name,
help='Storage account key. Must be used in conjunction with storage '
'account name. Var: AZURE_STORAGE_KEY')
command.add_argument('connection_string', '--connection-string', required=False, default=None,
validator=validate_client_parameters, arg_group=group_name,
help='Storage account connection string. Var: '
'AZURE_STORAGE_CONNECTION_STRING')
command.add_argument('sas_token', '--sas-token', required=False, default=None,
arg_group=group_name,
help='A Shared Access Signature (SAS). Must be used in conjunction with '
'storage account name. Var: AZURE_SAS_TOKEN')
command_table[command.name] = command

0 comments on commit 313df3c

Please sign in to comment.