Skip to content

Commit 221d212

Browse files
authored
Merge pull request #487 from p1c2u/feature/request-response-validator-backward-compatibility
RequestValidator and ResponseValidator backward compatibility
2 parents 99fb081 + e985598 commit 221d212

16 files changed

+589
-320
lines changed

openapi_core/validation/request/__init__.py

+20-12
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,16 @@
1111
DetectSpecRequestValidatorProxy,
1212
)
1313
from openapi_core.validation.request.proxies import SpecRequestValidatorProxy
14-
from openapi_core.validation.request.validators import RequestBodyValidator
1514
from openapi_core.validation.request.validators import (
16-
RequestParametersValidator,
15+
APICallRequestBodyValidator,
1716
)
18-
from openapi_core.validation.request.validators import RequestSecurityValidator
19-
from openapi_core.validation.request.validators import RequestValidator
17+
from openapi_core.validation.request.validators import (
18+
APICallRequestParametersValidator,
19+
)
20+
from openapi_core.validation.request.validators import (
21+
APICallRequestSecurityValidator,
22+
)
23+
from openapi_core.validation.request.validators import APICallRequestValidator
2024
from openapi_core.validation.request.validators import V30RequestBodyValidator
2125
from openapi_core.validation.request.validators import (
2226
V30RequestParametersValidator,
@@ -85,37 +89,41 @@
8589

8690
# spec validators
8791
openapi_v30_request_body_validator = SpecRequestValidatorProxy(
88-
RequestBodyValidator,
92+
APICallRequestBodyValidator,
8993
schema_unmarshallers_factory=oas30_request_schema_unmarshallers_factory,
9094
)
9195
openapi_v30_request_parameters_validator = SpecRequestValidatorProxy(
92-
RequestParametersValidator,
96+
APICallRequestParametersValidator,
9397
schema_unmarshallers_factory=oas30_request_schema_unmarshallers_factory,
9498
)
9599
openapi_v30_request_security_validator = SpecRequestValidatorProxy(
96-
RequestSecurityValidator,
100+
APICallRequestSecurityValidator,
97101
schema_unmarshallers_factory=oas30_request_schema_unmarshallers_factory,
98102
)
99103
openapi_v30_request_validator = SpecRequestValidatorProxy(
100-
RequestValidator,
104+
APICallRequestValidator,
101105
schema_unmarshallers_factory=oas30_request_schema_unmarshallers_factory,
106+
deprecated="openapi_v30_request_validator",
107+
use="V30RequestValidator",
102108
)
103109

104110
openapi_v31_request_body_validator = SpecRequestValidatorProxy(
105-
RequestBodyValidator,
111+
APICallRequestBodyValidator,
106112
schema_unmarshallers_factory=oas31_schema_unmarshallers_factory,
107113
)
108114
openapi_v31_request_parameters_validator = SpecRequestValidatorProxy(
109-
RequestParametersValidator,
115+
APICallRequestParametersValidator,
110116
schema_unmarshallers_factory=oas31_schema_unmarshallers_factory,
111117
)
112118
openapi_v31_request_security_validator = SpecRequestValidatorProxy(
113-
RequestSecurityValidator,
119+
APICallRequestSecurityValidator,
114120
schema_unmarshallers_factory=oas31_schema_unmarshallers_factory,
115121
)
116122
openapi_v31_request_validator = SpecRequestValidatorProxy(
117-
RequestValidator,
123+
APICallRequestValidator,
118124
schema_unmarshallers_factory=oas31_schema_unmarshallers_factory,
125+
deprecated="openapi_v31_request_validator",
126+
use="V31RequestValidator",
119127
)
120128

121129
# spec validators alias to the latest v3 version

openapi_core/validation/request/proxies.py

+13-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""OpenAPI spec validator validation proxies module."""
22
import warnings
3+
from typing import TYPE_CHECKING
34
from typing import Any
45
from typing import Iterator
56
from typing import Mapping
@@ -11,29 +12,35 @@
1112
from openapi_core.validation.exceptions import ValidatorDetectError
1213
from openapi_core.validation.request.datatypes import RequestValidationResult
1314
from openapi_core.validation.request.protocols import Request
14-
from openapi_core.validation.request.validators import (
15-
BaseAPICallRequestValidator,
16-
)
15+
16+
if TYPE_CHECKING:
17+
from openapi_core.validation.request.validators import (
18+
BaseAPICallRequestValidator,
19+
)
1720

1821

1922
class SpecRequestValidatorProxy:
2023
def __init__(
2124
self,
22-
validator_cls: Type[BaseAPICallRequestValidator],
25+
validator_cls: Type["BaseAPICallRequestValidator"],
26+
deprecated: str = "RequestValidator",
27+
use: Optional[str] = None,
2328
**validator_kwargs: Any,
2429
):
2530
self.validator_cls = validator_cls
2631
self.validator_kwargs = validator_kwargs
2732

33+
self.deprecated = deprecated
34+
self.use = use or self.validator_cls.__name__
35+
2836
def validate(
2937
self,
3038
spec: Spec,
3139
request: Request,
3240
base_url: Optional[str] = None,
3341
) -> RequestValidationResult:
3442
warnings.warn(
35-
"openapi_request_validator is deprecated. "
36-
f"Use {self.validator_cls.__name__} class instead.",
43+
f"{self.deprecated} is deprecated. Use {self.use} instead.",
3744
DeprecationWarning,
3845
)
3946
validator = self.validator_cls(

openapi_core/validation/request/validators.py

+29-14
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
from openapi_core.validation.request.protocols import BaseRequest
6666
from openapi_core.validation.request.protocols import Request
6767
from openapi_core.validation.request.protocols import WebhookRequest
68+
from openapi_core.validation.request.proxies import SpecRequestValidatorProxy
6869
from openapi_core.validation.validators import BaseAPICallValidator
6970
from openapi_core.validation.validators import BaseValidator
7071
from openapi_core.validation.validators import BaseWebhookValidator
@@ -105,7 +106,7 @@ def _validate(
105106
params = self._get_parameters(request.parameters, operation, path)
106107
except ParametersError as exc:
107108
params = exc.parameters
108-
params_errors = exc.context
109+
params_errors = exc.errors
109110
else:
110111
params_errors = []
111112

@@ -154,7 +155,7 @@ def _validate_parameters(
154155
params = self._get_parameters(request.parameters, path, operation)
155156
except ParametersError as exc:
156157
params = exc.parameters
157-
params_errors = exc.context
158+
params_errors = exc.errors
158159
else:
159160
params_errors = []
160161

@@ -328,7 +329,7 @@ def validate(self, request: WebhookRequest) -> RequestValidationResult:
328329
raise NotImplementedError
329330

330331

331-
class RequestBodyValidator(BaseAPICallRequestValidator):
332+
class APICallRequestBodyValidator(BaseAPICallRequestValidator):
332333
def validate(self, request: Request) -> RequestValidationResult:
333334
try:
334335
_, operation, _, _, _ = self._find_path(request)
@@ -338,7 +339,7 @@ def validate(self, request: Request) -> RequestValidationResult:
338339
return self._validate_body(request, operation)
339340

340341

341-
class RequestParametersValidator(BaseAPICallRequestValidator):
342+
class APICallRequestParametersValidator(BaseAPICallRequestValidator):
342343
def validate(self, request: Request) -> RequestValidationResult:
343344
try:
344345
path, operation, _, path_result, _ = self._find_path(request)
@@ -352,7 +353,7 @@ def validate(self, request: Request) -> RequestValidationResult:
352353
return self._validate_parameters(request, operation, path)
353354

354355

355-
class RequestSecurityValidator(BaseAPICallRequestValidator):
356+
class APICallRequestSecurityValidator(BaseAPICallRequestValidator):
356357
def validate(self, request: Request) -> RequestValidationResult:
357358
try:
358359
_, operation, _, _, _ = self._find_path(request)
@@ -362,7 +363,7 @@ def validate(self, request: Request) -> RequestValidationResult:
362363
return self._validate_security(request, operation)
363364

364365

365-
class RequestValidator(BaseAPICallRequestValidator):
366+
class APICallRequestValidator(BaseAPICallRequestValidator):
366367
def validate(self, request: Request) -> RequestValidationResult:
367368
try:
368369
path, operation, _, path_result, _ = self._find_path(request)
@@ -426,35 +427,35 @@ def validate(self, request: WebhookRequest) -> RequestValidationResult:
426427
return self._validate_security(request, operation)
427428

428429

429-
class V30RequestBodyValidator(RequestBodyValidator):
430+
class V30RequestBodyValidator(APICallRequestBodyValidator):
430431
schema_unmarshallers_factory = oas30_request_schema_unmarshallers_factory
431432

432433

433-
class V30RequestParametersValidator(RequestParametersValidator):
434+
class V30RequestParametersValidator(APICallRequestParametersValidator):
434435
schema_unmarshallers_factory = oas30_request_schema_unmarshallers_factory
435436

436437

437-
class V30RequestSecurityValidator(RequestSecurityValidator):
438+
class V30RequestSecurityValidator(APICallRequestSecurityValidator):
438439
schema_unmarshallers_factory = oas30_request_schema_unmarshallers_factory
439440

440441

441-
class V30RequestValidator(RequestValidator):
442+
class V30RequestValidator(APICallRequestValidator):
442443
schema_unmarshallers_factory = oas30_request_schema_unmarshallers_factory
443444

444445

445-
class V31RequestBodyValidator(RequestBodyValidator):
446+
class V31RequestBodyValidator(APICallRequestBodyValidator):
446447
schema_unmarshallers_factory = oas31_schema_unmarshallers_factory
447448

448449

449-
class V31RequestParametersValidator(RequestParametersValidator):
450+
class V31RequestParametersValidator(APICallRequestParametersValidator):
450451
schema_unmarshallers_factory = oas31_schema_unmarshallers_factory
451452

452453

453-
class V31RequestSecurityValidator(RequestSecurityValidator):
454+
class V31RequestSecurityValidator(APICallRequestSecurityValidator):
454455
schema_unmarshallers_factory = oas31_schema_unmarshallers_factory
455456

456457

457-
class V31RequestValidator(RequestValidator):
458+
class V31RequestValidator(APICallRequestValidator):
458459
schema_unmarshallers_factory = oas31_schema_unmarshallers_factory
459460
path_finder_cls = WebhookPathFinder
460461

@@ -477,3 +478,17 @@ class V31WebhookRequestSecurityValidator(WebhookRequestSecurityValidator):
477478
class V31WebhookRequestValidator(WebhookRequestValidator):
478479
schema_unmarshallers_factory = oas31_schema_unmarshallers_factory
479480
path_finder_cls = WebhookPathFinder
481+
482+
483+
# backward compatibility
484+
class RequestValidator(SpecRequestValidatorProxy):
485+
def __init__(
486+
self,
487+
schema_unmarshallers_factory: SchemaUnmarshallersFactory,
488+
**kwargs: Any,
489+
):
490+
super().__init__(
491+
APICallRequestValidator,
492+
schema_unmarshallers_factory=schema_unmarshallers_factory,
493+
**kwargs,
494+
)

openapi_core/validation/response/__init__.py

+17-9
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,15 @@
1111
DetectResponseValidatorProxy,
1212
)
1313
from openapi_core.validation.response.proxies import SpecResponseValidatorProxy
14-
from openapi_core.validation.response.validators import ResponseDataValidator
1514
from openapi_core.validation.response.validators import (
16-
ResponseHeadersValidator,
15+
APICallResponseDataValidator,
16+
)
17+
from openapi_core.validation.response.validators import (
18+
APICallResponseHeadersValidator,
19+
)
20+
from openapi_core.validation.response.validators import (
21+
APICallResponseValidator,
1722
)
18-
from openapi_core.validation.response.validators import ResponseValidator
1923
from openapi_core.validation.response.validators import (
2024
V30ResponseDataValidator,
2125
)
@@ -72,29 +76,33 @@
7276

7377
# spec validators
7478
openapi_v30_response_data_validator = SpecResponseValidatorProxy(
75-
ResponseDataValidator,
79+
APICallResponseDataValidator,
7680
schema_unmarshallers_factory=oas30_response_schema_unmarshallers_factory,
7781
)
7882
openapi_v30_response_headers_validator = SpecResponseValidatorProxy(
79-
ResponseHeadersValidator,
83+
APICallResponseHeadersValidator,
8084
schema_unmarshallers_factory=oas30_response_schema_unmarshallers_factory,
8185
)
8286
openapi_v30_response_validator = SpecResponseValidatorProxy(
83-
ResponseValidator,
87+
APICallResponseValidator,
8488
schema_unmarshallers_factory=oas30_response_schema_unmarshallers_factory,
89+
deprecated="openapi_v30_response_validator",
90+
use="V30ResponseValidator",
8591
)
8692

8793
openapi_v31_response_data_validator = SpecResponseValidatorProxy(
88-
ResponseDataValidator,
94+
APICallResponseDataValidator,
8995
schema_unmarshallers_factory=oas31_schema_unmarshallers_factory,
9096
)
9197
openapi_v31_response_headers_validator = SpecResponseValidatorProxy(
92-
ResponseHeadersValidator,
98+
APICallResponseHeadersValidator,
9399
schema_unmarshallers_factory=oas31_schema_unmarshallers_factory,
94100
)
95101
openapi_v31_response_validator = SpecResponseValidatorProxy(
96-
ResponseValidator,
102+
APICallResponseValidator,
97103
schema_unmarshallers_factory=oas31_schema_unmarshallers_factory,
104+
deprecated="openapi_v31_response_validator",
105+
use="V31ResponseValidator",
98106
)
99107

100108
# spec validators alias to the latest v3 version

openapi_core/validation/response/proxies.py

+13-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"""OpenAPI spec validator validation proxies module."""
22
import warnings
3+
from typing import TYPE_CHECKING
34
from typing import Any
45
from typing import Iterator
56
from typing import Mapping
@@ -12,20 +13,27 @@
1213
from openapi_core.validation.request.protocols import Request
1314
from openapi_core.validation.response.datatypes import ResponseValidationResult
1415
from openapi_core.validation.response.protocols import Response
15-
from openapi_core.validation.response.validators import (
16-
BaseAPICallResponseValidator,
17-
)
16+
17+
if TYPE_CHECKING:
18+
from openapi_core.validation.response.validators import (
19+
BaseAPICallResponseValidator,
20+
)
1821

1922

2023
class SpecResponseValidatorProxy:
2124
def __init__(
2225
self,
23-
validator_cls: Type[BaseAPICallResponseValidator],
26+
validator_cls: Type["BaseAPICallResponseValidator"],
27+
deprecated: str = "ResponseValidator",
28+
use: Optional[str] = None,
2429
**validator_kwargs: Any,
2530
):
2631
self.validator_cls = validator_cls
2732
self.validator_kwargs = validator_kwargs
2833

34+
self.deprecated = deprecated
35+
self.use = use or self.validator_cls.__name__
36+
2937
def validate(
3038
self,
3139
spec: Spec,
@@ -34,8 +42,7 @@ def validate(
3442
base_url: Optional[str] = None,
3543
) -> ResponseValidationResult:
3644
warnings.warn(
37-
"openapi_response_validator is deprecated. "
38-
f"Use {self.validator_cls.__name__} class instead.",
45+
f"{self.deprecated} is deprecated. Use {self.use} instead.",
3946
DeprecationWarning,
4047
)
4148
validator = self.validator_cls(

0 commit comments

Comments
 (0)