From ebe53f0d181c28ec2f7a86f46d7d51a7d48bbd9e Mon Sep 17 00:00:00 2001 From: nvbn Date: Thu, 27 Aug 2015 16:52:26 +0300 Subject: [PATCH] Use decorator library --- setup.py | 2 +- tests/specific/test_sudo.py | 6 ++++-- thefuck/specific/git.py | 40 ++++++++++++++++++------------------- thefuck/specific/sudo.py | 32 ++++++++++++++--------------- thefuck/utils.py | 33 ++++++++++++------------------ 5 files changed, 52 insertions(+), 61 deletions(-) diff --git a/setup.py b/setup.py index e2d6e12c..88900cf5 100755 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ elif (3, 0) < version < (3, 3): VERSION = '2.8' -install_requires = ['psutil', 'colorama', 'six'] +install_requires = ['psutil', 'colorama', 'six', 'decorator'] extras_require = {':python_version<"3.4"': ['pathlib']} setup(name='thefuck', diff --git a/tests/specific/test_sudo.py b/tests/specific/test_sudo.py index 46afa5c2..b8243322 100644 --- a/tests/specific/test_sudo.py +++ b/tests/specific/test_sudo.py @@ -13,6 +13,8 @@ from tests.utils import Command (False, 'sudo ls', 'ls', False), (False, 'ls', 'ls', False)]) def test_sudo_support(return_value, command, called, result): - fn = Mock(return_value=return_value, __name__='') + def fn(command, settings): + assert command == Command(called) + return return_value + assert sudo_support(fn)(Command(command), None) == result - fn.assert_called_once_with(Command(called), None) diff --git a/thefuck/specific/git.py b/thefuck/specific/git.py index 4c415987..b8420573 100644 --- a/thefuck/specific/git.py +++ b/thefuck/specific/git.py @@ -1,34 +1,32 @@ -from functools import wraps import re from shlex import split +from decorator import decorator from ..types import Command -from ..utils import quote, for_app +from ..utils import quote, is_app -def git_support(fn): +@decorator +def git_support(fn, command, settings): """Resolves git aliases and supports testing for both git and hub.""" # supports GitHub's `hub` command # which is recommended to be used with `alias git=hub` # but at this point, shell aliases have already been resolved + if not is_app(command, 'git', 'hub'): + return False - @for_app('git', 'hub') - @wraps(fn) - def wrapper(command, settings): - # perform git aliases expansion - if 'trace: alias expansion:' in command.stderr: - search = re.search("trace: alias expansion: ([^ ]*) => ([^\n]*)", - command.stderr) - alias = search.group(1) + # perform git aliases expansion + if 'trace: alias expansion:' in command.stderr: + search = re.search("trace: alias expansion: ([^ ]*) => ([^\n]*)", + command.stderr) + alias = search.group(1) - # by default git quotes everything, for example: - # 'commit' '--amend' - # which is surprising and does not allow to easily test for - # eg. 'git commit' - expansion = ' '.join(map(quote, split(search.group(2)))) - new_script = command.script.replace(alias, expansion) + # by default git quotes everything, for example: + # 'commit' '--amend' + # which is surprising and does not allow to easily test for + # eg. 'git commit' + expansion = ' '.join(map(quote, split(search.group(2)))) + new_script = command.script.replace(alias, expansion) - command = Command._replace(command, script=new_script) + command = Command._replace(command, script=new_script) - return fn(command, settings) - - return wrapper + return fn(command, settings) diff --git a/thefuck/specific/sudo.py b/thefuck/specific/sudo.py index 88a6cb07..8e5d30cd 100644 --- a/thefuck/specific/sudo.py +++ b/thefuck/specific/sudo.py @@ -1,24 +1,22 @@ -from functools import wraps import six +from decorator import decorator from ..types import Command -def sudo_support(fn): +@decorator +def sudo_support(fn, command, settings): """Removes sudo before calling fn and adds it after.""" - @wraps(fn) - def wrapper(command, settings): - if not command.script.startswith('sudo '): - return fn(command, settings) + if not command.script.startswith('sudo '): + return fn(command, settings) - result = fn(Command(command.script[5:], - command.stdout, - command.stderr), - settings) + result = fn(Command(command.script[5:], + command.stdout, + command.stderr), + settings) - if result and isinstance(result, six.string_types): - return u'sudo {}'.format(result) - elif isinstance(result, list): - return [u'sudo {}'.format(x) for x in result] - else: - return result - return wrapper \ No newline at end of file + if result and isinstance(result, six.string_types): + return u'sudo {}'.format(result) + elif isinstance(result, list): + return [u'sudo {}'.format(x) for x in result] + else: + return result diff --git a/thefuck/utils.py b/thefuck/utils.py index 2887397e..afa110e0 100644 --- a/thefuck/utils.py +++ b/thefuck/utils.py @@ -1,5 +1,6 @@ from difflib import get_close_matches from functools import wraps +from decorator import decorator import os import pickle @@ -47,12 +48,9 @@ def wrap_settings(params): print(settings.apt) """ - def decorator(fn): - @wraps(fn) - def wrapper(command, settings): - return fn(command, settings.update(**params)) - return wrapper - return decorator + def _wrap_settings(fn, command, settings): + return fn(command, settings.update(**params)) + return decorator(_wrap_settings) def memoize(fn): @@ -110,11 +108,9 @@ def replace_argument(script, from_, to): u' {} '.format(from_), u' {} '.format(to), 1) -def eager(fn): - @wraps(fn) - def wrapper(*args, **kwargs): - return list(fn(*args, **kwargs)) - return wrapper +@decorator +def eager(fn, *args, **kwargs): + return list(fn(*args, **kwargs)) @eager @@ -146,13 +142,10 @@ def is_app(command, *app_names): def for_app(*app_names): """Specifies that matching script is for on of app names.""" - def decorator(fn): - @wraps(fn) - def wrapper(command, settings): - if is_app(command, *app_names): - return fn(command, settings) - else: - return False + def _for_app(fn, command, settings): + if is_app(command, *app_names): + return fn(command, settings) + else: + return False - return wrapper - return decorator + return decorator(_for_app)