Skip to content

Commit d039190

Browse files
authored
Merge pull request #779 from python-openapi/fix/openapi-config-pass-to-validators-and-unmarshallers-fix
OpenAPI config passed to validators and unmarshallers fix
2 parents 4729584 + bc05481 commit d039190

File tree

6 files changed

+320
-16
lines changed

6 files changed

+320
-16
lines changed

Diff for: openapi_core/app.py

+84-8
Original file line numberDiff line numberDiff line change
@@ -204,63 +204,139 @@ def request_validator(self) -> RequestValidator:
204204
if self.request_validator_cls is None:
205205
raise SpecError("Validator class not found")
206206
return self.request_validator_cls(
207-
self.spec, base_url=self.config.server_base_url
207+
self.spec,
208+
base_url=self.config.server_base_url,
209+
style_deserializers_factory=self.config.style_deserializers_factory,
210+
media_type_deserializers_factory=self.config.media_type_deserializers_factory,
211+
schema_casters_factory=self.config.schema_casters_factory,
212+
schema_validators_factory=self.config.schema_validators_factory,
213+
spec_validator_cls=self.config.spec_validator_cls,
214+
extra_format_validators=self.config.extra_format_validators,
215+
extra_media_type_deserializers=self.config.extra_media_type_deserializers,
216+
security_provider_factory=self.config.security_provider_factory,
208217
)
209218

210219
@property
211220
def response_validator(self) -> ResponseValidator:
212221
if self.response_validator_cls is None:
213222
raise SpecError("Validator class not found")
214223
return self.response_validator_cls(
215-
self.spec, base_url=self.config.server_base_url
224+
self.spec,
225+
base_url=self.config.server_base_url,
226+
style_deserializers_factory=self.config.style_deserializers_factory,
227+
media_type_deserializers_factory=self.config.media_type_deserializers_factory,
228+
schema_casters_factory=self.config.schema_casters_factory,
229+
schema_validators_factory=self.config.schema_validators_factory,
230+
spec_validator_cls=self.config.spec_validator_cls,
231+
extra_format_validators=self.config.extra_format_validators,
232+
extra_media_type_deserializers=self.config.extra_media_type_deserializers,
216233
)
217234

218235
@property
219236
def webhook_request_validator(self) -> WebhookRequestValidator:
220237
if self.webhook_request_validator_cls is None:
221238
raise SpecError("Validator class not found")
222239
return self.webhook_request_validator_cls(
223-
self.spec, base_url=self.config.server_base_url
240+
self.spec,
241+
base_url=self.config.server_base_url,
242+
style_deserializers_factory=self.config.style_deserializers_factory,
243+
media_type_deserializers_factory=self.config.media_type_deserializers_factory,
244+
schema_casters_factory=self.config.schema_casters_factory,
245+
schema_validators_factory=self.config.schema_validators_factory,
246+
spec_validator_cls=self.config.spec_validator_cls,
247+
extra_format_validators=self.config.extra_format_validators,
248+
extra_media_type_deserializers=self.config.extra_media_type_deserializers,
249+
security_provider_factory=self.config.security_provider_factory,
224250
)
225251

226252
@property
227253
def webhook_response_validator(self) -> WebhookResponseValidator:
228254
if self.webhook_response_validator_cls is None:
229255
raise SpecError("Validator class not found")
230256
return self.webhook_response_validator_cls(
231-
self.spec, base_url=self.config.server_base_url
257+
self.spec,
258+
base_url=self.config.server_base_url,
259+
style_deserializers_factory=self.config.style_deserializers_factory,
260+
media_type_deserializers_factory=self.config.media_type_deserializers_factory,
261+
schema_casters_factory=self.config.schema_casters_factory,
262+
schema_validators_factory=self.config.schema_validators_factory,
263+
spec_validator_cls=self.config.spec_validator_cls,
264+
extra_format_validators=self.config.extra_format_validators,
265+
extra_media_type_deserializers=self.config.extra_media_type_deserializers,
232266
)
233267

234268
@property
235269
def request_unmarshaller(self) -> RequestUnmarshaller:
236270
if self.request_unmarshaller_cls is None:
237271
raise SpecError("Unmarshaller class not found")
238272
return self.request_unmarshaller_cls(
239-
self.spec, base_url=self.config.server_base_url
273+
self.spec,
274+
base_url=self.config.server_base_url,
275+
style_deserializers_factory=self.config.style_deserializers_factory,
276+
media_type_deserializers_factory=self.config.media_type_deserializers_factory,
277+
schema_casters_factory=self.config.schema_casters_factory,
278+
schema_validators_factory=self.config.schema_validators_factory,
279+
spec_validator_cls=self.config.spec_validator_cls,
280+
extra_format_validators=self.config.extra_format_validators,
281+
extra_media_type_deserializers=self.config.extra_media_type_deserializers,
282+
security_provider_factory=self.config.security_provider_factory,
283+
schema_unmarshallers_factory=self.config.schema_unmarshallers_factory,
284+
extra_format_unmarshallers=self.config.extra_format_unmarshallers,
240285
)
241286

