From c61d6fc80d7c20f580ad111db59352b8eae7b7da Mon Sep 17 00:00:00 2001 From: Colin Wilk Date: Mon, 9 Oct 2023 11:52:05 +0200 Subject: Rename booru-sync to szuruboorupy Initially the project was intended as a script repository containing scripts for managing my szurubooru instance. Since most of my work was actually writing an API client, I decided to rename this repository to an API client and do the script repository later on separately. Signed-off-by: Colin Wilk --- szuruboorupy/exceptions.py | 341 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 341 insertions(+) create mode 100644 szuruboorupy/exceptions.py (limited to 'szuruboorupy/exceptions.py') 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 -- cgit v1.2.3