From 24ce459f2cac721a08ab4e359119dc5603b03fa3 Mon Sep 17 00:00:00 2001 From: Namwoo Kim Date: Thu, 23 Apr 2015 17:00:57 +0900 Subject: [PATCH] Add a support for unknown brew commands - #83 --- tests/rules/test_brew_unknown_command.py | 28 ++++++++++++++++++++ thefuck/rules/brew_unknown_command.py | 33 ++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 tests/rules/test_brew_unknown_command.py create mode 100644 thefuck/rules/brew_unknown_command.py diff --git a/tests/rules/test_brew_unknown_command.py b/tests/rules/test_brew_unknown_command.py new file mode 100644 index 00000000..408e9989 --- /dev/null +++ b/tests/rules/test_brew_unknown_command.py @@ -0,0 +1,28 @@ +import pytest +from thefuck.types import Command +from thefuck.rules.brew_unknown_command import match, get_new_command +from thefuck.rules.brew_unknown_command import brew_commands + + +@pytest.fixture +def brew_unknown_cmd(): + return '''Error: Unknown command: inst''' + + +@pytest.fixture +def brew_unknown_cmd_instaa(): + return '''Error: Unknown command: instaa''' + + +def test_match(brew_unknown_cmd): + assert match(Command('brew inst', '', brew_unknown_cmd), None) + for command in brew_commands: + assert not match(Command('brew ' + command, '', ''), None) + + +def test_get_new_command(brew_unknown_cmd, brew_unknown_cmd_instaa): + assert get_new_command(Command('brew inst', '', brew_unknown_cmd), None)\ + == 'brew list' + + assert get_new_command(Command('brew instaa', '', brew_unknown_cmd_instaa), + None) == 'brew install' diff --git a/thefuck/rules/brew_unknown_command.py b/thefuck/rules/brew_unknown_command.py new file mode 100644 index 00000000..447b3c19 --- /dev/null +++ b/thefuck/rules/brew_unknown_command.py @@ -0,0 +1,33 @@ +import difflib +import re +import thefuck.logs + +# This commands are based on Homebrew 0.9.5 +brew_commands = ['info', 'home', 'options', 'install', 'uninstall', 'search', + 'list', 'update', 'upgrade', 'pin', 'unpin', 'doctor', + 'create', 'edit'] + + +def _get_similar_commands(command): + return difflib.get_close_matches(command, brew_commands) + + +def match(command, settings): + is_proper_command = ('brew' in command.script and + 'Unknown command' in command.stderr) + + has_possible_commands = False + if is_proper_command: + broken_cmd = re.findall(r'Error: Unknown command: ([a-z]+)', + command.stderr)[0] + has_possible_commands = len(_get_similar_commands(broken_cmd)) > 0 + + return has_possible_commands + + +def get_new_command(command, settings): + broken_cmd = re.findall(r'Error: Unknown command: ([a-z]+)', + command.stderr)[0] + new_cmd = _get_similar_commands(broken_cmd)[0] + + return command.script.replace(broken_cmd, new_cmd, 1)