Skip to content

Commit 6cc9050

Browse files
committed
unmarshallers and validators restructure
1 parent dc5a4e6 commit 6cc9050

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+3097
-1540
lines changed

openapi_core/__init__.py

+43-11
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,41 @@
11
"""OpenAPI core module"""
2+
from openapi_core.shortcuts import unmarshal_request
3+
from openapi_core.shortcuts import unmarshal_response
4+
from openapi_core.shortcuts import unmarshal_webhook_request
5+
from openapi_core.shortcuts import unmarshal_webhook_response
6+
from openapi_core.shortcuts import validate_request
7+
from openapi_core.shortcuts import validate_response
28
from openapi_core.spec import Spec
9+
from openapi_core.unmarshalling.request import RequestValidator
10+
from openapi_core.unmarshalling.request import V3RequestUnmarshaller
11+
from openapi_core.unmarshalling.request import V3WebhookRequestUnmarshaller
12+
from openapi_core.unmarshalling.request import V30RequestUnmarshaller
13+
from openapi_core.unmarshalling.request import V31RequestUnmarshaller
14+
from openapi_core.unmarshalling.request import V31WebhookRequestUnmarshaller
15+
from openapi_core.unmarshalling.request import openapi_request_validator
16+
from openapi_core.unmarshalling.request import openapi_v3_request_validator
17+
from openapi_core.unmarshalling.request import openapi_v30_request_validator
18+
from openapi_core.unmarshalling.request import openapi_v31_request_validator
19+
from openapi_core.unmarshalling.response import ResponseValidator
20+
from openapi_core.unmarshalling.response import V3ResponseUnmarshaller
21+
from openapi_core.unmarshalling.response import V3WebhookResponseUnmarshaller
22+
from openapi_core.unmarshalling.response import V30ResponseUnmarshaller
23+
from openapi_core.unmarshalling.response import V31ResponseUnmarshaller
24+
from openapi_core.unmarshalling.response import V31WebhookResponseUnmarshaller
25+
from openapi_core.unmarshalling.response import openapi_response_validator
26+
from openapi_core.unmarshalling.response import openapi_v3_response_validator
27+
from openapi_core.unmarshalling.response import openapi_v30_response_validator
28+
from openapi_core.unmarshalling.response import openapi_v31_response_validator
329
from openapi_core.validation.request import V3RequestValidator
430
from openapi_core.validation.request import V3WebhookRequestValidator
531
from openapi_core.validation.request import V30RequestValidator
632
from openapi_core.validation.request import V31RequestValidator
733
from openapi_core.validation.request import V31WebhookRequestValidator
8-
from openapi_core.validation.request import openapi_request_validator
9-
from openapi_core.validation.request import openapi_v3_request_validator
10-
from openapi_core.validation.request import openapi_v30_request_validator
11-
from openapi_core.validation.request import openapi_v31_request_validator
1234
from openapi_core.validation.response import V3ResponseValidator
1335
from openapi_core.validation.response import V3WebhookResponseValidator
1436
from openapi_core.validation.response import V30ResponseValidator
1537
from openapi_core.validation.response import V31ResponseValidator
1638
from openapi_core.validation.response import V31WebhookResponseValidator
17-
from openapi_core.validation.response import openapi_response_validator
18-
from openapi_core.validation.response import openapi_v3_response_validator
19-
from openapi_core.validation.response import openapi_v30_response_validator
20-
from openapi_core.validation.response import openapi_v31_response_validator
21-
from openapi_core.validation.shortcuts import validate_request
22-
from openapi_core.validation.shortcuts import validate_response
2339

2440
__author__ = "Artur Maciag"
2541
__email__ = "maciag.artur@gmail.com"
@@ -29,18 +45,34 @@
2945

