Skip to content
This repository was archived by the owner on Nov 19, 2024. It is now read-only.

Commit caa8406

Browse files
committed
Docs: Added documentation for custom errors
1 parent 2a66a9f commit caa8406

17 files changed

+465
-63
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,10 @@ tox -p
7676

7777
# TODO
7878

79-
- [ ] Documentation
80-
- [ ] Licence
79+
- [ ] Move todo-list to GitHub issues
8180
- [ ] Badges
8281
- [ ] Automatic build/deployment (https://github.com/pypa/cibuildwheel)
8382
- [ ] https://github.com/PyCQA/flake8-bugbear
8483
- [ ] Versioning of docs in Read the Docs
84+
- [ ] Refactor documentation to avoid full links in docs (have `BadRequestError` instead of `flask_utils.errors.BadRequestError`)
85+
- [ ] Add usage examples to documentation in the Usage section

docs/source/api.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@ This part of the documentation covers all the interfaces of Flask-Utils
99
Custom exceptions
1010
-----------------
1111

12+
.. warning:: For any of these errors to work, you need to register the error handlers in your Flask app.
13+
To do this, you can call :meth:`flask_utils.errors.register_error_handlers` with your Flask app as an argument.
14+
15+
.. code-block:: python
16+
17+
from flask_utils import register_error_handlers
18+
register_error_handlers(app)
19+
1220
.. automodule:: flask_utils.errors
1321
:members:
1422

flask_utils/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Increment versions here according to SemVer
2-
__version__ = "0.2.4"
2+
__version__ = "0.2.5"
33

44
from flask_utils.errors import ConflictError
55
from flask_utils.errors import ForbiddenError

flask_utils/errors/__init__.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from flask import Flask
22
from flask import Response
33

4-
from flask_utils.errors._error_template import generate_error_json
4+
from flask_utils.errors._error_template import _generate_error_json
55
from flask_utils.errors.badrequest import BadRequestError
66
from flask_utils.errors.conflict import ConflictError
77
from flask_utils.errors.failed_dependency import FailedDependencyError
@@ -32,7 +32,7 @@ def generate_badrequest(error: BadRequestError) -> Response:
3232
:param error: The error body
3333
:return: Returns the response formatted
3434
"""
35-
return generate_error_json(error, 400)
35+
return _generate_error_json(error, 400)
3636

3737
@application.errorhandler(ConflictError)
3838
def generate_conflict(error: ConflictError) -> Response:
@@ -44,7 +44,7 @@ def generate_conflict(error: ConflictError) -> Response:
4444
:return: Returns the response formatted
4545
"""
4646

47-
return generate_error_json(error, 409)
47+
return _generate_error_json(error, 409)
4848

4949
@application.errorhandler(ForbiddenError)
5050
def generate_forbidden(error: ForbiddenError) -> Response:
@@ -56,7 +56,7 @@ def generate_forbidden(error: ForbiddenError) -> Response:
5656
:return: Returns the response formatted
5757
"""
5858

59-
return generate_error_json(error, 403)
59+
return _generate_error_json(error, 403)
6060

6161
@application.errorhandler(NotFoundError)
6262
def generate_notfound(error: NotFoundError) -> Response:
@@ -68,7 +68,7 @@ def generate_notfound(error: NotFoundError) -> Response:
6868
:return: Returns the response formatted
6969
"""
7070

71-
return generate_error_json(error, 404)
71+
return _generate_error_json(error, 404)
7272

7373
@application.errorhandler(UnauthorizedError)
7474
def generate_unauthorized(error: UnauthorizedError) -> Response:
@@ -80,7 +80,7 @@ def generate_unauthorized(error: UnauthorizedError) -> Response:
8080
:return: Returns the response formatted
8181
"""
8282

83-
return generate_error_json(error, 401)
83+
return _generate_error_json(error, 401)
8484

8585
@application.errorhandler(OriginIsUnreachableError)
8686
def generate_origin_is_unreachable(error: OriginIsUnreachableError) -> Response:
@@ -92,7 +92,7 @@ def generate_origin_is_unreachable(error: OriginIsUnreachableError) -> Response:
9292
:return: Returns the response formatted
9393
"""
9494

95-
return generate_error_json(error, 523)
95+
return _generate_error_json(error, 523)
9696

9797
@application.errorhandler(WebServerIsDownError)
9898
def generate_web_server_is_down(error: WebServerIsDownError) -> Response:
@@ -104,7 +104,7 @@ def generate_web_server_is_down(error: WebServerIsDownError) -> Response:
104104
:return: Returns the response formatted
105105
"""
106106

107-
return generate_error_json(error, 521)
107+
return _generate_error_json(error, 521)
108108

109109
@application.errorhandler(FailedDependencyError)
110110
def generate_failed_dependency(error: FailedDependencyError) -> Response:
@@ -116,7 +116,7 @@ def generate_failed_dependency(error: FailedDependencyError) -> Response:
116116
:return: Returns the response formatted
117117
"""
118118

119-
return generate_error_json(error, 424)
119+
return _generate_error_json(error, 424)
120120

121121
@application.errorhandler(GoneError)
122122
def generate_gone(error: GoneError) -> Response:
@@ -128,7 +128,7 @@ def generate_gone(error: GoneError) -> Response:
128128
:return: Returns the response formatted
129129
"""
130130

131-
return generate_error_json(error, 410)
131+
return _generate_error_json(error, 410)
132132

133133
@application.errorhandler(UnprocessableEntityError)
134134
def generate_unprocessable_entity(error: UnprocessableEntityError) -> Response:
@@ -140,7 +140,7 @@ def generate_unprocessable_entity(error: UnprocessableEntityError) -> Response:
140140
:return: Returns the response formatted
141141
"""
142142

143-
return generate_error_json(error, 422)
143+
return _generate_error_json(error, 422)
144144

145145
@application.errorhandler(ServiceUnavailableError)
146146
def generate_service_unavailable(error: ServiceUnavailableError) -> Response:
@@ -152,7 +152,7 @@ def generate_service_unavailable(error: ServiceUnavailableError) -> Response:
152152
:return: Returns the response formatted
153153
"""
154154

155-
return generate_error_json(error, 503)
155+
return _generate_error_json(error, 503)
156156

157157

158158
__all__ = [
@@ -161,7 +161,7 @@ def generate_service_unavailable(error: ServiceUnavailableError) -> Response:
161161
"ForbiddenError",
162162
"NotFoundError",
163163
"UnauthorizedError",
164-
"generate_error_json",
164+
"_generate_error_json",
165165
"FailedDependencyError",
166166
"WebServerIsDownError",
167167
"OriginIsUnreachableError",

flask_utils/errors/_error_template.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,35 @@
11
from flask import jsonify
22
from flask import Response
33

4-
from flask_utils.errors.base_class import BaseFlaskException
4+
from flask_utils.errors.base_class import _BaseFlaskException
55

66

7-
def generate_error_json(error: BaseFlaskException, status_code: int) -> Response:
7+
def _generate_error_json(error: _BaseFlaskException, status_code: int) -> Response:
88
"""
99
This function is used to generate a json of the error passed
1010
1111
:param error: The error containing the message and solution
1212
:param status_code: The status code of the error.
1313
:return: Returns a json containing all the info
14+
15+
:Example:
16+
17+
.. code-block:: python
18+
19+
from flask_utils.errors import _BaseFlaskException
20+
from flask_utils.errors._error_template import _generate_error_json
21+
22+
class MyError(_BaseFlaskException):
23+
self.name = "MyError"
24+
self.msg = msg
25+
self.solution = solution
26+
self.status_code = 666
27+
28+
error = MyError("This is an error", "This is the solution")
29+
30+
json = _generate_error_json(error, 666)
31+
32+
.. versionadded:: 0.1.0
1433
"""
1534
success = False
1635
json = {

flask_utils/errors/badrequest.py

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,43 @@
1-
from flask_utils.errors.base_class import BaseFlaskException
1+
from flask_utils.errors.base_class import _BaseFlaskException
22

33

4-
class BadRequestError(BaseFlaskException):
5-
"""
6-
This is the BadRequestError class for the Exception.
4+
class BadRequestError(_BaseFlaskException):
5+
"""This is the BadRequestError exception class.
6+
7+
When raised, it will return a 400 status code with the message and solution provided.
8+
9+
:param msg: The message to be displayed in the error.
10+
:param solution: The solution to the error.
11+
12+
:Example:
13+
14+
.. code-block:: python
15+
16+
from flask_utils.errors import BadRequestError
17+
18+
# Inside a Flask route
19+
@app.route('/example', methods=['POST'])
20+
def example_route():
21+
...
22+
if some_condition:
23+
raise BadRequestError("This is a bad request error.")
24+
25+
The above code would return the following JSON response from Flask:
26+
27+
.. code-block:: json
28+
29+
{
30+
"success": false,
31+
"error": {
32+
"type": "BadRequestError",
33+
"name": "Bad Request",
34+
"message": "This is a bad request error.",
35+
"solution": "Try again."
36+
},
37+
"code": 400
38+
}
39+
40+
.. versionadded:: 0.1.0
741
"""
842

943
def __init__(self, msg: str, solution: str = "Try again.") -> None:

flask_utils/errors/base_class.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import Optional
22

33

4-
class BaseFlaskException(Exception):
4+
class _BaseFlaskException(Exception):
55
name: Optional[str] = None
66
msg: Optional[str] = None
77
solution: str = "Try again."

flask_utils/errors/conflict.py

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,43 @@
1-
from flask_utils.errors.base_class import BaseFlaskException
1+
from flask_utils.errors.base_class import _BaseFlaskException
22

33

4-
class ConflictError(BaseFlaskException):
5-
"""
6-
This is the ConflictError class for the Exception.
4+
class ConflictError(_BaseFlaskException):
5+
"""This is the ConflictError exception class.
6+
7+
When raised, it will return a 409 status code with the message and solution provided.
8+
9+
:param msg: The message to be displayed in the error.
10+
:param solution: The solution to the error.
11+
12+
:Example:
13+
14+
.. code-block:: python
15+
16+
from flask_utils.errors import ConflictError
17+
18+
# Inside a Flask route
19+
@app.route('/example', methods=['POST'])
20+
def example_route():
21+
...
22+
if some_condition:
23+
raise ConflictError("This is a conflict error.")
24+
25+
The above code would return the following JSON response from Flask:
26+
27+
.. code-block:: json
28+
29+
{
30+
"success": false,
31+
"error": {
32+
"type": "ConflictError",
33+
"name": "Conflict",
34+
"message": "This is a conflict error.",
35+
"solution": "Try again."
36+
},
37+
"code": 409
38+
}
39+
40+
.. versionadded:: 0.1.0
741
"""
842

943
def __init__(self, msg: str, solution: str = "Try again.") -> None:

flask_utils/errors/failed_dependency.py

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,43 @@
1-
from flask_utils.errors.base_class import BaseFlaskException
1+
from flask_utils.errors.base_class import _BaseFlaskException
22

33

4-
class FailedDependencyError(BaseFlaskException):
5-
"""
6-
This is the FailedDependencyError class for the Exception.
4+
class FailedDependencyError(_BaseFlaskException):
5+
"""This is the FailedDependencyError exception class.
6+
7+
When raised, it will return a 424 status code with the message and solution provided.
8+
9+
:param msg: The message to be displayed in the error.
10+
:param solution: The solution to the error.
11+
12+
:Example:
13+
14+
.. code-block:: python
15+
16+
from flask_utils.errors import FailedDependencyError
17+
18+
# Inside a Flask route
19+
@app.route('/example', methods=['POST'])
20+
def example_route():
21+
...
22+
if some_condition:
23+
raise FailedDependencyError("This is a failed dependency error.")
24+
25+
The above code would return the following JSON response from Flask:
26+
27+
.. code-block:: json
28+
29+
{
30+
"success": false,
31+
"error": {
32+
"type": "FailedDependencyError",
33+
"name": "Failed Dependency",
34+
"message": "This is a failed dependency error.",
35+
"solution": "Try again later."
36+
},
37+
"code": 424
38+
}
39+
40+
.. versionadded:: 0.1.0
741
"""
842

943
def __init__(self, msg: str, solution: str = "Try again later.") -> None:

flask_utils/errors/forbidden.py

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,43 @@
1-
from flask_utils.errors.base_class import BaseFlaskException
1+
from flask_utils.errors.base_class import _BaseFlaskException
22

33

4-
class ForbiddenError(BaseFlaskException):
5-
"""
6-
This is the ForbiddenError class for the Exception.
4+
class ForbiddenError(_BaseFlaskException):
5+
"""This is the ForbiddenError exception class.
6+
7+
When raised, it will return a 403 status code with the message and solution provided.
8+
9+
:param msg: The message to be displayed in the error.
10+
:param solution: The solution to the error.
11+
12+
:Example:
13+
14+
.. code-block:: python
15+
16+
from flask_utils.errors import ForbiddenError
17+
18+
# Inside a Flask route
19+
@app.route('/example', methods=['POST'])
20+
def example_route():
21+
...
22+
if some_condition:
23+
raise ForbiddenError("This is a forbidden error.")
24+
25+
The above code would return the following JSON response from Flask:
26+
27+
.. code-block:: json
28+
29+
{
30+
"success": false,
31+
"error": {
32+
"type": "ForbiddenError",
33+
"name": "Forbidden",
34+
"message": "This is a forbidden error.",
35+
"solution": "Try again."
36+
},
37+
"code": 403
38+
}
39+
40+
.. versionadded:: 0.1.0
741
"""
842

943
def __init__(self, msg: str, solution: str = "Try again.") -> None:

0 commit comments

Comments
 (0)