242287
@property
243288
def response_unmarshaller(self) -> ResponseUnmarshaller:
244289
if self.response_unmarshaller_cls is None:
245290
raise SpecError("Unmarshaller class not found")
246291
return self.response_unmarshaller_cls(
247-
self.spec, base_url=self.config.server_base_url
292+
self.spec,
293+
base_url=self.config.server_base_url,
294+
style_deserializers_factory=self.config.style_deserializers_factory,
295+
media_type_deserializers_factory=self.config.media_type_deserializers_factory,
296+
schema_casters_factory=self.config.schema_casters_factory,
297+
schema_validators_factory=self.config.schema_validators_factory,
298+
spec_validator_cls=self.config.spec_validator_cls,
299+
extra_format_validators=self.config.extra_format_validators,
300+
extra_media_type_deserializers=self.config.extra_media_type_deserializers,
301+
schema_unmarshallers_factory=self.config.schema_unmarshallers_factory,
302+
extra_format_unmarshallers=self.config.extra_format_unmarshallers,
248303
)
249304

250305
@property
251306
def webhook_request_unmarshaller(self) -> WebhookRequestUnmarshaller:
252307
if self.webhook_request_unmarshaller_cls is None:
253308
raise SpecError("Unmarshaller class not found")
254309
return self.webhook_request_unmarshaller_cls(
255-
self.spec, base_url=self.config.server_base_url
310+
self.spec,
311+
base_url=self.config.server_base_url,
312+
style_deserializers_factory=self.config.style_deserializers_factory,
313+
media_type_deserializers_factory=self.config.media_type_deserializers_factory,
314+
schema_casters_factory=self.config.schema_casters_factory,
315+
schema_validators_factory=self.config.schema_validators_factory,
316+
spec_validator_cls=self.config.spec_validator_cls,
317+
extra_format_validators=self.config.extra_format_validators,
318+
extra_media_type_deserializers=self.config.extra_media_type_deserializers,
319+
security_provider_factory=self.config.security_provider_factory,
320+
schema_unmarshallers_factory=self.config.schema_unmarshallers_factory,
321+
extra_format_unmarshallers=self.config.extra_format_unmarshallers,
256322
)
257323

258324
@property
259325
def webhook_response_unmarshaller(self) -> WebhookResponseUnmarshaller:
260326
if self.webhook_response_unmarshaller_cls is None:
261327
raise SpecError("Unmarshaller class not found")
262328
return self.webhook_response_unmarshaller_cls(
263-
self.spec, base_url=self.config.server_base_url
329+
self.spec,
330+
base_url=self.config.server_base_url,
331+
style_deserializers_factory=self.config.style_deserializers_factory,
332+
media_type_deserializers_factory=self.config.media_type_deserializers_factory,
333+
schema_casters_factory=self.config.schema_casters_factory,
334+
schema_validators_factory=self.config.schema_validators_factory,
335+
spec_validator_cls=self.config.spec_validator_cls,
336+
extra_format_validators=self.config.extra_format_validators,
337+
extra_media_type_deserializers=self.config.extra_media_type_deserializers,
338+
schema_unmarshallers_factory=self.config.schema_unmarshallers_factory,
339+
extra_format_unmarshallers=self.config.extra_format_unmarshallers,
264340
)
265341

266342
def validate_request(self, request: AnyRequest) -> None:

Diff for: openapi_core/unmarshalling/request/protocols.py

+67-2
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,60 @@
44
from typing import runtime_checkable
55

66
from jsonschema_path import SchemaPath
7+
from openapi_spec_validator.validation.types import SpecValidatorType
78

