|
1 | 1 | """OpenAPI core mediaTypes module""" |
| 2 | +from collections import defaultdict |
| 3 | + |
| 4 | +from json import loads |
2 | 5 | from six import iteritems |
3 | 6 |
|
4 | 7 | from openapi_core.exceptions import InvalidValueType, InvalidMediaTypeValue |
5 | 8 |
|
6 | 9 |
|
| 10 | +MEDIA_TYPE_DESERIALIZERS = { |
| 11 | + 'application/json': loads, |
| 12 | +} |
| 13 | + |
| 14 | + |
7 | 15 | class MediaType(object): |
8 | 16 | """Represents an OpenAPI MediaType.""" |
9 | 17 |
|
10 | 18 | def __init__(self, mimetype, schema=None): |
11 | 19 | self.mimetype = mimetype |
12 | 20 | self.schema = schema |
13 | 21 |
|
| 22 | + def get_deserializer_mapping(self): |
| 23 | + mapping = MEDIA_TYPE_DESERIALIZERS.copy() |
| 24 | + return defaultdict(lambda: lambda x: x, mapping) |
| 25 | + |
| 26 | + def get_dererializer(self): |
| 27 | + mapping = self.get_deserializer_mapping() |
| 28 | + return mapping[self.mimetype] |
| 29 | + |
| 30 | + def deserialize(self, value): |
| 31 | + deserializer = self.get_dererializer() |
| 32 | + return deserializer(value) |
| 33 | + |
14 | 34 | def unmarshal(self, value): |
15 | 35 | if not self.schema: |
16 | 36 | return value |
17 | 37 |
|
18 | 38 | try: |
19 | | - return self.schema.unmarshal(value) |
| 39 | + deserialized = self.deserialize(value) |
| 40 | + except ValueError as exc: |
| 41 | + raise InvalidMediaTypeValue(str(exc)) |
| 42 | + |
| 43 | + try: |
| 44 | + return self.schema.unmarshal(deserialized) |
20 | 45 | except InvalidValueType as exc: |
21 | 46 | raise InvalidMediaTypeValue(str(exc)) |
22 | 47 |
|
|
0 commit comments