Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions src/decorators.py
Original file line number Diff line number Diff line change
@@ -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)
68 changes: 68 additions & 0 deletions tests/test_decorators.py
Original file line number Diff line number Diff line change
@@ -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