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
131
|
from pygithub3.exceptions import BadRequest, NotFound
from pygithub3.services.base import Service, MimeTypeMixin
from .comments import Comments
class PullRequests(Service, MimeTypeMixin):
"""Consume `Pull Request API <http://developer.github.com/v3/pulls/>`_"""
def __init__(self, **config):
self.comments = Comments(**config)
super(PullRequests, self).__init__(**config)
def list(self, user=None, repo=None):
"""List all of the pull requests for a repo
:param str user: Username
:param str repo: Repository
"""
return self._get_result(
self.make_request('pull_requests.list', user=user, repo=repo)
)
def get(self, number, user=None, repo=None):
"""Get a single pull request
:param str number: The number of the pull request to get
:param str user: Username
:param str repo: Repository
"""
return self._get(
self.make_request('pull_requests.get', number=number, user=user,
repo=repo)
)
def create(self, body, user=None, repo=None):
"""Create a pull request
:param dict body: Data for the new pull request
:param str user: Username
:param str repo: Repository
"""
return self._post(
self.make_request('pull_requests.create', body=body, user=user,
repo=repo)
)
def update(self, number, body, user=None, repo=None):
"""Update a pull request
:param str number: The number of the the pull request to update
:param dict body: The data to update the pull request with
:param str user: Username
:param str repo: Repository
"""
return self._patch(
self.make_request('pull_requests.update', number=number,
body=body, user=user, repo=repo)
)
def list_commits(self, number, user=None, repo=None):
"""List the commits for a pull request
:param str number: The number of the pull request to list commits for
:param str user: Username
:param str repo: Repository
"""
return self._get_result(
self.make_request('pull_requests.list_commits', number=number,
user=user, repo=repo)
)
def list_files(self, number, user=None, repo=None):
"""List the files for a pull request
:param str number: The number of the pull request to list files for
:param str user: Username
:param str repo: Repository
"""
return self._get_result(
self.make_request('pull_requests.list_files', number=number,
user=user, repo=repo)
)
def merge_status(self, number, user=None, repo=None):
"""Gets whether a pull request has been merged or not.
:param str number: The pull request to check
:param str user: Username
:param str repo: Repository
"""
# for this to work with a proper Resource, we would need to pass the
# response's status code to the Resource constructor, and that's kind
# of scary
try:
resp = self._client.get(
self.make_request('pull_requests.merge_status', number=number,
user=user, repo=repo)
)
except NotFound:
return False
code = resp.status_code
if code == 204:
return True
# TODO: more flexible way to return arbitrary objects based on
# response. Probably something on Request
raise BadRequest('got code %s: %s' % (code, resp.content))
# again, I'm sorry.
def merge(self, number, message='', user=None, repo=None):
"""Merge a pull request.
:param str number: The pull request to merge
:param str user: Username
:param str repo: Repository
This currently raises an HTTP 405 error if the request is not
mergable.
"""
body = {'commit_message': message}
return self._put(
self.make_request('pull_requests.merge', number=number,
body=body, user=user, repo=repo)
)
|