From bc2c87e8fe2c1ac19dc9e58e8a9003b17aa784bc Mon Sep 17 00:00:00 2001 From: Namwoo Kim Date: Tue, 28 Apr 2015 15:09:38 +0900 Subject: [PATCH] Add a support for pip install with sudo - Fixes #136 --- tests/rules/test_pip_install_sudo.py | 58 ++++++++++++++++++++++++++++ thefuck/rules/pip_install_sudo.py | 13 +++++++ 2 files changed, 71 insertions(+) create mode 100644 tests/rules/test_pip_install_sudo.py create mode 100644 thefuck/rules/pip_install_sudo.py diff --git a/tests/rules/test_pip_install_sudo.py b/tests/rules/test_pip_install_sudo.py new file mode 100644 index 00000000..db4220dc --- /dev/null +++ b/tests/rules/test_pip_install_sudo.py @@ -0,0 +1,58 @@ +import pytest +from thefuck.rules.pip_install_sudo import match, get_new_command +from tests.utils import Command + + +@pytest.fixture +def stdout_success(): + return ''' + Collecting thefuck + Downloading thefuck-1.30.tar.gz + Requirement already satisfied (use --upgrade to upgrade): pathlib in /usr/local/lib/python2.7/site-packages/pathlib-1.0.1-py2.7.egg (from thefuck) + Requirement already satisfied (use --upgrade to upgrade): psutil in /usr/local/lib/python2.7/site-packages/psutil-2.2.1-py2.7-macosx-10.10-x86_64.egg (from thefuck) + Requirement already satisfied (use --upgrade to upgrade): colorama in /usr/local/lib/python2.7/site-packages/colorama-0.3.3-py2.7.egg (from thefuck) + Requirement already satisfied (use --upgrade to upgrade): six in /usr/local/lib/python2.7/site-packages (from thefuck) + Installing collected packages: thefuck + Running setup.py install for thefuck + Successfully installed thefuck-1.30 + ''' + + +@pytest.fixture +def stdout(): + return ''' + Collecting ipaddr + Using cached ipaddr-2.1.11.tar.gz + Installing collected packages: ipaddr + Running setup.py install for ipaddr + Complete output from command /usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip-build-usOyBh/ipaddr/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-ghPfAW-record/install-record.txt --single-version-externally-managed --compile: + running install + running build + running build_py + creating build + creating build/lib.linux-x86_64-2.7 + copying ipaddr.py -> build/lib.linux-x86_64-2.7 + running install_lib + copying build/lib.linux-x86_64-2.7/ipaddr.py -> /usr/local/lib/python2.7/dist-packages + error: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/ipaddr.py' + ''' + + +@pytest.fixture +def stderr(): + return ''' + Command "/usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip-build-usOyBh/ipaddr/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-ghPfAW-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-usOyBh/ipaddr + ''' + + +def test_match(stdout, stdout_success, stderr): + assert match(Command('pip install ipaddr', stdout=stdout, stderr=stderr), + None) + assert not match(Command('pip install thefuck', stdout=stdout_success), + None) + + +def test_get_new_command(stdout, stdout_success, stderr): + assert get_new_command(Command('pip install ipaddr', stdout=stdout, + stderr=stderr), None)\ + == 'sudo pip install ipaddr' diff --git a/thefuck/rules/pip_install_sudo.py b/thefuck/rules/pip_install_sudo.py new file mode 100644 index 00000000..0d1e37d9 --- /dev/null +++ b/thefuck/rules/pip_install_sudo.py @@ -0,0 +1,13 @@ +import re +from thefuck.utils import sudo_support + + +def match(command, settings): + return (('pip' in command.script and 'install' in command.script) and + 'failed with error code 1' in command.stderr and + ('Errno 13' in command.stdout or + 'Permission denied' in command.stdout)) + + +def get_new_command(command, settings): + return u'sudo {}'.format(command.script)