Skip to content

Commit d0eef79

Browse files
authored
Consolidate Error Classes (#35)
* WIP * Consolidate erro classes * Add import * Fix some bugs in response handling * A few more type oddities Co-authored-by: Ted Benson <[email protected]>
1 parent 11f4b1b commit d0eef79

File tree

4 files changed

+55
-37
lines changed

4 files changed

+55
-37
lines changed

src/steamship/app/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
from .app import App, get, post
22
from .lambda_handler import create_handler
33
from .request import Request, Invocation
4-
from .response import Response, AppResponse, ErrorResponse, Error
4+
from .response import Response, AppResponse, Error

src/steamship/app/lambda_handler.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from steamship.app.request import Request
88
from steamship.app.response import Response, Error, Http
99
from steamship.client.client import Steamship
10-
10+
from steamship.base import SteamshipError
1111

1212
def create_handler(App: Type[App]):
1313
"""Wrapper function for an Steamship app within an AWS Lambda function.
@@ -54,6 +54,11 @@ def handler(event: Dict, context: Dict = None) -> Dict:
5454

5555
if type(response) == Response:
5656
lambda_response = response
57+
elif type(response) == SteamshipError:
58+
lambda_response = Response(
59+
error=response,
60+
http=Http(status=500)
61+
)
5762
elif type(response) == io.BytesIO:
5863
lambda_response = Response(bytes=response)
5964
elif type(response) == dict:
@@ -66,16 +71,14 @@ def handler(event: Dict, context: Dict = None) -> Dict:
6671
lambda_response = Response(json=response)
6772
else:
6873
lambda_response = Response(
69-
error=Error(message="Handler provided unknown response type."),
70-
http=Http(statusCode=500)
74+
error=SteamshipError(message="Handler provided unknown response type."),
75+
http=Http(status=500)
7176
)
72-
7377
if lambda_response is None:
7478
lambda_response = Response(
75-
error=Error(message="Handler provided no response."),
76-
http=Http(statusCode=500)
79+
error=SteamshipError(message="Handler provided no response."),
80+
http=Http(status=500)
7781
)
78-
7982
return dataclasses.asdict(lambda_response)
8083

8184
return handler

src/steamship/app/response.py

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,14 @@
44
from typing import Dict, Any
55

66
from steamship.base.binary_utils import flexi_create
7+
from steamship.base import SteamshipError
78

89

910
@dataclass
1011
class AppResponse:
1112
pass
1213

1314

14-
@dataclass
15-
class ErrorResponse():
16-
message: str = None
17-
internalMessage: str = None
18-
error: str = None
19-
suggestion: str = None
20-
code: str = None
21-
22-
def log(self):
23-
logging.error("[{}] {}. [Internal: {}]".format(self.code, self.message, self.internalMessage))
24-
if self.error:
25-
logging.error(self.error)
26-
27-
2815
@dataclass
2916
class Http():
3017
status: int = None
@@ -33,13 +20,13 @@ class Http():
3320

3421
@dataclass
3522
class Response(AppResponse):
36-
error: ErrorResponse = None
23+
error: SteamshipError = None
3724
http: Http = None
3825
body: any = None
3926

4027
def __init__(
4128
self,
42-
error: ErrorResponse = None,
29+
error: SteamshipError = None,
4330
http: Http = None,
4431
body: any = None,
4532
string: str = None,
@@ -74,10 +61,10 @@ def Error(
7461
suggestion: str = None,
7562
error: Exception = None
7663
) -> Response:
77-
err = ErrorResponse(
64+
err = SteamshipError(
7865
message=message,
7966
internalMessage=internalMessage,
80-
error="{}".format(error),
67+
error=error,
8168
suggestion=suggestion,
8269
code=code
8370
)

src/steamship/base/error.py

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,26 @@
11
from typing import Any
2+
from dataclasses import dataclass
3+
import logging
4+
from typing import Union
25

3-
6+
@dataclass
47
class SteamshipError(Exception):
5-
statusMessage: str = None
6-
statusSuggestion: str = None
7-
statusCode: str = None
8+
message: str = None
9+
internalMessage: str = None
10+
suggestion: str = None
11+
code: str = None
812
error: str = None
913

10-
def __init__(self, message: str = "Undefined remote error", suggestion: str = None, code: str = None,
11-
error: Exception = None):
12-
self.statusMessage = message
13-
self.statusSuggestion = suggestion
14+
def __init__(
15+
self,
16+
message: str = "Undefined remote error",
17+
internalMessage : str = None,
18+
suggestion: str = None,
19+
code: str = None,
20+
error: Union[Exception, str] = None):
21+
self.message = message
22+
self.suggestion = suggestion
23+
self.internalMessage = internalMessage
1424
self.statusCode = code
1525
if error is not None:
1626
self.error = "{}".format(error)
@@ -20,16 +30,34 @@ def __init__(self, message: str = "Undefined remote error", suggestion: str = No
2030
parts.append("[{}]".format(code))
2131
if message is not None:
2232
parts.append(message)
33+
if internalMessage is not None:
34+
parts.append("Internal Message: {}".format(internalMessage))
2335
if suggestion is not None:
2436
parts.append("Suggestion: {}".format(suggestion))
2537

2638
super().__init__("\n".join(parts))
2739

40+
def log(self):
41+
logging.error("[{}] {}. [Internal: {}] [Suggestion: {}]".format(self.code, self.message, self.internalMessage, self.suggestion))
42+
if self.error:
43+
logging.error(self.error)
44+
45+
def to_dict(self) -> dict:
46+
return dict(
47+
message=self.message,
48+
internalMessage=self.internalMessage,
49+
suggestion=self.suggestion,
50+
code=self.code,
51+
error=self.error
52+
)
53+
2854
@staticmethod
2955
def from_dict(d: any, client: Any = None) -> "SteamshipError":
3056
"""Last resort if subclass doesn't override: pass through."""
3157
return SteamshipError(
32-
message=d.get('statusMessage', None),
33-
suggestion=d.get('statusSuggestion', None),
34-
code=d.get('statusCode', None)
58+
message=d.get('statusMessage', d.get('message', None)),
59+
internalMessage=d.get('internalMessage', None),
60+
suggestion=d.get('statusSuggestion', suggestion=d.get('suggestion', None)),
61+
code=d.get('statusCode', d.get('code', None)),
62+
error=d.get('error', d.get('error', None))
3563
)

0 commit comments

Comments
 (0)