Passed
Push — master ( 9301e1...0bc911 )
by Mingyu
01:47
created

app.decorators.validation   A

Complexity

Total Complexity 2

Size/Duplication

Total Lines 30
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 2
eloc 23
dl 0
loc 30
rs 10
c 0
b 0
f 0

1 Function

Rating   Name   Duplication   Size   Complexity  
A validate_with_pydantic() 0 13 2
1
from enum import Enum
2
from functools import wraps
3
from typing import Type
4
5
from flask import abort, request
6
from pydantic import BaseModel
7
from pydantic.error_wrappers import ValidationError
8
9
from app.context import context_property
10
11
12
class PayloadLocation(Enum):
13
    ARGS = 'args'
14
    JSON = 'json'
15
16
17
def validate_with_pydantic(payload_location: PayloadLocation, model: Type[BaseModel]):
18
    def decorator(fn):
19
        @wraps(fn)
20
        def wrapper(*args, **kwargs):
21
            try:
22
                instance = model(**getattr(request, payload_location.value))
23
24
                context_property.request_payload = instance
25
                return fn(*args, **kwargs)
26
            except ValidationError as e:
27
                abort(400, e.json())
28
        return wrapper
29
    return decorator
30