From 8d256390a1215540bcba0186796e15265168a62d Mon Sep 17 00:00:00 2001 From: Pablo Santiago Blum de Aguiar Date: Fri, 8 May 2015 20:09:50 -0300 Subject: [PATCH 1/2] refact(shells): use os.path.basename to get the name of the shell Signed-off-by: Pablo Santiago Blum de Aguiar --- thefuck/shells.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thefuck/shells.py b/thefuck/shells.py index 87715d6b..eeb20dca 100644 --- a/thefuck/shells.py +++ b/thefuck/shells.py @@ -136,7 +136,7 @@ def _get_shell(): shell = Process(os.getpid()).parent().cmdline()[0] except TypeError: shell = Process(os.getpid()).parent.cmdline[0] - return shells[shell] + return shells[os.path.basename(shell)] def from_shell(command): From 1b5c935f30371d2cf147de83c327b8a7495b2c10 Mon Sep 17 00:00:00 2001 From: Pablo Santiago Blum de Aguiar Date: Fri, 8 May 2015 20:09:50 -0300 Subject: [PATCH 2/2] feat(shells): add specific actions for the Fish shell Signed-off-by: Pablo Santiago Blum de Aguiar --- tests/test_shells.py | 22 ++++++++++++++++++++++ thefuck/shells.py | 26 ++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/tests/test_shells.py b/tests/test_shells.py index 449496c9..f5490777 100644 --- a/tests/test_shells.py +++ b/tests/test_shells.py @@ -50,6 +50,28 @@ class TestBash(object): write.assert_called_once_with('ls\n') +@pytest.mark.usefixtures('isfile') +class TestFish(object): + @pytest.mark.parametrize('before, after', [ + ('pwd', 'pwd'), + ('ll', 'll')]) # Fish has no aliases but functions + def test_from_shell(self, before, after): + assert shells.Fish().from_shell(before) == after + + def test_to_shell(self): + assert shells.Fish().to_shell('pwd') == 'pwd' + + def test_put_to_history(self, builtins_open, mocker): + mocker.patch('thefuck.shells.time', + return_value=1430707243.3517463) + shells.Fish().put_to_history('ls') + builtins_open.return_value.__enter__.return_value. \ + write.assert_called_once_with('- cmd: ls\n when: 1430707243\n') + + def test_and_(self): + assert shells.Fish().and_('foo', 'bar') == 'foo; and bar' + + @pytest.mark.usefixtures('isfile') class TestZsh(object): @pytest.fixture(autouse=True) diff --git a/thefuck/shells.py b/thefuck/shells.py index eeb20dca..5443c652 100644 --- a/thefuck/shells.py +++ b/thefuck/shells.py @@ -76,6 +76,31 @@ class Bash(Generic): return u'{}\n'.format(command_script) +class Fish(Generic): + def app_alias(self): + return ("function fuck -d 'Correct your previous console command'\n" + " set -l exit_code $status\n" + " set -l eval_script" + " (mktemp 2>/dev/null ; or mktemp -t 'thefuck')\n" + " set -l fucked_up_commandd $history[1]\n" + " thefuck $fucked_up_commandd > $eval_script\n" + " . $eval_script\n" + " rm $eval_script\n" + " if test $exit_code -ne 0\n" + " history --delete $fucked_up_commandd\n" + " end\n" + "end") + + def _get_history_file_name(self): + return os.path.expanduser('~/.config/fish/fish_history') + + def _get_history_line(self, command_script): + return u'- cmd: {}\n when: {}\n'.format(command_script, int(time())) + + def and_(self, *commands): + return '; and '.join(commands) + + class Zsh(Generic): def app_alias(self): return "\nalias fuck='eval $(thefuck $(fc -ln -1 | tail -n 1)); fc -R'\n" @@ -126,6 +151,7 @@ class Tcsh(Generic): shells = defaultdict(lambda: Generic(), { 'bash': Bash(), + 'fish': Fish(), 'zsh': Zsh(), '-csh': Tcsh(), 'tcsh': Tcsh()})