Skip to content

Commit 4e1a61a

Browse files
committed
Exceptions restructure
1 parent 9b05d7b commit 4e1a61a

File tree

27 files changed

+287
-209
lines changed

27 files changed

+287
-209
lines changed

openapi_core/exceptions.py

Lines changed: 0 additions & 77 deletions
This file was deleted.

openapi_core/schema/exceptions.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
"""OpenAPI core schema exceptions module"""
2+
3+
4+
class OpenAPIError(Exception):
5+
pass
6+
7+
8+
class OpenAPIMappingError(OpenAPIError):
9+
pass
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from openapi_core.schema.exceptions import OpenAPIMappingError
2+
3+
4+
class OpenAPIMediaTypeError(OpenAPIMappingError):
5+
pass
6+
7+
8+
class InvalidMediaTypeValue(OpenAPIMediaTypeError):
9+
pass
10+
11+
12+
class InvalidContentType(OpenAPIMediaTypeError):
13+
pass

openapi_core/schema/media_types/models.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
from collections import defaultdict
33

44
from json import loads
5-
from six import iteritems
65

7-
from openapi_core.exceptions import InvalidValueType, InvalidMediaTypeValue
6+
from openapi_core.schema.media_types.exceptions import InvalidMediaTypeValue
7+
from openapi_core.schema.schemas.exceptions import InvalidSchemaValue
88

99

1010
MEDIA_TYPE_DESERIALIZERS = {
@@ -42,5 +42,5 @@ def unmarshal(self, value):
4242

4343
try:
4444
return self.schema.unmarshal(deserialized)
45-
except InvalidValueType as exc:
45+
except InvalidSchemaValue as exc:
4646
raise InvalidMediaTypeValue(str(exc))
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from openapi_core.schema.exceptions import OpenAPIMappingError
2+
3+
4+
class OpenAPIOperationError(OpenAPIMappingError):
5+
pass
6+
7+
8+
class InvalidOperation(OpenAPIOperationError):
9+
pass

openapi_core/schema/operations/models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# -*- coding: utf-8 -*-
22
"""OpenAPI core operations models module"""
3-
from openapi_core.exceptions import InvalidResponse
3+
from openapi_core.schema.responses.exceptions import InvalidResponse
44

55

66
class Operation(object):
@@ -21,6 +21,7 @@ def __getitem__(self, name):
2121
return self.parameters[name]
2222

2323
def get_response(self, http_status='default'):
24+
# @todo: move to Responses object
2425
try:
2526
return self.responses[http_status]
2627
except KeyError:
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from openapi_core.schema.exceptions import OpenAPIMappingError
2+
3+
4+
class OpenAPIParameterError(OpenAPIMappingError):
5+
pass
6+
7+
8+
class MissingParameter(OpenAPIParameterError):
9+
pass
10+
11+
12+
class MissingRequiredParameter(OpenAPIParameterError):
13+
pass
14+
15+
16+
class EmptyParameterValue(OpenAPIParameterError):
17+
pass
18+
19+
20+
class InvalidParameterValue(OpenAPIParameterError):
21+
pass

openapi_core/schema/parameters/models.py

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
import logging
33
import warnings
44

5-
from openapi_core.exceptions import (
6-
EmptyValue, InvalidValueType, InvalidParameterValue,
7-
)
85
from openapi_core.schema.parameters.enums import ParameterLocation, ParameterStyle
6+
from openapi_core.schema.parameters.exceptions import (
7+
MissingRequiredParameter, MissingParameter, InvalidParameterValue,
8+
EmptyParameterValue,
9+
)
910
from openapi_core.schema.schemas.enums import SchemaType
11+
from openapi_core.schema.schemas.exceptions import InvalidSchemaValue
1012

1113
log = logging.getLogger(__name__)
1214

@@ -68,6 +70,27 @@ def deserialize(self, value):
6870
deserializer = self.get_dererializer()
6971
return deserializer(value)
7072

73+
def get_value(self, request):
74+
location = request.parameters[self.location.value]
75+
76+
try:
77+
raw = location[self.name]
78+
except KeyError:
79+
if self.required:
80+
raise MissingRequiredParameter(
81+
"Missing required `{0}` parameter".format(self.name))
82+
83+
if not self.schema or self.schema.default is None:
84+
raise MissingParameter(
85+
"Missing `{0}` parameter".format(self.name))
86+
87+
raw = self.schema.default
88+
89+
if self.aslist and self.explode:
90+
return location.getlist(self.name)
91+
92+
return raw
93+
7194
def unmarshal(self, value):
7295
if self.deprecated:
7396
warnings.warn(
@@ -77,7 +100,7 @@ def unmarshal(self, value):
77100

78101
if (self.location == ParameterLocation.QUERY and value == "" and
79102
not self.allow_empty_value):
80-
raise EmptyValue(
103+
raise EmptyParameterValue(
81104
"Value of {0} parameter cannot be empty".format(self.name))
82105

83106
if not self.schema:
@@ -87,5 +110,5 @@ def unmarshal(self, value):
87110

88111
try:
89112
return self.schema.unmarshal(deserialized)
90-
except InvalidValueType as exc:
113+
except InvalidSchemaValue as exc:
91114
raise InvalidParameterValue(str(exc))
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from openapi_core.schema.exceptions import OpenAPIMappingError
2+
3+
4+
class OpenAPIRequestBodyError(OpenAPIMappingError):
5+
pass
6+
7+
8+
class MissingRequestBody(OpenAPIRequestBodyError):
9+
pass

openapi_core/schema/request_bodies/models.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
"""OpenAPI core request bodies models module"""
2-
from openapi_core.exceptions import InvalidContentType
2+
3+
from openapi_core.schema.media_types.exceptions import InvalidContentType
4+
from openapi_core.schema.request_bodies.exceptions import MissingRequestBody
35

46

57
class RequestBody(object):
@@ -15,3 +17,9 @@ def __getitem__(self, mimetype):
1517
except KeyError:
1618
raise InvalidContentType(
1719
"Invalid mime type `{0}`".format(mimetype))
20+
21+
def get_value(self, request):
22+
if not request.body and self.required:
23+
raise MissingRequestBody("Missing required request body")
24+
25+
return request.body

0 commit comments

Comments
 (0)