Skip to content

Commit 0da2a38

Browse files
authored
Merge pull request #676 from python-openapi/fix/parameter-deserializer-renamed-into-style-deserializer
Parameter deserializers renamed Style deserializers
2 parents cbbe084 + cf3d356 commit 0da2a38

File tree

14 files changed

+78
-88
lines changed

14 files changed

+78
-88
lines changed

Diff for: openapi_core/deserializing/parameters/__init__.py

-7
This file was deleted.

Diff for: openapi_core/deserializing/parameters/factories.py

-31
This file was deleted.

Diff for: openapi_core/deserializing/styles/__init__.py

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from openapi_core.deserializing.styles.factories import (
2+
StyleDeserializersFactory,
3+
)
4+
5+
__all__ = ["style_deserializers_factory"]
6+
7+
style_deserializers_factory = StyleDeserializersFactory()

Diff for: openapi_core/deserializing/parameters/deserializers.py renamed to openapi_core/deserializing/styles/deserializers.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,16 @@
55
from typing import Optional
66

77
from openapi_core.deserializing.exceptions import DeserializeError
8-
from openapi_core.deserializing.parameters.datatypes import (
9-
DeserializerCallable,
10-
)
11-
from openapi_core.deserializing.parameters.exceptions import (
8+
from openapi_core.deserializing.styles.datatypes import DeserializerCallable
9+
from openapi_core.deserializing.styles.exceptions import (
1210
EmptyQueryParameterValue,
1311
)
1412
from openapi_core.schema.parameters import get_aslist
1513
from openapi_core.schema.parameters import get_explode
1614
from openapi_core.spec import Spec
1715

1816

19-
class CallableParameterDeserializer:
17+
class CallableStyleDeserializer:
2018
def __init__(
2119
self,
2220
param_or_header: Spec,

Diff for: openapi_core/deserializing/parameters/exceptions.py renamed to openapi_core/deserializing/styles/exceptions.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44

55

66
@dataclass
7-
class BaseParameterDeserializeError(DeserializeError):
8-
"""Base parameter deserialize operation error"""
7+
class BaseStyleDeserializeError(DeserializeError):
8+
"""Base style deserialize operation error"""
99

1010
location: str
1111

1212

1313
@dataclass
14-
class ParameterDeserializeError(BaseParameterDeserializeError):
14+
class ParameterDeserializeError(BaseStyleDeserializeError):
1515
"""Parameter deserialize operation error"""
1616

1717
style: str
@@ -25,7 +25,7 @@ def __str__(self) -> str:
2525

2626

2727
@dataclass(init=False)
28-
class EmptyQueryParameterValue(BaseParameterDeserializeError):
28+
class EmptyQueryParameterValue(BaseStyleDeserializeError):
2929
name: str
3030

3131
def __init__(self, name: str):

Diff for: openapi_core/deserializing/styles/factories.py

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import re
2+
from functools import partial
3+
from typing import Dict
4+
5+
from openapi_core.deserializing.styles.datatypes import DeserializerCallable
6+
from openapi_core.deserializing.styles.deserializers import (
7+
CallableStyleDeserializer,
8+
)
9+
from openapi_core.deserializing.styles.util import split
10+
from openapi_core.schema.parameters import get_style
11+
from openapi_core.spec import Spec
12+
13+
14+
class StyleDeserializersFactory:
15+
STYLE_DESERIALIZERS: Dict[str, DeserializerCallable] = {
16+
"form": partial(split, separator=","),
17+
"simple": partial(split, separator=","),
18+
"spaceDelimited": partial(split, separator=" "),
19+
"pipeDelimited": partial(split, separator="|"),
20+
"deepObject": partial(re.split, pattern=r"\[|\]"),
21+
}
22+
23+
def create(self, param_or_header: Spec) -> CallableStyleDeserializer:
24+
style = get_style(param_or_header)
25+
26+
deserialize_callable = self.STYLE_DESERIALIZERS.get(style)
27+
return CallableStyleDeserializer(
28+
param_or_header, style, deserialize_callable
29+
)

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

+6-8
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,9 @@
1111
from openapi_core.deserializing.media_types.factories import (
1212
MediaTypeDeserializersFactory,
1313
)
14-
from openapi_core.deserializing.parameters import (
15-
parameter_deserializers_factory,
16-
)
17-
from openapi_core.deserializing.parameters.factories import (
18-
ParameterDeserializersFactory,
14+
from openapi_core.deserializing.styles import style_deserializers_factory
15+
from openapi_core.deserializing.styles.factories import (
16+
StyleDeserializersFactory,
1917
)
2018
from openapi_core.protocols import BaseRequest
2119
from openapi_core.protocols import Request
@@ -86,7 +84,7 @@ def __init__(
8684
spec: Spec,
8785
base_url: Optional[str] = None,
8886
schema_casters_factory: SchemaCastersFactory = schema_casters_factory,
89-
parameter_deserializers_factory: ParameterDeserializersFactory = parameter_deserializers_factory,
87+
style_deserializers_factory: StyleDeserializersFactory = style_deserializers_factory,
9088
media_type_deserializers_factory: MediaTypeDeserializersFactory = media_type_deserializers_factory,
9189
schema_validators_factory: Optional[SchemaValidatorsFactory] = None,
9290
format_validators: Optional[FormatValidatorsDict] = None,
@@ -106,7 +104,7 @@ def __init__(
106104
spec,
107105
base_url=base_url,
108106
schema_casters_factory=schema_casters_factory,
109-
parameter_deserializers_factory=parameter_deserializers_factory,
107+
style_deserializers_factory=style_deserializers_factory,
110108
media_type_deserializers_factory=media_type_deserializers_factory,
111109
schema_validators_factory=schema_validators_factory,
112110
format_validators=format_validators,
@@ -121,7 +119,7 @@ def __init__(
121119
spec,
122120
base_url=base_url,
123121
schema_casters_factory=schema_casters_factory,
124-
parameter_deserializers_factory=parameter_deserializers_factory,
122+
style_deserializers_factory=style_deserializers_factory,
125123
media_type_deserializers_factory=media_type_deserializers_factory,
126124
schema_validators_factory=schema_validators_factory,
127125
format_validators=format_validators,

Diff for: openapi_core/unmarshalling/unmarshallers.py

+5-7
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,9 @@
1414
from openapi_core.deserializing.media_types.factories import (
1515
MediaTypeDeserializersFactory,
1616
)
17-
from openapi_core.deserializing.parameters import (
18-
parameter_deserializers_factory,
19-
)
20-
from openapi_core.deserializing.parameters.factories import (
21-
ParameterDeserializersFactory,
17+
from openapi_core.deserializing.styles import style_deserializers_factory
18+
from openapi_core.deserializing.styles.factories import (
19+
StyleDeserializersFactory,
2220
)
2321
from openapi_core.spec import Spec
2422
from openapi_core.unmarshalling.schemas.datatypes import (
@@ -40,7 +38,7 @@ def __init__(
4038
spec: Spec,
4139
base_url: Optional[str] = None,
4240
schema_casters_factory: SchemaCastersFactory = schema_casters_factory,
43-
parameter_deserializers_factory: ParameterDeserializersFactory = parameter_deserializers_factory,
41+
style_deserializers_factory: StyleDeserializersFactory = style_deserializers_factory,
4442
media_type_deserializers_factory: MediaTypeDeserializersFactory = media_type_deserializers_factory,
4543
schema_validators_factory: Optional[SchemaValidatorsFactory] = None,
4644
format_validators: Optional[FormatValidatorsDict] = None,
@@ -62,7 +60,7 @@ def __init__(
6260
spec,
6361
base_url=base_url,
6462
schema_casters_factory=schema_casters_factory,
65-
parameter_deserializers_factory=parameter_deserializers_factory,
63+
style_deserializers_factory=style_deserializers_factory,
6664
media_type_deserializers_factory=media_type_deserializers_factory,
6765
schema_validators_factory=schema_validators_factory,
6866
format_validators=format_validators,

Diff for: openapi_core/validation/request/validators.py

+5-7
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,9 @@
1818
from openapi_core.deserializing.media_types.factories import (
1919
MediaTypeDeserializersFactory,
2020
)
21-
from openapi_core.deserializing.parameters import (
22-
parameter_deserializers_factory,
23-
)
24-
from openapi_core.deserializing.parameters.factories import (
25-
ParameterDeserializersFactory,
21+
from openapi_core.deserializing.styles import style_deserializers_factory
22+
from openapi_core.deserializing.styles.factories import (
23+
StyleDeserializersFactory,
2624
)
2725
from openapi_core.protocols import BaseRequest
2826
from openapi_core.protocols import Request
@@ -68,7 +66,7 @@ def __init__(
6866
spec: Spec,
6967
base_url: Optional[str] = None,
7068
schema_casters_factory: SchemaCastersFactory = schema_casters_factory,
71-
parameter_deserializers_factory: ParameterDeserializersFactory = parameter_deserializers_factory,
69+
style_deserializers_factory: StyleDeserializersFactory = style_deserializers_factory,
7270
media_type_deserializers_factory: MediaTypeDeserializersFactory = media_type_deserializers_factory,
7371
schema_validators_factory: Optional[SchemaValidatorsFactory] = None,
7472
format_validators: Optional[FormatValidatorsDict] = None,
@@ -82,7 +80,7 @@ def __init__(
8280
spec,
8381
base_url=base_url,
8482
schema_casters_factory=schema_casters_factory,
85-
parameter_deserializers_factory=parameter_deserializers_factory,
83+
style_deserializers_factory=style_deserializers_factory,
8684
media_type_deserializers_factory=media_type_deserializers_factory,
8785
schema_validators_factory=schema_validators_factory,
8886
format_validators=format_validators,

Diff for: openapi_core/validation/validators.py

+13-13
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,9 @@
1717
from openapi_core.deserializing.media_types.factories import (
1818
MediaTypeDeserializersFactory,
1919
)
20-
from openapi_core.deserializing.parameters import (
21-
parameter_deserializers_factory,
22-
)
23-
from openapi_core.deserializing.parameters.factories import (
24-
ParameterDeserializersFactory,
20+
from openapi_core.deserializing.styles import style_deserializers_factory
21+
from openapi_core.deserializing.styles.factories import (
22+
StyleDeserializersFactory,
2523
)
2624
from openapi_core.protocols import Request
2725
from openapi_core.protocols import WebhookRequest
@@ -44,7 +42,7 @@ def __init__(
4442
spec: Spec,
4543
base_url: Optional[str] = None,
4644
schema_casters_factory: SchemaCastersFactory = schema_casters_factory,
47-
parameter_deserializers_factory: ParameterDeserializersFactory = parameter_deserializers_factory,
45+
style_deserializers_factory: StyleDeserializersFactory = style_deserializers_factory,
4846
media_type_deserializers_factory: MediaTypeDeserializersFactory = media_type_deserializers_factory,
4947
schema_validators_factory: Optional[SchemaValidatorsFactory] = None,
5048
format_validators: Optional[FormatValidatorsDict] = None,
@@ -57,7 +55,7 @@ def __init__(
5755
self.base_url = base_url
5856

5957
self.schema_casters_factory = schema_casters_factory
60-
self.parameter_deserializers_factory = parameter_deserializers_factory
58+
self.style_deserializers_factory = style_deserializers_factory
6159
self.media_type_deserializers_factory = (
6260
media_type_deserializers_factory
6361
)
@@ -78,15 +76,15 @@ def _get_media_type(self, content: Spec, mimetype: str) -> MediaType:
7876
finder = MediaTypeFinder(content)
7977
return finder.find(mimetype)
8078

81-
def _deserialise_data(self, mimetype: str, value: Any) -> Any:
79+
def _deserialise_media_type(self, mimetype: str, value: Any) -> Any:
8280
deserializer = self.media_type_deserializers_factory.create(
8381
mimetype,
8482
extra_media_type_deserializers=self.extra_media_type_deserializers,
8583
)
8684
return deserializer.deserialize(value)
8785

88-
def _deserialise_parameter(self, param: Spec, value: Any) -> Any:
89-
deserializer = self.parameter_deserializers_factory.create(param)
86+
def _deserialise_style(self, param_or_header: Spec, value: Any) -> Any:
87+
deserializer = self.style_deserializers_factory.create(param_or_header)
9088
return deserializer.deserialize(value)
9189

9290
def _cast(self, schema: Spec, value: Any) -> Any:
@@ -144,15 +142,17 @@ def _get_param_or_header_value_and_schema(
144142
else:
145143
# Simple scenario
146144
if "content" not in param_or_header:
147-
deserialised = self._deserialise_parameter(
145+
deserialised = self._deserialise_style(
148146
param_or_header, raw_value
149147
)
150148
schema = param_or_header / "schema"
151149
# Complex scenario
152150
else:
153151
content = param_or_header / "content"
154152
mimetype, media_type = next(content.items())
155-
deserialised = self._deserialise_data(mimetype, raw_value)
153+
deserialised = self._deserialise_media_type(
154+
mimetype, raw_value
155+
)
156156
schema = media_type / "schema"
157157
casted = self._cast(schema, deserialised)
158158
return casted, schema
@@ -161,7 +161,7 @@ def _get_content_value_and_schema(
161161
self, raw: Any, mimetype: str, content: Spec
162162
) -> Tuple[Any, Optional[Spec]]:
163163
media_type, mimetype = self._get_media_type(content, mimetype)
164-
deserialised = self._deserialise_data(mimetype, raw)
164+
deserialised = self._deserialise_media_type(mimetype, raw)
165165
casted = self._cast(media_type, deserialised)
166166

167167
if "schema" not in media_type:

Diff for: tests/integration/test_petstore.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from openapi_core.casting.schemas.exceptions import CastError
1515
from openapi_core.datatypes import Parameters
1616
from openapi_core.deserializing.exceptions import DeserializeError
17-
from openapi_core.deserializing.parameters.exceptions import (
17+
from openapi_core.deserializing.styles.exceptions import (
1818
EmptyQueryParameterValue,
1919
)
2020
from openapi_core.templating.media_types.exceptions import MediaTypeNotFound

Diff for: tests/unit/deserializing/test_parameters_deserializers.py renamed to tests/unit/deserializing/test_styles_deserializers.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
import pytest
22

3-
from openapi_core.deserializing.parameters.exceptions import (
3+
from openapi_core.deserializing.styles.exceptions import (
44
EmptyQueryParameterValue,
55
)
6-
from openapi_core.deserializing.parameters.factories import (
7-
ParameterDeserializersFactory,
6+
from openapi_core.deserializing.styles.factories import (
7+
StyleDeserializersFactory,
88
)
99
from openapi_core.spec.paths import Spec
1010

1111

12-
class TestParameterDeserializer:
12+
class TestStyleDeserializer:
1313
@pytest.fixture
1414
def deserializer_factory(self):
1515
def create_deserializer(param):
16-
return ParameterDeserializersFactory().create(param)
16+
return StyleDeserializersFactory().create(param)
1717

1818
return create_deserializer
1919

0 commit comments

Comments
 (0)