Skip to content

Commit b4c10e8

Browse files
committed
Split cast and deserialise processes
1 parent 2c1a6c1 commit b4c10e8

File tree

6 files changed

+52
-23
lines changed

6 files changed

+52
-23
lines changed

openapi_core/schema/media_types/models.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,17 @@ def deserialize(self, value):
3131
deserializer = self.get_dererializer()
3232
return deserializer(value)
3333

34-
def cast(self, value):
34+
def deserialise(self, value):
3535
try:
36-
deserialized = self.deserialize(value)
36+
return self.deserialize(value)
3737
except ValueError as exc:
3838
raise InvalidMediaTypeValue(exc)
3939

40+
def cast(self, value):
4041
if not self.schema:
41-
return deserialized
42+
return value
4243

4344
try:
44-
return self.schema.cast(deserialized)
45+
return self.schema.cast(value)
4546
except CastError as exc:
4647
raise InvalidMediaTypeValue(exc)

openapi_core/schema/parameters/models.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def get_raw_value(self, request):
8888

8989
return location[self.name]
9090

91-
def cast(self, value):
91+
def deserialise(self, value):
9292
if self.deprecated:
9393
warnings.warn(
9494
"{0} parameter is deprecated".format(self.name),
@@ -100,14 +100,15 @@ def cast(self, value):
100100
raise EmptyParameterValue(self.name)
101101

102102
try:
103-
deserialized = self.deserialize(value)
103+
return self.deserialize(value)
104104
except (ValueError, AttributeError) as exc:
105105
raise InvalidParameterValue(self.name, exc)
106106

107+
def cast(self, value):
107108
if not self.schema:
108-
return deserialized
109+
return value
109110

110111
try:
111-
return self.schema.cast(deserialized)
112+
return self.schema.cast(value)
112113
except CastError as exc:
113114
raise InvalidParameterValue(self.name, exc)

openapi_core/validation/request/validators.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,15 @@ def _get_parameters(self, request, params):
109109
casted = param.schema.default
110110
else:
111111
try:
112-
casted = param.cast(raw_value)
112+
deserialised = self._deserialise(param, raw_value)
113113
except OpenAPIParameterError as exc:
114114
errors.append(exc)
115-
continue
115+
else:
116+
try:
117+
casted = self._cast(param, deserialised)
118+
except OpenAPIParameterError as exc:
119+
errors.append(exc)
120+
continue
116121

117122
try:
118123
unmarshalled = self._unmarshal(param, casted)
@@ -142,17 +147,28 @@ def _get_body(self, request, operation):
142147
errors.append(exc)
143148
else:
144149
try:
145-
casted = media_type.cast(raw_body)
150+
deserialised = self._deserialise(media_type, raw_body)
146151
except InvalidMediaTypeValue as exc:
147152
errors.append(exc)
148153
else:
149154
try:
150-
body = self._unmarshal(media_type, casted)
151-
except (ValidateError, UnmarshalError) as exc:
155+
casted = self._cast(media_type, deserialised)
156+
except InvalidMediaTypeValue as exc:
152157
errors.append(exc)
158+
else:
159+
try:
160+
body = self._unmarshal(media_type, casted)
161+
except (ValidateError, UnmarshalError) as exc:
162+
errors.append(exc)
153163

154164
return body, errors
155165

166+
def _deserialise(self, param_or_media_type, value):
167+
return param_or_media_type.deserialise(value)
168+
169+
def _cast(self, param_or_media_type, value):
170+
return param_or_media_type.cast(value)
171+
156172
def _unmarshal(self, param_or_media_type, value):
157173
if not param_or_media_type.schema:
158174
return value

openapi_core/validation/response/validators.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,19 @@ def _get_data(self, response, operation_response):
8181
errors.append(exc)
8282
else:
8383
try:
84-
casted = media_type.cast(raw_data)
84+
deserialised = self._deserialise(media_type, raw_data)
8585
except InvalidMediaTypeValue as exc:
8686
errors.append(exc)
8787
else:
8888
try:
89-
data = self._unmarshal(media_type, casted)
90-
except (ValidateError, UnmarshalError) as exc:
89+
casted = self._cast(media_type, deserialised)
90+
except InvalidMediaTypeValue as exc:
9191
errors.append(exc)
92+
else:
93+
try:
94+
data = self._unmarshal(media_type, casted)
95+
except (ValidateError, UnmarshalError) as exc:
96+
errors.append(exc)
9297

9398
return data, errors
9499

@@ -100,6 +105,12 @@ def _get_headers(self, response, operation_response):
100105

101106
return headers, errors
102107

108+
def _deserialise(self, param_or_media_type, value):
109+
return param_or_media_type.deserialise(value)
110+
111+
def _cast(self, param_or_media_type, value):
112+
return param_or_media_type.cast(value)
113+
103114
def _unmarshal(self, param_or_media_type, value):
104115
if not param_or_media_type.schema:
105116
return value

tests/unit/schema/test_media_types.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@
44
from openapi_core.schema.media_types.models import MediaType
55

66

7-
class TestMediaTypeCast(object):
7+
class TestMediaTypeDeserialise(object):
88

99
def test_empty(self):
1010
media_type = MediaType('application/json')
1111
value = ''
1212

1313
with pytest.raises(InvalidMediaTypeValue):
14-
media_type.cast(value)
14+
media_type.deserialise(value)
1515

1616
def test_no_schema_deserialised(self):
1717
media_type = MediaType('application/json')
1818
value = "{}"
1919

20-
result = media_type.cast(value)
20+
result = media_type.deserialise(value)
2121

2222
assert result == {}

tests/unit/schema/test_parameters.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,14 @@ def test_cookie(self):
3838
assert param.explode is True
3939

4040

41-
class TestParameterCast(object):
41+
class TestParameterDeserialise(object):
4242

4343
def test_deprecated(self):
4444
param = Parameter('param', 'query', deprecated=True)
4545
value = 'test'
4646

4747
with pytest.warns(DeprecationWarning):
48-
result = param.cast(value)
48+
result = param.deserialise(value)
4949

5050
assert result == value
5151

@@ -54,12 +54,12 @@ def test_query_empty(self):
5454
value = ''
5555

5656
with pytest.raises(EmptyParameterValue):
57-
param.cast(value)
57+
param.deserialise(value)
5858

5959
def test_query_valid(self):
6060
param = Parameter('param', 'query')
6161
value = 'test'
6262

63-
result = param.cast(value)
63+
result = param.deserialise(value)
6464

6565
assert result == value

0 commit comments

Comments
 (0)