Moved searching for aliases to CommandRunner.parse_all()

This addresses issue with having alias for multiple commands splitted by ';;'.

See: The-Compiler/qutebrowser#956.
This commit is contained in:
Michał Góral 2016-06-12 21:03:04 +02:00
parent cfe360b95e
commit 7ee99ba043
4 changed files with 18 additions and 19 deletions

View File

@ -80,21 +80,23 @@ class CommandRunner(QObject):
self._partial_match = partial_match self._partial_match = partial_match
self._win_id = win_id self._win_id = win_id
def _get_alias(self, text): def _get_alias(self, text, default = None):
"""Get an alias from the config. """Get an alias from the config.
Args: Args:
text: The text to parse. text: The text to parse.
default : Default value to return when alias was not found. By
default it is set to None.
Return: Return:
None if no alias was found. The new command string if an alias was found. Default value
The new command string if an alias was found. otherwise.
""" """
parts = text.strip().split(maxsplit=1) parts = text.strip().split(maxsplit=1)
try: try:
alias = config.get('aliases', parts[0]) alias = config.get('aliases', parts[0])
except (configexc.NoOptionError, configexc.NoSectionError): except (configexc.NoOptionError, configexc.NoSectionError):
return None return default
try: try:
new_cmd = '{} {}'.format(alias, parts[1]) new_cmd = '{} {}'.format(alias, parts[1])
except IndexError: except IndexError:
@ -103,7 +105,7 @@ class CommandRunner(QObject):
new_cmd += ' ' new_cmd += ' '
return new_cmd return new_cmd
def parse_all(self, text, *args, **kwargs): def parse_all(self, text, aliases = True, *args, **kwargs):
"""Split a command on ;; and parse all parts. """Split a command on ;; and parse all parts.
If the first command in the commandline is a non-split one, it only If the first command in the commandline is a non-split one, it only
@ -111,11 +113,16 @@ class CommandRunner(QObject):
Args: Args:
text: Text to parse. text: Text to parse.
aliases: Whether to handle aliases.
*args/**kwargs: Passed to parse(). *args/**kwargs: Passed to parse().
Yields: Yields:
ParseResult tuples. ParseResult tuples.
""" """
if aliases:
text = self._get_alias(text, text)
if ';;' in text: if ';;' in text:
# Get the first command and check if it doesn't want to have ;; # Get the first command and check if it doesn't want to have ;;
# split. # split.
@ -159,12 +166,11 @@ class CommandRunner(QObject):
cmdline = text.split() cmdline = text.split()
return ParseResult(cmd=None, args=None, cmdline=cmdline, count=count) return ParseResult(cmd=None, args=None, cmdline=cmdline, count=count)
def parse(self, text, *, aliases=True, fallback=False, keep=False): def parse(self, text, *, fallback=False, keep=False):
"""Split the commandline text into command and arguments. """Split the commandline text into command and arguments.
Args: Args:
text: Text to parse. text: Text to parse.
aliases: Whether to handle aliases.
fallback: Whether to do a fallback splitting when the command was fallback: Whether to do a fallback splitting when the command was
unknown. unknown.
keep: Whether to keep special chars and whitespace keep: Whether to keep special chars and whitespace
@ -178,13 +184,6 @@ class CommandRunner(QObject):
if not cmdstr and not fallback: if not cmdstr and not fallback:
raise cmdexc.NoSuchCommandError("No command given") raise cmdexc.NoSuchCommandError("No command given")
if aliases:
new_cmd = self._get_alias(text)
if new_cmd is not None:
log.commands.debug("Re-parsing with '{}'.".format(new_cmd))
return self.parse(new_cmd, aliases=False, fallback=fallback,
keep=keep)
if self._partial_match: if self._partial_match:
cmdstr = self._completion_match(cmdstr) cmdstr = self._completion_match(cmdstr)

View File

@ -354,7 +354,7 @@ class Completer(QObject):
if completion.enabled: if completion.enabled:
completion.show() completion.show()
def split(self, keep=False, aliases=False): def split(self, keep=False):
"""Get the text split up in parts. """Get the text split up in parts.
Args: Args:
@ -371,7 +371,7 @@ class Completer(QObject):
# the whitespace. # the whitespace.
return [text] return [text]
runner = runners.CommandRunner(self._win_id) runner = runners.CommandRunner(self._win_id)
result = runner.parse(text, fallback=True, aliases=aliases, keep=keep) result = runner.parse(text, fallback=True, keep=keep)
parts = result.cmdline parts = result.cmdline
if self._empty_item_idx is not None: if self._empty_item_idx is not None:
log.completion.debug("Empty element queued at {}, " log.completion.debug("Empty element queued at {}, "

View File

@ -46,7 +46,7 @@ class TestCommandRunner:
def test_parse_with_count(self): def test_parse_with_count(self):
"""Test parsing of commands with a count.""" """Test parsing of commands with a count."""
cr = runners.CommandRunner(0) cr = runners.CommandRunner(0)
result = cr.parse('20:scroll down', aliases=False) result = cr.parse('20:scroll down')
assert result.cmd.name == 'scroll' assert result.cmd.name == 'scroll'
assert result.count == 20 assert result.count == 20
assert result.args == ['down'] assert result.args == ['down']
@ -58,5 +58,5 @@ class TestCommandRunner:
The same with it being disabled is tested by test_parse_all. The same with it being disabled is tested by test_parse_all.
""" """
cr = runners.CommandRunner(0, partial_match=True) cr = runners.CommandRunner(0, partial_match=True)
result = cr.parse('message-i', aliases=False) result = cr.parse('message-i')
assert result.cmd.name == 'message-info' assert result.cmd.name == 'message-info'

View File

@ -306,7 +306,7 @@ class TestDefaultConfig:
runner = runners.CommandRunner(win_id=0) runner = runners.CommandRunner(win_id=0)
for sectname in configdata.KEY_DATA: for sectname in configdata.KEY_DATA:
for cmd in conf.get_bindings_for(sectname).values(): for cmd in conf.get_bindings_for(sectname).values():
runner.parse(cmd, aliases=False) runner.parse(cmd)
def test_upgrade_version(self): def test_upgrade_version(self):
"""Fail when the qutebrowser version changed. """Fail when the qutebrowser version changed.