8000 Add support for repository invitations · sigmavirus24/github3.py@2b1c696 · GitHub
[go: up one dir, main page]

Skip to content

Commit 2b1c696

Browse files
committed
Add support for repository invitations
Closes #739
1 parent 87af5a1 commit 2b1c696

File tree

7 files changed

+302
-0
lines changed

7 files changed

+302
-0
lines changed

src/github3/repos/invitation.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
# -*- coding: utf-8 -*-
2+
"""Invitation related logic."""
3+
from __future__ import unicode_literals
4+
5+
from json import dumps
6+
7+
from .. import models
8+
from .. import users
9+
10+
from ..decorators import requires_auth
11+
12+
13+
class Invitation(models.GitHubCore):
14+
"""Representation of an invitation to collaborate on a repository.
15+
16+
.. attribute:: created_at
17+
18+
TODO
19+
20+
.. attribute:: html_url
21+
22+
TODO
23+
24+
.. attribute:: id
25+
26+
TODO
27+
28+
.. attribute:: invitee
29+
30+
TODO
31+
32+
.. attribute:: inviter
33+
34+
TODO
35+
36+
.. attribute:: permissions
37+
38+
TODO
39+
40+
.. attribute:: repository
41+
42+
TODO
43+
"""
44+
45+
class_name = 'Invitation'
46+
allowed_permissions = frozenset(['admin', 'read', 'write'])
47+
48+
def _update_attributes(self, invitation):
49+
from . import repo
50+
self._api = invitation['url']
51+
self.created_at = self._strptime(invitation['created_at'])
52+
self.html_url = invitation['html_url']
53+
self.id = invitation['id']
54+
self.invitee = users.ShortUser(invitation['invitee'], self)
55+
self.inviter = users.ShortUser(invitation['inviter'], self)
56+
self.permissions = invitation['permissions']
57+
self.repository = repo.ShortRepository(invitation['repository'], self)
58+
59+
def _repr(self):
60+
return '<Invitation [{0}]>'.format(self.repository.full_name)
61+
62+
@requires_auth
63+
def delete(self):
64+
"""Delete this invitation.
65+
66+
:returns:
67+
True if successful, False otherwise
68+
:rtype:
69+
bool
70+
"""
71+
return self._boolean(self._delete(self._api), 204, 404)
72+
73+
@requires_auth
74+
def update(self, permissions):
75+
"""Update this invitation.
76+
77+
:param str permissions:
78+
(required), the permissions that will be granted by this invitation
79+
once it has been updated. Options: 'admin', 'read', 'write'
80+
:returns:
81+
The updated invitation
82+
:rtype:
83+
:class:`~github3.repos.invitation.Invitation`
84+
"""
85+
if permissions not in self.allowed_permissions:
86+
raise ValueError("'permissions' must be one of {0}".format(
87+
', '.join(sorted(self.allowed_permissions))
88+
))
89+
data = {'permissions': permissions}
90+
json = self._json(self._patch(self._api, data=dumps(data)), 200)
91+
return self._instance_or_null(Invitation, json)

