Passed
Push — master ( 622bd5...daf764 )
by Mingyu
57s
created

{{cookiecutter.project_slug}}.app.decorators.validation   A

Complexity

Total Complexity 3

Size/Duplication

Total Lines 34
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 3
eloc 22
dl 0
loc 34
rs 10
c 0
b 0
f 0

1 Function

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