Skip to content

OpenAPI config passed to validators and unmarshallers fix #779

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 84 additions & 8 deletions openapi_core/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,63 +204,139 @@ 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
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
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
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
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
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
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
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:
Expand Down
69 changes: 67 additions & 2 deletions openapi_core/unmarshalling/request/protocols.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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(
Expand Down
65 changes: 63 additions & 2 deletions openapi_core/unmarshalling/response/protocols.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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(
Expand Down
8 changes: 8 additions & 0 deletions openapi_core/validation/configurations.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
Expand All @@ -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
)
Loading