-
-
Notifications
You must be signed in to change notification settings - Fork 133
/
Copy pathshortcuts.py
178 lines (163 loc) · 6.7 KB
/
shortcuts.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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
"""OpenAPI core validation shortcuts module"""
import warnings
from typing import Any
from typing import Dict
from typing import NamedTuple
from typing import Optional
from typing import Type
from typing import Union
from openapi_core.spec import Spec
from openapi_core.validation.exceptions import ValidatorDetectError
from openapi_core.validation.request import V30RequestValidator
from openapi_core.validation.request import V31RequestValidator
from openapi_core.validation.request import V31WebhookRequestValidator
from openapi_core.validation.request.datatypes import RequestValidationResult
from openapi_core.validation.request.protocols import Request
from openapi_core.validation.request.protocols import RequestValidator
from openapi_core.validation.request.protocols import WebhookRequest
from openapi_core.validation.request.protocols import WebhookRequestValidator
from openapi_core.validation.request.proxies import SpecRequestValidatorProxy
from openapi_core.validation.response import V30ResponseValidator
from openapi_core.validation.response import V31ResponseValidator
from openapi_core.validation.response import V31WebhookResponseValidator
from openapi_core.validation.response.datatypes import ResponseValidationResult
from openapi_core.validation.response.protocols import Response
from openapi_core.validation.response.protocols import ResponseValidator
from openapi_core.validation.response.protocols import WebhookResponseValidator
from openapi_core.validation.response.proxies import SpecResponseValidatorProxy
AnyRequest = Union[Request, WebhookRequest]
RequestValidatorType = Type[RequestValidator]
ResponseValidatorType = Type[ResponseValidator]
WebhookRequestValidatorType = Type[WebhookRequestValidator]
WebhookResponseValidatorType = Type[WebhookResponseValidator]
AnyRequestValidatorType = Union[
RequestValidatorType, WebhookRequestValidatorType
]
AnyResponseValidatorType = Union[
ResponseValidatorType, WebhookResponseValidatorType
]
class SpecVersion(NamedTuple):
name: str
version: str
class SpecValidators(NamedTuple):
request_cls: Type[RequestValidator]
response_cls: Type[ResponseValidator]
webhook_request_cls: Optional[Type[WebhookRequestValidator]]
webhook_response_cls: Optional[Type[WebhookResponseValidator]]
SPECS: Dict[SpecVersion, SpecValidators] = {
SpecVersion("openapi", "3.0"): SpecValidators(
V30RequestValidator,
V30ResponseValidator,
None,
None,
),
SpecVersion("openapi", "3.1"): SpecValidators(
V31RequestValidator,
V31ResponseValidator,
V31WebhookRequestValidator,
V31WebhookResponseValidator,
),
}
def get_validators(spec: Spec) -> SpecValidators:
for v, validators in SPECS.items():
if v.name in spec and spec[v.name].startswith(v.version):
return validators
raise ValidatorDetectError("Spec schema version not detected")
def validate_request(
request: AnyRequest,
spec: Spec,
base_url: Optional[str] = None,
validator: Optional[SpecRequestValidatorProxy] = None,
cls: Optional[AnyRequestValidatorType] = None,
**validator_kwargs: Any,
) -> RequestValidationResult:
if isinstance(spec, (Request, WebhookRequest)) and isinstance(
request, Spec
):
warnings.warn(
"spec parameter as a first argument is deprecated. "
"Move it to second argument instead.",
DeprecationWarning,
)
request, spec = spec, request
if not isinstance(request, (Request, WebhookRequest)):
raise TypeError("'request' argument is not type of (Webhook)Request")
if not isinstance(spec, Spec):
raise TypeError("'spec' argument is not type of Spec")
if validator is not None and isinstance(request, Request):
warnings.warn(
"validator parameter is deprecated. Use cls instead.",
DeprecationWarning,
)
result = validator.validate(spec, request, base_url=base_url)
else:
if cls is None:
validators = get_validators(spec)
if isinstance(request, WebhookRequest):
cls = validators.webhook_request_cls
else:
cls = validators.request_cls
if cls is None:
raise ValidatorDetectError("Validator not found")
assert (
isinstance(cls, RequestValidator) and isinstance(request, Request)
) or (
isinstance(cls, WebhookRequestValidator)
and isinstance(request, WebhookRequest)
)
v = cls(spec, base_url=base_url, **validator_kwargs)
result = v.validate(request)
result.raise_for_errors()
return result
def validate_response(
request: Union[Request, WebhookRequest, Spec],
response: Union[Response, Request, WebhookRequest],
spec: Union[Spec, Response],
base_url: Optional[str] = None,
validator: Optional[SpecResponseValidatorProxy] = None,
cls: Optional[AnyResponseValidatorType] = None,
**validator_kwargs: Any,
) -> ResponseValidationResult:
if (
isinstance(request, Spec)
and isinstance(response, (Request, WebhookRequest))
and isinstance(spec, Response)
):
warnings.warn(
"spec parameter as a first argument is deprecated. "
"Move it to third argument instead.",
DeprecationWarning,
)
args = request, response, spec
spec, request, response = args
if not isinstance(request, (Request, WebhookRequest)):
raise TypeError("'request' argument is not type of (Webhook)Request")
if not isinstance(response, Response):
raise TypeError("'response' argument is not type of Response")
if not isinstance(spec, Spec):
raise TypeError("'spec' argument is not type of Spec")
if validator is not None and isinstance(request, Request):
warnings.warn(
"validator parameter is deprecated. Use cls instead.",
DeprecationWarning,
)
result = validator.validate(spec, request, response, base_url=base_url)
else:
if cls is None:
validators = get_validators(spec)
if isinstance(request, WebhookRequest):
cls = validators.webhook_response_cls
else:
cls = validators.response_cls
if cls is None:
raise ValidatorDetectError("Validator not found")
assert (
isinstance(cls, ResponseValidator) and isinstance(request, Request)
) or (
isinstance(cls, WebhookResponseValidator)
and isinstance(request, WebhookRequest)
)
v = cls(spec, base_url=base_url, **validator_kwargs)
result = v.validate(request, response)
result.raise_for_errors()
return result