3
3
from openapi_core .deserializing .exceptions import DeserializeError
4
4
from openapi_core .schema .operations .exceptions import InvalidOperation
5
5
from openapi_core .schema .media_types .exceptions import InvalidContentType
6
+ from openapi_core .schema .paths .exceptions import InvalidPath
6
7
from openapi_core .schema .responses .exceptions import (
7
8
InvalidResponse , MissingResponseContent ,
8
9
)
13
14
)
14
15
from openapi_core .validation .response .datatypes import ResponseValidationResult
15
16
from openapi_core .validation .util import get_operation_pattern
17
+ from openapi_core .validation .validators import BaseValidator
16
18
17
19
18
- class ResponseValidator (object ):
19
-
20
- def __init__ (
21
- self , spec ,
22
- custom_formatters = None , custom_media_type_deserializers = None ,
23
- ):
24
- self .spec = spec
25
- self .custom_formatters = custom_formatters
26
- self .custom_media_type_deserializers = custom_media_type_deserializers
20
+ class ResponseValidator (BaseValidator ):
27
21
28
22
def validate (self , request , response ):
23
+ try :
24
+ _ , operation , _ , _ , _ = self ._find_path (request )
25
+ # don't process if operation errors
26
+ except (InvalidServer , InvalidPath , InvalidOperation ) as exc :
27
+ return ResponseValidationResult ([exc , ], None , None )
28
+
29
29
try :
30
30
operation_response = self ._get_operation_response (
31
- request , response )
31
+ operation , response )
32
32
# don't process if operation errors
33
- except ( InvalidServer , InvalidOperation , InvalidResponse ) as exc :
33
+ except InvalidResponse as exc :
34
34
return ResponseValidationResult ([exc , ], None , None )
35
35
36
36
data , data_errors = self ._get_data (response , operation_response )
@@ -41,28 +41,21 @@ def validate(self, request, response):
41
41
errors = data_errors + headers_errors
42
42
return ResponseValidationResult (errors , data , headers )
43
43
44
- def _get_operation_pattern (self , request ):
45
- server = self .spec .get_server (request .full_url_pattern )
46
-
47
- return get_operation_pattern (
48
- server .default_url , request .full_url_pattern
49
- )
50
-
51
- def _get_operation (self , request ):
52
- operation_pattern = self ._get_operation_pattern (request )
53
-
54
- return self .spec .get_operation (operation_pattern , request .method )
55
-
56
- def _get_operation_response (self , request , response ):
57
- operation = self ._get_operation (request )
58
-
44
+ def _get_operation_response (self , operation , response ):
59
45
return operation .get_response (str (response .status_code ))
60
46
61
47
def _validate_data (self , request , response ):
48
+ try :
49
+ _ , operation , _ , _ , _ = self ._find_path (request )
50
+ # don't process if operation errors
51
+ except (InvalidServer , InvalidPath , InvalidOperation ) as exc :
52
+ return ResponseValidationResult ([exc , ], None , None )
53
+
62
54
try :
63
55
operation_response = self ._get_operation_response (
64
- request , response )
65
- except (InvalidServer , InvalidOperation , InvalidResponse ) as exc :
56
+ operation , response )
57
+ # don't process if operation errors
58
+ except InvalidResponse as exc :
66
59
return ResponseValidationResult ([exc , ], None , None )
67
60
68
61
data , data_errors = self ._get_data (response , operation_response )
@@ -113,36 +106,7 @@ def _get_data_value(self, response):
113
106
114
107
return response .data
115
108
116
- def _deserialise_media_type (self , media_type , value ):
117
- from openapi_core .deserializing .media_types .factories import (
118
- MediaTypeDeserializersFactory ,
119
- )
120
- deserializers_factory = MediaTypeDeserializersFactory (
121
- self .custom_media_type_deserializers )
122
- deserializer = deserializers_factory .create (media_type )
123
- return deserializer (value )
124
-
125
- def _cast (self , param_or_media_type , value ):
126
- # return param_or_media_type.cast(value)
127
- if not param_or_media_type .schema :
128
- return value
129
-
130
- from openapi_core .casting .schemas .factories import SchemaCastersFactory
131
- casters_factory = SchemaCastersFactory ()
132
- caster = casters_factory .create (param_or_media_type .schema )
133
- return caster (value )
134
-
135
109
def _unmarshal (self , param_or_media_type , value ):
136
- if not param_or_media_type .schema :
137
- return value
138
-
139
- from openapi_core .unmarshalling .schemas .factories import (
140
- SchemaUnmarshallersFactory ,
141
- )
142
- unmarshallers_factory = SchemaUnmarshallersFactory (
143
- self .spec ._resolver , self .custom_formatters ,
144
- context = UnmarshalContext .RESPONSE ,
110
+ return super (ResponseValidator , self )._unmarshal (
111
+ param_or_media_type , value , context = UnmarshalContext .RESPONSE ,
145
112
)
146
- unmarshaller = unmarshallers_factory .create (
147
- param_or_media_type .schema )
148
- return unmarshaller (value )
0 commit comments