1
0
mirror of https://github.com/nvbn/thefuck.git synced 2025-01-31 10:11:14 +00:00

#298 Don't suggest duplicates

This commit is contained in:
nvbn 2015-08-01 19:16:22 +03:00
parent 213e7bf74b
commit fd759ea2ac
3 changed files with 28 additions and 8 deletions

View File

@ -2,8 +2,8 @@ import pytest
from pathlib import PosixPath, Path from pathlib import PosixPath, Path
from mock import Mock from mock import Mock
from thefuck import corrector, conf, types from thefuck import corrector, conf, types
from tests.utils import Rule, Command from tests.utils import Rule, Command, CorrectedCommand
from thefuck.corrector import make_corrected_commands, get_corrected_commands from thefuck.corrector import make_corrected_commands, get_corrected_commands, remove_duplicates
def test_load_rule(mocker): def test_load_rule(mocker):
@ -65,14 +65,23 @@ class TestGetCorrectedCommands(object):
rule = Rule(get_new_command=lambda x, _: [x.script + '!', x.script + '@'], rule = Rule(get_new_command=lambda x, _: [x.script + '!', x.script + '@'],
priority=100) priority=100)
assert list(make_corrected_commands(Command(script='test'), [rule], None)) \ assert list(make_corrected_commands(Command(script='test'), [rule], None)) \
== [types.CorrectedCommand(script='test!', priority=100, side_effect=None), == [CorrectedCommand(script='test!', priority=100),
types.CorrectedCommand(script='test@', priority=200, side_effect=None)] CorrectedCommand(script='test@', priority=200)]
def test_with_rule_returns_command(self): def test_with_rule_returns_command(self):
rule = Rule(get_new_command=lambda x, _: x.script + '!', rule = Rule(get_new_command=lambda x, _: x.script + '!',
priority=100) priority=100)
assert list(make_corrected_commands(Command(script='test'), [rule], None)) \ assert list(make_corrected_commands(Command(script='test'), [rule], None)) \
== [types.CorrectedCommand(script='test!', priority=100, side_effect=None)] == [CorrectedCommand(script='test!', priority=100)]
def test_remove_duplicates():
side_effect = lambda *_: None
assert set(remove_duplicates([CorrectedCommand('ls', priority=100),
CorrectedCommand('ls', priority=200),
CorrectedCommand('ls', side_effect, 300)])) \
== {CorrectedCommand('ls', priority=100),
CorrectedCommand('ls', side_effect, 300)}
def test_get_corrected_commands(mocker): def test_get_corrected_commands(mocker):
@ -84,5 +93,5 @@ def test_get_corrected_commands(mocker):
get_new_command=lambda x, _: [x.script + '@', x.script + ';'], get_new_command=lambda x, _: [x.script + '@', x.script + ';'],
priority=60)] priority=60)]
mocker.patch('thefuck.corrector.get_rules', return_value=rules) mocker.patch('thefuck.corrector.get_rules', return_value=rules)
assert [cmd.script for cmd in get_corrected_commands(command, None, Mock(debug=False))]\ assert [cmd.script for cmd in get_corrected_commands(command, None, Mock(debug=False))] \
== ['test@', 'test!', 'test;'] == ['test@', 'test!', 'test;']

View File

@ -15,3 +15,7 @@ def Rule(name='', match=lambda *_: True,
return types.Rule(name, match, get_new_command, return types.Rule(name, match, get_new_command,
enabled_by_default, side_effect, enabled_by_default, side_effect,
priority, requires_output) priority, requires_output)
def CorrectedCommand(script='', side_effect=None, priority=DEFAULT_PRIORITY):
return types.CorrectedCommand(script, side_effect, priority)

View File

@ -66,6 +66,13 @@ def make_corrected_commands(command, rules, settings):
priority=(n + 1) * rule.priority) priority=(n + 1) * rule.priority)
def remove_duplicates(corrected_commands):
commands = {(command.script, command.side_effect): command
for command in sorted(corrected_commands,
key=lambda command: -command.priority)}
return commands.values()
def get_corrected_commands(command, user_dir, settings): def get_corrected_commands(command, user_dir, settings):
rules = get_rules(user_dir, settings) rules = get_rules(user_dir, settings)
logs.debug( logs.debug(
@ -76,5 +83,5 @@ def get_corrected_commands(command, user_dir, settings):
u'Matched rules: {}'.format(', '.join(rule.name for rule in matched)), u'Matched rules: {}'.format(', '.join(rule.name for rule in matched)),
settings) settings)
corrected_commands = make_corrected_commands(command, matched, settings) corrected_commands = make_corrected_commands(command, matched, settings)
return sorted(corrected_commands, return sorted(remove_duplicates(corrected_commands),
key=lambda corrected_command: corrected_command.priority) key=lambda corrected_command: corrected_command.priority)