summaryrefslogtreecommitdiffstats
path: root/szuruboorupy/exceptions.py
diff options
context:
space:
mode:
Diffstat (limited to 'szuruboorupy/exceptions.py')
-rw-r--r--szuruboorupy/exceptions.py341
1 files changed, 341 insertions, 0 deletions
diff --git a/szuruboorupy/exceptions.py b/szuruboorupy/exceptions.py
new file mode 100644
index 0000000..bde9c9a
--- /dev/null
+++ b/szuruboorupy/exceptions.py
@@ -0,0 +1,341 @@
+"""Possible Exceptions that are returned by the Szurubooru REST API
+
+We define the general Exception `SzurubooruException` and possible child exceptions
+defined in this module as well as the Szurubooru API docs:
+https://github.com/rr-/szurubooru/blob/master/doc/API.md#error-handling
+"""
+
+import requests as r
+import json
+
+
+class SzurubooruException(Exception):
+ """General Error returned from the Szurubooru REST API.
+
+ The Szurubooru API returns errors together with an http code in a form like this:
+ .. code-block:: JSON
+ {
+ "name": "Name of the error, e.g. 'PostNotFoundError'",
+ "title": "Generic title of error message, e.g. 'Not found'",
+ "description": "Detailed description of what went wrong, e.g.
+ 'User `rr-` not found."
+ }
+
+ We map this json response to the SzurubooruException class or more specific children
+ such as MissingRequiredFileError with the fields / args that are provided from the
+ json response.
+
+ Args:
+ name: Name of the exception as defined by the Szurubooru REST API
+ The name is also used in more specific Exceptions such as
+ MissingRequiredFileError(SzurubooruException).
+ title: Generic, human readable title of the error message.
+ description: More detailed description of what went wrong. Often includes
+ input from the user that caused the error.
+ """
+
+ name: str
+ title: str
+ description: str
+
+ def __init__(self, name: str, title: str, description: str) -> None:
+ self.name = name
+ self.title = title
+ self.description = description
+ super().__init__(description)
+
+ @staticmethod
+ def response_is_exception(res: r.Response) -> bool:
+ """Check if the Szurubooru REST API response is an error or not.
+
+ Args:
+ res (r.Response): the Response of the request from the requests module.
+
+ Returns:
+ bool: True if response is an error and False if it is not.
+ """
+ return res.status_code != 200
+
+ @staticmethod
+ def map_exception(res: r.Response) -> Exception:
+ """Generate an exception for an error response from the Szurubooru REST API.
+
+ Args:
+ res (r.Response): the Response from the Szurubooru REST API that should be
+ mapped to a Python Exception.
+
+ Raises:
+ LookupError: Thrown when the Szurubooru REST API sent an error type (name)
+ that could not be mapped to one of the SzurubooruException
+ Python Exceptions. This can happen when there was an unexpected
+ e.g. an Internal Server Error in the Szurubooru REST API.
+
+ Returns:
+ Exception: Returns a more specific exception.
+ """
+ content: dict[str, str] = json.loads(res.content)
+ name: str = content["name"]
+ title: str = content["title"]
+ description: str = content["description"]
+
+ match name:
+ case "MissingRequiredFileError":
+ return MissingRequiredFileError(name, title, description)
+ case "MissingRequiredParameterError":
+ return MissingRequiredParameterError(name, title, description)
+ case "InvalidParameterError":
+ return InvalidParameterError(name, title, description)
+ case "IntegrityError":
+ return IntegrityError(name, title, description)
+ case "SearchError":
+ return SearchError(name, title, description)
+ case "AuthError":
+ return AuthError(name, title, description)
+ case "PostNotFoundError":
+ return PostNotFoundError(name, title, description)
+ case "PostAlreadyFeaturedError":
+ return PostAlreadyFeaturedError(name, title, description)
+ case "PostAlreadyUploadedError":
+ return PostAlreadyUploadedError(name, title, description)
+ case "InvalidPostIdError":
+ return InvalidPostIdError(name, title, description)
+ case "InvalidPostSafetyError":
+ return InvalidPostSafetyError(name, title, description)
+ case "InvalidPostSourceError":
+ return InvalidPostSourceError(name, title, description)
+ case "InvalidPostContentError":
+ return InvalidPostContentError(name, title, description)
+ case "InvalidPostRelationError":
+ return InvalidPostRelationError(name, title, description)
+ case "InvalidPostNoteError":
+ return InvalidPostNoteError(name, title, description)
+ case "InvalidPostFlagError":
+ return InvalidPostFlagError(name, title, description)
+ case "InvalidFavoriteTargetError":
+ return InvalidFavoriteTargetError(name, title, description)
+ case "InvalidCommentIdError":
+ return InvalidCommentIdError(name, title, description)
+ case "CommentNotFoundError":
+ return CommentNotFoundError(name, title, description)
+ case "EmptyCommentTextError":
+ return EmptyCommentTextError(name, title, description)
+ case "InvalidScoreTargetError":
+ return InvalidScoreTargetError(name, title, description)
+ case "InvalidScoreValueError":
+ return InvalidScoreValueError(name, title, description)
+ case "TagCategoryNotFoundError":
+ return TagCategoryNotFoundError(name, title, description)
+ case "TagCategoryAlreadyExistsError":
+ return TagCategoryAlreadyExistsError(name, title, description)
+ case "TagCategoryIsInUseError":
+ return TagCategoryIsInUseError(name, title, description)
+ case "InvalidTagCategoryNameError":
+ return InvalidTagCategoryNameError(name, title, description)
+ case "InvalidTagCategoryColorError":
+ return InvalidTagCategoryColorError(name, title, description)
+ case "TagNotFoundError":
+ return TagNotFoundError(name, title, description)
+ case "TagAlreadyExistsError":
+ return TagAlreadyExistsError(name, title, description)
+ case "TagIsInUseError":
+ return TagIsInUseError(name, title, description)
+ case "InvalidTagNameError":
+ return InvalidTagNameError(name, title, description)
+ case "InvalidTagRelationError":
+ return InvalidTagRelationError(name, title, description)
+ case "InvalidTagCategoryError":
+ return InvalidTagCategoryError(name, title, description)
+ case "InvalidTagDescriptionError":
+ return InvalidTagDescriptionError(name, title, description)
+ case "UserNotFoundError":
+ return UserNotFoundError(name, title, description)
+ case "UserAlreadyExistsError":
+ return UserAlreadyExistsError(name, title, description)
+ case "InvalidUserNameError":
+ return InvalidUserNameError(name, title, description)
+ case "InvalidEmailError":
+ return InvalidEmailError(name, title, description)
+ case "InvalidPasswordError":
+ return InvalidPasswordError(name, title, description)
+ case "InvalidRankError":
+ return InvalidRankError(name, title, description)
+ case "InvalidAvatarError":
+ return InvalidAvatarError(name, title, description)
+ case "ProcessingError":
+ return ProcessingError(name, title, description)
+ case "ValidationError":
+ return ValidationError(name, title, description)
+ case _:
+ raise LookupError(f'Unknown SzurubooruException: "{name}"')
+
+
+class MissingRequiredFileError(SzurubooruException): # noqa: D101
+ pass
+
+
+class MissingRequiredParameterError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidParameterError(SzurubooruException): # noqa: D101
+ pass
+
+
+class IntegrityError(SzurubooruException): # noqa: D101
+ pass
+
+
+class SearchError(SzurubooruException): # noqa: D101
+ pass
+
+
+class AuthError(SzurubooruException): # noqa: D101
+ pass
+
+
+class PostNotFoundError(SzurubooruException): # noqa: D101
+ pass
+
+
+class PostAlreadyFeaturedError(SzurubooruException): # noqa: D101
+ pass
+
+
+class PostAlreadyUploadedError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidPostIdError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidPostSafetyError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidPostSourceError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidPostContentError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidPostRelationError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidPostNoteError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidPostFlagError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidFavoriteTargetError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidCommentIdError(SzurubooruException): # noqa: D101
+ pass
+
+
+class CommentNotFoundError(SzurubooruException): # noqa: D101
+ pass
+
+
+class EmptyCommentTextError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidScoreTargetError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidScoreValueError(SzurubooruException): # noqa: D101
+ pass
+
+
+class TagCategoryNotFoundError(SzurubooruException): # noqa: D101
+ pass
+
+
+class TagCategoryAlreadyExistsError(SzurubooruException): # noqa: D101
+ pass
+
+
+class TagCategoryIsInUseError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidTagCategoryNameError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidTagCategoryColorError(SzurubooruException): # noqa: D101
+ pass
+
+
+class TagNotFoundError(SzurubooruException): # noqa: D101
+ pass
+
+
+class TagAlreadyExistsError(SzurubooruException): # noqa: D101
+ pass
+
+
+class TagIsInUseError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidTagNameError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidTagRelationError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidTagCategoryError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidTagDescriptionError(SzurubooruException): # noqa: D101
+ pass
+
+
+class UserNotFoundError(SzurubooruException): # noqa: D101
+ pass
+
+
+class UserAlreadyExistsError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidUserNameError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidEmailError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidPasswordError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidRankError(SzurubooruException): # noqa: D101
+ pass
+
+
+class InvalidAvatarError(SzurubooruException): # noqa: D101
+ pass
+
+
+class ProcessingError(SzurubooruException): # noqa: D101
+ pass
+
+
+class ValidationError(SzurubooruException): # noqa: D101
+ pass