Handle flags with args correctly with split=False.

This commit is contained in:
Florian Bruhin 2014-12-11 21:17:43 +01:00
parent 3579caf1ff
commit 451df7bbf4
2 changed files with 11 additions and 2 deletions

View File

@ -44,6 +44,7 @@ class Command:
parser: The ArgumentParser to use to parse this command. parser: The ArgumentParser to use to parse this command.
special_params: A dict with the names of the special parameters as special_params: A dict with the names of the special parameters as
values. values.
flags_with_args: A list of flags which take an argument.
_type_conv: A mapping of conversion functions for arguments. _type_conv: A mapping of conversion functions for arguments.
_name_conv: A mapping of argument names to parameter names. _name_conv: A mapping of argument names to parameter names.
_needs_js: Whether the command needs javascript enabled _needs_js: Whether the command needs javascript enabled
@ -92,6 +93,7 @@ class Command:
self.pos_args = [] self.pos_args = []
self.special_params = {'count': None, 'win_id': None} self.special_params = {'count': None, 'win_id': None}
self.desc = None self.desc = None
self.flags_with_args = []
self._type_conv = {} self._type_conv = {}
self._name_conv = {} self._name_conv = {}
self._inspect_func() self._inspect_func()
@ -290,6 +292,8 @@ class Command:
args.append(long_flag) args.append(long_flag)
args.append(short_flag) args.append(short_flag)
self.opt_args[param.name] = long_flag, short_flag self.opt_args[param.name] = long_flag, short_flag
if param.kind == inspect.Parameter.KEYWORD_ONLY:
self.flags_with_args.append(param.name)
else: else:
args.append(name) args.append(name)
self.pos_args.append((param.name, name)) self.pos_args.append((param.name, name))

View File

@ -262,12 +262,17 @@ class CommandRunner(QObject):
# second split: ['--foo', '-v', 'bar baz'] # second split: ['--foo', '-v', 'bar baz']
# (maxsplit=2) # (maxsplit=2)
split_args = split.simple_split(argstr, keep=keep) split_args = split.simple_split(argstr, keep=keep)
flag_arg_count = 0
for i, arg in enumerate(split_args): for i, arg in enumerate(split_args):
arg = arg.strip() arg = arg.strip()
if not arg.startswith('-'): if arg.startswith('-'):
if arg.lstrip('-') in self._cmd.flags_with_args:
flag_arg_count += 1
else:
self._args = [] self._args = []
maxsplit = i + self._cmd.maxsplit + flag_arg_count
args = split.simple_split(argstr, keep=keep, args = split.simple_split(argstr, keep=keep,
maxsplit=i + self._cmd.maxsplit) maxsplit=maxsplit)
for s in args: for s in args:
# remove quotes and replace \" by " # remove quotes and replace \" by "
s = re.sub(r"""(^|[^\\])["']""", r'\1', s) s = re.sub(r"""(^|[^\\])["']""", r'\1', s)