src/github3/repos/repo.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
from . import contents
3535
from . import deployment
3636
from . import hook
37+
from . import invitation
3738
from . import issue_import
3839
from . import pages
3940
from . import release
@@ -1536,6 +1537,23 @@ def import_issue(self, title, body, created_at, assignee=None,
15361537
json = self._json(data, 202)
15371538
return self._instance_or_null(issue_import.ImportedIssue, json)
15381539

1540+
@requires_auth
1541+
def invitations(self, number=-1, etag=None):
1542+
"""Iterate over the invitations to this repository.
1543+
1544+
:param int number:
1545+
(optional), number of invitations to return. Default: -1 returns
1546+
all available invitations
1547+
:param str etag:
1548+
(optional), ETag from a previous request to the same endpoint
1549+
:returns:
1550+
generator of repository invitation objects
1551+
:rtype:
1552+
:class:`~github3.repos.invitation.Invitation`
1553+
"""
1554+
url = self._build_url('invitations', base_url=self._api)
1555+
return self._iter(int(number), url, invitation.Invitation, etag=etag)
1556+
15391557
def is_assignee(self, username):
15401558
"""Check if the user can be assigned an issue on this repository.
15411559
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"http_interactions": [{"request": {"body": {"string": "", "encoding": "utf-8"}, "headers": {"Accept-Encoding": ["gzip, deflate"], "Accept": ["application/vnd.github.v3.full+json"], "User-Agent": ["github3.py/1.1.0"], "Accept-Charset": ["utf-8"], "Connection": ["keep-alive"], "Content-Type": ["application/json"], "Authorization": ["token <AUTH_TOKEN>"]}, "method": "GET", "uri": "https://api.github.com/repos/jacquerie/flask-shell-bpython"}, "response": {"body": {"string": "", "base64_string": "H4sIAAAAAAAAA62Y227jNhCGX8XwbRPLds4Ggm2LLhYp6t124W0XuTFoibYYU6RKUnZtIe/enwdbspFNlEQ3iaJwPv4azYxmWHZZ0h1dDi6uhjfDq5OukAmd2lvd8W8f11/47zz+dLMl37+uYrEcjiffzsYPy83n9e1tF4tJRrFyzolenuqUcn46yzcmlQL/nBecT8OKBxL/W1DFaPT0WrkWVHVHZZfLBRNA7g0AsmrOrgfD6/6hvL8u//7+mccP4/Px5O58/IuTRFbEEDUtFAclNSbXoyjyN/Wwt2AmLWaFpiqWwlBherHMoiLy+A+r23MgFipAnBtw4wiWs8DxxoDpqK43NRk/EuD3devrK+eSc7mG/bHeZ7eI9mbWyw7BxOItCJiVkTQphcPwGI/24Zk2r5TjTMrI/kLkWIjGK1A0eZ2kYARBNhgey0jRXDpaMdOxYrlhUrxS2oEpUFItiGBb8gYUTDUIVtQrRTgTmNIVAu6Vtt6mjHLFViTeWHcoGlO2gnffwjsyBs5scpvD3/D+ra+ZoVOSZDYJ54Rr+njSdXsbLHI3TpBVjeL7B6me0P3LxLZfac5JTDuIwU5C56TgpuNKRMeVkw4yJiMi6ayRuB3S0SxjnKiOFLSjCiEQwJ1f/3QVpwf1c6mWe5nPZq17J1Uu/kCr5b3wwhqAkK/AQN6SblqgWUoZ4WdIthgVgMykIka+VEiaiD3AlVH9Txt9hpKshYdwGOBSKdvwsMMAx7QuaKPEaOIKR9PRLgdFkc18kWySeU028BzoJlqzhaC0Bc/uUWW0q+kzRUSctgHfkcrIX7mIIIsWZFsKYDMuZy3Q8L2NHKqMdEr8d81M21Fq2ZZ0gFZ03pJsS9qjjWolJpxki9qD8bE1CI8WNO9IURk8zYlYFGTRBnuPQmTY9mBBti82S03yrmIBbDtBxWZFW+WzolnVvndB3WjD1RWsQru26PlOq5FLak2Wc0qWsZealSbcADpIltbgNq6PN7B/v9xnNZVuSWVUVX7/gQl7vN/r4Quz01zfKQwoLYTNjhSVP+XEpLYaYsOcKPr+BwigqJwR9Iq9Xq9MKXEzQEZVKzXAcwAkKk7R975fc7kjoS/LiHGTxtxKTjB5cEmSFny+RwHrX/L7dXtOPUZyjNgtiHWYOhdNNtUGTXYL8IpV30FIw+YsbjKINUnVA1z5QTMR0xPC+Qmi3LCYIe4xKth3jFaZtuEzz8Ej4QjET2WcIgVacJiinlRGfphOMCLJTUs1rQazZUBRDHbJlBiMYsP+4PK0f3k67E8GN6P+cDQ4v8eaIk8O1lyf9q/cmosRlp1d2jV5gWmtwmDJxWn/bNK/Hg3PRv1ruwSlOmQArnAk89SJyFNTmD1qgbnWaWX+c2U8evZkKRjHHKF8lH+v3X91/I1tCoD4VGY0R0fkT5M02+JqMDhoaWJZCLyE85Pumhj06mgXqlu7Ngj2fta1TKKnviB0R0YVdizHnVzJBxobXc3quFnVotrKNVuyA0vbse3N/OAbFJyhmDOlZDhVE6gW+2qME7JwKiBzKoKinfQh0o3FVGg8b2mnXzwAugqoD8eC47tJ54+wAu7Ik//C0ePdxEbe4Rne4ZlYAOsoAGvHlvHl5BN/uP/nYns/+bjt4gTDD+AjPEhNZXcEfTtvO9eHA4ipn22sWKKNOxbJqcrgbXsAZR8lHJB4v9vg33nSVlJ/jV0FNWtM/jtvYPd6NxicO3j8H5Hk0yGCFQAA", "encoding": "utf-8"}, "headers": {"X-XSS-Protection": ["1; mode=block"], "Content-Security-Policy": ["default-src 'none'"], "Access-Control-Expose-Headers": ["ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval"], "Transfer-Encoding": ["chunked"], "Last-Modified": ["Fri, 20 Jul 2018 15:19:36 GMT"], "Access-Control-Allow-Origin": ["*"], "X-Frame-Options": ["deny"], "Status": ["200 OK"], "X-GitHub-Request-Id": ["ED12:3FAE:1A2E137:30D43C4:5B621756"], "ETag": ["W/\"5b587e532e9e6c06823e87ca3ddcfb68\""], "Date": ["Wed, 01 Aug 2018 20:25:58 GMT"], "X-RateLimit-Remaining": ["4994"], "Strict-Transport-Security": ["max-age=31536000; includeSubdomains; preload"], "Server": ["GitHub.com"], "X-OAuth-Scopes": ["read:user, repo:invite"], "X-GitHub-Media-Type": ["github.v3; param=full; format=json"], "X-Content-Type-Options": ["nosniff"], "Content-Encoding": ["gzip"], "X-Runtime-rack": ["0.072372"], "Vary": ["Accept, Authorization, Cookie, X-GitHub-OTP"], "X-RateLimit-Limit": ["5000"], "Cache-Control": ["private, max-age=60, s-maxage=60"], "Referrer-Policy": ["origin-when-cross-origin, strict-origin-when-cross-origin"], "Content-Type": ["application/json; charset=utf-8"], "X-Accepted-OAuth-Scopes": ["repo"], "X-RateLimit-Reset": ["1533158172"]}, "status": {"message": "OK", "code": 200}, "url": "https://api.github.com/repos/jacquerie/flask-shell-bpython"}, "recorded_at": "2018-08-01T20:25:58"}, {"request": {"body": {"string": "", "encoding": "utf-8"}, "headers": {"Accept-Encoding": ["gzip, deflate"], "Accept": ["application/vnd.github.v3.full+json"], "User-Agent": ["github3.py/1.1.0"], "Accept-Charset": ["utf-8"], "Connection": ["keep-alive"], "Content-Type": ["application/json"], "Authorization": ["token <AUTH_TOKEN>"]}, "method": "GET", "uri": "https://api.github.com/repos/jacquerie/flask-shell-bpython/invitations?per_page=100"}, "response": {"body": {"string": "", "base64_string": "H4sIAAAAAAAAA+2ZYW/bNhCG/4rgr3NMx4mbOEBQdOhWpICTrnC2osNgUBJtMaFIjaRsOEL++46kLMnGYss2PwYo2kTVPTyRd6e7V38XHRp3bs77F5fD0fCi2+EiJlNzqTP+fLd8YF9Z9GX0gn98X0ScfQ35zyz+8nsf/zXKx5NPL/efH4f3k/Ftp9uRJBOKaiFXnRsH/XA+vBqMBleb0N+2oM+D8eTxYvz0vLpf3hoQxymB5WcMq+czlRDGzsJspRPB4T9nOWPT8o4nHP2bE0kJ+v97xZITaZxhYk45ICsDAJlHvLg+H1z3N93748OfP+5Z9DS+HE/uLsefrEt4gTWW01wyoCRaZ+oGIXdRDXpzqpM8zBWRkeCacN2LRIpy5PAfF7eXgJjLEmL3Fi5swTJacpwxwBRq+pvolG054Na19zfvnAnGxBLst/3duQSqzMwuWwTl82MQYFYgoRMCGwaP8Woenip9oDvWpEDmHwhHA1FwBJLEh7lUGoFDJhheC2TC1NLyUEWSZpoKfqBrG6aAEnKOOX3BR6DAVAHB5s5hD2ZNwJQsIOAOtHU2BcokXeBoZbZDkojQBezuMbwtY8DpVWZy+BHO3+w11WSK49Qk4QwzRV67Hbu2hpvshS5kVav4fiPVY1IdJiz7nWQMRySAGAxiMsM504EtEYEtJwFkTIp5HCwhcQMcKJpShmUgOAlkzjkEcPDrN1txeuD9TMjnys2dWWvPpM7FN3w1vD0H1gIE+QoYcO+ZrDzQDKVA8HeZbBFUABwKiaGge8Bv4ArU/NVEnyY49bCKxQAuEcLHDlsM4KhSOWmVGG3OzdIUWucgz9PQFck2mddmAccBv7FSdM4J8bCzFapA65oeSsyjxAd8TSqQ+8lGBJ57cNtQABYyEXqgwfsWWVSBVILde01P/Xhq2Ia0gZZk5sltQ6rQWnqJCeuyQVVgeNlqCA8PPq9JqCh3mmE+z/HcB7tCQWSY9mCOX/Y2S23yrmYB2HSCkoa5r/JZ04zXrneBuuFjq2tYjbZt0e6GpNWWNJosuylpSvc1K224JWgjWbzBTVxvL2B+399ntXXdkApUV373ginXOH3XyzfM2ufmSuWA4iFs1iRU/JJhnZhqCAtmWJLTH6AEoSLE0Cv2er0iIdjOACmRXmqA4wAQyyiBvvd0n4s1CfqyFGs7acyMyzFMHkzg2MOeVyjAukM+3W/HacZIBiO2B2ctpsmFJpsoDU22B3jNaq7AhaYzGrUZxNqk6gau+Kgoj0gXM9aFKNc0ohD3MCqYM4ZWmfjYM8eBRwIJxE1ljEAKeNgwSRypQG6YjmFEEitPNa0B68BoR/kCBj4Y7WrlJaVRglM7sBr9Y3A9Gl6NttSmtfJyd/kAgtCDU5V2KS8XbyovJf8E6aXh8O7JtHHjQcLL2u543WWLcIrsUqFOUl0qij/RpUY25RqIooM1l4p0qORSGdqSAUu3mdPMkKRQZepHcGl4siHWgE/79RaXlO9yaC3fvsuh73Ko/XrgJzvrrxFHyaFEptCKGTEaBMylhBcopHUkCWik8RRruDjon1+f9eHP+WTQvxkMb4aDn3DPTkXS1CErebsvM1NbBVx/hNbffICx+xW38zsLaiA7r//8BywQcGxQGgAA", "encoding": "utf-8"}, "headers": {"X-XSS-Protection": ["1; mode=block"], "Content-Security-Policy": ["default-src 'none'"], "Access-Control-Expose-Headers": ["ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval"], "Transfer-Encoding": ["chunked"], "Access-Control-Allow-Origin": ["*"], "X-Frame-Options": ["deny"], "Status": ["200 OK"], "X-GitHub-Request-Id": ["ED12:3FAE:1A2E151:30D43EE:5B621756"], "ETag": ["W/\"8e089a7add57e600036b75be62868b0e\""], "Date": ["Wed, 01 Aug 2018 20:25:58 GMT"], "X-RateLimit-Remaining": ["4993"], "Strict-Transport-Security": ["max-age=31536000; includeSubdomains; preload"], "Server": ["GitHub.com"], "X-OAuth-Scopes": ["read:user, repo:invite"], "X-GitHub-Media-Type": ["github.v3; param=full; format=json"], "X-Content-Type-Options": ["nosniff"], "Content-Encoding": ["gzip"], "X-Runtime-rack": ["0.053210"], "Vary": ["Accept, Authorization, Cookie, X-GitHub-OTP"], "X-RateLimit-Limit": ["5000"], "Cache-Control": ["private, max-age=60, s-maxage=60"], "Referrer-Policy": ["origin-when-cross-origin, strict-origin-when-cross-origin"], "Content-Type": ["application/json; charset=utf-8"], "X-Accepted-OAuth-Scopes": [""], "X-RateLimit-Reset": ["1533158172"]}, "status": {"message": "OK", "code": 200}, "url": "https://api.github.com/repos/jacquerie/flask-shell-bpython/invitations?per_page=100"}, "recorded_at": "2018-08-01T20:25:59"}], "recorded_with": "betamax/0.8.1"}

tests/integration/test_repos_repo.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,17 @@ def test_ignore(self):
718718
subscription = repository.ignore()
719719
assert subscription.ignored is True
720720

721+
def test_invitations(self):
722+
"""Test that a user can iterate over the invitations to a repo."""
723+
self.token_login()
724+
cassette_name = self.cassette_name('invitations')
725+
with self.recorder.use_cassette(cassette_name):
726+
repository = self.gh.repository('jacquerie', 'flask-shell-bpython')
727+
invitations = list(repository.invitations())
728+
assert len(invitations) > 0
729+
for invitation in invitations:
730+
assert isinstance(invitation, github3.repos.invitation.Invitation)
731+
721732
def test_is_assignee(self):
722733
"""
723734
Test the ability to check if a user can be assigned issues on a
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
{
2+
"id": 1,
3+
"repository": {
4+
"id": 1296269,
5+
"node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5",
6+
"name": "Hello-World",
7+
"full_name": "octocat/Hello-World",
8+
"owner": {
9+
"login": "octocat",
10+
"id": 1,
11+
"node_id": "MDQ6VXNlcjE=",
12+
"avatar_url": "https://github.com/images/error/octocat_happy.gif",
13+
"gravatar_id": "",
14+
"url": "https://api.github.com/users/octocat",
15+
"html_url": "https://github.com/octocat",
16+
"followers_url": "https://api.github.com/users/octocat/followers",
17+
"following_url": "https://api.github.com/users/octocat/following{/other_user}",
18+
"gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
19+
"starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
20+
"subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
21+
"organizations_url": "https://api.github.com/users/octocat/orgs",
22+
"repos_url": "https://api.github.com/users/octocat/repos",
23+
"events_url": "https://api.github.com/users/octocat/events{/privacy}",
24+
"received_events_url": "https://api.github.com/users/octocat/received_events",
25+
"type": "User",
26+
"site_admin": false
27+
},
28+
"private": false,
29+
"html_url": "https://github.com/octocat/Hello-World",
30+
"description": "This your first repo!",
31+
"fork": false,
32+
"url": "https://api.github.com/repos/octocat/Hello-World",
33+
"archive_url": "http://api.github.com/repos/octocat/Hello-World/{archive_format}{/ref}",
34+
"assignees_url": "http://api.github.com/repos/octocat/Hello-World/assignees{/user}",
35+
"blobs_url": "http://api.github.com/repos/octocat/Hello-World/git/blobs{/sha}",
36+
"branches_url": "http://api.github.com/repos/octocat/Hello-World/branches{/branch}",
37+
"collaborators_url": "http://api.github.com/repos/octocat/Hello-World/collaborators{/collaborator}",
38+
"comments_url": "http://api.github.com/repos/octocat/Hello-World/comments{/number}",
39+
"commits_url": "http://api.github.com/repos/octocat/Hello-World/commits{/sha}",
40+
"compare_url": "http://api.github.com/repos/octocat/Hello-World/compare/{base}...{head}",
41+
"contents_url": "http://api.github.com/repos/octocat/Hello-World/contents/{+path}",
42+
"contributors_url": "http://api.github.com/repos/octocat/Hello-World/contributors",
43+
"deployments_url": "http://api.github.com/repos/octocat/Hello-World/deployments",
44+
"downloads_url": "http://api.github.com/repos/octocat/Hello-World/downloads",
45+
"events_url": "http://api.github.com/repos/octocat/Hello-World/events",
46+
"forks_url": "http://api.github.com/repos/octocat/Hello-World/forks",
47+
"git_commits_url": "http://api.github.com/repos/octocat/Hello-World/git/commits{/sha}",
48+
"git_refs_url": "http://api.github.com/repos/octocat/Hello-World/git/refs{/sha}",
49+
"git_tags_url": "http://api.github.com/repos/octocat/Hello-World/git/tags{/sha}",
50+
"git_url": "git:github.com/octocat/Hello-World.git",
51+
"hooks_url": "http://api.github.com/repos/octocat/Hello-World/hooks",
52+
"issue_comment_url": "http://api.github.com/repos/octocat/Hello-World/issues/comments{/number}",
53+
"issue_events_url": "http://api.github.com/repos/octocat/Hello-World/issues/events{/number}",
54+
"issues_url": "http://api.github.com/repos/octocat/Hello-World/issues{/number}",
55+
"keys_url": "http://api.github.com/repos/octocat/Hello-World/keys{/key_id}",
56+
"labels_url": "http://api.github.com/repos/octocat/Hello-World/labels{/name}",
57+
"languages_url": "http://api.github.com/repos/octocat/Hello-World/languages",
58+
"merges_url": "http://api.github.com/repos/octocat/Hello-World/merges",
59+
"milestones_url": "http://api.github.com/repos/octocat/Hello-World/milestones{/number}",
60+
"notifications_url": "http://api.github.com/repos/octocat/Hello-World/notifications{?since,all,participating}",
61+
"pulls_url": "http://api.github.com/repos/octocat/Hello-World/pulls{/number}",
62+
"releases_url": "http://api.github.com/repos/octocat/Hello-World/releases{/id}",
63+
"ssh_url": "git@github.com:octocat/Hello-World.git",
64+
"stargazers_url": "http://api.github.com/repos/octocat/Hello-World/stargazers",
65+
"statuses_url": "http://api.github.com/repos/octocat/Hello-World/statuses/{sha}",
66+
"subscribers_url": "http://api.github.com/repos/octocat/Hello-World/subscribers",
67+
"subscription_url": "http://api.github.com/repos/octocat/Hello-World/subscription",
68+
"tags_url": "http://api.github.com/repos/octocat/Hello-World/tags",
69+
"teams_url": "http://api.github.com/repos/octocat/Hello-World/teams",
70+
"trees_url": "http://api.github.com/repos/octocat/Hello-World/git/trees{/sha}"
71+
},
72+
"invitee": {
73+
"login": "octocat",
74+
"id": 1,
75+
"node_id": "MDQ6VXNlcjE=",
76+
"avatar_url": "https://github.com/images/error/octocat_happy.gif",
77+
"gravatar_id": "",
78+
"url": "https://api.github.com/users/octocat",
79+
"html_url": "https://github.com/octocat",
80+
"followers_ur B428 l": "https://api.github.com/users/octocat/followers",
81+
"following_url": "https://api.github.com/users/octocat/following{/other_user}",
82+
"gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
83+
"starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
84+
"subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
85+
"organizations_url": "https://api.github.com/users/octocat/orgs",
86+
"repos_url": "https://api.github.com/users/octocat/repos",
87+
"events_url": "https://api.github.com/users/octocat/events{/privacy}",
88+
"received_events_url": "https://api.github.com/users/octocat/received_events",
89+
"type": "User",
90+
"site_admin": false
91+
},
92+
"inviter": {
93+
"login": "octocat",
94+
"id": 1,
95+
"node_id": "MDQ6VXNlcjE=",
96+
"avatar_url": "https://github.com/images/error/octocat_happy.gif",
97+
"gravatar_id": "",
98+
"url": "https://api.github.com/users/octocat",
99+
"html_url": "https://github.com/octocat",
100+
"followers_url": "https://api.github.com/users/octocat/followers",
101+
"following_url": "https://api.github.com/users/octocat/following{/other_user}",
102+
"gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
103+
"starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
104+
"subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
105+
"organizations_url": "https://api.github.com/users/octocat/orgs",
106+
"repos_url": "https://api.github.com/users/octocat/repos",
107+
"events_url": "https://api.github.com/users/octocat/events{/privacy}",
108+
"received_events_url": "https://api.github.com/users/octocat/received_events",
109+
"type": "User",
110+
"site_admin": false
111+
},
112+
"permissions": "write",
113+
"created_at": "2016-06-13T14:52:50-05:00",
114+
"url": "https://api.github.com/user/repository_invitations/1296269",
115+
"html_url": "https://github.com/octocat/Hello-World/invitations"
116+
}

0 commit comments

Comments
 (0)
0