diff --git a/qutebrowser/commands/cmdutils.py b/qutebrowser/commands/cmdutils.py index 8a364849a..fde3d91f7 100644 --- a/qutebrowser/commands/cmdutils.py +++ b/qutebrowser/commands/cmdutils.py @@ -179,14 +179,15 @@ class register: # pylint: disable=invalid-name default=argparser.SUPPRESS, nargs=0, help=argparser.SUPPRESS) self._check_func() - has_count, desc, type_conv = self._inspect_func() + has_count, desc, type_conv, name_conv = self._inspect_func() cmd = command.Command( name=names[0], split=self.split, hide=self.hide, count=has_count, desc=desc, instance=self.instance, handler=func, completion=self.completion, modes=self.modes, not_modes=self.not_modes, needs_js=self.needs_js, is_debug=self.debug, parser=self.parser, type_conv=type_conv, - opt_args=self.opt_args, pos_args=self.pos_args) + opt_args=self.opt_args, pos_args=self.pos_args, + name_conv=name_conv) for name in names: cmd_dict[name] = cmd aliases += names[1:] @@ -240,6 +241,18 @@ class register: # pylint: disable=invalid-name type_conv[param.name] = argparser.multitype_conv(typ) return type_conv + def _get_nameconv(self, param, annotation_info): + """Get a dict with a name conversion for the paraeter. + + Args: + param: The inspect.Parameter to handle. + annotation_info: The AnnotationInfo tuple for the parameter. + """ + d = {} + if annotation_info.name is not None: + d[param.name] = annotation_info.name + return d + def _inspect_func(self): """Inspect the function to get useful informations from it. @@ -248,8 +261,10 @@ class register: # pylint: disable=invalid-name has_count: Whether the command supports a count. desc: The description of the command. type_conv: A mapping of args to type converter callables. + name_conv: A mapping of names to convert. """ type_conv = {} + name_conv = {} signature = inspect.signature(self.func) has_count = 'count' in signature.parameters doc = inspect.getdoc(self.func) @@ -266,13 +281,14 @@ class register: # pylint: disable=invalid-name args, kwargs = self._param_to_argparse_args( param, annotation_info) type_conv.update(self._get_typeconv(param, typ)) + name_conv.update(self._get_nameconv(param, annotation_info)) callsig = debugutils.format_call( self.parser.add_argument, args, kwargs, full=False) log.commands.vdebug('Adding arg {} of type {} -> {}'.format( param.name, typ, callsig)) self.parser.add_argument(*args, **kwargs) - return has_count, desc, type_conv + return has_count, desc, type_conv, name_conv def _param_to_argparse_args(self, param, annotation_info): """Get argparse arguments for a parameter. diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py index e3f08f25f..57b13a84f 100644 --- a/qutebrowser/commands/command.py +++ b/qutebrowser/commands/command.py @@ -46,6 +46,7 @@ class Command: debug: Whether this is a debugging command (only shown with --debug). parser: The ArgumentParser to use to parse this command. type_conv: A mapping of conversion functions for arguments. + name_conv: A mapping of argument names to parameter names. """ # TODO: @@ -54,7 +55,7 @@ class Command: def __init__(self, name, split, hide, count, desc, instance, handler, completion, modes, not_modes, needs_js, is_debug, parser, - type_conv, opt_args, pos_args): + type_conv, opt_args, pos_args, name_conv): # I really don't know how to solve this in a better way, I tried. # pylint: disable=too-many-arguments,too-many-locals self.name = name @@ -73,6 +74,7 @@ class Command: self.type_conv = type_conv self.opt_args = opt_args self.pos_args = pos_args + self.name_conv = name_conv def _check_prerequisites(self): """Check if the command is permitted to run currently. @@ -145,7 +147,8 @@ class Command: "argument 'count'!".format( self.name, param.kind)) continue - value = getattr(namespace, param.name) + name = self.name_conv.get(param.name, param.name) + value = getattr(namespace, name) if param.name in self.type_conv: # We convert enum types after getting the values from # argparse, because argparse's choices argument is @@ -158,7 +161,7 @@ class Command: if value is not None: args += value elif param.kind == inspect.Parameter.KEYWORD_ONLY: - kwargs[param.name] = value + kwargs[name] = value else: raise TypeError("{}: Invalid parameter type {} for argument " "'{}'!".format(