Repository navigation
Expand file tree
/
Copy pathexceptions.py
More file actions
113 lines (80 loc) · 2.84 KB
/
Copy pathexceptions.py
File metadata and controls
113 lines (80 loc) · 2.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
from abc import ABC
from typing import Any
__all__ = (
"OptimadeHTTPException",
"BadRequest",
"VersionNotSupported",
"Forbidden",
"NotFound",
"UnprocessableEntity",
"InternalServerError",
"NotImplementedResponse",
"POSSIBLE_ERRORS",
)
class OptimadeHTTPException(Exception, ABC):
"""This abstract class can be subclassed to define
HTTP responses with the desired status codes, and
detailed error strings to represent in the JSON:API
error response.
This class closely follows the `starlette.HTTPException` without
requiring it as a dependency, so that such errors can also be
raised from within client code.
Attributes:
status_code: The HTTP status code accompanying this exception.
title: A descriptive title for this exception.
detail: An optional string containing the details of the error.
"""
status_code: int
title: str
detail: str | None = None
headers: dict[str, Any] | None = None
def __init__(self, detail: str | None = None, headers: dict | None = None) -> None:
if self.status_code is None:
raise AttributeError(
"HTTPException class {self.__class__.__name__} is missing required `status_code` attribute."
)
self.detail = detail
self.headers = headers
def __str__(self) -> str:
return self.detail if self.detail is not None else self.__repr__()
def __repr__(self) -> str:
class_name = self.__class__.__name__
return f"{class_name}(status_code={self.status_code!r}, detail={self.detail!r})"
class BadRequest(OptimadeHTTPException):
"""400 Bad Request"""
status_code: int = 400
title: str = "Bad Request"
class VersionNotSupported(OptimadeHTTPException):
"""553 Version Not Supported"""
status_code: int = 553
title: str = "Version Not Supported"
class Forbidden(OptimadeHTTPException):
"""403 Forbidden"""
status_code: int = 403
title: str = "Forbidden"
class NotFound(OptimadeHTTPException):
"""404 Not Found"""
status_code: int = 404
title: str = "Not Found"
class UnprocessableEntity(OptimadeHTTPException):
"""422 Unprocessable Entity"""
status_code: int = 422
title: str = "Unprocessable Entity"
class InternalServerError(OptimadeHTTPException):
"""500 Internal Server Error"""
status_code: int = 500
title: str = "Internal Server Error"
class NotImplementedResponse(OptimadeHTTPException):
"""501 Not Implemented"""
status_code: int = 501
title: str = "Not Implemented"
"""A tuple of the possible errors that can be returned by an OPTIMADE API."""
POSSIBLE_ERRORS: tuple[type[OptimadeHTTPException], ...] = (
BadRequest,
Forbidden,
NotFound,
UnprocessableEntity,
InternalServerError,
NotImplementedResponse,
VersionNotSupported,
)