-
-
Notifications
You must be signed in to change notification settings - Fork 133
/
Copy pathproxies.py
115 lines (101 loc) · 3.36 KB
/
proxies.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
"""OpenAPI spec validator validation proxies module."""
import warnings
from typing import TYPE_CHECKING
from typing import Any
from typing import Iterator
from typing import Mapping
from typing import Optional
from typing import Tuple
from typing import Type
from openapi_core.spec import Spec
from openapi_core.validation.exceptions import ValidatorDetectError
from openapi_core.validation.request.datatypes import RequestValidationResult
from openapi_core.validation.request.protocols import Request
if TYPE_CHECKING:
from openapi_core.validation.request.validators import (
BaseAPICallRequestValidator,
)
class SpecRequestValidatorProxy:
def __init__(
self,
validator_cls: Type["BaseAPICallRequestValidator"],
deprecated: str = "RequestValidator",
use: Optional[str] = None,
**validator_kwargs: Any,
):
self.validator_cls = validator_cls
self.validator_kwargs = validator_kwargs
self.deprecated = deprecated
self.use = use or self.validator_cls.__name__
def validate(
self,
spec: Spec,
request: Request,
base_url: Optional[str] = None,
) -> RequestValidationResult:
warnings.warn(
f"{self.deprecated} is deprecated. Use {self.use} instead.",
DeprecationWarning,
)
validator = self.validator_cls(
spec, base_url=base_url, **self.validator_kwargs
)
return validator.validate(request)
def is_valid(
self,
spec: Spec,
request: Request,
base_url: Optional[str] = None,
) -> bool:
validator = self.validator_cls(
spec, base_url=base_url, **self.validator_kwargs
)
error = next(validator.iter_errors(request), None)
return error is None
def iter_errors(
self,
spec: Spec,
request: Request,
base_url: Optional[str] = None,
) -> Iterator[Exception]:
validator = self.validator_cls(
spec, base_url=base_url, **self.validator_kwargs
)
yield from validator.iter_errors(request)
class DetectSpecRequestValidatorProxy:
def __init__(
self, choices: Mapping[Tuple[str, str], SpecRequestValidatorProxy]
):
self.choices = choices
def detect(self, spec: Spec) -> SpecRequestValidatorProxy:
for (key, value), validator in self.choices.items():
if key in spec and spec[key].startswith(value):
return validator
raise ValidatorDetectError("Spec schema version not detected")
def validate(
self,
spec: Spec,
request: Request,
base_url: Optional[str] = None,
) -> RequestValidationResult:
validator = self.detect(spec)
return validator.validate(spec, request, base_url=base_url)
def is_valid(
self,
spec: Spec,
request: Request,
base_url: Optional[str] = None,
) -> bool:
validator = self.detect(spec)
error = next(
validator.iter_errors(spec, request, base_url=base_url), None
)
return error is None
def iter_errors(
self,
spec: Spec,
request: Request,
base_url: Optional[str] = None,
) -> Iterator[Exception]:
validator = self.detect(spec)
yield from validator.iter_errors(spec, request, base_url=base_url)