Export headers in GithubException (#1887)

Since the headers that led to an exception are also useful, firstly pass
them into the constructor, and then export them in a property. Test one
specific use case to make sure of coverage.

Fixes #1814
This commit is contained in:
Steve Kowalik
2021-03-23 13:47:05 +11:00
committed by GitHub
parent e0acd8f466
commit ddd437a7cd
5 changed files with 20 additions and 7 deletions
+10 -2
View File
@@ -38,11 +38,12 @@ class GithubException(Exception):
Some other types of exceptions might be raised by underlying libraries, for example for network-related issues.
"""
def __init__(self, status, data):
def __init__(self, status, data, headers):
super().__init__()
self.__status = status
self.__data = data
self.args = [status, data]
self.__headers = headers
self.args = [status, data, headers]
@property
def status(self):
@@ -58,6 +59,13 @@ class GithubException(Exception):
"""
return self.__data
@property
def headers(self):
"""
The headers returned by the Github API
"""
return self.__headers
def __str__(self):
return "{status} {data}".format(status=self.status, data=json.dumps(self.data))
+4 -1
View File
@@ -1,13 +1,16 @@
from typing import Any, Dict, List, Optional, Tuple, Type, Union
class GithubException(Exception):
def __init__(self, status: Union[int, str], data: Any,) -> None: ...
def __init__(self, status: Union[int, str], data: Any, headers: Optional[Dict[str, str]]) -> None: ...
def __str__(self) -> str: ...
@property
def data(self) -> Dict[str, Union[str, List[str], List[Dict[str, str]]]]: ...
@property
def status(self) -> int: ...
@property
def headers(self) -> Union[None, Dict[str, str]]: ...
class BadAttributeException(GithubException):
def __init__(
self,
+1 -1
View File
@@ -300,7 +300,7 @@ class CompletableGithubObject(GithubObject):
def __complete(self):
if self._url.value is None:
raise GithubException.IncompletableObject(
400, "Returned object contains no URL"
400, "Returned object contains no URL", None
)
headers, data = self._requester.requestJsonAndCheck("GET", self._url.value)
self._storeAndUseAttributes(headers, data)
+1 -1
View File
@@ -435,7 +435,7 @@ class Requester:
cls = GithubException.UnknownObjectException
else:
cls = GithubException.GithubException
return cls(status, output)
return cls(status, output, headers)
def __structuredFromJson(self, data):
if len(data) == 0:
+4 -2
View File
@@ -90,7 +90,7 @@ class Exceptions(Framework.TestCase):
self.assertEqual(str(raisedexp.exception), '401 {"message": "Bad credentials"}')
def testExceptionPickling(self):
pickle.loads(pickle.dumps(github.GithubException("foo", "bar")))
pickle.loads(pickle.dumps(github.GithubException("foo", "bar", None)))
class SpecificExceptions(Framework.TestCase):
@@ -134,7 +134,9 @@ class SpecificExceptions(Framework.TestCase):
res = self.g.search_code("jacquev6")
res.get_page(0)
self.assertRaises(github.RateLimitExceededException, exceed)
with self.assertRaises(github.RateLimitExceededException) as raised:
exceed()
self.assertEqual(raised.exception.headers.get("retry-after"), "60")
def testIncompletableObject(self):
github.UserKey.UserKey.setCheckAfterInitFlag(False)