diff --git a/src/decorators.py b/src/decorators.py new file mode 100644 index 0000000..51b55f2 --- /dev/null +++ b/src/decorators.py @@ -0,0 +1,46 @@ +from functools import update_wrapper, wraps + + +def basic_decorator(func): + def wrapper(): + return func() + + return wrapper + + +def cool_decorator(func): + @wraps(func) + def wrapper(): + return func() + + return wrapper + + +def cooler_decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + return func(*args, **kwargs) + + return wrapper + + +def offset(offset_): + def decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + return func(*args, **kwargs) + offset_ + + return wrapper + + return decorator + + +class PrintNameUpper: + def __init__(self, func): + update_wrapper(self, func) + self.func = func + self.name_upper = str(func.__name__).upper() + + def __call__(self, *args, **kwargs): + print(self.name_upper) + return self.func(*args, **kwargs) diff --git a/tests/test_decorators.py b/tests/test_decorators.py new file mode 100644 index 0000000..85afe16 --- /dev/null +++ b/tests/test_decorators.py @@ -0,0 +1,68 @@ +from decorators import ( + PrintNameUpper, + basic_decorator, + cool_decorator, + cooler_decorator, + offset, +) + + +def test_basic_decorator_changes_name_and_doc(): + def bla(): + """blabla""" + pass + + assert "bla" == bla.__name__ + assert "blabla" == bla.__doc__ + + bla = basic_decorator(bla) + + assert "bla" != bla.__name__ + assert "blabla" != bla.__doc__ + + +def test_cool_decorator_keeps_name_and_doc(): + def bla(): + """blabla""" + pass + + assert "bla" == bla.__name__ + assert "blabla" == bla.__doc__ + + bla = cool_decorator(bla) + + assert "bla" == bla.__name__ + assert "blabla" == bla.__doc__ + + +def test_cooler_decorator_decorates_functions_with_args_and_kwargs(): + @cooler_decorator + def bla(a): + pass + + @cooler_decorator + def ble(a, b): + pass + + bla(1) + ble(1, b=2) + + +def test_decorator_with_args(): + @offset(42) + def bla(a): + return a + + value = 5 + assert (value + 42) == bla(value) + + +def test_class_decorator(capsys): + @PrintNameUpper + def bla(): + pass + + bla() + out = capsys.readouterr().out + assert "BLA" in out + assert "bla" not in out