From e2e29918ea27a005c7f57d8b1fa90b4ddf65d30e Mon Sep 17 00:00:00 2001 From: Steve Kowalik Date: Mon, 23 Apr 2018 16:22:51 +1000 Subject: [PATCH] Re-work PullRequest reviewer request (#765) Add create_review_request() and delete_review_request() methods to PullRequest, as well as renaming get_reviewer_requests() to get_review_requests() and cleaning up its return value to firstly respect teams, and secondly to cut out the middleman of PullRequestReviewerRequests, which has been removed. Fixes #597 --- github/PullRequest.py | 66 ++++++++++++++++--- github/PullRequestReviewerRequest.py | 64 ------------------ github/tests/AllTests.py | 1 - github/tests/PullRequest.py | 10 +++ github/tests/PullRequestReviewerRequests.py | 45 ------------- .../PullRequest.testReviewRequests.txt | 66 +++++++++++++++++++ .../PullRequestReviewerRequests.setUp.txt | 22 ------- 7 files changed, 133 insertions(+), 141 deletions(-) delete mode 100644 github/PullRequestReviewerRequest.py delete mode 100644 github/tests/PullRequestReviewerRequests.py create mode 100644 github/tests/ReplayData/PullRequest.testReviewRequests.txt delete mode 100644 github/tests/ReplayData/PullRequestReviewerRequests.setUp.txt diff --git a/github/PullRequest.py b/github/PullRequest.py index 4e9365f5..46507faa 100644 --- a/github/PullRequest.py +++ b/github/PullRequest.py @@ -49,7 +49,6 @@ import github.File import github.IssueComment import github.Commit import github.PullRequestReview -import github.PullRequestReviewerRequest class PullRequest(github.GithubObject.CompletableGithubObject): @@ -438,6 +437,46 @@ class PullRequest(github.GithubObject.CompletableGithubObject): self._useAttributes(data) return github.PullRequestReview.PullRequestReview(self._requester, headers, data, completed=True) + def create_review_request(self, reviewers=github.GithubObject.NotSet, team_reviewers=github.GithubObject.NotSet): + """ + :calls `POST /repos/:owner/:repo/pulls/:number/requested_reviewers `_ + :param reviewers: list of strings + :param team_reviewers: list of strings + :rtype: None + """ + post_parameters = dict() + if reviewers is not github.GithubObject.NotSet: + assert all(isinstance(element, (str, unicode)) for element in reviewers), reviewers + post_parameters["reviewers"] = reviewers + if team_reviewers is not github.GithubObject.NotSet: + assert all(isinstance(element, (str, unicode)) for element in team_reviewers), team_reviewers + post_parameters["team_reviewers"] = team_reviewers + headers, data = self._requester.requestJsonAndCheck( + "POST", + self.url + "/requested_reviewers", + input=post_parameters + ) + + def delete_review_request(self, reviewers=github.GithubObject.NotSet, team_reviewers=github.GithubObject.NotSet): + """ + :calls `DELETE /repos/:owner/:repo/pulls/:number/requested_reviewers `_ + :param reviewers: list of strings + :param team_reviewers: list of strings + :rtype: None + """ + post_parameters = dict() + if reviewers is not github.GithubObject.NotSet: + assert all(isinstance(element, (str, unicode)) for element in reviewers), reviewers + post_parameters["reviewers"] = reviewers + if team_reviewers is not github.GithubObject.NotSet: + assert all(isinstance(element, (str, unicode)) for element in team_reviewers), team_reviewers + post_parameters["team_reviewers"] = team_reviewers + headers, data = self._requester.requestJsonAndCheck( + "DELETE", + self.url + "/requested_reviewers", + input=post_parameters + ) + def edit(self, title=github.GithubObject.NotSet, body=github.GithubObject.NotSet, state=github.GithubObject.NotSet, base=github.GithubObject.NotSet): """ :calls: `PATCH /repos/:owner/:repo/pulls/:number `_ @@ -601,17 +640,26 @@ class PullRequest(github.GithubObject.CompletableGithubObject): None, ) - def get_reviewer_requests(self): + def get_review_requests(self): """ :calls: `GET /repos/:owner/:repo/pulls/:number/requested_reviewers `_ - :rtype: :class:`github.PaginatedList.PaginatedList` of :class:`github.PullRequestReviewerRequest.PullRequestReviewerRequest` + :rtype: tuple of :class:`github.PaginatedList.PaginatedList` of :class:`github.NamedUser.NamedUser` and of :class:`github.PaginatedList.PaginatedList` of :class:`github.Team.Team` """ - return github.PaginatedList.PaginatedList( - github.PullRequestReviewerRequest.PullRequestReviewerRequest, - self._requester, - self.url + "/requested_reviewers", - None, - list_item='users' + return ( + github.PaginatedList.PaginatedList( + github.NamedUser.NamedUser, + self._requester, + self.url + "/requested_reviewers", + None, + list_item='users' + ), + github.PaginatedList.PaginatedList( + github.Team.Team, + self._requester, + self.url + "/requested_reviewers", + None, + list_item='teams' + ) ) def get_labels(self): diff --git a/github/PullRequestReviewerRequest.py b/github/PullRequestReviewerRequest.py deleted file mode 100644 index 72001801..00000000 --- a/github/PullRequestReviewerRequest.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- coding: utf-8 -*- - -############################ Copyrights and license ############################ -# # -# Copyright 2017 Aaron Levine # -# Copyright 2018 Wan Liuyang # -# Copyright 2018 sfdye # -# # -# This file is part of PyGithub. # -# http://pygithub.readthedocs.io/ # -# # -# PyGithub is free software: you can redistribute it and/or modify it under # -# the terms of the GNU Lesser General Public License as published by the Free # -# Software Foundation, either version 3 of the License, or (at your option) # -# any later version. # -# # -# PyGithub is distributed in the hope that it will be useful, but WITHOUT ANY # -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more # -# details. # -# # -# You should have received a copy of the GNU Lesser General Public License # -# along with PyGithub. If not, see . # -# # -################################################################################ - -import github.GithubObject - -import github.NamedUser - - -class PullRequestReviewerRequest(github.GithubObject.CompletableGithubObject): - """ - This class represents PullRequestReviewerRequests. The reference can be found here https://developer.github.com/v3/pulls/review_requests/ - """ - - def __repr__(self): - return self.get__repr__({"id": self._id.value, "login": self._login.value}) - - @property - def login(self): - """ - :type: string - """ - self._completeIfNotSet(self._login) - return self._login.value - - @property - def id(self): - """ - :type: integer - """ - self._completeIfNotSet(self._id) - return self._id.value - - def _initAttributes(self): - self._login = github.GithubObject.NotSet - self._id = github.GithubObject.NotSet - - def _useAttributes(self, attributes): - if "login" in attributes: # pragma no branch - self._login = self._makeStringAttribute(attributes["login"]) - if "id" in attributes: # pragma no branch - self._id = self._makeIntAttribute(attributes["id"]) diff --git a/github/tests/AllTests.py b/github/tests/AllTests.py index d906223a..f72a949a 100644 --- a/github/tests/AllTests.py +++ b/github/tests/AllTests.py @@ -70,7 +70,6 @@ from Organization import * from PullRequest import * from PullRequestComment import * from PullRequestReview import * -from PullRequestReviewerRequests import * from PullRequestFile import * from RateLimiting import * from Repository import * diff --git a/github/tests/PullRequest.py b/github/tests/PullRequest.py index b7b0fd5c..c0b8a3b5 100644 --- a/github/tests/PullRequest.py +++ b/github/tests/PullRequest.py @@ -98,6 +98,16 @@ class PullRequest(Framework.TestCase): comment = self.pull.get_issue_comment(8387331) self.assertEqual(comment.body, "Issue comment created by PyGithub") + def testReviewRequests(self): + self.pull.create_review_request(reviewers="sfdye", team_reviewers="pygithub-owners") + review_requests = self.pull.get_review_requests() + self.assertListKeyEqual(review_requests[0], lambda c: c.login, ["sfdye"]) + self.assertListKeyEqual(review_requests[1], lambda c: c.slug, ["pygithub-owners"]) + self.pull.delete_review_request(reviewers="sfdye") + review_requests = self.pull.get_review_requests() + self.assertEqual(list(review_requests[0]), []) + self.assertListKeyEqual(review_requests[1], lambda c: c.slug, ["pygithub-owners"]) + def testEditWithoutArguments(self): self.pull.edit() diff --git a/github/tests/PullRequestReviewerRequests.py b/github/tests/PullRequestReviewerRequests.py deleted file mode 100644 index 987a9e87..00000000 --- a/github/tests/PullRequestReviewerRequests.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- - -############################ Copyrights and license ############################ -# # -# Copyright 2017 Aaron Levine # -# Copyright 2017 Simon # -# Copyright 2018 sfdye # -# # -# This file is part of PyGithub. # -# http://pygithub.readthedocs.io/ # -# # -# PyGithub is free software: you can redistribute it and/or modify it under # -# the terms of the GNU Lesser General Public License as published by the Free # -# Software Foundation, either version 3 of the License, or (at your option) # -# any later version. # -# # -# PyGithub is distributed in the hope that it will be useful, but WITHOUT ANY # -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more # -# details. # -# # -# You should have received a copy of the GNU Lesser General Public License # -# along with PyGithub. If not, see . # -# # -################################################################################ - -import Framework - - -class PullRequestReviewerRequests(Framework.TestCase): - def setUp(self): - Framework.TestCase.setUp(self) - self.repo = self.g.get_repo("PyGithub/PyGithub") - self.pull = self.repo.get_pull(538) - - self.pullreviewerrequests = self.pull.get_reviewer_requests() - self.pullreviewerrequest = self.pullreviewerrequests[0] - - def testAttributes(self): - - self.assertEqual(self.pullreviewerrequest.id, 2930472) - self.assertEqual(self.pullreviewerrequest.login, "jayfk") - - # test __repr__() based on this attributes - self.assertEqual(self.pullreviewerrequest.__repr__(), 'PullRequestReviewerRequest(login="jayfk", id=2930472)') diff --git a/github/tests/ReplayData/PullRequest.testReviewRequests.txt b/github/tests/ReplayData/PullRequest.testReviewRequests.txt new file mode 100644 index 00000000..665da686 --- /dev/null +++ b/github/tests/ReplayData/PullRequest.testReviewRequests.txt @@ -0,0 +1,66 @@ +https +POST +api.github.com +None +/repos/jacquev6/PyGithub/pulls/31/requested_reviewers +{'Authorization': 'Basic login_and_password_removed', 'Content-Type': 'application/json', 'User-Agent': 'PyGithub/Python'} +{"reviewers":"sfdye","team_reviewers":"pygithub-owners"} +201 +'' + + +https +GET +api.github.com +None +/repos/jacquev6/PyGithub/pulls/31/requested_reviewers +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4985'), ('x-github-media-type', 'github.beta; format=json'), ('x-content-type-options', 'nosniff'), ('x-ratelimit-limit', '5000'), ('vary', 'Accept, Authorization, Cookie'), ('content-length', '1153'), ('server', 'nginx'), ('last-modified', 'Sat, 03 Nov 2012 08:19:40 GMT'), ('connection', 'keep-alive'), ('etag', '"1ec7d9f2ebb27db7dc002f1382d23975"'), ('cache-control', 'private, s-maxage=60, max-age=60'), ('date', 'Sat, 03 Nov 2012 08:19:46 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"users":[{"login":"sfdye","id":343369,"avatar_url":"https://avatars2.githubusercontent.com/u/343369?v=4","gravatar_id":"","url":"https://api.github.com/users/sfdye","html_url":"https://github.com/sfdye","followers_url":"https://api.github.com/users/sfdye/followers","following_url":"https://api.github.com/users/sfdye/following{/other_user}","gists_url":"https://api.github.com/users/sfdye/gists{/gist_id}","starred_url":"https://api.github.com/users/sfdye/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sfdye/subscriptions","organizations_url":"https://api.github.com/users/sfdye/orgs","repos_url":"https://api.github.com/users/sfdye/repos","events_url":"https://api.github.com/users/sfdye/events{/privacy}","received_events_url":"https://api.github.com/users/sfdye/received_events","type":"User","site_admin":false}],"teams":[{"name":"pygithub-owners","id":585225,"slug":"pygithub-owners","description":"","privacy":"closed","url":"https://api.github.com/teams/585225","members_url":"https://api.github.com/teams/585225/members{/member}","repositories_url":"https://api.github.com/teams/585225/repos","permission":"pull"}]} + +https +GET +api.github.com +None +/repos/jacquev6/PyGithub/pulls/31/requested_reviewers +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4985'), ('x-github-media-type', 'github.beta; format=json'), ('x-content-type-options', 'nosniff'), ('x-ratelimit-limit', '5000'), ('vary', 'Accept, Authorization, Cookie'), ('content-length', '1153'), ('server', 'nginx'), ('last-modified', 'Sat, 03 Nov 2012 08:19:40 GMT'), ('connection', 'keep-alive'), ('etag', '"1ec7d9f2ebb27db7dc002f1382d23975"'), ('cache-control', 'private, s-maxage=60, max-age=60'), ('date', 'Sat, 03 Nov 2012 08:19:46 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"users":[{"login":"sfdye","id":343369,"avatar_url":"https://avatars2.githubusercontent.com/u/343369?v=4","gravatar_id":"","url":"https://api.github.com/users/sfdye","html_url":"https://github.com/sfdye","followers_url":"https://api.github.com/users/sfdye/followers","following_url":"https://api.github.com/users/sfdye/following{/other_user}","gists_url":"https://api.github.com/users/sfdye/gists{/gist_id}","starred_url":"https://api.github.com/users/sfdye/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sfdye/subscriptions","organizations_url":"https://api.github.com/users/sfdye/orgs","repos_url":"https://api.github.com/users/sfdye/repos","events_url":"https://api.github.com/users/sfdye/events{/privacy}","received_events_url":"https://api.github.com/users/sfdye/received_events","type":"User","site_admin":false}],"teams":[{"name":"pygithub-owners","id":585225,"slug":"pygithub-owners","description":"","privacy":"closed","url":"https://api.github.com/teams/585225","members_url":"https://api.github.com/teams/585225/members{/member}","repositories_url":"https://api.github.com/teams/585225/repos","permission":"pull"}]} + +https +DELETE +api.github.com +None +/repos/jacquev6/PyGithub/pulls/31/requested_reviewers +{'Authorization': 'Basic login_and_password_removed', 'Content-Type': 'application/json', 'User-Agent': 'PyGithub/Python'} +{"reviewers":"sfdye"} +204 +'' + + +https +GET +api.github.com +None +/repos/jacquev6/PyGithub/pulls/31/requested_reviewers +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4985'), ('x-github-media-type', 'github.beta; format=json'), ('x-content-type-options', 'nosniff'), ('x-ratelimit-limit', '5000'), ('vary', 'Accept, Authorization, Cookie'), ('content-length', '318'), ('server', 'nginx'), ('last-modified', 'Sat, 03 Nov 2012 08:19:40 GMT'), ('connection', 'keep-alive'), ('etag', '"1ec7d9f2ebb27db7dc002f1382d23975"'), ('cache-control', 'private, s-maxage=60, max-age=60'), ('date', 'Sat, 03 Nov 2012 08:19:46 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"users":[],"teams":[{"name":"pygithub-owners","id":585225,"slug":"pygithub-owners","description":"","privacy":"closed","url":"https://api.github.com/teams/585225","members_url":"https://api.github.com/teams/585225/members{/member}","repositories_url":"https://api.github.com/teams/585225/repos","permission":"pull"}]} + +https +GET +api.github.com +None +/repos/jacquev6/PyGithub/pulls/31/requested_reviewers +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4985'), ('x-github-media-type', 'github.beta; format=json'), ('x-content-type-options', 'nosniff'), ('x-ratelimit-limit', '5000'), ('vary', 'Accept, Authorization, Cookie'), ('content-length', '318'), ('server', 'nginx'), ('last-modified', 'Sat, 03 Nov 2012 08:19:40 GMT'), ('connection', 'keep-alive'), ('etag', '"1ec7d9f2ebb27db7dc002f1382d23975"'), ('cache-control', 'private, s-maxage=60, max-age=60'), ('date', 'Sat, 03 Nov 2012 08:19:46 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"users":[],"teams":[{"name":"pygithub-owners","id":585225,"slug":"pygithub-owners","description":"","privacy":"closed","url":"https://api.github.com/teams/585225","members_url":"https://api.github.com/teams/585225/members{/member}","repositories_url":"https://api.github.com/teams/585225/repos","permission":"pull"}]} + diff --git a/github/tests/ReplayData/PullRequestReviewerRequests.setUp.txt b/github/tests/ReplayData/PullRequestReviewerRequests.setUp.txt deleted file mode 100644 index 64fabdfa..00000000 --- a/github/tests/ReplayData/PullRequestReviewerRequests.setUp.txt +++ /dev/null @@ -1,22 +0,0 @@ -https -GET -api.github.com -None -/repos/PyGithub/PyGithub/pulls/538 -{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} -None -200 -[('content-length', '14726'), ('vary', 'Accept, Authorization, Cookie, X-GitHub-OTP, Accept-Encoding'), ('x-served-by', 'a474937f3b2fa272558fa6dc951018ad'), ('x-oauth-scopes', 'gist, repo, user'), ('x-xss-protection', '1; mode=block'), ('x-content-type-options', 'nosniff'), ('x-accepted-oauth-scopes', ''), ('etag', '"f375b2b7b6eb9081788c5e3b1dedba0e"'), ('cache-control', 'private, max-age=60, s-maxage=60'), ('status', '200 OK'), ('x-ratelimit-remaining', '4952'), ('x-github-media-type', 'github.v3; format=json'), ('access-control-expose-headers', 'ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval'), ('x-github-request-id', 'C19A:69E1:10370BA:13FF894:58D559AE'), ('last-modified', 'Wed, 22 Mar 2017 19:07:28 GMT'), ('date', 'Fri, 24 Mar 2017 17:38:54 GMT'), ('access-control-allow-origin', '*'), ('content-security-policy', "default-src 'none'"), ('strict-transport-security', 'max-age=31536000; includeSubdomains; preload'), ('server', 'GitHub.com'), ('x-ratelimit-limit', '5000'), ('x-frame-options', 'deny'), ('content-type', 'application/json; charset=utf-8'), ('x-ratelimit-reset', '1490379624')] -{"url":"https://api.github.com/repos/PyGithub/PyGithub/pulls/538","id":111649703,"html_url":"https://github.com/PyGithub/PyGithub/pull/538","diff_url":"https://github.com/PyGithub/PyGithub/pull/538.diff","patch_url":"https://github.com/PyGithub/PyGithub/pull/538.patch","issue_url":"https://api.github.com/repos/PyGithub/PyGithub/issues/538","number":538,"state":"open","locked":false,"title":"Add Support for Pull Request Reviews feature","user":{"login":"allevin","id":13543471,"avatar_url":"https://avatars1.githubusercontent.com/u/13543471?v=3","gravatar_id":"","url":"https://api.github.com/users/allevin","html_url":"https://github.com/allevin","followers_url":"https://api.github.com/users/allevin/followers","following_url":"https://api.github.com/users/allevin/following{/other_user}","gists_url":"https://api.github.com/users/allevin/gists{/gist_id}","starred_url":"https://api.github.com/users/allevin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/allevin/subscriptions","organizations_url":"https://api.github.com/users/allevin/orgs","repos_url":"https://api.github.com/users/allevin/repos","events_url":"https://api.github.com/users/allevin/events{/privacy}","received_events_url":"https://api.github.com/users/allevin/received_events","type":"User","site_admin":false},"body":"Adding support to Pull Request class to access new Github API features [Pull Request reviews](https://developer.github.com/v3/pulls/reviews/) and [Pull Request Reviewer Requests](https://developer.github.com/v3/pulls/review_requests/)\r\n\r\nThe API's is still in beta. \r\n\r\nI approached this by providing a minimal set of routines to access the list of reviews or a specific review. Also access to get a list of Reviewer requests. \r\n\r\nBecause the API is still early in Beta, I choose not to implement the create/delete/edit features, but the infrastructure should be in place for future improvements.\r\n\r\n","created_at":"2017-03-20T21:00:37Z","updated_at":"2017-03-22T19:07:28Z","closed_at":null,"merged_at":null,"merge_commit_sha":"764e59cb251dc0e9aab5be993d4451b35f91b685","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/PyGithub/PyGithub/pulls/538/commits","review_comments_url":"https://api.github.com/repos/PyGithub/PyGithub/pulls/538/comments","review_comment_url":"https://api.github.com/repos/PyGithub/PyGithub/pulls/comments{/number}","comments_url":"https://api.github.com/repos/PyGithub/PyGithub/issues/538/comments","statuses_url":"https://api.github.com/repos/PyGithub/PyGithub/statuses/7a0fcb27b7cd6c346fc3f76216ccb6e0f4ca3bcc","head":{"label":"allevin:Add_Pull_Request_Reviews_Feature","ref":"Add_Pull_Request_Reviews_Feature","sha":"7a0fcb27b7cd6c346fc3f76216ccb6e0f4ca3bcc","user":{"login":"allevin","id":13543471,"avatar_url":"https://avatars1.githubusercontent.com/u/13543471?v=3","gravatar_id":"","url":"https://api.github.com/users/allevin","html_url":"https://github.com/allevin","followers_url":"https://api.github.com/users/allevin/followers","following_url":"https://api.github.com/users/allevin/following{/other_user}","gists_url":"https://api.github.com/users/allevin/gists{/gist_id}","starred_url":"https://api.github.com/users/allevin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/allevin/subscriptions","organizations_url":"https://api.github.com/users/allevin/orgs","repos_url":"https://api.github.com/users/allevin/repos","events_url":"https://api.github.com/users/allevin/events{/privacy}","received_events_url":"https://api.github.com/users/allevin/received_events","type":"User","site_admin":false},"repo":{"id":85619926,"name":"PyGithub","full_name":"allevin/PyGithub","owner":{"login":"allevin","id":13543471,"avatar_url":"https://avatars1.githubusercontent.com/u/13543471?v=3","gravatar_id":"","url":"https://api.github.com/users/allevin","html_url":"https://github.com/allevin","followers_url":"https://api.github.com/users/allevin/followers","following_url":"https://api.github.com/users/allevin/following{/other_user}","gists_url":"https://api.github.com/users/allevin/gists{/gist_id}","starred_url":"https://api.github.com/users/allevin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/allevin/subscriptions","organizations_url":"https://api.github.com/users/allevin/orgs","repos_url":"https://api.github.com/users/allevin/repos","events_url":"https://api.github.com/users/allevin/events{/privacy}","received_events_url":"https://api.github.com/users/allevin/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/allevin/PyGithub","description":"Typed interactions with the GitHub API v3","fork":true,"url":"https://api.github.com/repos/allevin/PyGithub","forks_url":"https://api.github.com/repos/allevin/PyGithub/forks","keys_url":"https://api.github.com/repos/allevin/PyGithub/keys{/key_id}","collaborators_url":"https://api.github.com/repos/allevin/PyGithub/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/allevin/PyGithub/teams","hooks_url":"https://api.github.com/repos/allevin/PyGithub/hooks","issue_events_url":"https://api.github.com/repos/allevin/PyGithub/issues/events{/number}","events_url":"https://api.github.com/repos/allevin/PyGithub/events","assignees_url":"https://api.github.com/repos/allevin/PyGithub/assignees{/user}","branches_url":"https://api.github.com/repos/allevin/PyGithub/branches{/branch}","tags_url":"https://api.github.com/repos/allevin/PyGithub/tags","blobs_url":"https://api.github.com/repos/allevin/PyGithub/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/allevin/PyGithub/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/allevin/PyGithub/git/refs{/sha}","trees_url":"https://api.github.com/repos/allevin/PyGithub/git/trees{/sha}","statuses_url":"https://api.github.com/repos/allevin/PyGithub/statuses/{sha}","languages_url":"https://api.github.com/repos/allevin/PyGithub/languages","stargazers_url":"https://api.github.com/repos/allevin/PyGithub/stargazers","contributors_url":"https://api.github.com/repos/allevin/PyGithub/contributors","subscribers_url":"https://api.github.com/repos/allevin/PyGithub/subscribers","subscription_url":"https://api.github.com/repos/allevin/PyGithub/subscription","commits_url":"https://api.github.com/repos/allevin/PyGithub/commits{/sha}","git_commits_url":"https://api.github.com/repos/allevin/PyGithub/git/commits{/sha}","comments_url":"https://api.github.com/repos/allevin/PyGithub/comments{/number}","issue_comment_url":"https://api.github.com/repos/allevin/PyGithub/issues/comments{/number}","contents_url":"https://api.github.com/repos/allevin/PyGithub/contents/{+path}","compare_url":"https://api.github.com/repos/allevin/PyGithub/compare/{base}...{head}","merges_url":"https://api.github.com/repos/allevin/PyGithub/merges","archive_url":"https://api.github.com/repos/allevin/PyGithub/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/allevin/PyGithub/downloads","issues_url":"https://api.github.com/repos/allevin/PyGithub/issues{/number}","pulls_url":"https://api.github.com/repos/allevin/PyGithub/pulls{/number}","milestones_url":"https://api.github.com/repos/allevin/PyGithub/milestones{/number}","notifications_url":"https://api.github.com/repos/allevin/PyGithub/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/allevin/PyGithub/labels{/name}","releases_url":"https://api.github.com/repos/allevin/PyGithub/releases{/id}","deployments_url":"https://api.github.com/repos/allevin/PyGithub/deployments","created_at":"2017-03-20T19:55:57Z","updated_at":"2017-03-20T19:56:01Z","pushed_at":"2017-03-23T18:08:52Z","git_url":"git://github.com/allevin/PyGithub.git","ssh_url":"git@github.com:allevin/PyGithub.git","clone_url":"https://github.com/allevin/PyGithub.git","svn_url":"https://github.com/allevin/PyGithub","homepage":"","size":12131,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"PyGithub:master","ref":"master","sha":"414f6e648f4da87f10bae7d01948a63dc82b80f8","user":{"login":"PyGithub","id":11288996,"avatar_url":"https://avatars3.githubusercontent.com/u/11288996?v=3","gravatar_id":"","url":"https://api.github.com/users/PyGithub","html_url":"https://github.com/PyGithub","followers_url":"https://api.github.com/users/PyGithub/followers","following_url":"https://api.github.com/users/PyGithub/following{/other_user}","gists_url":"https://api.github.com/users/PyGithub/gists{/gist_id}","starred_url":"https://api.github.com/users/PyGithub/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PyGithub/subscriptions","organizations_url":"https://api.github.com/users/PyGithub/orgs","repos_url":"https://api.github.com/users/PyGithub/repos","events_url":"https://api.github.com/users/PyGithub/events{/privacy}","received_events_url":"https://api.github.com/users/PyGithub/received_events","type":"Organization","site_admin":false},"repo":{"id":3544490,"name":"PyGithub","full_name":"PyGithub/PyGithub","owner":{"login":"PyGithub","id":11288996,"avatar_url":"https://avatars3.githubusercontent.com/u/11288996?v=3","gravatar_id":"","url":"https://api.github.com/users/PyGithub","html_url":"https://github.com/PyGithub","followers_url":"https://api.github.com/users/PyGithub/followers","following_url":"https://api.github.com/users/PyGithub/following{/other_user}","gists_url":"https://api.github.com/users/PyGithub/gists{/gist_id}","starred_url":"https://api.github.com/users/PyGithub/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PyGithub/subscriptions","organizations_url":"https://api.github.com/users/PyGithub/orgs","repos_url":"https://api.github.com/users/PyGithub/repos","events_url":"https://api.github.com/users/PyGithub/events{/privacy}","received_events_url":"https://api.github.com/users/PyGithub/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/PyGithub/PyGithub","description":"Typed interactions with the GitHub API v3","fork":false,"url":"https://api.github.com/repos/PyGithub/PyGithub","forks_url":"https://api.github.com/repos/PyGithub/PyGithub/forks","keys_url":"https://api.github.com/repos/PyGithub/PyGithub/keys{/key_id}","collaborators_url":"https://api.github.com/repos/PyGithub/PyGithub/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/PyGithub/PyGithub/teams","hooks_url":"https://api.github.com/repos/PyGithub/PyGithub/hooks","issue_events_url":"https://api.github.com/repos/PyGithub/PyGithub/issues/events{/number}","events_url":"https://api.github.com/repos/PyGithub/PyGithub/events","assignees_url":"https://api.github.com/repos/PyGithub/PyGithub/assignees{/user}","branches_url":"https://api.github.com/repos/PyGithub/PyGithub/branches{/branch}","tags_url":"https://api.github.com/repos/PyGithub/PyGithub/tags","blobs_url":"https://api.github.com/repos/PyGithub/PyGithub/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/PyGithub/PyGithub/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/PyGithub/PyGithub/git/refs{/sha}","trees_url":"https://api.github.com/repos/PyGithub/PyGithub/git/trees{/sha}","statuses_url":"https://api.github.com/repos/PyGithub/PyGithub/statuses/{sha}","languages_url":"https://api.github.com/repos/PyGithub/PyGithub/languages","stargazers_url":"https://api.github.com/repos/PyGithub/PyGithub/stargazers","contributors_url":"https://api.github.com/repos/PyGithub/PyGithub/contributors","subscribers_url":"https://api.github.com/repos/PyGithub/PyGithub/subscribers","subscription_url":"https://api.github.com/repos/PyGithub/PyGithub/subscription","commits_url":"https://api.github.com/repos/PyGithub/PyGithub/commits{/sha}","git_commits_url":"https://api.github.com/repos/PyGithub/PyGithub/git/commits{/sha}","comments_url":"https://api.github.com/repos/PyGithub/PyGithub/comments{/number}","issue_comment_url":"https://api.github.com/repos/PyGithub/PyGithub/issues/comments{/number}","contents_url":"https://api.github.com/repos/PyGithub/PyGithub/contents/{+path}","compare_url":"https://api.github.com/repos/PyGithub/PyGithub/compare/{base}...{head}","merges_url":"https://api.github.com/repos/PyGithub/PyGithub/merges","archive_url":"https://api.github.com/repos/PyGithub/PyGithub/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/PyGithub/PyGithub/downloads","issues_url":"https://api.github.com/repos/PyGithub/PyGithub/issues{/number}","pulls_url":"https://api.github.com/repos/PyGithub/PyGithub/pulls{/number}","milestones_url":"https://api.github.com/repos/PyGithub/PyGithub/milestones{/number}","notifications_url":"https://api.github.com/repos/PyGithub/PyGithub/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/PyGithub/PyGithub/labels{/name}","releases_url":"https://api.github.com/repos/PyGithub/PyGithub/releases{/id}","deployments_url":"https://api.github.com/repos/PyGithub/PyGithub/deployments","created_at":"2012-02-25T12:53:47Z","updated_at":"2017-03-22T13:29:26Z","pushed_at":"2017-03-21T19:00:19Z","git_url":"git://github.com/PyGithub/PyGithub.git","ssh_url":"git@github.com:PyGithub/PyGithub.git","clone_url":"https://github.com/PyGithub/PyGithub.git","svn_url":"https://github.com/PyGithub/PyGithub","homepage":"","size":12133,"stargazers_count":1221,"watchers_count":1221,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":403,"mirror_url":null,"open_issues_count":124,"forks":403,"open_issues":124,"watchers":1221,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/PyGithub/PyGithub/pulls/538"},"html":{"href":"https://github.com/PyGithub/PyGithub/pull/538"},"issue":{"href":"https://api.github.com/repos/PyGithub/PyGithub/issues/538"},"comments":{"href":"https://api.github.com/repos/PyGithub/PyGithub/issues/538/comments"},"review_comments":{"href":"https://api.github.com/repos/PyGithub/PyGithub/pulls/538/comments"},"review_comment":{"href":"https://api.github.com/repos/PyGithub/PyGithub/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/PyGithub/PyGithub/pulls/538/commits"},"statuses":{"href":"https://api.github.com/repos/PyGithub/PyGithub/statuses/7a0fcb27b7cd6c346fc3f76216ccb6e0f4ca3bcc"}},"merged":false,"mergeable":true,"mergeable_state":"unstable","merged_by":null,"comments":3,"review_comments":0,"maintainer_can_modify":true,"commits":3,"additions":329,"deletions":0,"changed_files":6} - -https -GET -api.github.com -None -/repos/PyGithub/PyGithub/pulls/538/requested_reviewers -{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} -None -200 -[('content-length', '839'), ('vary', 'Accept, Authorization, Cookie, X-GitHub-OTP, Accept-Encoding'), ('x-served-by', '07ff1c8a09e44b62e277fae50a1b1dc4'), ('x-oauth-scopes', 'gist, repo, user'), ('x-xss-protection', '1; mode=block'), ('x-content-type-options', 'nosniff'), ('x-accepted-oauth-scopes', ''), ('etag', '"bc596203c153ef71a3f3e99a908de946"'), ('cache-control', 'private, max-age=60, s-maxage=60'), ('status', '200 OK'), ('x-ratelimit-remaining', '4951'), ('x-github-media-type', 'github.v3; format=json'), ('access-control-expose-headers', 'ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval'), ('x-github-request-id', 'C19B:69EB:2590DF2:2ECC945:58D559AE'), ('date', 'Fri, 24 Mar 2017 17:38:55 GMT'), ('access-control-allow-origin', '*'), ('content-security-policy', "default-src 'none'"), ('strict-transport-security', 'max-age=31536000; includeSubdomains; preload'), ('server', 'GitHub.com'), ('x-ratelimit-limit', '5000'), ('x-frame-options', 'deny'), ('content-type', 'application/json; charset=utf-8'), ('x-ratelimit-reset', '1490379624')] -[{"login":"jayfk","id":2930472,"avatar_url":"https://avatars1.githubusercontent.com/u/2930472?v=3","gravatar_id":"","url":"https://api.github.com/users/jayfk","html_url":"https://github.com/jayfk","followers_url":"https://api.github.com/users/jayfk/followers","following_url":"https://api.github.com/users/jayfk/following{/other_user}","gists_url":"https://api.github.com/users/jayfk/gists{/gist_id}","starred_url":"https://api.github.com/users/jayfk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jayfk/subscriptions","organizations_url":"https://api.github.com/users/jayfk/orgs","repos_url":"https://api.github.com/users/jayfk/repos","events_url":"https://api.github.com/users/jayfk/events{/privacy}","received_events_url":"https://api.github.com/users/jayfk/received_events","type":"User","site_admin":false}] -