3046
__all__ = [
3147
"Spec",
48+
"unmarshal_request",
49+
"unmarshal_response",
50+
"unmarshal_webhook_request",
51+
"unmarshal_webhook_response",
3252
"validate_request",
3353
"validate_response",
54+
"V30RequestUnmarshaller",
55+
"V30ResponseUnmarshaller",
56+
"V31RequestUnmarshaller",
57+
"V31ResponseUnmarshaller",
58+
"V31WebhookRequestUnmarshaller",
59+
"V31WebhookResponseUnmarshaller",
60+
"V3RequestUnmarshaller",
61+
"V3ResponseUnmarshaller",
62+
"V3WebhookRequestUnmarshaller",
63+
"V3WebhookResponseUnmarshaller",
3464
"V30RequestValidator",
35-
"V31RequestValidator",
3665
"V30ResponseValidator",
66+
"V31RequestValidator",
3767
"V31ResponseValidator",
3868
"V31WebhookRequestValidator",
3969
"V31WebhookResponseValidator",
4070
"V3RequestValidator",
4171
"V3ResponseValidator",
4272
"V3WebhookRequestValidator",
4373
"V3WebhookResponseValidator",
74+
"RequestValidator",
75+
"ResponseValidator",
4476
"openapi_v3_request_validator",
4577
"openapi_v30_request_validator",
4678
"openapi_v31_request_validator",

openapi_core/contrib/django/middlewares.py

+10-8
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@
1010
from openapi_core.contrib.django.handlers import DjangoOpenAPIErrorsHandler
1111
from openapi_core.contrib.django.requests import DjangoOpenAPIRequest
1212
from openapi_core.contrib.django.responses import DjangoOpenAPIResponse
13-
from openapi_core.validation.processors import OpenAPIProcessor
14-
from openapi_core.validation.request.datatypes import RequestValidationResult
15-
from openapi_core.validation.response.datatypes import ResponseValidationResult
13+
from openapi_core.unmarshalling.processors import UnmarshallingProcessor
14+
from openapi_core.unmarshalling.request.datatypes import RequestUnmarshalResult
15+
from openapi_core.unmarshalling.response.datatypes import (
16+
ResponseUnmarshalResult,
17+
)
1618

1719

1820
class DjangoOpenAPIMiddleware:
@@ -26,19 +28,19 @@ def __init__(self, get_response: Callable[[HttpRequest], HttpResponse]):
2628
if not hasattr(settings, "OPENAPI_SPEC"):
2729
raise ImproperlyConfigured("OPENAPI_SPEC not defined in settings")
2830

29-
self.validation_processor = OpenAPIProcessor(settings.OPENAPI_SPEC)
31+
self.processor = UnmarshallingProcessor(settings.OPENAPI_SPEC)
3032

3133
def __call__(self, request: HttpRequest) -> HttpResponse:
3234
openapi_request = self._get_openapi_request(request)
33-
req_result = self.validation_processor.process_request(openapi_request)
35+
req_result = self.processor.process_request(openapi_request)
3436
if req_result.errors:
3537
response = self._handle_request_errors(req_result, request)
3638
else:
3739
request.openapi = req_result
3840
response = self.get_response(request)
3941

4042
openapi_response = self._get_openapi_response(response)
41-
resp_result = self.validation_processor.process_response(
43+
resp_result = self.processor.process_response(
4244
openapi_request, openapi_response
4345
)
4446
if resp_result.errors:
@@ -47,13 +49,13 @@ def __call__(self, request: HttpRequest) -> HttpResponse:
4749
return response
4850

4951
def _handle_request_errors(
50-
self, request_result: RequestValidationResult, req: HttpRequest
52+
self, request_result: RequestUnmarshalResult, req: HttpRequest
5153
) -> JsonResponse:
5254
return self.errors_handler.handle(request_result.errors, req, None)
5355

5456
def _handle_response_errors(
5557
self,
56-
response_result: ResponseValidationResult,
58+
response_result: ResponseUnmarshalResult,
5759
req: HttpRequest,
5860
resp: HttpResponse,
5961
) -> JsonResponse:

openapi_core/contrib/django/requests.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from werkzeug.datastructures import Headers
77
from werkzeug.datastructures import ImmutableMultiDict
88

9-
from openapi_core.validation.request.datatypes import RequestParameters
9+
from openapi_core.datatypes import RequestParameters
1010

1111
# https://docs.djangoproject.com/en/stable/topics/http/urls/
1212
#

openapi_core/contrib/falcon/middlewares.py

+18-16
Original file line numberDiff line numberDiff line change
@@ -10,31 +10,33 @@
1010
from openapi_core.contrib.falcon.requests import FalconOpenAPIRequest
1111
from openapi_core.contrib.falcon.responses import FalconOpenAPIResponse
1212
from openapi_core.spec import Spec
13-
from openapi_core.validation.processors import OpenAPIProcessor
14-
from openapi_core.validation.request.datatypes import RequestValidationResult
15-
from openapi_core.validation.request.protocols import RequestValidator
16-
from openapi_core.validation.response.datatypes import ResponseValidationResult
17-
from openapi_core.validation.response.protocols import ResponseValidator
13+
from openapi_core.unmarshalling.processors import UnmarshallingProcessor
14+
from openapi_core.unmarshalling.request.datatypes import RequestUnmarshalResult
15+
from openapi_core.unmarshalling.request.types import RequestUnmarshallerType
16+
from openapi_core.unmarshalling.response.datatypes import (
17+
ResponseUnmarshalResult,
18+
)
19+
from openapi_core.unmarshalling.response.types import ResponseUnmarshallerType
1820

1921

20-
class FalconOpenAPIMiddleware(OpenAPIProcessor):
22+
class FalconOpenAPIMiddleware(UnmarshallingProcessor):
2123
request_class = FalconOpenAPIRequest
2224
response_class = FalconOpenAPIResponse
2325
errors_handler = FalconOpenAPIErrorsHandler()
2426

2527
def __init__(
2628
self,
2729
spec: Spec,
28-
request_validator_cls: Optional[Type[RequestValidator]] = None,
29-
response_validator_cls: Optional[Type[ResponseValidator]] = None,
30+
request_unmarshaller_cls: Optional[RequestUnmarshallerType] = None,
31+
response_unmarshaller_cls: Optional[ResponseUnmarshallerType] = None,
3032
request_class: Type[FalconOpenAPIRequest] = FalconOpenAPIRequest,
3133
response_class: Type[FalconOpenAPIResponse] = FalconOpenAPIResponse,
3234
errors_handler: Optional[FalconOpenAPIErrorsHandler] = None,
3335
):
3436
super().__init__(
3537
spec,
36-
request_validator_cls=request_validator_cls,
37-
response_validator_cls=response_validator_cls,
38+
request_unmarshaller_cls=request_unmarshaller_cls,
39+
response_unmarshaller_cls=response_unmarshaller_cls,
3840
)
3941
self.request_class = request_class or self.request_class
4042
self.response_class = response_class or self.response_class
@@ -44,16 +46,16 @@ def __init__(
4446
def from_spec(
4547
cls,
4648
spec: Spec,
47-
request_validator_cls: Optional[Type[RequestValidator]] = None,
48-
response_validator_cls: Optional[Type[ResponseValidator]] = None,
49+
request_unmarshaller_cls: Optional[RequestUnmarshallerType] = None,
50+
response_unmarshaller_cls: Optional[ResponseUnmarshallerType] = None,
4951
request_class: Type[FalconOpenAPIRequest] = FalconOpenAPIRequest,
5052
response_class: Type[FalconOpenAPIResponse] = FalconOpenAPIResponse,
5153
errors_handler: Optional[FalconOpenAPIErrorsHandler] = None,
5254
) -> "FalconOpenAPIMiddleware":
5355
return cls(
5456
spec,
55-
request_validator_cls=request_validator_cls,
56-
response_validator_cls=response_validator_cls,
57+
request_unmarshaller_cls=request_unmarshaller_cls,
58+
response_unmarshaller_cls=response_unmarshaller_cls,
5759
request_class=request_class,
5860
response_class=response_class,
5961
errors_handler=errors_handler,
@@ -82,15 +84,15 @@ def _handle_request_errors(
8284
self,
8385
req: Request,
8486
resp: Response,
85-
request_result: RequestValidationResult,
87+
request_result: RequestUnmarshalResult,
8688
) -> None:
8789
return self.errors_handler.handle(req, resp, request_result.errors)
8890

8991
def _handle_response_errors(
9092
self,
9193
req: Request,
9294
resp: Response,
93-
response_result: ResponseValidationResult,
95+
response_result: ResponseUnmarshalResult,
9496
) -> None:
9597
return self.errors_handler.handle(req, resp, response_result.errors)
9698

openapi_core/contrib/falcon/requests.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from werkzeug.datastructures import Headers
1010
from werkzeug.datastructures import ImmutableMultiDict
1111

12-
from openapi_core.validation.request.datatypes import RequestParameters
12+
from openapi_core.datatypes import RequestParameters
1313

1414

1515
class FalconOpenAPIRequest:

openapi_core/contrib/flask/decorators.py

+19-17
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,21 @@
1515
from openapi_core.contrib.flask.requests import FlaskOpenAPIRequest
1616
from openapi_core.contrib.flask.responses import FlaskOpenAPIResponse
1717
from openapi_core.spec import Spec
18-
from openapi_core.validation.processors import OpenAPIProcessor
19-
from openapi_core.validation.request.datatypes import RequestValidationResult
20-
from openapi_core.validation.request.protocols import RequestValidator
21-
from openapi_core.validation.response.datatypes import ResponseValidationResult
22-
from openapi_core.validation.response.protocols import ResponseValidator
18+
from openapi_core.unmarshalling.processors import UnmarshallingProcessor
19+
from openapi_core.unmarshalling.request.datatypes import RequestUnmarshalResult
20+
from openapi_core.unmarshalling.request.types import RequestUnmarshallerType
21+
from openapi_core.unmarshalling.response.datatypes import (
22+
ResponseUnmarshalResult,
23+
)
24+
from openapi_core.unmarshalling.response.types import ResponseUnmarshallerType
2325

2426

25-
class FlaskOpenAPIViewDecorator(OpenAPIProcessor):
27+
class FlaskOpenAPIViewDecorator(UnmarshallingProcessor):
2628
def __init__(
2729
self,
2830
spec: Spec,
29-
request_validator_cls: Optional[Type[RequestValidator]] = None,
30-
response_validator_cls: Optional[Type[ResponseValidator]] = None,
31+
request_unmarshaller_cls: Optional[RequestUnmarshallerType] = None,
32+
response_unmarshaller_cls: Optional[ResponseUnmarshallerType] = None,
3133
request_class: Type[FlaskOpenAPIRequest] = FlaskOpenAPIRequest,
3234
response_class: Type[FlaskOpenAPIResponse] = FlaskOpenAPIResponse,
3335
request_provider: Type[FlaskRequestProvider] = FlaskRequestProvider,
@@ -37,8 +39,8 @@ def __init__(
3739
):
3840
super().__init__(
3941
spec,
40-
request_validator_cls=request_validator_cls,
41-
response_validator_cls=response_validator_cls,
42+
request_unmarshaller_cls=request_unmarshaller_cls,
43+
response_unmarshaller_cls=response_unmarshaller_cls,
4244
)
4345
self.request_class = request_class
4446
self.response_class = response_class
@@ -68,7 +70,7 @@ def decorated(*args: Any, **kwargs: Any) -> Response:
6870

6971
def _handle_request_view(
7072
self,
71-
request_result: RequestValidationResult,
73+
request_result: RequestUnmarshalResult,
7274
view: Callable[[Any], Response],
7375
*args: Any,
7476
**kwargs: Any
@@ -79,12 +81,12 @@ def _handle_request_view(
7981
return make_response(rv)
8082

8183
def _handle_request_errors(
82-
self, request_result: RequestValidationResult
84+
self, request_result: RequestUnmarshalResult
8385
) -> Response:
8486
return self.openapi_errors_handler.handle(request_result.errors)
8587

8688
def _handle_response_errors(
87-
self, response_result: ResponseValidationResult
89+
self, response_result: ResponseUnmarshalResult
8890
) -> Response:
8991
return self.openapi_errors_handler.handle(response_result.errors)
9092

@@ -103,8 +105,8 @@ def _get_openapi_response(
103105
def from_spec(
104106
cls,
105107
spec: Spec,
106-
request_validator_cls: Optional[Type[RequestValidator]] = None,
107-
response_validator_cls: Optional[Type[ResponseValidator]] = None,
108+
request_unmarshaller_cls: Optional[RequestUnmarshallerType] = None,
109+
response_unmarshaller_cls: Optional[ResponseUnmarshallerType] = None,
108110
request_class: Type[FlaskOpenAPIRequest] = FlaskOpenAPIRequest,
109111
response_class: Type[FlaskOpenAPIResponse] = FlaskOpenAPIResponse,
110112
request_provider: Type[FlaskRequestProvider] = FlaskRequestProvider,
@@ -114,8 +116,8 @@ def from_spec(
114116
) -> "FlaskOpenAPIViewDecorator":
115117
return cls(
116118
spec,
117-
request_validator_cls=request_validator_cls,
118-
response_validator_cls=response_validator_cls,
119+
request_unmarshaller_cls=request_unmarshaller_cls,
120+
response_unmarshaller_cls=response_unmarshaller_cls,
119121
request_class=request_class,
120122
response_class=response_class,
121123
request_provider=request_provider,

openapi_core/contrib/flask/requests.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from werkzeug.datastructures import ImmutableMultiDict
55

66
from openapi_core.contrib.werkzeug.requests import WerkzeugOpenAPIRequest
7-
from openapi_core.validation.request.datatypes import RequestParameters
7+
from openapi_core.datatypes import RequestParameters
88

99

1010
class FlaskOpenAPIRequest(WerkzeugOpenAPIRequest):

openapi_core/contrib/requests/requests.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from werkzeug.datastructures import ImmutableMultiDict
1212

1313
from openapi_core.contrib.requests.protocols import SupportsCookieJar
14-
from openapi_core.validation.request.datatypes import RequestParameters
14+
from openapi_core.datatypes import RequestParameters
1515

1616

1717
class RequestsOpenAPIRequest:

openapi_core/contrib/starlette/requests.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from asgiref.sync import AsyncToSync
55
from starlette.requests import Request
66

7-
from openapi_core.validation.request.datatypes import RequestParameters
7+
from openapi_core.datatypes import RequestParameters
88

99

1010
class StarletteOpenAPIRequest:

openapi_core/contrib/werkzeug/requests.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from werkzeug.datastructures import ImmutableMultiDict
77
from werkzeug.wrappers import Request
88

9-
from openapi_core.validation.request.datatypes import RequestParameters
9+
from openapi_core.datatypes import RequestParameters
1010

1111
# http://flask.pocoo.org/docs/1.0/quickstart/#variable-rules
1212
PATH_PARAMETER_PATTERN = r"<(?:(?:string|int|float|path|uuid):)?(\w+)>"

0 commit comments

Comments
 (0)