From ee87d1c5476f5d831c4304d8e2ab79340eb44fc8 Mon Sep 17 00:00:00 2001 From: nvbn Date: Mon, 20 Jul 2015 01:53:32 +0300 Subject: [PATCH] #N/A Ignore history lines before `fuck` call in history rule --- tests/rules/test_history.py | 15 +++++++++++---- thefuck/rules/history.py | 20 ++++++++++++++++---- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/tests/rules/test_history.py b/tests/rules/test_history.py index 0a6065d7..40554b1c 100644 --- a/tests/rules/test_history.py +++ b/tests/rules/test_history.py @@ -6,7 +6,14 @@ from tests.utils import Command @pytest.fixture def history(mocker): return mocker.patch('thefuck.rules.history.get_history', - return_value=['ls cat', 'diff x', 'nocommand x']) + return_value=['le cat', 'fuck', 'ls cat', + 'diff x', 'nocommand x']) + + +@pytest.fixture +def alias(mocker): + return mocker.patch('thefuck.rules.history.thefuck_alias', + return_value='fuck') @pytest.fixture @@ -15,19 +22,19 @@ def callables(mocker): return_value=['diff', 'ls']) -@pytest.mark.usefixtures('history', 'callables', 'no_memoize') +@pytest.mark.usefixtures('history', 'callables', 'no_memoize', 'alias') @pytest.mark.parametrize('script', ['ls cet', 'daff x']) def test_match(script): assert match(Command(script=script), None) -@pytest.mark.usefixtures('history', 'callables', 'no_memoize') +@pytest.mark.usefixtures('history', 'callables', 'no_memoize', 'alias') @pytest.mark.parametrize('script', ['apt-get', 'nocommand y']) def test_not_match(script): assert not match(Command(script=script), None) -@pytest.mark.usefixtures('history', 'callables', 'no_memoize') +@pytest.mark.usefixtures('history', 'callables', 'no_memoize', 'alias') @pytest.mark.parametrize('script, result', [ ('ls cet', 'ls cat'), ('daff x', 'diff x')]) diff --git a/thefuck/rules/history.py b/thefuck/rules/history.py index 257c3a8e..cb424f70 100644 --- a/thefuck/rules/history.py +++ b/thefuck/rules/history.py @@ -1,17 +1,28 @@ from difflib import get_close_matches -from thefuck.shells import get_history +from thefuck.shells import get_history, thefuck_alias from thefuck.utils import get_closest, memoize from thefuck.rules.no_command import get_all_callables +def _not_corrected(history, tf_alias): + """Returns all lines from history except that comes before `fuck`.""" + previous = None + for line in history: + if previous is not None and line != tf_alias: + yield previous + previous = line + yield history[-1] + + @memoize def _history_of_exists_without_current(command): + history = get_history() + tf_alias = thefuck_alias() callables = get_all_callables() - return [line for line in get_history() - if line != command.script + return [line for line in _not_corrected(history, tf_alias) + if not line.startswith(tf_alias) and not line == command.script and line.split(' ')[0] in callables] - def match(command, settings): return len(get_close_matches(command.script, _history_of_exists_without_current(command))) @@ -21,4 +32,5 @@ def get_new_command(command, settings): return get_closest(command.script, _history_of_exists_without_current(command)) + priority = 9999