Skip to content

Commit 85cf602

Browse files
authored
Merge pull request #328 from p1c2u/refactor/validation-factories-rafactor
Validation factories refactor
2 parents 01d760b + a990e86 commit 85cf602

File tree

3 files changed

+65
-41
lines changed

3 files changed

+65
-41
lines changed

openapi_core/validation/request/validators.py

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,25 @@
44

55
from openapi_core.casting.schemas.exceptions import CastError
66
from openapi_core.deserializing.exceptions import DeserializeError
7+
from openapi_core.deserializing.parameters.factories import (
8+
ParameterDeserializersFactory,
9+
)
710
from openapi_core.exceptions import (
811
MissingRequiredParameter, MissingParameter,
912
MissingRequiredRequestBody, MissingRequestBody,
1013
)
1114
from openapi_core.security.exceptions import SecurityError
15+
from openapi_core.security.factories import SecurityProviderFactory
1216
from openapi_core.schema.parameters import get_aslist, get_explode
1317
from openapi_core.templating.media_types.exceptions import MediaTypeFinderError
1418
from openapi_core.templating.paths.exceptions import PathError
1519
from openapi_core.unmarshalling.schemas.enums import UnmarshalContext
1620
from openapi_core.unmarshalling.schemas.exceptions import (
1721
UnmarshalError, ValidateError,
1822
)
23+
from openapi_core.unmarshalling.schemas.factories import (
24+
SchemaUnmarshallersFactory,
25+
)
1926
from openapi_core.validation.exceptions import InvalidSecurity
2027
from openapi_core.validation.request.datatypes import (
2128
RequestParameters, RequestValidationResult,
@@ -25,6 +32,23 @@
2532

2633
class RequestValidator(BaseValidator):
2734

35+
@property
36+
def schema_unmarshallers_factory(self):
37+
spec_resolver = self.spec.accessor.dereferencer.resolver_manager.\
38+
resolver
39+
return SchemaUnmarshallersFactory(
40+
spec_resolver, self.format_checker,
41+
self.custom_formatters, context=UnmarshalContext.REQUEST,
42+
)
43+
44+
@property
45+
def security_provider_factory(self):
46+
return SecurityProviderFactory()
47+
48+
@property
49+
def parameter_deserializers_factory(self):
50+
return ParameterDeserializersFactory()
51+
2852
def validate(self, request):
2953
try:
3054
path, operation, _, path_result, _ = self._find_path(request)
@@ -212,9 +236,7 @@ def _get_security_value(self, scheme_name, request):
212236
if scheme_name not in security_schemes:
213237
return
214238
scheme = security_schemes[scheme_name]
215-
from openapi_core.security.factories import SecurityProviderFactory
216-
security_provider_factory = SecurityProviderFactory()
217-
security_provider = security_provider_factory.create(scheme)
239+
security_provider = self.security_provider_factory.create(scheme)
218240
return security_provider(request)
219241

220242
def _get_parameter_value(self, param, request):
@@ -244,14 +266,5 @@ def _get_body_value(self, request_body, request):
244266
return request.body
245267

246268
def _deserialise_parameter(self, param, value):
247-
from openapi_core.deserializing.parameters.factories import (
248-
ParameterDeserializersFactory,
249-
)
250-
deserializers_factory = ParameterDeserializersFactory()
251-
deserializer = deserializers_factory.create(param)
269+
deserializer = self.parameter_deserializers_factory.create(param)
252270
return deserializer(value)
253-
254-
def _unmarshal(self, param_or_media_type, value):
255-
return super(RequestValidator, self)._unmarshal(
256-
param_or_media_type, value, context=UnmarshalContext.REQUEST,
257-
)

openapi_core/validation/response/validators.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,24 @@
1111
from openapi_core.unmarshalling.schemas.exceptions import (
1212
UnmarshalError, ValidateError,
1313
)
14+
from openapi_core.unmarshalling.schemas.factories import (
15+
SchemaUnmarshallersFactory,
16+
)
1417
from openapi_core.validation.response.datatypes import ResponseValidationResult
1518
from openapi_core.validation.validators import BaseValidator
1619

1720

1821
class ResponseValidator(BaseValidator):
1922

23+
@property
24+
def schema_unmarshallers_factory(self):
25+
spec_resolver = self.spec.accessor.dereferencer.resolver_manager.\
26+
resolver
27+
return SchemaUnmarshallersFactory(
28+
spec_resolver, self.format_checker,
29+
self.custom_formatters, context=UnmarshalContext.RESPONSE,
30+
)
31+
2032
def validate(self, request, response):
2133
try:
2234
_, operation, _, _, _ = self._find_path(request)
@@ -113,8 +125,3 @@ def _get_data_value(self, response):
113125
raise MissingResponseContent(response)
114126

115127
return response.data
116-
117-
def _unmarshal(self, param_or_media_type, value):
118-
return super(ResponseValidator, self)._unmarshal(
119-
param_or_media_type, value, context=UnmarshalContext.RESPONSE,
120-
)

openapi_core/validation/validators.py

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
"""OpenAPI core validation validators module"""
22
from __future__ import division
33

4+
from openapi_core.casting.schemas.factories import SchemaCastersFactory
5+
from openapi_core.deserializing.media_types.factories import (
6+
MediaTypeDeserializersFactory,
7+
)
8+
from openapi_core.templating.paths.finders import PathFinder
49
from openapi_core.unmarshalling.schemas.util import build_format_checker
510

611

@@ -18,49 +23,48 @@ def __init__(
1823

1924
self.format_checker = build_format_checker(**self.custom_formatters)
2025

26+
@property
27+
def path_finder(self):
28+
return PathFinder(self.spec, base_url=self.base_url)
29+
30+
@property
31+
def schema_casters_factory(self):
32+
return SchemaCastersFactory()
33+
34+
@property
35+
def media_type_deserializers_factory(self):
36+
return MediaTypeDeserializersFactory(
37+
self.custom_media_type_deserializers)
38+
39+
@property
40+
def schema_unmarshallers_factory(self):
41+
raise NotImplementedError
42+
2143
def _find_path(self, request):
22-
from openapi_core.templating.paths.finders import PathFinder
23-
finder = PathFinder(self.spec, base_url=self.base_url)
24-
return finder.find(request)
44+
return self.path_finder.find(request)
2545

2646
def _get_media_type(self, content, request_or_response):
2747
from openapi_core.templating.media_types.finders import MediaTypeFinder
2848
finder = MediaTypeFinder(content)
2949
return finder.find(request_or_response)
3050

3151
def _deserialise_data(self, mimetype, value):
32-
from openapi_core.deserializing.media_types.factories import (
33-
MediaTypeDeserializersFactory,
34-
)
35-
deserializers_factory = MediaTypeDeserializersFactory(
36-
self.custom_media_type_deserializers)
37-
deserializer = deserializers_factory.create(mimetype)
52+
deserializer = self.media_type_deserializers_factory.create(mimetype)
3853
return deserializer(value)
3954

4055
def _cast(self, param_or_media_type, value):
4156
# return param_or_media_type.cast(value)
4257
if 'schema' not in param_or_media_type:
4358
return value
4459

45-
from openapi_core.casting.schemas.factories import SchemaCastersFactory
46-
casters_factory = SchemaCastersFactory()
4760
schema = param_or_media_type / 'schema'
48-
caster = casters_factory.create(schema)
61+
caster = self.schema_casters_factory.create(schema)
4962
return caster(value)
5063

51-
def _unmarshal(self, param_or_media_type, value, context):
64+
def _unmarshal(self, param_or_media_type, value):
5265
if 'schema' not in param_or_media_type:
5366
return value
5467

55-
from openapi_core.unmarshalling.schemas.factories import (
56-
SchemaUnmarshallersFactory,
57-
)
58-
spec_resolver = self.spec.accessor.dereferencer.resolver_manager.\
59-
resolver
60-
unmarshallers_factory = SchemaUnmarshallersFactory(
61-
spec_resolver, self.format_checker,
62-
self.custom_formatters, context=context,
63-
)
6468
schema = param_or_media_type / 'schema'
65-
unmarshaller = unmarshallers_factory.create(schema)
69+
unmarshaller = self.schema_unmarshallers_factory.create(schema)
6670
return unmarshaller(value)

0 commit comments

Comments
 (0)