{"action":"opened","number":860,"pull_request":{"url":"https://api.github.com/repos/PyGithub/PyGithub/pulls/860","id":207351337,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA3MzUxMzM3","html_url":"https://github.com/PyGithub/PyGithub/pull/860","diff_url":"https://github.com/PyGithub/PyGithub/pull/860.diff","patch_url":"https://github.com/PyGithub/PyGithub/pull/860.patch","issue_url":"https://api.github.com/repos/PyGithub/PyGithub/issues/860","number":860,"state":"open","locked":false,"title":"Adding communications Retry functionality into requests via urllib3 retry object.","user":{"login":"allevin","id":13543471,"node_id":"MDQ6VXNlcjEzNTQzNDcx","avatar_url":"https://avatars2.githubusercontent.com/u/13543471?v=4","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":"This PR is related to #757 and #378\r\n\r\nThis is an attempt to add a communications retry feature into PyGithub that can be user defined at the top level.\r\n\r\nThis works directly with requests and uses the low level urllib3 Retry object (already used by requests) to implement the functionality.  It is backwards compatible with the current codeset.\r\n\r\nThe user can set the retry parameter in the top level `github(<login>, retry = X)` call.  Where X can be a simple `int` to define the number of retrys or it can be an `urllib3.util.retry.Retry(...)` object.  This allows the user very fine grained control over the retry system as defined by urllib3.\r\n\r\nThe structure for the Retry object can be setup like this example:\r\n```\r\nnum_retries=3\r\nbackoff_factor=5\r\nstatus_forcelist=(500, 502, 504)\r\nretry_data = urllib3.util.retry.Retry(\r\n                                      total=num_retries,\r\n                                      read=num_retries,\r\n                                      connect=num_retries,\r\n                                      backoff_factor=backoff_factor,\r\n                                      status_forcelist=status_forcelist\r\n                                     )\r\ngserver = github(<login or token>, retry = retry_data)\r\n```\r\nThe urllib3 Retry object has many parameters, that allows the user much flexibility to configure retry's to their heart's content.\r\n\r\nThe only issue I have at the moment, is that I am completely baffled on how to add tests for this feature given the current testing infrastructure.  Any suggestions would be appreciated.\r\n\r\nCC: @mfonville @jrouquie @sfdye \r\n","created_at":"2018-08-09T15:13:42Z","updated_at":"2018-08-09T15:13:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/PyGithub/PyGithub/pulls/860/commits","review_comments_url":"https://api.github.com/repos/PyGithub/PyGithub/pulls/860/comments","review_comment_url":"https://api.github.com/repos/PyGithub/PyGithub/pulls/comments{/number}","comments_url":"https://api.github.com/repos/PyGithub/PyGithub/issues/860/comments","statuses_url":"https://api.github.com/repos/PyGithub/PyGithub/statuses/bf4b4531737fba8abc826c045d2e325ef2981ee4","head":{"label":"allevin:retry_feature","ref":"retry_feature","sha":"bf4b4531737fba8abc826c045d2e325ef2981ee4","user":{"login":"allevin","id":13543471,"node_id":"MDQ6VXNlcjEzNTQzNDcx","avatar_url":"https://avatars2.githubusercontent.com/u/13543471?v=4","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,"node_id":"MDEwOlJlcG9zaXRvcnk4NTYxOTkyNg==","name":"PyGithub","full_name":"allevin/PyGithub","owner":{"login":"allevin","id":13543471,"node_id":"MDQ6VXNlcjEzNTQzNDcx","avatar_url":"https://avatars2.githubusercontent.com/u/13543471?v=4","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":"2018-08-03T14:17:06Z","pushed_at":"2018-08-09T14:39:55Z","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":13047,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":3,"license":{"key":"lgpl-3.0","name":"GNU Lesser General Public License v3.0","spdx_id":"LGPL-3.0","url":"https://api.github.com/licenses/lgpl-3.0","node_id":"MDc6TGljZW5zZTEy"},"forks":0,"open_issues":3,"watchers":0,"default_branch":"master"}},"base":{"label":"PyGithub:master","ref":"master","sha":"29d231517dec44314e81c691d7c4e398380414b1","user":{"login":"PyGithub","id":11288996,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExMjg4OTk2","avatar_url":"https://avatars0.githubusercontent.com/u/11288996?v=4","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,"node_id":"MDEwOlJlcG9zaXRvcnkzNTQ0NDkw","name":"PyGithub","full_name":"PyGithub/PyGithub","owner":{"login":"PyGithub","id":11288996,"node_id":"MDEyOk9yZ2FuaXphdGlvbjExMjg4OTk2","avatar_url":"https://avatars0.githubusercontent.com/u/11288996?v=4","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":"2018-08-09T09:58:55Z","pushed_at":"2018-08-09T05:11:21Z","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":"http://pygithub.readthedocs.io/","size":11205,"stargazers_count":1968,"watchers_count":1968,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":688,"mirror_url":null,"archived":false,"open_issues_count":102,"license":{"key":"lgpl-3.0","name":"GNU Lesser General Public License v3.0","spdx_id":"LGPL-3.0","url":"https://api.github.com/licenses/lgpl-3.0","node_id":"MDc6TGljZW5zZTEy"},"forks":688,"open_issues":102,"watchers":1968,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/PyGithub/PyGithub/pulls/860"},"html":{"href":"https://github.com/PyGithub/PyGithub/pull/860"},"issue":{"href":"https://api.github.com/repos/PyGithub/PyGithub/issues/860"},"comments":{"href":"https://api.github.com/repos/PyGithub/PyGithub/issues/860/comments"},"review_comments":{"href":"https://api.github.com/repos/PyGithub/PyGithub/pulls/860/comments"},"review_comment":{"href":"https://api.github.com/repos/PyGithub/PyGithub/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/PyGithub/PyGithub/pulls/860/commits"},"statuses":{"href":"https://api.github.com/repos/PyGithub/PyGithub/statuses/bf4b4531737fba8abc826c045d2e325ef2981ee4"}},"author_association":"CONTRIBUTOR","merged":false,"mergeable":null,"rebaseable":null,"mergeable_state":"unknown","merged_by":null,"comments":0,"review_comments":0,"maintainer_can_modify":true,"commits":2,"additions":22,"deletions":8,"changed_files":2}}
{"actor":{"display_login":"allevin"}}