mirror of
https://github.com/nvbn/thefuck.git
synced 2025-02-20 20:09:07 +00:00
Use decorator library
This commit is contained in:
parent
0c283ff2b8
commit
ebe53f0d18
2
setup.py
2
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',
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
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
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user