From 48808f93acd7dd908cdc108453a80fb0c446f97e Mon Sep 17 00:00:00 2001 From: lawrencebenson Date: Wed, 2 Mar 2016 17:48:20 +0100 Subject: [PATCH 1/4] Add no hard link support for ln --- README.md | 1 + tests/rules/test_ln_no_hard_link.py | 45 +++++++++++++++++++++++++++++ thefuck/rules/ln_no_hard_link.py | 24 +++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 tests/rules/test_ln_no_hard_link.py create mode 100644 thefuck/rules/ln_no_hard_link.py diff --git a/README.md b/README.md index 2ff554f..36bf881 100644 --- a/README.md +++ b/README.md @@ -178,6 +178,7 @@ using the matched rule and runs it. Rules enabled by default are as follows: * `java` – removes `.java` extension when running Java programs; * `javac` – appends missing `.java` when compiling Java files; * `lein_not_task` – fixes wrong `lein` tasks like `lein rpl`; +* `ln_no_hard_link` – catches hard link creation on directories, suggest symbolic link; * `ls_lah` – adds `-lah` to `ls`; * `man` – changes manual section; * `man_no_space` – fixes man commands without spaces, for example `mandiff`; diff --git a/tests/rules/test_ln_no_hard_link.py b/tests/rules/test_ln_no_hard_link.py new file mode 100644 index 0000000..ca21279 --- /dev/null +++ b/tests/rules/test_ln_no_hard_link.py @@ -0,0 +1,45 @@ +from thefuck.rules.ln_no_hard_link import match, get_new_command +from tests.utils import Command + + +def test_match(): + err = "hard link not allowed for directory" + assert not match(Command()) + + cmd1 = Command("ln barDir barLink", stderr="ln: ‘barDir’: {}".format(err)) + assert match(cmd1) + + cmd2 = Command("sudo ln a b", stderr="ln: ‘a’: {}".format(err)) + assert match(cmd2) + + cmd3 = Command("ln a b", stderr="... hard link") + assert not match(cmd3) + + cmd4 = Command("sudo ln a b", stderr="... hard link") + assert not match(cmd4) + + cmd5 = Command("a b", stderr=err) + assert not match(cmd5) + + cmd6 = Command("sudo ln -nbi a b", stderr="ln: ‘a’: {}".format(err)) + assert match(cmd6) + + +def test_get_new_command(): + cmd1 = Command("ln barDir barLink") + assert get_new_command(cmd1) == "ln -s barDir barLink" + + cmd2 = Command("sudo ln barDir barLink") + assert get_new_command(cmd2) == "sudo ln -s barDir barLink" + + cmd3 = Command("sudo ln -nbi a b") + assert get_new_command(cmd3) == "sudo ln -s -nbi a b" + + cmd4 = Command("ln -nbi a b && ls") + assert get_new_command(cmd4) == "ln -s -nbi a b && ls" + + cmd5 = Command("ln a ln") + assert get_new_command(cmd5) == "ln -s a ln" + + cmd6 = Command("sudo ln a ln") + assert get_new_command(cmd6) == "sudo ln -s a ln" diff --git a/thefuck/rules/ln_no_hard_link.py b/thefuck/rules/ln_no_hard_link.py new file mode 100644 index 0000000..422f4ed --- /dev/null +++ b/thefuck/rules/ln_no_hard_link.py @@ -0,0 +1,24 @@ +"""Suggest creating symbolic link if hard link is not allowed. + +Example: +> ln barDir barLink +ln: ‘barDir’: hard link not allowed for directory + +--> ln -s barDir barLink +""" + +import re +from thefuck.utils import for_app +from thefuck.specific.sudo import sudo_support + + +@sudo_support +@for_app('ln') +def match(command): + return (command.stderr.endswith("hard link not allowed for directory") and + command.script.startswith("ln ")) + + +@sudo_support +def get_new_command(command): + return re.sub(r'^ln ', 'ln -s ', command.script) From 6b0311181dfbaf763e895ae5b7deec25f87fad95 Mon Sep 17 00:00:00 2001 From: lawrencebenson Date: Wed, 2 Mar 2016 23:19:22 +0100 Subject: [PATCH 2/4] Fix encoding error for Python 2 --- tests/rules/test_ln_no_hard_link.py | 2 ++ thefuck/rules/ln_no_hard_link.py | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/rules/test_ln_no_hard_link.py b/tests/rules/test_ln_no_hard_link.py index ca21279..d882eb5 100644 --- a/tests/rules/test_ln_no_hard_link.py +++ b/tests/rules/test_ln_no_hard_link.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + from thefuck.rules.ln_no_hard_link import match, get_new_command from tests.utils import Command diff --git a/thefuck/rules/ln_no_hard_link.py b/thefuck/rules/ln_no_hard_link.py index 422f4ed..4df512e 100644 --- a/thefuck/rules/ln_no_hard_link.py +++ b/thefuck/rules/ln_no_hard_link.py @@ -8,12 +8,10 @@ ln: ‘barDir’: hard link not allowed for directory """ import re -from thefuck.utils import for_app from thefuck.specific.sudo import sudo_support @sudo_support -@for_app('ln') def match(command): return (command.stderr.endswith("hard link not allowed for directory") and command.script.startswith("ln ")) From 77ad68b04b66feb47116999cf79892f6630d9601 Mon Sep 17 00:00:00 2001 From: lawrencebenson Date: Thu, 3 Mar 2016 10:43:33 +0100 Subject: [PATCH 3/4] Fix encoding error in source file example --- thefuck/rules/ln_no_hard_link.py | 1 + 1 file changed, 1 insertion(+) diff --git a/thefuck/rules/ln_no_hard_link.py b/thefuck/rules/ln_no_hard_link.py index 4df512e..3aca042 100644 --- a/thefuck/rules/ln_no_hard_link.py +++ b/thefuck/rules/ln_no_hard_link.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """Suggest creating symbolic link if hard link is not allowed. Example: From 4f5b382df4f5d0a2515d78a79f4ef9ebe5d4e2d3 Mon Sep 17 00:00:00 2001 From: nvbn Date: Fri, 4 Mar 2016 00:20:33 +0300 Subject: [PATCH 4/4] #471: Use parametrized tests --- tests/rules/test_ln_no_hard_link.py | 64 ++++++++++++----------------- 1 file changed, 27 insertions(+), 37 deletions(-) diff --git a/tests/rules/test_ln_no_hard_link.py b/tests/rules/test_ln_no_hard_link.py index d882eb5..9ada4d5 100644 --- a/tests/rules/test_ln_no_hard_link.py +++ b/tests/rules/test_ln_no_hard_link.py @@ -1,47 +1,37 @@ # -*- coding: utf-8 -*- - +import pytest from thefuck.rules.ln_no_hard_link import match, get_new_command from tests.utils import Command - -def test_match(): - err = "hard link not allowed for directory" - assert not match(Command()) - - cmd1 = Command("ln barDir barLink", stderr="ln: ‘barDir’: {}".format(err)) - assert match(cmd1) - - cmd2 = Command("sudo ln a b", stderr="ln: ‘a’: {}".format(err)) - assert match(cmd2) - - cmd3 = Command("ln a b", stderr="... hard link") - assert not match(cmd3) - - cmd4 = Command("sudo ln a b", stderr="... hard link") - assert not match(cmd4) - - cmd5 = Command("a b", stderr=err) - assert not match(cmd5) - - cmd6 = Command("sudo ln -nbi a b", stderr="ln: ‘a’: {}".format(err)) - assert match(cmd6) +error = "hard link not allowed for directory" -def test_get_new_command(): - cmd1 = Command("ln barDir barLink") - assert get_new_command(cmd1) == "ln -s barDir barLink" +@pytest.mark.parametrize('script, stderr', [ + ("ln barDir barLink", "ln: ‘barDir’: {}"), + ("sudo ln a b", "ln: ‘a’: {}"), + ("sudo ln -nbi a b", "ln: ‘a’: {}")]) +def test_match(script, stderr): + command = Command(script, stderr=stderr.format(error)) + assert match(command) - cmd2 = Command("sudo ln barDir barLink") - assert get_new_command(cmd2) == "sudo ln -s barDir barLink" - cmd3 = Command("sudo ln -nbi a b") - assert get_new_command(cmd3) == "sudo ln -s -nbi a b" +@pytest.mark.parametrize('script, stderr', [ + ('', ''), + ("ln a b", "... hard link"), + ("sudo ln a b", "... hard link"), + ("a b", error)]) +def test_assert_not_match(script, stderr): + command = Command(script, stderr=stderr) + assert not match(command) - cmd4 = Command("ln -nbi a b && ls") - assert get_new_command(cmd4) == "ln -s -nbi a b && ls" - cmd5 = Command("ln a ln") - assert get_new_command(cmd5) == "ln -s a ln" - - cmd6 = Command("sudo ln a ln") - assert get_new_command(cmd6) == "sudo ln -s a ln" +@pytest.mark.parametrize('script, result', [ + ("ln barDir barLink", "ln -s barDir barLink"), + ("sudo ln barDir barLink", "sudo ln -s barDir barLink"), + ("sudo ln -nbi a b", "sudo ln -s -nbi a b"), + ("ln -nbi a b && ls", "ln -s -nbi a b && ls"), + ("ln a ln", "ln -s a ln"), + ("sudo ln a ln", "sudo ln -s a ln")]) +def test_get_new_command(script, result): + command = Command(script) + assert get_new_command(command) == result