forked from sigmavirus24/github3.py
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathexceptions.py
More file actions
130 lines (80 loc) · 2.67 KB
/
Copy pathexceptions.py
File metadata and controls
130 lines (80 loc) · 2.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# -*- coding: utf-8 -*-
"""All exceptions for the github3 library."""
class GitHubError(Exception):
"""The base exception class."""
def __init__(self, resp):
super(GitHubError, self).__init__(resp)
#: Response code that triggered the error
self.response = resp
self.code = resp.status_code
self.errors = []
try:
error = resp.json()
#: Message associated with the error
self.msg = error.get('message')
#: List of errors provided by GitHub
if error.get('errors'):
self.errors = error.get('errors')
except: # Amazon S3 error
self.msg = resp.content or '[No message]'
def __repr__(self):
return '<{0} [{1}]>'.format(self.__class__.__name__,
self.msg or self.code)
def __str__(self):
return '{0} {1}'.format(self.code, self.msg)
@property
def message(self):
"""The actual message returned by the API."""
return self.msg
class BadRequest(GitHubError):
"""Exception class for 400 responses."""
pass
class AuthenticationFailed(GitHubError):
"""Exception class for 401 responses.
Possible reasons:
- Need one time password (for two-factor authentication)
- You are not authorized to access the resource
"""
pass
class ForbiddenError(GitHubError):
"""Exception class for 403 responses.
Possible reasons:
- Too many requests (you've exceeded the ratelimit)
- Too many login failures
"""
pass
class NotFoundError(GitHubError):
"""Exception class for 404 responses."""
pass
class MethodNotAllowed(GitHubError):
"""Exception class for 405 responses."""
pass
class NotAcceptable(GitHubError):
"""Exception class for 406 responses."""
pass
class UnprocessableEntity(GitHubError):
"""Exception class for 422 responses."""
pass
class ClientError(GitHubError):
"""Catch-all for 400 responses that aren't specific errors."""
class ServerError(GitHubError):
"""Exception class for 5xx responses."""
pass
error_classes = {
400: BadRequest,
401: AuthenticationFailed,
403: ForbiddenError,
404: NotFoundError,
405: MethodNotAllowed,
406: NotAcceptable,
422: UnprocessableEntity,
}
def error_for(response):
"""Return the appropriate initialized exception class for a response."""
klass = error_classes.get(response.status_code)
if klass is None:
if 400 <= response.status_code < 500:
klass = ClientError
if 500 <= response.status_code < 600:
klass = ServerError
return klass(response)