diff options
author | Jenkins <jenkins@review.openstack.org> | 2013-05-22 08:42:12 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2013-05-22 08:42:12 +0000 |
commit | ea4a642587c12852777d5af05e23fa6c0de51f16 (patch) | |
tree | 6b6198d56034845c7f330cb16e1d6e92c7933455 | |
parent | 46382e32469f58f6b40fd986a665e75b076b068d (diff) | |
parent | e1f884174eb65895ade604933b25ed245fb45942 (diff) | |
download | oslo-config-ea4a642587c12852777d5af05e23fa6c0de51f16.tar.gz |
Merge "Allow Multiple sets of deprecated name/group for options"1.2.0a1
-rw-r--r-- | oslo/config/cfg.py | 75 | ||||
-rw-r--r-- | tests/test_cfg.py | 44 |
2 files changed, 100 insertions, 19 deletions
diff --git a/oslo/config/cfg.py b/oslo/config/cfg.py index 0fd6023..71702f3 100644 --- a/oslo/config/cfg.py +++ b/oslo/config/cfg.py @@ -524,7 +524,8 @@ class Opt(object): def __init__(self, name, dest=None, short=None, default=None, positional=False, metavar=None, help=None, secret=False, required=False, - deprecated_name=None, deprecated_group=None): + deprecated_name=None, deprecated_group=None, + deprecated_opts=None): """Construct an Opt object. The only required parameter is the option's name. However, it is @@ -541,6 +542,7 @@ class Opt(object): :param required: true iff a value must be supplied for this option :param deprecated_name: deprecated name option. Acts like an alias :param deprecated_group: the group containing a deprecated alias + :param deprecated_opts: array of DeprecatedOpt(s) """ self.name = name if dest is None: @@ -555,10 +557,11 @@ class Opt(object): self.secret = secret self.required = required if deprecated_name is not None: - self.deprecated_name = deprecated_name.replace('-', '_') - else: - self.deprecated_name = None - self.deprecated_group = deprecated_group + deprecated_name = deprecated_name.replace('-', '_') + + self.deprecated_opts = copy.deepcopy(deprecated_opts) or [] + self.deprecated_opts.append(DeprecatedOpt(deprecated_name, + group=deprecated_group)) def __ne__(self, another): return vars(self) != vars(another) @@ -579,10 +582,11 @@ class Opt(object): """If cannot find option as dest try deprecated_name alias.""" names = [(section, self.dest)] - dname, dgroup = self.deprecated_name, self.deprecated_group - if dname or dgroup: - names.append((dgroup if dgroup else section, - dname if dname else self.dest)) + for opt in self.deprecated_opts: + dname, dgroup = opt.name, opt.group + if dname or dgroup: + names.append((dgroup if dgroup else section, + dname if dname else self.dest)) return cparser.get(names, multi) @@ -599,10 +603,12 @@ class Opt(object): container = self._get_argparse_container(parser, group) kwargs = self._get_argparse_kwargs(group) prefix = self._get_argparse_prefix('', group.name if group else None) - deprecated_name = self._get_deprecated_cli_name(self.deprecated_name, - self.deprecated_group) - self._add_to_argparse(container, self.name, self.short, kwargs, prefix, - self.positional, deprecated_name) + for opt in self.deprecated_opts: + deprecated_name = self._get_deprecated_cli_name(opt.name, + opt.group) + self._add_to_argparse(container, self.name, self.short, + kwargs, prefix, + self.positional, deprecated_name) def _add_to_argparse(self, container, name, short, kwargs, prefix='', positional=False, deprecated_name=None): @@ -708,6 +714,36 @@ class Opt(object): return self._get_argparse_prefix(prefix, dgroup) + dname +class DeprecatedOpt(object): + + """Represents a Deprecated option. Here's how you can use it + + oldopts = [cfg.DeprecatedOpt('oldfoo', group='oldgroup'), + cfg.DeprecatedOpt('oldfoo2', group='oldgroup2')] + cfg.CONF.register_group(cfg.OptGroup('blaa')) + cfg.CONF.register_opt(cfg.StrOpt('foo', deprecated_opts=oldopts), + group='blaa') + """ + + def __init__(self, name, group=None): + """Constructs an DeprecatedOpt object. + + :param name: the name of the option + :param group: the group of the option + """ + self.name = name + self.group = group + + def __key(self): + return (self.name, self.group) + + def __eq__(x, y): + return x.__key() == y.__key() + + def __hash__(self): + return hash(self.__key()) + + class StrOpt(Opt): """String options. @@ -758,12 +794,13 @@ class BoolOpt(Opt): container = self._get_argparse_container(parser, group) kwargs = self._get_argparse_kwargs(group, action='store_false') prefix = self._get_argparse_prefix('no', group.name if group else None) - deprecated_name = self._get_deprecated_cli_name(self.deprecated_name, - self.deprecated_group, - prefix='no') - kwargs["help"] = "The inverse of --" + self.name - self._add_to_argparse(container, self.name, None, kwargs, prefix, - self.positional, deprecated_name) + for opt in self.deprecated_opts: + deprecated_name = self._get_deprecated_cli_name(opt.name, + opt.group, + prefix='no') + kwargs["help"] = "The inverse of --" + self.name + self._add_to_argparse(container, self.name, None, kwargs, prefix, + self.positional, deprecated_name) def _get_argparse_kwargs(self, group, action='store_true', **kwargs): """Extends the base argparse keyword dict for boolean options.""" diff --git a/tests/test_cfg.py b/tests/test_cfg.py index 06e928a..26ccade 100644 --- a/tests/test_cfg.py +++ b/tests/test_cfg.py @@ -2470,3 +2470,47 @@ class SetDefaultsTestCase(BaseTestCase): cfg.set_defaults(opts, foo='bar') self.conf([]) self.assertEquals(self.conf.blaa.foo, 'bar') + + +class MultipleDeprecatedOptionsTestCase(BaseTestCase): + + def test_conf_file_override_use_deprecated_name_and_group(self): + self.conf.register_group(cfg.OptGroup('blaa')) + self.conf.register_opt(cfg.StrOpt('foo', + deprecated_name='oldfoo', + deprecated_group='oldgroup'), + group='blaa') + + paths = self.create_tempfiles([('test', + '[oldgroup]\n' + 'oldfoo = bar\n')]) + + self.conf(['--config-file', paths[0]]) + self.assertEquals(self.conf.blaa.foo, 'bar') + + def test_conf_file_override_use_deprecated_opts(self): + self.conf.register_group(cfg.OptGroup('blaa')) + oldopts = [cfg.DeprecatedOpt('oldfoo', group='oldgroup')] + self.conf.register_opt(cfg.StrOpt('foo', deprecated_opts=oldopts), + group='blaa') + + paths = self.create_tempfiles([('test', + '[oldgroup]\n' + 'oldfoo = bar\n')]) + + self.conf(['--config-file', paths[0]]) + self.assertEquals(self.conf.blaa.foo, 'bar') + + def test_conf_file_override_use_deprecated_multi_opts(self): + self.conf.register_group(cfg.OptGroup('blaa')) + oldopts = [cfg.DeprecatedOpt('oldfoo', group='oldgroup'), + cfg.DeprecatedOpt('oldfoo2', group='oldgroup2')] + self.conf.register_opt(cfg.StrOpt('foo', deprecated_opts=oldopts), + group='blaa') + + paths = self.create_tempfiles([('test', + '[oldgroup2]\n' + 'oldfoo2 = bar\n')]) + + self.conf(['--config-file', paths[0]]) + self.assertEquals(self.conf.blaa.foo, 'bar') |