def _find_actions(self, subparsers, actions_module, version, do_help): msg = _(" (Supported by API versions '%(start)s' - '%(end)s')") for attr in (a for a in dir(actions_module) if a.startswith('do_')): # I prefer to be hyphen-separated instead of underscores. command = attr[3:].replace('_', '-') callback = getattr(actions_module, attr) desc = callback.__doc__ or '' if hasattr(callback, "versioned"): subs = api_versions.get_substitutions( utils.get_function_name(callback)) if do_help: desc += msg % {'start': subs[0].start_version.get_string(), 'end': subs[-1].end_version.get_string()} else: for versioned_method in subs: if version.matches(versioned_method.start_version, versioned_method.end_version): callback = versioned_method.func break else: continue action_help = desc.strip() arguments = getattr(callback, 'arguments', []) subparser = subparsers.add_parser( command, help=action_help, description=desc, add_help=False, formatter_class=OpenStackHelpFormatter) subparser.add_argument( '-h', '--help', action='help', help=argparse.SUPPRESS, ) self.subcommands[command] = subparser for (args, kwargs) in arguments: start_version = kwargs.get("start_version", None) if start_version: start_version = api_versions.APIVersion(start_version) end_version = kwargs.get("end_version", None) if end_version: end_version = api_versions.APIVersion(end_version) else: end_version = api_versions.APIVersion( "%s.latest" % start_version.ver_major) if do_help: kwargs["help"] = kwargs.get("help", "") + (msg % { "start": start_version.get_string(), "end": end_version.get_string()}) else: if not version.matches(start_version, end_version): continue kw = kwargs.copy() kw.pop("start_version", None) kw.pop("end_version", None) subparser.add_argument(*args, **kw) subparser.set_defaults(func=callback)
def test_arguments_property_is_copied(self): @cliutils.arg("argument_1") @api_versions.wraps("2.666", "2.777") @cliutils.arg("argument_2") def some_func(): pass versioned_method = api_versions.get_substitutions( nutils.get_function_name(some_func), api_versions.APIVersion("2.700"))[0] self.assertEqual(some_func.arguments, versioned_method.func.arguments) self.assertIn((("argument_1", ), {}), versioned_method.func.arguments) self.assertIn((("argument_2", ), {}), versioned_method.func.arguments)
def test_arguments_property_is_copied(self): @nutils.arg("argument_1") @api_versions.wraps("2.666", "2.777") @nutils.arg("argument_2") def some_func(): pass versioned_method = api_versions.get_substitutions( nutils.get_function_name(some_func), api_versions.APIVersion("2.700"))[0] self.assertEqual(some_func.arguments, versioned_method.func.arguments) self.assertIn((("argument_1",), {}), versioned_method.func.arguments) self.assertIn((("argument_2",), {}), versioned_method.func.arguments)
def decor(func): func.versioned = True name = utils.get_function_name(func) versioned_method = VersionedMethod(name, start_version, end_version, func) add_substitution(versioned_method) @functools.wraps(func) def substitution(obj, *args, **kwargs): methods = get_substitutions(name, obj.api_version) if not methods: raise exceptions.VersionNotFoundForAPIMethod(obj.api_version.get_string(), name) else: return max(methods, key=lambda f: f.start_version).func(obj, *args, **kwargs) return substitution
def decor(func): func.versioned = True name = utils.get_function_name(func) versioned_method = VersionedMethod(name, start_version, end_version, func) add_substitution(versioned_method) @functools.wraps(func) def substitution(obj, *args, **kwargs): methods = get_substitutions(name, obj.api_version) if not methods: raise exceptions.VersionNotFoundForAPIMethod( obj.api_version.get_string(), name) else: return max(methods, key=lambda f: f.start_version).func( obj, *args, **kwargs) return substitution
def decor(func): func.versioned = True name = utils.get_function_name(func) versioned_method = VersionedMethod(name, start_version, end_version, func) add_substitution(versioned_method) @functools.wraps(func) def substitution(obj, *args, **kwargs): methods = get_substitutions(name, obj.api_version) if not methods: raise exceptions.VersionNotFoundForAPIMethod(obj.api_version.get_string(), name) method = max(methods, key=lambda f: f.start_version) return method.func(obj, *args, **kwargs) if hasattr(func, "arguments"): for cli_args, cli_kwargs in func.arguments: cliutils.add_arg(substitution, *cli_args, **cli_kwargs) return substitution
def decor(func): func.versioned = True name = utils.get_function_name(func) versioned_method = VersionedMethod(name, start_version, end_version, func) add_substitution(versioned_method) @functools.wraps(func) def substitution(obj, *args, **kwargs): methods = get_substitutions(name, obj.api_version) if not methods: raise exceptions.VersionNotFoundForAPIMethod(obj.api_version.get_string(), name) return methods[-1].func(obj, *args, **kwargs) # Let's share "arguments" with original method and substitution to # allow put cliutils.arg and wraps decorators in any order if not hasattr(func, "arguments"): func.arguments = [] substitution.arguments = func.arguments return substitution
def decor(func): func.versioned = True name = utils.get_function_name(func) versioned_method = VersionedMethod(name, start_version, end_version, func) add_substitution(versioned_method) @functools.wraps(func) def substitution(obj, *args, **kwargs): methods = get_substitutions(name, obj.api_version) if not methods: raise exceptions.VersionNotFoundForAPIMethod( obj.api_version.get_string(), name) method = max(methods, key=lambda f: f.start_version) return method.func(obj, *args, **kwargs) if hasattr(func, 'arguments'): for cli_args, cli_kwargs in func.arguments: cliutils.add_arg(substitution, *cli_args, **cli_kwargs) return substitution
def decor(func): func.versioned = True name = utils.get_function_name(func) versioned_method = VersionedMethod(name, start_version, end_version, func) add_substitution(versioned_method) @functools.wraps(func) def substitution(obj, *args, **kwargs): methods = get_substitutions(name, obj.api_version) if not methods: raise exceptions.VersionNotFoundForAPIMethod( obj.api_version.get_string(), name) return methods[-1].func(obj, *args, **kwargs) # Let's share "arguments" with original method and substitution to # allow put cliutils.arg and wraps decorators in any order if not hasattr(func, 'arguments'): func.arguments = [] substitution.arguments = func.arguments return substitution
def _find_actions(self, subparsers, actions_module, version, do_help): msg = _(" (Supported by API versions '%(start)s' - '%(end)s')") for attr in (a for a in dir(actions_module) if a.startswith('do_')): # I prefer to be hyphen-separated instead of underscores. command = attr[3:].replace('_', '-') callback = getattr(actions_module, attr) desc = callback.__doc__ or '' if hasattr(callback, "versioned"): subs = api_versions.get_substitutions( utils.get_function_name(callback)) if do_help: desc += msg % { 'start': subs[0].start_version.get_string(), 'end': subs[-1].end_version.get_string() } else: for versioned_method in subs: if version.matches(versioned_method.start_version, versioned_method.end_version): callback = versioned_method.func break else: continue action_help = desc.strip() arguments = getattr(callback, 'arguments', []) subparser = subparsers.add_parser( command, help=action_help, description=desc, add_help=False, formatter_class=OpenStackHelpFormatter) subparser.add_argument( '-h', '--help', action='help', help=argparse.SUPPRESS, ) self.subcommands[command] = subparser for (args, kwargs) in arguments: start_version = kwargs.get("start_version", None) if start_version: start_version = api_versions.APIVersion(start_version) end_version = kwargs.get("end_version", None) if end_version: end_version = api_versions.APIVersion(end_version) else: end_version = api_versions.APIVersion( "%s.latest" % start_version.ver_major) if do_help: kwargs["help"] = kwargs.get( "help", "") + (msg % { "start": start_version.get_string(), "end": end_version.get_string() }) else: if not version.matches(start_version, end_version): continue kw = kwargs.copy() kw.pop("start_version", None) kw.pop("end_version", None) subparser.add_argument(*args, **kw) subparser.set_defaults(func=callback)