From bc05481e063a80226df05bcb3546c75afe1fef43 Mon Sep 17 00:00:00 2001 From: p1c2u Date: Sat, 10 Feb 2024 15:01:15 +0000 Subject: [PATCH] OpenAPI config passed to validators and unmarshallers fix --- openapi_core/app.py | 92 +++++++++++++++++-- .../unmarshalling/request/protocols.py | 69 +++++++++++++- .../unmarshalling/response/protocols.py | 65 ++++++++++++- openapi_core/validation/configurations.py | 8 ++ openapi_core/validation/request/protocols.py | 53 ++++++++++- openapi_core/validation/response/protocols.py | 49 +++++++++- 6 files changed, 320 insertions(+), 16 deletions(-) diff --git a/openapi_core/app.py b/openapi_core/app.py index 38e270ce..db80564c 100644 --- a/openapi_core/app.py +++ b/openapi_core/app.py @@ -204,7 +204,16 @@ def request_validator(self) -> RequestValidator: if self.request_validator_cls is None: raise SpecError("Validator class not found") return self.request_validator_cls( - self.spec, base_url=self.config.server_base_url + self.spec, + base_url=self.config.server_base_url, + style_deserializers_factory=self.config.style_deserializers_factory, + media_type_deserializers_factory=self.config.media_type_deserializers_factory, + schema_casters_factory=self.config.schema_casters_factory, + schema_validators_factory=self.config.schema_validators_factory, + spec_validator_cls=self.config.spec_validator_cls, + extra_format_validators=self.config.extra_format_validators, + extra_media_type_deserializers=self.config.extra_media_type_deserializers, + security_provider_factory=self.config.security_provider_factory, ) @property @@ -212,7 +221,15 @@ def response_validator(self) -> ResponseValidator: if self.response_validator_cls is None: raise SpecError("Validator class not found") return self.response_validator_cls( - self.spec, base_url=self.config.server_base_url + self.spec, + base_url=self.config.server_base_url, + style_deserializers_factory=self.config.style_deserializers_factory, + media_type_deserializers_factory=self.config.media_type_deserializers_factory, + schema_casters_factory=self.config.schema_casters_factory, + schema_validators_factory=self.config.schema_validators_factory, + spec_validator_cls=self.config.spec_validator_cls, + extra_format_validators=self.config.extra_format_validators, + extra_media_type_deserializers=self.config.extra_media_type_deserializers, ) @property @@ -220,7 +237,16 @@ def webhook_request_validator(self) -> WebhookRequestValidator: if self.webhook_request_validator_cls is None: raise SpecError("Validator class not found") return self.webhook_request_validator_cls( - self.spec, base_url=self.config.server_base_url + self.spec, + base_url=self.config.server_base_url, + style_deserializers_factory=self.config.style_deserializers_factory, + media_type_deserializers_factory=self.config.media_type_deserializers_factory, + schema_casters_factory=self.config.schema_casters_factory, + schema_validators_factory=self.config.schema_validators_factory, + spec_validator_cls=self.config.spec_validator_cls, + extra_format_validators=self.config.extra_format_validators, + extra_media_type_deserializers=self.config.extra_media_type_deserializers, + security_provider_factory=self.config.security_provider_factory, ) @property @@ -228,7 +254,15 @@ def webhook_response_validator(self) -> WebhookResponseValidator: if self.webhook_response_validator_cls is None: raise SpecError("Validator class not found") return self.webhook_response_validator_cls( - self.spec, base_url=self.config.server_base_url + self.spec, + base_url=self.config.server_base_url, + style_deserializers_factory=self.config.style_deserializers_factory, + media_type_deserializers_factory=self.config.media_type_deserializers_factory, + schema_casters_factory=self.config.schema_casters_factory, + schema_validators_factory=self.config.schema_validators_factory, + spec_validator_cls=self.config.spec_validator_cls, + extra_format_validators=self.config.extra_format_validators, + extra_media_type_deserializers=self.config.extra_media_type_deserializers, ) @property @@ -236,7 +270,18 @@ def request_unmarshaller(self) -> RequestUnmarshaller: if self.request_unmarshaller_cls is None: raise SpecError("Unmarshaller class not found") return self.request_unmarshaller_cls( - self.spec, base_url=self.config.server_base_url + self.spec, + base_url=self.config.server_base_url, + style_deserializers_factory=self.config.style_deserializers_factory, + media_type_deserializers_factory=self.config.media_type_deserializers_factory, + schema_casters_factory=self.config.schema_casters_factory, + schema_validators_factory=self.config.schema_validators_factory, + spec_validator_cls=self.config.spec_validator_cls, + extra_format_validators=self.config.extra_format_validators, + extra_media_type_deserializers=self.config.extra_media_type_deserializers, + security_provider_factory=self.config.security_provider_factory, + schema_unmarshallers_factory=self.config.schema_unmarshallers_factory, + extra_format_unmarshallers=self.config.extra_format_unmarshallers, ) @property @@ -244,7 +289,17 @@ def response_unmarshaller(self) -> ResponseUnmarshaller: if self.response_unmarshaller_cls is None: raise SpecError("Unmarshaller class not found") return self.response_unmarshaller_cls( - self.spec, base_url=self.config.server_base_url + self.spec, + base_url=self.config.server_base_url, + style_deserializers_factory=self.config.style_deserializers_factory, + media_type_deserializers_factory=self.config.media_type_deserializers_factory, + schema_casters_factory=self.config.schema_casters_factory, + schema_validators_factory=self.config.schema_validators_factory, + spec_validator_cls=self.config.spec_validator_cls, + extra_format_validators=self.config.extra_format_validators, + extra_media_type_deserializers=self.config.extra_media_type_deserializers, + schema_unmarshallers_factory=self.config.schema_unmarshallers_factory, + extra_format_unmarshallers=self.config.extra_format_unmarshallers, ) @property @@ -252,7 +307,18 @@ def webhook_request_unmarshaller(self) -> WebhookRequestUnmarshaller: if self.webhook_request_unmarshaller_cls is None: raise SpecError("Unmarshaller class not found") return self.webhook_request_unmarshaller_cls( - self.spec, base_url=self.config.server_base_url + self.spec, + base_url=self.config.server_base_url, + style_deserializers_factory=self.config.style_deserializers_factory, + media_type_deserializers_factory=self.config.media_type_deserializers_factory, + schema_casters_factory=self.config.schema_casters_factory, + schema_validators_factory=self.config.schema_validators_factory, + spec_validator_cls=self.config.spec_validator_cls, + extra_format_validators=self.config.extra_format_validators, + extra_media_type_deserializers=self.config.extra_media_type_deserializers, + security_provider_factory=self.config.security_provider_factory, + schema_unmarshallers_factory=self.config.schema_unmarshallers_factory, + extra_format_unmarshallers=self.config.extra_format_unmarshallers, ) @property @@ -260,7 +326,17 @@ def webhook_response_unmarshaller(self) -> WebhookResponseUnmarshaller: if self.webhook_response_unmarshaller_cls is None: raise SpecError("Unmarshaller class not found") return self.webhook_response_unmarshaller_cls( - self.spec, base_url=self.config.server_base_url + self.spec, + base_url=self.config.server_base_url, + style_deserializers_factory=self.config.style_deserializers_factory, + media_type_deserializers_factory=self.config.media_type_deserializers_factory, + schema_casters_factory=self.config.schema_casters_factory, + schema_validators_factory=self.config.schema_validators_factory, + spec_validator_cls=self.config.spec_validator_cls, + extra_format_validators=self.config.extra_format_validators, + extra_media_type_deserializers=self.config.extra_media_type_deserializers, + schema_unmarshallers_factory=self.config.schema_unmarshallers_factory, + extra_format_unmarshallers=self.config.extra_format_unmarshallers, ) def validate_request(self, request: AnyRequest) -> None: diff --git a/openapi_core/unmarshalling/request/protocols.py b/openapi_core/unmarshalling/request/protocols.py index 388f13c8..32d653ff 100644 --- a/openapi_core/unmarshalling/request/protocols.py +++ b/openapi_core/unmarshalling/request/protocols.py @@ -4,15 +4,60 @@ from typing import runtime_checkable from jsonschema_path import SchemaPath +from openapi_spec_validator.validation.types import SpecValidatorType +from openapi_core.casting.schemas.factories import SchemaCastersFactory +from openapi_core.deserializing.media_types import ( + media_type_deserializers_factory, +) +from openapi_core.deserializing.media_types.datatypes import ( + MediaTypeDeserializersDict, +) +from openapi_core.deserializing.media_types.factories import ( + MediaTypeDeserializersFactory, +) +from openapi_core.deserializing.styles import style_deserializers_factory +from openapi_core.deserializing.styles.factories import ( + StyleDeserializersFactory, +) from openapi_core.protocols import Request from openapi_core.protocols import WebhookRequest +from openapi_core.security import security_provider_factory +from openapi_core.security.factories import SecurityProviderFactory from openapi_core.unmarshalling.request.datatypes import RequestUnmarshalResult +from openapi_core.unmarshalling.schemas.datatypes import ( + FormatUnmarshallersDict, +) +from openapi_core.unmarshalling.schemas.factories import ( + SchemaUnmarshallersFactory, +) +from openapi_core.validation.schemas.datatypes import FormatValidatorsDict +from openapi_core.validation.schemas.factories import SchemaValidatorsFactory @runtime_checkable class RequestUnmarshaller(Protocol): - def __init__(self, spec: SchemaPath, base_url: Optional[str] = None): + def __init__( + self, + spec: SchemaPath, + base_url: Optional[str] = None, + style_deserializers_factory: StyleDeserializersFactory = style_deserializers_factory, + media_type_deserializers_factory: MediaTypeDeserializersFactory = media_type_deserializers_factory, + schema_casters_factory: Optional[SchemaCastersFactory] = None, + schema_validators_factory: Optional[SchemaValidatorsFactory] = None, + spec_validator_cls: Optional[SpecValidatorType] = None, + format_validators: Optional[FormatValidatorsDict] = None, + extra_format_validators: Optional[FormatValidatorsDict] = None, + extra_media_type_deserializers: Optional[ + MediaTypeDeserializersDict + ] = None, + security_provider_factory: SecurityProviderFactory = security_provider_factory, + schema_unmarshallers_factory: Optional[ + SchemaUnmarshallersFactory + ] = None, + format_unmarshallers: Optional[FormatUnmarshallersDict] = None, + extra_format_unmarshallers: Optional[FormatUnmarshallersDict] = None, + ): ... def unmarshal( @@ -24,7 +69,27 @@ def unmarshal( @runtime_checkable class WebhookRequestUnmarshaller(Protocol): - def __init__(self, spec: SchemaPath, base_url: Optional[str] = None): + def __init__( + self, + spec: SchemaPath, + base_url: Optional[str] = None, + style_deserializers_factory: StyleDeserializersFactory = style_deserializers_factory, + media_type_deserializers_factory: MediaTypeDeserializersFactory = media_type_deserializers_factory, + schema_casters_factory: Optional[SchemaCastersFactory] = None, + schema_validators_factory: Optional[SchemaValidatorsFactory] = None, + spec_validator_cls: Optional[SpecValidatorType] = None, + format_validators: Optional[FormatValidatorsDict] = None, + extra_format_validators: Optional[FormatValidatorsDict] = None, + extra_media_type_deserializers: Optional[ + MediaTypeDeserializersDict + ] = None, + security_provider_factory: SecurityProviderFactory = security_provider_factory, + schema_unmarshallers_factory: Optional[ + SchemaUnmarshallersFactory + ] = None, + format_unmarshallers: Optional[FormatUnmarshallersDict] = None, + extra_format_unmarshallers: Optional[FormatUnmarshallersDict] = None, + ): ... def unmarshal( diff --git a/openapi_core/unmarshalling/response/protocols.py b/openapi_core/unmarshalling/response/protocols.py index ad9d719b..00e9e5aa 100644 --- a/openapi_core/unmarshalling/response/protocols.py +++ b/openapi_core/unmarshalling/response/protocols.py @@ -4,18 +4,60 @@ from typing import runtime_checkable from jsonschema_path import SchemaPath +from openapi_spec_validator.validation.types import SpecValidatorType +from openapi_core.casting.schemas.factories import SchemaCastersFactory +from openapi_core.deserializing.media_types import ( + media_type_deserializers_factory, +) +from openapi_core.deserializing.media_types.datatypes import ( + MediaTypeDeserializersDict, +) +from openapi_core.deserializing.media_types.factories import ( + MediaTypeDeserializersFactory, +) +from openapi_core.deserializing.styles import style_deserializers_factory +from openapi_core.deserializing.styles.factories import ( + StyleDeserializersFactory, +) from openapi_core.protocols import Request from openapi_core.protocols import Response from openapi_core.protocols import WebhookRequest from openapi_core.unmarshalling.response.datatypes import ( ResponseUnmarshalResult, ) +from openapi_core.unmarshalling.schemas.datatypes import ( + FormatUnmarshallersDict, +) +from openapi_core.unmarshalling.schemas.factories import ( + SchemaUnmarshallersFactory, +) +from openapi_core.validation.schemas.datatypes import FormatValidatorsDict +from openapi_core.validation.schemas.factories import SchemaValidatorsFactory @runtime_checkable class ResponseUnmarshaller(Protocol): - def __init__(self, spec: SchemaPath, base_url: Optional[str] = None): + def __init__( + self, + spec: SchemaPath, + base_url: Optional[str] = None, + style_deserializers_factory: StyleDeserializersFactory = style_deserializers_factory, + media_type_deserializers_factory: MediaTypeDeserializersFactory = media_type_deserializers_factory, + schema_casters_factory: Optional[SchemaCastersFactory] = None, + schema_validators_factory: Optional[SchemaValidatorsFactory] = None, + spec_validator_cls: Optional[SpecValidatorType] = None, + format_validators: Optional[FormatValidatorsDict] = None, + extra_format_validators: Optional[FormatValidatorsDict] = None, + extra_media_type_deserializers: Optional[ + MediaTypeDeserializersDict + ] = None, + schema_unmarshallers_factory: Optional[ + SchemaUnmarshallersFactory + ] = None, + format_unmarshallers: Optional[FormatUnmarshallersDict] = None, + extra_format_unmarshallers: Optional[FormatUnmarshallersDict] = None, + ): ... def unmarshal( @@ -28,7 +70,26 @@ def unmarshal( @runtime_checkable class WebhookResponseUnmarshaller(Protocol): - def __init__(self, spec: SchemaPath, base_url: Optional[str] = None): + def __init__( + self, + spec: SchemaPath, + base_url: Optional[str] = None, + style_deserializers_factory: StyleDeserializersFactory = style_deserializers_factory, + media_type_deserializers_factory: MediaTypeDeserializersFactory = media_type_deserializers_factory, + schema_casters_factory: Optional[SchemaCastersFactory] = None, + schema_validators_factory: Optional[SchemaValidatorsFactory] = None, + spec_validator_cls: Optional[SpecValidatorType] = None, + format_validators: Optional[FormatValidatorsDict] = None, + extra_format_validators: Optional[FormatValidatorsDict] = None, + extra_media_type_deserializers: Optional[ + MediaTypeDeserializersDict + ] = None, + schema_unmarshallers_factory: Optional[ + SchemaUnmarshallersFactory + ] = None, + format_unmarshallers: Optional[FormatUnmarshallersDict] = None, + extra_format_unmarshallers: Optional[FormatUnmarshallersDict] = None, + ): ... def unmarshal( diff --git a/openapi_core/validation/configurations.py b/openapi_core/validation/configurations.py index f910015f..17149428 100644 --- a/openapi_core/validation/configurations.py +++ b/openapi_core/validation/configurations.py @@ -15,6 +15,8 @@ from openapi_core.deserializing.styles.factories import ( StyleDeserializersFactory, ) +from openapi_core.security import security_provider_factory +from openapi_core.security.factories import SecurityProviderFactory from openapi_core.validation.schemas.datatypes import FormatValidatorsDict from openapi_core.validation.schemas.factories import SchemaValidatorsFactory @@ -38,6 +40,8 @@ class ValidatorConfig: Extra format validators. extra_media_type_deserializers Extra media type deserializers. + security_provider_factory + Security providers factory. """ server_base_url: Optional[str] = None @@ -53,3 +57,7 @@ class ValidatorConfig: extra_format_validators: Optional[FormatValidatorsDict] = None extra_media_type_deserializers: Optional[MediaTypeDeserializersDict] = None + + security_provider_factory: SecurityProviderFactory = ( + security_provider_factory + ) diff --git a/openapi_core/validation/request/protocols.py b/openapi_core/validation/request/protocols.py index e27f5863..d775ad54 100644 --- a/openapi_core/validation/request/protocols.py +++ b/openapi_core/validation/request/protocols.py @@ -5,14 +5,48 @@ from typing import runtime_checkable from jsonschema_path import SchemaPath +from openapi_spec_validator.validation.types import SpecValidatorType +from openapi_core.casting.schemas.factories import SchemaCastersFactory +from openapi_core.deserializing.media_types import ( + media_type_deserializers_factory, +) +from openapi_core.deserializing.media_types.datatypes import ( + MediaTypeDeserializersDict, +) +from openapi_core.deserializing.media_types.factories import ( + MediaTypeDeserializersFactory, +) +from openapi_core.deserializing.styles import style_deserializers_factory +from openapi_core.deserializing.styles.factories import ( + StyleDeserializersFactory, +) from openapi_core.protocols import Request from openapi_core.protocols import WebhookRequest +from openapi_core.security import security_provider_factory +from openapi_core.security.factories import SecurityProviderFactory +from openapi_core.validation.schemas.datatypes import FormatValidatorsDict +from openapi_core.validation.schemas.factories import SchemaValidatorsFactory @runtime_checkable class RequestValidator(Protocol): - def __init__(self, spec: SchemaPath, base_url: Optional[str] = None): + def __init__( + self, + spec: SchemaPath, + base_url: Optional[str] = None, + style_deserializers_factory: StyleDeserializersFactory = style_deserializers_factory, + media_type_deserializers_factory: MediaTypeDeserializersFactory = media_type_deserializers_factory, + schema_casters_factory: Optional[SchemaCastersFactory] = None, + schema_validators_factory: Optional[SchemaValidatorsFactory] = None, + spec_validator_cls: Optional[SpecValidatorType] = None, + format_validators: Optional[FormatValidatorsDict] = None, + extra_format_validators: Optional[FormatValidatorsDict] = None, + extra_media_type_deserializers: Optional[ + MediaTypeDeserializersDict + ] = None, + security_provider_factory: SecurityProviderFactory = security_provider_factory, + ): ... def iter_errors( @@ -30,7 +64,22 @@ def validate( @runtime_checkable class WebhookRequestValidator(Protocol): - def __init__(self, spec: SchemaPath, base_url: Optional[str] = None): + def __init__( + self, + spec: SchemaPath, + base_url: Optional[str] = None, + style_deserializers_factory: StyleDeserializersFactory = style_deserializers_factory, + media_type_deserializers_factory: MediaTypeDeserializersFactory = media_type_deserializers_factory, + schema_casters_factory: Optional[SchemaCastersFactory] = None, + schema_validators_factory: Optional[SchemaValidatorsFactory] = None, + spec_validator_cls: Optional[SpecValidatorType] = None, + format_validators: Optional[FormatValidatorsDict] = None, + extra_format_validators: Optional[FormatValidatorsDict] = None, + extra_media_type_deserializers: Optional[ + MediaTypeDeserializersDict + ] = None, + security_provider_factory: SecurityProviderFactory = security_provider_factory, + ): ... def iter_errors( diff --git a/openapi_core/validation/response/protocols.py b/openapi_core/validation/response/protocols.py index 7a403d3e..4948ae03 100644 --- a/openapi_core/validation/response/protocols.py +++ b/openapi_core/validation/response/protocols.py @@ -5,15 +5,46 @@ from typing import runtime_checkable from jsonschema_path import SchemaPath +from openapi_spec_validator.validation.types import SpecValidatorType +from openapi_core.casting.schemas.factories import SchemaCastersFactory +from openapi_core.deserializing.media_types import ( + media_type_deserializers_factory, +) +from openapi_core.deserializing.media_types.datatypes import ( + MediaTypeDeserializersDict, +) +from openapi_core.deserializing.media_types.factories import ( + MediaTypeDeserializersFactory, +) +from openapi_core.deserializing.styles import style_deserializers_factory +from openapi_core.deserializing.styles.factories import ( + StyleDeserializersFactory, +) from openapi_core.protocols import Request from openapi_core.protocols import Response from openapi_core.protocols import WebhookRequest +from openapi_core.validation.schemas.datatypes import FormatValidatorsDict +from openapi_core.validation.schemas.factories import SchemaValidatorsFactory @runtime_checkable class ResponseValidator(Protocol): - def __init__(self, spec: SchemaPath, base_url: Optional[str] = None): + def __init__( + self, + spec: SchemaPath, + base_url: Optional[str] = None, + style_deserializers_factory: StyleDeserializersFactory = style_deserializers_factory, + media_type_deserializers_factory: MediaTypeDeserializersFactory = media_type_deserializers_factory, + schema_casters_factory: Optional[SchemaCastersFactory] = None, + schema_validators_factory: Optional[SchemaValidatorsFactory] = None, + spec_validator_cls: Optional[SpecValidatorType] = None, + format_validators: Optional[FormatValidatorsDict] = None, + extra_format_validators: Optional[FormatValidatorsDict] = None, + extra_media_type_deserializers: Optional[ + MediaTypeDeserializersDict + ] = None, + ): ... def iter_errors( @@ -33,7 +64,21 @@ def validate( @runtime_checkable class WebhookResponseValidator(Protocol): - def __init__(self, spec: SchemaPath, base_url: Optional[str] = None): + def __init__( + self, + spec: SchemaPath, + base_url: Optional[str] = None, + style_deserializers_factory: StyleDeserializersFactory = style_deserializers_factory, + media_type_deserializers_factory: MediaTypeDeserializersFactory = media_type_deserializers_factory, + schema_casters_factory: Optional[SchemaCastersFactory] = None, + schema_validators_factory: Optional[SchemaValidatorsFactory] = None, + spec_validator_cls: Optional[SpecValidatorType] = None, + format_validators: Optional[FormatValidatorsDict] = None, + extra_format_validators: Optional[FormatValidatorsDict] = None, + extra_media_type_deserializers: Optional[ + MediaTypeDeserializersDict + ] = None, + ): ... def iter_errors( pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy