From 79fef262c3e05ff626981c891d9377abb1e18533 Mon Sep 17 00:00:00 2001 From: Nejc Habjan Date: Mon, 30 Mar 2020 01:19:23 +0200 Subject: [PATCH] chore: use raise..from for chained exceptions (#939) --- gitlab/__init__.py | 22 ++++++++++++++-------- gitlab/config.py | 8 ++++---- gitlab/exceptions.py | 2 +- gitlab/tests/test_exceptions.py | 19 +++++++++++++++++++ gitlab/v4/objects.py | 4 ++-- 5 files changed, 40 insertions(+), 15 deletions(-) create mode 100644 gitlab/tests/test_exceptions.py diff --git a/gitlab/__init__.py b/gitlab/__init__.py index a12ffb9cc..3170b4161 100644 --- a/gitlab/__init__.py +++ b/gitlab/__init__.py @@ -605,10 +605,10 @@ def http_get(self, path, query_data=None, streamed=False, raw=False, **kwargs): ): try: return result.json() - except Exception: + except Exception as e: raise GitlabParsingError( error_message="Failed to parse the server message" - ) + ) from e else: return result @@ -685,8 +685,10 @@ def http_post(self, path, query_data=None, post_data=None, files=None, **kwargs) try: if result.headers.get("Content-Type", None) == "application/json": return result.json() - except Exception: - raise GitlabParsingError(error_message="Failed to parse the server message") + except Exception as e: + raise GitlabParsingError( + error_message="Failed to parse the server message" + ) from e return result def http_put(self, path, query_data=None, post_data=None, files=None, **kwargs): @@ -721,8 +723,10 @@ def http_put(self, path, query_data=None, post_data=None, files=None, **kwargs): ) try: return result.json() - except Exception: - raise GitlabParsingError(error_message="Failed to parse the server message") + except Exception as e: + raise GitlabParsingError( + error_message="Failed to parse the server message" + ) from e def http_delete(self, path, **kwargs): """Make a PUT request to the Gitlab server. @@ -788,8 +792,10 @@ def _query(self, url, query_data=None, **kwargs): try: self._data = result.json() - except Exception: - raise GitlabParsingError(error_message="Failed to parse the server message") + except Exception as e: + raise GitlabParsingError( + error_message="Failed to parse the server message" + ) from e self._current = 0 diff --git a/gitlab/config.py b/gitlab/config.py index 2272dd3c5..1b665ed66 100644 --- a/gitlab/config.py +++ b/gitlab/config.py @@ -60,18 +60,18 @@ def __init__(self, gitlab_id=None, config_files=None): if self.gitlab_id is None: try: self.gitlab_id = self._config.get("global", "default") - except Exception: + except Exception as e: raise GitlabIDError( "Impossible to get the gitlab id (not specified in config file)" - ) + ) from e try: self.url = self._config.get(self.gitlab_id, "url") - except Exception: + except Exception as e: raise GitlabDataError( "Impossible to get gitlab informations from " "configuration (%s)" % self.gitlab_id - ) + ) from e self.ssl_verify = True try: diff --git a/gitlab/exceptions.py b/gitlab/exceptions.py index d6791f223..9feff6d5e 100644 --- a/gitlab/exceptions.py +++ b/gitlab/exceptions.py @@ -270,7 +270,7 @@ def wrapped_f(*args, **kwargs): try: return f(*args, **kwargs) except GitlabHttpError as e: - raise error(e.error_message, e.response_code, e.response_body) + raise error(e.error_message, e.response_code, e.response_body) from e return wrapped_f diff --git a/gitlab/tests/test_exceptions.py b/gitlab/tests/test_exceptions.py new file mode 100644 index 000000000..1f00af067 --- /dev/null +++ b/gitlab/tests/test_exceptions.py @@ -0,0 +1,19 @@ +import unittest + +from gitlab import exceptions + + +class TestExceptions(unittest.TestCase): + def test_error_raises_from_http_error(self): + """Methods decorated with @on_http_error should raise from GitlabHttpError.""" + + class TestError(Exception): + pass + + @exceptions.on_http_error(TestError) + def raise_error_from_http_error(): + raise exceptions.GitlabHttpError + + with self.assertRaises(TestError) as context: + raise_error_from_http_error() + self.assertIsInstance(context.exception.__cause__, exceptions.GitlabHttpError) diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py index 8852a1e81..a2f61530c 100644 --- a/gitlab/v4/objects.py +++ b/gitlab/v4/objects.py @@ -2720,14 +2720,14 @@ def set_release_description(self, description, **kwargs): path, post_data=data, **kwargs ) except exc.GitlabHttpError as e: - raise exc.GitlabCreateError(e.response_code, e.error_message) + raise exc.GitlabCreateError(e.response_code, e.error_message) from e else: try: server_data = self.manager.gitlab.http_put( path, post_data=data, **kwargs ) except exc.GitlabHttpError as e: - raise exc.GitlabUpdateError(e.response_code, e.error_message) + raise exc.GitlabUpdateError(e.response_code, e.error_message) from e self.release = server_data