diff --git a/github/AuthenticatedUser.py b/github/AuthenticatedUser.py index 37a9785c..b7fc4ea6 100644 --- a/github/AuthenticatedUser.py +++ b/github/AuthenticatedUser.py @@ -57,6 +57,7 @@ import github.Event import github.Authorization import github.Notification import github.Migration +import github.Membership from . import Consts import six @@ -1213,6 +1214,18 @@ class AuthenticatedUser(github.GithubObject.CompletableGithubObject): } ) + def get_organization_membership(self, org): + """ + :calls: `GET /user/memberships/orgs/:org `_ + :rtype: :class:`github.Membership.Membership` + """ + assert isinstance(org, int) + headers, data = self._requester.requestJsonAndCheck( + "GET", + "/user/memberships/orgs/" + str(org) + ) + return github.Membership.Membership(self._requester, headers, data, completed=True) + def _initAttributes(self): self._avatar_url = github.GithubObject.NotSet self._bio = github.GithubObject.NotSet diff --git a/github/Membership.py b/github/Membership.py new file mode 100644 index 00000000..c6cf4b65 --- /dev/null +++ b/github/Membership.py @@ -0,0 +1,122 @@ +# -*- coding: utf-8 -*- + +############################ Copyrights and license ############################ +# # +# Copyright 2012 Steve English # +# Copyright 2012 Vincent Jacques # +# Copyright 2012 Zearin # +# Copyright 2013 AKFish # +# Copyright 2013 Cameron White # +# Copyright 2013 Vincent Jacques # +# Copyright 2013 poulp # +# Copyright 2014 Tomas Radej # +# Copyright 2014 Vincent Jacques # +# Copyright 2016 E. Dunham # +# Copyright 2016 Jannis Gebauer # +# Copyright 2016 Peter Buckley # +# Copyright 2017 Balázs Rostás # +# Copyright 2017 Jannis Gebauer # +# Copyright 2017 Simon # +# Copyright 2018 Wan Liuyang # +# Copyright 2018 bryanhuntesl <31992054+bryanhuntesl@users.noreply.github.com> # +# Copyright 2018 sfdye # +# Copyright 2018 itsbruce # +# # +# 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 + + +class Membership(github.GithubObject.CompletableGithubObject): + """ + This class represents Organizations. The reference can be found here http://developer.github.com/v3/orgs/ + """ + + def __repr__(self): + return self.get__repr__({"url": self._url.value}) + + @property + def url(self): + """ + :type: string + """ + self._completeIfNotSet(self._url) + return self._url.value + + @property + def state(self): + """ + :type: string + """ + self._completeIfNotSet(self._state) + return self._state.value + + @property + def role(self): + """ + :type: string + """ + self._completeIfNotSet(self._role) + return self._role.value + + @property + def organization_url(self): + """ + :type: string + """ + self._completeIfNotSet(self._organization_url) + return self._organization_url.value + + @property + def organization(self): + """ + :type: :class:`github.Organization.Organization` + """ + self._completeIfNotSet(self._organization) + return self._organization.value + + @property + def user(self): + """ + :type: :class:`github.AuthenticatedUser.AuthenticatedUser` + """ + self._completeIfNotSet(self._user) + return self._user.value + + def _initAttributes(self): + self._url = github.GithubObject.NotSet + self._state = github.GithubObject.NotSet + self._role = github.GithubObject.NotSet + self._organization_url = github.GithubObject.NotSet + self._organization = github.GithubObject.NotSet + self._user = github.GithubObject.NotSet + + def _useAttributes(self, attributes): + if "url" in attributes: # pragma no branch + self._url = self._makeStringAttribute(attributes["url"]) + if "state" in attributes: # pragma no branch + self._state = self._makeStringAttribute(attributes["state"]) + if "role" in attributes: # pragma no branch + self._role = self._makeStringAttribute(attributes["role"]) + if "organization_url" in attributes: # pragma no branch + self._organization_url = self._makeStringAttribute(attributes["organization_url"]) + if "organization" in attributes: # pragma no branch + self._organization = self._makeClassAttribute(github.Organization.Organization, attributes["organization"]) + if "user" in attributes: # pragma no branch + self._user = self._makeClassAttribute(github.AuthenticatedUser.AuthenticatedUser, attributes["user"]) diff --git a/github/NamedUser.py b/github/NamedUser.py index 0fd2b50c..b52bc804 100644 --- a/github/NamedUser.py +++ b/github/NamedUser.py @@ -624,6 +624,18 @@ class NamedUser(github.GithubObject.CompletableGithubObject): def _identity(self): return self.login + def get_organization_membership(self, org): + """ + :calls: `GET /user/memberships/orgs/:org `_ + :rtype: :class:`github.Membership.Membership` + """ + assert isinstance(org, int) + headers, data = self._requester.requestJsonAndCheck( + "GET", + "/user/memberships/orgs/" + str(org) + ) + return github.Membership.Membership(self._requester, headers, data, completed=True) + def _initAttributes(self): self._avatar_url = github.GithubObject.NotSet self._bio = github.GithubObject.NotSet diff --git a/tests/GitMembership.py b/tests/GitMembership.py new file mode 100644 index 00000000..12cc0bb6 --- /dev/null +++ b/tests/GitMembership.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- + +############################ Copyrights and license ############################ +# # +# Copyright 2012 Steve English # +# Copyright 2012 Vincent Jacques # +# Copyright 2012 Zearin # +# Copyright 2013 AKFish # +# Copyright 2013 Cameron White # +# Copyright 2013 Vincent Jacques # +# Copyright 2013 poulp # +# Copyright 2014 Tomas Radej # +# Copyright 2014 Vincent Jacques # +# Copyright 2016 E. Dunham # +# Copyright 2016 Jannis Gebauer # +# Copyright 2016 Peter Buckley # +# Copyright 2017 Balázs Rostás # +# Copyright 2017 Jannis Gebauer # +# Copyright 2017 Simon # +# Copyright 2018 Wan Liuyang # +# Copyright 2018 bryanhuntesl <31992054+bryanhuntesl@users.noreply.github.com> # +# Copyright 2018 sfdye # +# Copyright 2018 itsbruce # +# # +# 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 . # +# # +################################################################################ +from __future__ import absolute_import +import github +import json + +from . import Framework + +import datetime + + +class GitMembership(Framework.TestCase): + def setUp(self): + Framework.TestCase.setUp(self) + self.org = self.g.get_organization("github") + + def tearDown(self): + self.org = None + Framework.TestCase.tearDown(self) + + def testGetMembership(self): + octocat = self.g.get_user("octocat") + membership_data = octocat.get_organization_membership(self.org.id) + self.assertEqual('octocat', membership_data.user.login) + self.assertEqual('admin', membership_data.role) + self.assertEqual('github', membership_data.organization.login) diff --git a/tests/ReplayData/GitMembership.setUp.txt b/tests/ReplayData/GitMembership.setUp.txt new file mode 100644 index 00000000..dc0c36ec --- /dev/null +++ b/tests/ReplayData/GitMembership.setUp.txt @@ -0,0 +1,10 @@ +https +GET +api.github.com +None +/orgs/github +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4969'), ('content-length', '716'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"d1b89d0f179a7977b3521babf470b71e"'), ('date', 'Sat, 26 May 2012 20:13:58 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"login":"github","id":1,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE=","url":"https://api.github.com/orgs/github","repos_url":"https://api.github.com/orgs/github/repos","events_url":"https://api.github.com/orgs/github/events","hooks_url":"https://api.github.com/orgs/github/hooks","issues_url":"https://api.github.com/orgs/github/issues","members_url":"https://api.github.com/orgs/github/members{/member}","public_members_url":"https://api.github.com/orgs/github/public_members{/member}","avatar_url":"https://github.com/images/error/octocat_happy.gif","description":"A great organization","name":"github","company":"GitHub","blog":"https://github.com/blog","location":"San Francisco","email":"octocat@github.com","is_verified":true,"has_organization_projects":true,"has_repository_projects":true,"public_repos":2,"public_gists":1,"followers":20,"following":0,"html_url":"https://github.com/octocat","created_at":"2008-01-14T04:33:35Z","type":"Organization","total_private_repos":100,"owned_private_repos":100,"private_gists":81,"disk_usage":10000,"collaborators":8,"billing_email":"support@github.com","plan":{"name":"Medium","space":400,"private_repos":20},"default_repository_settings":"read","members_can_create_repositories":true,"two_factor_requirement_enabled":true,"members_allowed_repository_creation_type":"all"} diff --git a/tests/ReplayData/GitMembership.testGetMembership.txt b/tests/ReplayData/GitMembership.testGetMembership.txt new file mode 100644 index 00000000..74db3bc9 --- /dev/null +++ b/tests/ReplayData/GitMembership.testGetMembership.txt @@ -0,0 +1,21 @@ +https +GET +api.github.com +None +/users/octocat +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +null +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4960'), ('content-length', '598'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"75740284d989e9a492e32f435cff48ac"'), ('date', 'Sat, 16 Apr 2018 20:23:33 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"type":"User","public_gists":19,"url":"https://api.github.com/users/octocat","hireable":false,"bio":null,"company":"Github","gravatar_id":"c5a7f21b46df698f3db31c37ed0cf55a","login":"octocat","blog":"http://blog.github.com","email":"info@github.com","public_repos":62,"followers":299,"name":"Octocat","created_at":"2009-05-12T21:19:38Z","location":"Netherlands","avatar_url":"","id":83844,"following":41,"html_url":"https://github.com/nvie"} + +https +GET +api.github.com +None +/user/memberships/orgs/1 +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4960'), ('content-length', '598'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"75740284d989e9a492e32f435cff48ac"'), ('date', 'Sat, 16 Apr 2018 20:23:33 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"url":"https://api.github.com/orgs/invitocat/memberships/defunkt","state":"pending","role":"admin","organization_url":"https://api.github.com/orgs/invitocat","organization":{"login":"github","id":1,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE=","url":"https://api.github.com/orgs/github","repos_url":"https://api.github.com/orgs/github/repos","events_url":"https://api.github.com/orgs/github/events","hooks_url":"https://api.github.com/orgs/github/hooks","issues_url":"https://api.github.com/orgs/github/issues","members_url":"https://api.github.com/orgs/github/members{/member}","public_members_url":"https://api.github.com/orgs/github/public_members{/member}","avatar_url":"https://github.com/images/error/octocat_happy.gif","description":"A great organization"},"user":{"login":"octocat","id":1,"node_id":"MDQ6VXNlcjE=","avatar_url":"https://github.com/images/error/octocat_happy.gif","gravatar_id":"","url":"https://api.github.com/users/octocat","html_url":"https://github.com/octocat","followers_url":"https://api.github.com/users/octocat/followers","following_url":"https://api.github.com/users/octocat/following{/other_user}","gists_url":"https://api.github.com/users/octocat/gists{/gist_id}","starred_url":"https://api.github.com/users/octocat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/octocat/subscriptions","organizations_url":"https://api.github.com/users/octocat/orgs","repos_url":"https://api.github.com/users/octocat/repos","events_url":"https://api.github.com/users/octocat/events{/privacy}","received_events_url":"https://api.github.com/users/octocat/received_events","type":"User","site_admin":false}} \ No newline at end of file