1
1
"""OpenAPI core templating media types finders module"""
2
2
import fnmatch
3
+ from typing import Mapping
4
+ from typing import Tuple
3
5
4
6
from openapi_core .spec import Spec
5
7
from openapi_core .templating .media_types .datatypes import MediaType
@@ -12,15 +14,34 @@ def __init__(self, content: Spec):
12
14
13
15
def get_first (self ) -> MediaType :
14
16
mimetype , media_type = next (self .content .items ())
15
- return MediaType (media_type , mimetype )
17
+ return MediaType (mimetype , {}, media_type )
16
18
17
19
def find (self , mimetype : str ) -> MediaType :
18
- if mimetype in self . content :
19
- return MediaType ( self . content / mimetype , mimetype )
20
+ if mimetype is None :
21
+ raise MediaTypeNotFound ( mimetype , list ( self . content . keys ()) )
20
22
21
- if mimetype :
23
+ mime_type , parameters = self ._parse_mimetype (mimetype )
24
+
25
+ # simple mime type
26
+ for m in [mimetype , mime_type ]:
27
+ if m in self .content :
28
+ return MediaType (mime_type , parameters , self .content / m )
29
+
30
+ # range mime type
31
+ if mime_type :
22
32
for key , value in self .content .items ():
23
- if fnmatch .fnmatch (mimetype , key ):
24
- return MediaType (value , key )
33
+ if fnmatch .fnmatch (mime_type , key ):
34
+ return MediaType (key , parameters , value )
25
35
26
36
raise MediaTypeNotFound (mimetype , list (self .content .keys ()))
37
+
38
+ def _parse_mimetype (self , mimetype : str ) -> Tuple [str , Mapping [str , str ]]:
39
+ mimetype_parts = mimetype .split ("; " )
40
+ mime_type = mimetype_parts [0 ]
41
+ parameters = {}
42
+ if len (mimetype_parts ) > 1 :
43
+ parameters_list = (
44
+ param_str .split ("=" ) for param_str in mimetype_parts [1 :]
45
+ )
46
+ parameters = dict (parameters_list )
47
+ return mime_type , parameters
0 commit comments