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(