9+
from openapi_core.casting.schemas.factories import SchemaCastersFactory
10+
from openapi_core.deserializing.media_types import (
11+
media_type_deserializers_factory,
12+
)
13+
from openapi_core.deserializing.media_types.datatypes import (
14+
MediaTypeDeserializersDict,
15+
)
16+
from openapi_core.deserializing.media_types.factories import (
17+
MediaTypeDeserializersFactory,
18+
)
19+
from openapi_core.deserializing.styles import style_deserializers_factory
20+
from openapi_core.deserializing.styles.factories import (
21+
StyleDeserializersFactory,
22+
)
823
from openapi_core.protocols import Request
924
from openapi_core.protocols import WebhookRequest
25+
from openapi_core.security import security_provider_factory
26+
from openapi_core.security.factories import SecurityProviderFactory
1027
from openapi_core.unmarshalling.request.datatypes import RequestUnmarshalResult
28+
from openapi_core.unmarshalling.schemas.datatypes import (
29+
FormatUnmarshallersDict,
30+
)
31+
from openapi_core.unmarshalling.schemas.factories import (
32+
SchemaUnmarshallersFactory,
33+
)
34+
from openapi_core.validation.schemas.datatypes import FormatValidatorsDict
35+
from openapi_core.validation.schemas.factories import SchemaValidatorsFactory
1136

1237

1338
@runtime_checkable
1439
class RequestUnmarshaller(Protocol):
15-
def __init__(self, spec: SchemaPath, base_url: Optional[str] = None):
40+
def __init__(
41+
self,
42+
spec: SchemaPath,
43+
base_url: Optional[str] = None,
44+
style_deserializers_factory: StyleDeserializersFactory = style_deserializers_factory,
45+
media_type_deserializers_factory: MediaTypeDeserializersFactory = media_type_deserializers_factory,
46+
schema_casters_factory: Optional[SchemaCastersFactory] = None,
47+
schema_validators_factory: Optional[SchemaValidatorsFactory] = None,
48+
spec_validator_cls: Optional[SpecValidatorType] = None,
49+
format_validators: Optional[FormatValidatorsDict] = None,
50+
extra_format_validators: Optional[FormatValidatorsDict] = None,
51+
extra_media_type_deserializers: Optional[
52+
MediaTypeDeserializersDict
53+
] = None,
54+
security_provider_factory: SecurityProviderFactory = security_provider_factory,
55+
schema_unmarshallers_factory: Optional[
56+
SchemaUnmarshallersFactory
57+
] = None,
58+
format_unmarshallers: Optional[FormatUnmarshallersDict] = None,
59+
extra_format_unmarshallers: Optional[FormatUnmarshallersDict] = None,
60+
):
1661
...
1762

1863
def unmarshal(
@@ -24,7 +69,27 @@ def unmarshal(
2469

2570
@runtime_checkable
2671
class WebhookRequestUnmarshaller(Protocol):
27-
def __init__(self, spec: SchemaPath, base_url: Optional[str] = None):
72+
def __init__(
73+
self,
74+
spec: SchemaPath,
75+
base_url: Optional[str] = None,
76+
style_deserializers_factory: StyleDeserializersFactory = style_deserializers_factory,
77+
media_type_deserializers_factory: MediaTypeDeserializersFactory = media_type_deserializers_factory,
78+
schema_casters_factory: Optional[SchemaCastersFactory] = None,
79+
schema_validators_factory: Optional[SchemaValidatorsFactory] = None,
80+
spec_validator_cls: Optional[SpecValidatorType] = None,
81+
format_validators: Optional[FormatValidatorsDict] = None,
82+
extra_format_validators: Optional[FormatValidatorsDict] = None,
83+
extra_media_type_deserializers: Optional[
84+
MediaTypeDeserializersDict
85+
] = None,
86+
security_provider_factory: SecurityProviderFactory = security_provider_factory,
87+
schema_unmarshallers_factory: Optional[
88+
SchemaUnmarshallersFactory
89+
] = None,
90+
format_unmarshallers: Optional[FormatUnmarshallersDict] = None,
91+
extra_format_unmarshallers: Optional[FormatUnmarshallersDict] = None,
92+
):
2893
...
2994

3095
def unmarshal(

Diff for: openapi_core/unmarshalling/response/protocols.py

+63-2
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,60 @@
44
from typing import runtime_checkable
55

66
from jsonschema_path import SchemaPath
7+
from openapi_spec_validator.validation.types import SpecValidatorType
78

9+
from openapi_core.casting.schemas.factories import SchemaCastersFactory
10+
from openapi_core.deserializing.media_types import (
11+
media_type_deserializers_factory,
12+
)
13+
from openapi_core.deserializing.media_types.datatypes import (
14+
MediaTypeDeserializersDict,
15+
)
16+
from openapi_core.deserializing.media_types.factories import (
17+
MediaTypeDeserializersFactory,
18+
)
19+
from openapi_core.deserializing.styles import style_deserializers_factory
20+
from openapi_core.deserializing.styles.factories import (
21+
StyleDeserializersFactory,
22+
)
823
from openapi_core.protocols import Request
924
from openapi_core.protocols import Response
1025
from openapi_core.protocols import WebhookRequest
1126
from openapi_core.unmarshalling.response.datatypes import (
1227
ResponseUnmarshalResult,
1328
)
29+
from openapi_core.unmarshalling.schemas.datatypes import (
30+
FormatUnmarshallersDict,
31+
)
32+
from openapi_core.unmarshalling.schemas.factories import (
33+
SchemaUnmarshallersFactory,
34+
)
35+
from openapi_core.validation.schemas.datatypes import FormatValidatorsDict
36+
from openapi_core.validation.schemas.factories import SchemaValidatorsFactory
1437

1538

1639
@runtime_checkable
1740
class ResponseUnmarshaller(Protocol):
18-
def __init__(self, spec: SchemaPath, base_url: Optional[str] = None):
41+
def __init__(
42+
self,
43+
spec: SchemaPath,
44+
base_url: Optional[str] = None,
45+
style_deserializers_factory: StyleDeserializersFactory = style_deserializers_factory,
46+
media_type_deserializers_factory: MediaTypeDeserializersFactory = media_type_deserializers_factory,
47+
schema_casters_factory: Optional[SchemaCastersFactory] = None,
48+
schema_validators_factory: Optional[SchemaValidatorsFactory] = None,
49+
spec_validator_cls: Optional[SpecValidatorType] = None,
50+
format_validators: Optional[FormatValidatorsDict] = None,
51+
extra_format_validators: Optional[FormatValidatorsDict] = None,
52+
extra_media_type_deserializers: Optional[
53+
MediaTypeDeserializersDict
54+
] = None,
55+
schema_unmarshallers_factory: Optional[
56+
SchemaUnmarshallersFactory
57+
] = None,
58+
format_unmarshallers: Optional[FormatUnmarshallersDict] = None,
59+
extra_format_unmarshallers: Optional[FormatUnmarshallersDict] = None,
60+
):
1961
...
2062

2163
def unmarshal(
@@ -28,7 +70,26 @@ def unmarshal(
2870

2971
@runtime_checkable
3072
class WebhookResponseUnmarshaller(Protocol):
31-
def __init__(self, spec: SchemaPath, base_url: Optional[str] = None):
73+
def __init__(
74+
self,
75+
spec: SchemaPath,
76+
base_url: Optional[str] = None,
77+
style_deserializers_factory: StyleDeserializersFactory = style_deserializers_factory,
78+
media_type_deserializers_factory: MediaTypeDeserializersFactory = media_type_deserializers_factory,
79+
schema_casters_factory: Optional[SchemaCastersFactory] = None,
80+
schema_validators_factory: Optional[SchemaValidatorsFactory] = None,
81+
spec_validator_cls: Optional[SpecValidatorType] = None,
82+
format_validators: Optional[FormatValidatorsDict] = None,
83+
extra_format_validators: Optional[FormatValidatorsDict] = None,
84+
extra_media_type_deserializers: Optional[
85+
MediaTypeDeserializersDict
86+
] = None,
87+
schema_unmarshallers_factory: Optional[
88+
SchemaUnmarshallersFactory
89+
] = None,
90+
format_unmarshallers: Optional[FormatUnmarshallersDict] = None,
91+
extra_format_unmarshallers: Optional[FormatUnmarshallersDict] = None,
92+
):
3293
...
3394

3495
def unmarshal(

Diff for: openapi_core/validation/configurations.py

+8
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
from openapi_core.deserializing.styles.factories import (
1616
StyleDeserializersFactory,
1717
)
18+
from openapi_core.security import security_provider_factory
19+
from openapi_core.security.factories import SecurityProviderFactory
1820
from openapi_core.validation.schemas.datatypes import FormatValidatorsDict
1921
from openapi_core.validation.schemas.factories import SchemaValidatorsFactory
2022

@@ -38,6 +40,8 @@ class ValidatorConfig:
3840
Extra format validators.
3941
extra_media_type_deserializers
4042
Extra media type deserializers.
43+
security_provider_factory
44+
Security providers factory.
4145
"""
4246

4347
server_base_url: Optional[str] = None
@@ -53,3 +57,7 @@ class ValidatorConfig:
5357

5458
extra_format_validators: Optional[FormatValidatorsDict] = None
5559
extra_media_type_deserializers: Optional[MediaTypeDeserializersDict] = None
60+
61+
security_provider_factory: SecurityProviderFactory = (
62+
security_provider_factory
63+
)

0 commit comments

Comments
 (0)