Code Duplication    Length = 20-23 lines in 3 locations

flask_extras/decorators.py 3 locations

@@ 8-27 (lines=20) @@
5
from flask import (
6
    abort,
7
    request,
8
)
9
10
11
def require_headers(headers=[]):
12
    """Check for required headers in a view.
13
14
    @require_headers(headers=['X-Foo'])
15
    def view():
16
        pass
17
    """
18
    def outer(func, *args, **kwargs):
19
        @wraps(func)
20
        def inner(*args, **kwargs):
21
            if headers:
22
                s1, s2 = set(headers), set([h[0] for h in request.headers])
23
                matches = s1.intersection(s2)
24
                diff = s1.difference(s2)
25
                if len(s1) != len(matches):
26
                    raise ValueError(
27
                        'Missing required header(s): {}'.format(list(diff)))
28
            return func(*args, **kwargs)
29
        return inner
30
    return outer
@@ 30-50 (lines=21) @@
27
                        'Missing required header(s): {}'.format(list(diff)))
28
            return func(*args, **kwargs)
29
        return inner
30
    return outer
31
32
33
def require_cookies(cookies=[]):
34
    """Check for required cookies in a view.
35
36
    @require_cookies(cookies=['csrftoken', 'session'])
37
    def view():
38
        pass
39
    """
40
    def outer(func, *args, **kwargs):
41
        @wraps(func)
42
        def inner(*args, **kwargs):
43
            if cookies:
44
                s1 = set(cookies)
45
                s2 = set([k for k, v in request.cookies.items()])
46
                matches = s1.intersection(s2)
47
                diff = s1.difference(s2)
48
                if len(s1) != len(matches):
49
                    raise ValueError(
50
                        'Missing required cookie(s): {}'.format(list(diff)))
51
            return func(*args, **kwargs)
52
        return inner
53
    return outer
@@ 93-115 (lines=23) @@
90
                                'for param {}.'.format(arg, param))
91
            return func(*args, **kwargs)
92
        return inner
93
    return outer
94
95
96
def require_form(values=[]):
97
    """Check for required form values.
98
99
    @require_form(values=['name', 'address'])
100
    def view():
101
        pass
102
    """
103
    def outer(func, *args, **kwargs):
104
        @wraps(func)
105
        def inner(*args, **kwargs):
106
            if request.method == 'POST':
107
                if values:
108
                    s1 = set(values)
109
                    s2 = set([k for k, v in request.form.items()])
110
                    matches = s1.intersection(s2)
111
                    diff = s1.difference(s2)
112
                    if len(s1) != len(matches):
113
                        raise ValueError(
114
                            'Missing required form '
115
                            'field(s): {}'.format(list(diff)))
116
            return func(*args, **kwargs)
117
        return inner
118
    return outer