From 89207d6d7c91833f3b2aeb576db5a29acfaa2561 Mon Sep 17 00:00:00 2001 From: Iulian Onofrei <6d0847b9@opayq.com> Date: Tue, 22 May 2018 20:25:05 +0300 Subject: [PATCH] Add brew_reinstall rule (#816) Replaces install with reinstall when a package is already installed. --- README.md | 1 + tests/rules/test_brew_reinstall.py | 28 ++++++++++++++++++++++++++++ thefuck/rules/brew_reinstall.py | 19 +++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 tests/rules/test_brew_reinstall.py create mode 100644 thefuck/rules/brew_reinstall.py diff --git a/README.md b/README.md index e9c419b1..5bf72e01 100644 --- a/README.md +++ b/README.md @@ -305,6 +305,7 @@ The following rules are enabled by default on specific platforms only: * `apt_upgrade` – helps you run `apt upgrade` after `apt list --upgradable`; * `brew_cask_dependency` – installs cask dependencies; * `brew_install` – fixes formula name for `brew install`; +* `brew_reinstall` – turns `brew install ` into `brew reinstall `; * `brew_link` – adds `--overwrite --dry-run` if linking fails; * `brew_uninstall` – adds `--force` to `brew uninstall` if multiple versions were installed; * `brew_unknown_command` – fixes wrong brew commands, for example `brew docto/brew doctor`; diff --git a/tests/rules/test_brew_reinstall.py b/tests/rules/test_brew_reinstall.py new file mode 100644 index 00000000..e1ca0b47 --- /dev/null +++ b/tests/rules/test_brew_reinstall.py @@ -0,0 +1,28 @@ +import pytest +from thefuck.types import Command +from thefuck.rules.brew_reinstall import get_new_command, match + + +output = ("Warning: thefuck 9.9 is already installed and up-to-date\nTo " + "reinstall 9.9, run `brew reinstall thefuck`") + + +def test_match(): + command = Command('brew install thefuck', output) + assert match(command) + + +@pytest.mark.parametrize('script', [ + 'brew reinstall thefuck', + 'brew install foo']) +def test_not_match(script): + assert not match(Command(script, '')) + + +@pytest.mark.parametrize('script, formula, ', [ + ('brew install foo', 'foo'), + ('brew install bar zap', 'bar zap')]) +def test_get_new_command(script, formula): + command = Command(script, output) + new_command = 'brew reinstall {}'.format(formula) + assert get_new_command(command) == new_command diff --git a/thefuck/rules/brew_reinstall.py b/thefuck/rules/brew_reinstall.py new file mode 100644 index 00000000..bc14e69b --- /dev/null +++ b/thefuck/rules/brew_reinstall.py @@ -0,0 +1,19 @@ +import re +from thefuck.utils import for_app + + +warning_regex = re.compile(r'Warning: (?:.(?!is ))+ is already installed and ' + r'up-to-date') +message_regex = re.compile(r'To reinstall (?:(?!, ).)+, run `brew reinstall ' + r'[^`]+`') + + +@for_app('brew', at_least=2) +def match(command): + return ('install' in command.script + and warning_regex.search(command.output) + and message_regex.search(command.output)) + + +def get_new_command(command): + return command.script.replace('install', 'reinstall')