diff options
| author | Cyril Roelandt <cyril.roelandt@enovance.com> | 2013-09-25 12:49:58 +0000 |
|---|---|---|
| committer | Cyril Roelandt <cyril.roelandt@enovance.com> | 2013-09-25 15:24:47 +0000 |
| commit | b961738765976e77711d909eec1ecc402fa8a484 (patch) | |
| tree | f9ec8353bcd89c9a0524aa2d0971215af8b314a6 /ceilometerclient | |
| parent | ce01f564651bee07f91be8dc7f6dfca561216625 (diff) | |
| download | python-ceilometerclient-b961738765976e77711d909eec1ecc402fa8a484.tar.gz | |
Help messages: specify which options are required
Closes-Bug: #1223283
Change-Id: I080fa73bd45a1f9f442dbcdfa65fdc24e30521da
Diffstat (limited to 'ceilometerclient')
| -rw-r--r-- | ceilometerclient/common/utils.py | 7 | ||||
| -rw-r--r-- | ceilometerclient/tests/test_utils.py | 19 | ||||
| -rw-r--r-- | ceilometerclient/v2/shell.py | 26 |
3 files changed, 34 insertions, 18 deletions
diff --git a/ceilometerclient/common/utils.py b/ceilometerclient/common/utils.py index eac860f..ef76dcc 100644 --- a/ceilometerclient/common/utils.py +++ b/ceilometerclient/common/utils.py @@ -27,6 +27,13 @@ from ceilometerclient.openstack.common import importutils # Decorator for cli-args def arg(*args, **kwargs): def _decorator(func): + if 'help' in kwargs: + if 'default' in kwargs: + kwargs['help'] += " Defaults to %s." % kwargs['default'] + required = kwargs.get('required', False) + if required: + kwargs['help'] += " Required." + # Because of the sematics of decorator composition if we just append # to the options list positional options will appear to be backwards. func.__dict__.setdefault('arguments', []).insert(0, (args, kwargs)) diff --git a/ceilometerclient/tests/test_utils.py b/ceilometerclient/tests/test_utils.py index c002dc6..0e209b0 100644 --- a/ceilometerclient/tests/test_utils.py +++ b/ceilometerclient/tests/test_utils.py @@ -74,3 +74,22 @@ class UtilsTest(test_utils.BaseTestCase): 'statictic': 'avg', 'comparison_operator': 'or'}, }) + + def test_arg(self): + @utils.arg(help="not_required_no_default.") + def not_required_no_default(): + pass + _, args = not_required_no_default.__dict__['arguments'][0] + self.assertEqual(args['help'], "not_required_no_default.") + + @utils.arg(required=True, help="required_no_default.") + def required_no_default(): + pass + _, args = required_no_default.__dict__['arguments'][0] + self.assertEqual(args['help'], "required_no_default. Required.") + + @utils.arg(default=42, help="not_required_default.") + def not_required_default(): + pass + _, args = not_required_default.__dict__['arguments'][0] + self.assertEqual(args['help'], "not_required_default. Defaults to 42.") diff --git a/ceilometerclient/v2/shell.py b/ceilometerclient/v2/shell.py index 8423bd4..bcd5657 100644 --- a/ceilometerclient/v2/shell.py +++ b/ceilometerclient/v2/shell.py @@ -35,7 +35,7 @@ OPERATORS_STRING = dict(gt='>', ge='>=', @utils.arg('-q', '--query', metavar='<QUERY>', help='key[op]value; list.') -@utils.arg('-m', '--meter', metavar='<NAME>', +@utils.arg('-m', '--meter', metavar='<NAME>', required=True, help='Name of meter to show samples for.') @utils.arg('-p', '--period', metavar='<PERIOD>', help='Period in seconds over which to group samples.') @@ -44,8 +44,6 @@ def do_statistics(cc, args): fields = {'meter_name': args.meter, 'q': options.cli_to_array(args.query), 'period': args.period} - if args.meter is None: - raise exc.CommandError('Meter name not provided (-m <meter name>)') try: statistics = cc.statistics.list(**fields) except exc.HTTPNotFound: @@ -62,14 +60,12 @@ def do_statistics(cc, args): @utils.arg('-q', '--query', metavar='<QUERY>', help='key[op]value; list.') -@utils.arg('-m', '--meter', metavar='<NAME>', +@utils.arg('-m', '--meter', metavar='<NAME>', required=True, help='Name of meter to show samples for.') def do_sample_list(cc, args): '''List the samples for this meters.''' fields = {'meter_name': args.meter, 'q': options.cli_to_array(args.query)} - if args.meter is None: - raise exc.CommandError('Meter name not provided (-m <meter name>)') try: samples = cc.samples.list(**fields) except exc.HTTPNotFound: @@ -89,15 +85,15 @@ def do_sample_list(cc, args): @utils.arg('--user-id', metavar='<USER_ID>', help='User to associate with sample ' '(only settable by admin users)') -@utils.arg('-r', '--resource-id', metavar='<RESOURCE_ID>', +@utils.arg('-r', '--resource-id', metavar='<RESOURCE_ID>', required=True, help='ID of the resource.') @utils.arg('-m', '--meter-name', metavar='<METER_NAME>', help='the meter name') -@utils.arg('--meter-type', metavar='<METER_TYPE>', +@utils.arg('--meter-type', metavar='<METER_TYPE>', required=True, help='the meter type') -@utils.arg('--meter-unit', metavar='<METER_UNIT>', +@utils.arg('--meter-unit', metavar='<METER_UNIT>', required=True, help='the meter unit') -@utils.arg('--sample-volume', metavar='<SAMPLE_VOLUME>', +@utils.arg('--sample-volume', metavar='<SAMPLE_VOLUME>', required=True, help='The sample volume') @utils.arg('--resource-metadata', metavar='<RESOURCE_METADATA>', help='resource metadata') @@ -188,12 +184,10 @@ def _display_alarm(alarm): utils.print_dict(data, wrap=72) -@utils.arg('-a', '--alarm_id', metavar='<ALARM_ID>', +@utils.arg('-a', '--alarm_id', metavar='<ALARM_ID>', required=True, help='ID of the alarm to show.') def do_alarm_show(cc, args={}): '''Show an alarm.''' - if args.alarm_id is None: - raise exc.CommandError('Alarm ID not provided (-a <alarm id>)') try: alarm = cc.alarms.get(args.alarm_id) except exc.HTTPNotFound: @@ -416,8 +410,6 @@ def do_alarm_combination_update(cc, args={}): help='ID of the alarm to delete.') def do_alarm_delete(cc, args={}): '''Delete an alarm.''' - if args.alarm_id is None: - raise exc.CommandError('Alarm ID not provided (-a <alarm id>)') try: cc.alarms.delete(args.alarm_id) except exc.HTTPNotFound: @@ -462,12 +454,10 @@ def do_resource_list(cc, args={}): sortby=1) -@utils.arg('-r', '--resource_id', metavar='<RESOURCE_ID>', +@utils.arg('-r', '--resource_id', metavar='<RESOURCE_ID>', required=True, help='ID of the resource to show.') def do_resource_show(cc, args={}): '''Show the resource.''' - if args.resource_id is None: - raise exc.CommandError('Resource id not provided (-r <resource id>)') try: resource = cc.resources.get(args.resource_id) except exc.HTTPNotFound: |
