Skip to content

Commit 52b4a5d

Browse files
committed
Add Teams Service
1 parent b488b84 commit 52b4a5d

File tree

4 files changed

+302
-1
lines changed

4 files changed

+302
-1
lines changed

pygithub3/requests/orgs/teams.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
# -*- encoding: utf-8 -*-
2+
3+
from pygithub3.resources.orgs import Member, Team
4+
from pygithub3.resources.repos import Repo
5+
from . import Request
6+
7+
8+
class List(Request):
9+
uri = 'orgs/{org}/teams'
10+
resource = Team
11+
12+
13+
class Get(Request):
14+
uri = 'teams/{id}'
15+
resource = Team
16+
17+
18+
class Create(Request):
19+
uri = 'orgs/{org}/teams'
20+
resource = Team
21+
body_schema = {
22+
'schema': ('name', 'repo_names', 'permission',),
23+
'required': ('name',),
24+
}
25+
26+
27+
class Update(Request):
28+
uri = 'teams/{id}'
29+
resource = Team
30+
body_schema = {
31+
'schema': ('name', 'permission',),
32+
'required': ('name',),
33+
}
34+
35+
36+
class Delete(Request):
37+
uri = 'teams/{id}'
38+
39+
40+
class List_members(Request):
41+
uri = 'teams/{id}/members'
42+
resource = Member
43+
44+
45+
class Is_member(Request):
46+
uri = 'teams/{id}/members/{user}'
47+
48+
49+
class Add_member(Request):
50+
uri = 'teams/{id}/members/{user}'
51+
52+
53+
class Remove_member(Request):
54+
uri = 'teams/{id}/members/{user}'
55+
56+
57+
class List_repos(Request):
58+
uri = 'teams/{id}/repos'
59+
resource = Repo
60+
61+
62+
class Contains_repo(Request):
63+
uri = 'teams/{id}/repos/{user}/{repo}'
64+
65+
66+
class Add_repo(Request):
67+
uri = 'teams/{id}/repos/{user}/{repo}'
68+
69+
70+
class Remove_repo(Request):
71+
uri = 'teams/{id}/repos/{user}/{repo}'

pygithub3/services/orgs/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
from pygithub3.services.base import Service
44
from .members import Members
5+
from .teams import Teams
56

67

78
class Org(Service):
89
""" Consume `Orgs API <http://developer.github.com/v3/orgs>`_ """
910

1011
def __init__(self, **config):
1112
self.members = Members(**config)
13+
self.teams = Teams(**config)
1214
super(Org, self).__init__(**config)
1315

1416
def list(self, user=None):

pygithub3/services/orgs/teams.py

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
# -*- encoding: utf-8 -*-
2+
3+
from . import Service
4+
5+
6+
class Teams(Service):
7+
""" Consume `Teams API <http://developer.github.com/v3/orgs/teams/>`_
8+
9+
.. warning ::
10+
You must be authenticated as an owner of the org
11+
"""
12+
13+
def list(self, org):
14+
""" Get org's teams
15+
16+
:param str org: Organisation name
17+
:returns: A :doc:`result`
18+
"""
19+
request = self.request_builder('orgs.teams.list', org=org)
20+
return self._get_result(request)
21+
22+
def get(self, id):
23+
""" Get a team
24+
25+
:param int id: The team id
26+
:returns: A :doc:`result`
27+
"""
28+
request = self.request_builder('orgs.teams.get', id=id)
29+
return self._get(request)
30+
31+
def create(self, org, name, repo_names=None, permission=None):
32+
""" Create a new team
33+
34+
:param str org: Organisation name
35+
:param str name: Team name
36+
:param list repo_names: List of repo names to belong to the team
37+
:param str permission: Permissions to be granted to members
38+
"""
39+
data = {'name': name}
40+
if repo_names:
41+
data['repo_names'] = repo_names
42+
if permission:
43+
data['permission'] = permission
44+
request = self.request_builder('orgs.teams.create', org=org, body=data)
45+
return self._post(request)
46+
47+
def update(self, id, name, permission=None):
48+
""" Update a team
49+
50+
:param int id: The team id
51+
:param str name: Team name
52+
:param str permission: Permissions to be granted to members
53+
"""
54+
data = {'name': name}
55+
if permission:
56+
data['permission'] = permission
57+
request = self.request_builder('orgs.teams.update', id=id, body=data)
58+
return self._patch(request)
59+
60+
def delete(self, id):
61+
""" Delete a team
62+
63+
:param int id: The team id
64+
"""
65+
request = self.request_builder('orgs.teams.delete', id=id)
66+
return self._delete(request)
67+
68+
def list_members(self, id):
69+
""" List the members of a team
70+
71+
:param int id: The team id
72+
:returns: A :doc:`result`
73+
"""
74+
request = self.request_builder('orgs.teams.list_members', id=id)
75+
return self._get_result(request)
76+
77+
def is_member(self, id, user):
78+
""" Determine if user is a member of a team
79+
80+
:param int id: The team id
81+
:param str user: User name
82+
"""
83+
request = self.request_builder('orgs.teams.is_member',
84+
id=id, user=user)
85+
return self._bool(request)
86+
87+
def add_member(self, id, user):
88+
""" Add a user to a team
89+
90+
:param int id: The team id
91+
:param str user: User name
92+
"""
93+
request = self.request_builder('orgs.teams.add_member',
94+
id=id, user=user)
95+
return self._put(request)
96+
97+
def remove_member(self, id, user):
98+
""" Remove a member from a team
99+
100+
:param int id: The team id
101+
:param str user: User name
102+
"""
103+
request = self.request_builder('orgs.teams.remove_member',
104+
id=id, user=user)
105+
return self._delete(request)
106+
107+
def list_repos(self, id):
108+
""" List the repos that a team's members get access to
109+
110+
:param int id: The team id
111+
:returns: A :doc:`result`
112+
"""
113+
request = self.request_builder('orgs.teams.list_repos', id=id)
114+
return self._get_result(request)
115+
116+
def contains_repo(self, id, user, repo):
117+
""" Determine if user is a member of a team
118+
119+
:param int id: The team id
120+
:param str user: User name
121+
:param str repo: Repo name
122+
"""
123+
request = self.request_builder('orgs.teams.contains_repo',
124+
id=id, user=user, repo=repo)
125+
return self._bool(request)
126+
127+
def add_repo(self, id, user, repo):
128+
""" Give team members access to a repo
129+
130+
:param int id: The team id
131+
:param str user: User name
132+
:param str repo: Repo name
133+
"""
134+
request = self.request_builder('orgs.teams.add_repo',
135+
id=id, user=user, repo=repo)
136+
return self._put(request)
137+
138+
def remove_repo(self, id, user, repo):
139+
""" Remove a repo from the a team
140+
141+
:param int id: The team id
142+
:param str user: User name
143+
:param str repo: Repo name
144+
"""
145+
request = self.request_builder('orgs.teams.remove_repo',
146+
id=id, user=user, repo=repo)
147+
return self._delete(request)

pygithub3/tests/services/test_orgs.py

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from pygithub3.tests.utils.core import TestCase
88
from pygithub3.resources.base import json
9-
from pygithub3.services.orgs import Org, Members
9+
from pygithub3.services.orgs import Org, Members, Teams
1010
from pygithub3.tests.utils.base import (mock_response, mock_response_result,
1111
mock_json)
1212
from pygithub3.tests.utils.services import _
@@ -89,3 +89,84 @@ def test_CONCEAL_MEMBERSHIP(self, request_method):
8989
self.ms.conceal_membership('acme', 'octocat')
9090
self.assertEqual(request_method.call_args[0],
9191
('delete', _('orgs/acme/public_members/octocat')))
92+
93+
94+
@patch.object(requests.sessions.Session, 'request')
95+
class TestOrgMemberService(TestCase):
96+
def setUp(self):
97+
self.ts = Teams()
98+
99+
def test_LIST(self, request_method):
100+
request_method.return_value = mock_response_result()
101+
self.ts.list('acme').all()
102+
self.assertEqual(request_method.call_args[0],
103+
('get', _('orgs/acme/teams')))
104+
105+
def test_GET(self, request_method):
106+
request_method.return_value = mock_response_result()
107+
self.ts.get(1)
108+
self.assertEqual(request_method.call_args[0], ('get', _('teams/1')))
109+
110+
def test_CREATE(self, request_method):
111+
request_method.return_value = mock_response_result('post')
112+
self.ts.create('acme', 'committers')
113+
self.assertEqual(request_method.call_args[0],
114+
('post', _('orgs/acme/teams')))
115+
116+
def test_UPDATE(self, request_method):
117+
request_method.return_value = mock_response_result()
118+
self.ts.update(1, 'committers', 'push')
119+
self.assertEqual(request_method.call_args[0], ('patch', _('teams/1')))
120+
121+
def test_DELETE(self, request_method):
122+
request_method.return_value = mock_response_result('delete')
123+
self.ts.delete(1)
124+
self.assertEqual(request_method.call_args[0], ('delete', _('teams/1')))
125+
126+
def test_LIST_MEMBERS(self, request_method):
127+
request_method.return_value = mock_response_result()
128+
self.ts.list_members(1).all()
129+
self.assertEqual(request_method.call_args[0],
130+
('get', _('teams/1/members')))
131+
132+
def test_IS_MEMBER(self, request_method):
133+
request_method.return_value = mock_response_result()
134+
self.ts.is_member(1, 'octocat')
135+
self.assertEqual(request_method.call_args[0],
136+
('head', _('teams/1/members/octocat')))
137+
138+
def test_ADD_MEMBER(self, request_method):
139+
request_method.return_value = mock_response_result()
140+
self.ts.add_member(1, 'octocat')
141+
self.assertEqual(request_method.call_args[0],
142+
('put', _('teams/1/members/octocat')))
143+
144+
def test_REMOVE_MEMBER(self, request_method):
145+
request_method.return_value = mock_response_result('delete')
146+
self.ts.remove_member(1, 'octocat')
147+
self.assertEqual(request_method.call_args[0],
148+
('delete', _('teams/1/members/octocat')))
149+
150+
def test_LIST_REPOS(self, request_method):
151+
request_method.return_value = mock_response_result()
152+
self.ts.list_repos(1).all()
153+
self.assertEqual(request_method.call_args[0],
154+
('get', _('teams/1/repos')))
155+
156+
def test_CONTAINS_REPO(self, request_method):
157+
request_method.return_value = mock_response_result()
158+
self.ts.contains_repo(1, 'octocat', 're_oct')
159+
self.assertEqual(request_method.call_args[0],
160+
('head', _('teams/1/repos/octocat/re_oct')))
161+
162+
def test_ADD_TEAM_REPO(self, request_method):
163+
request_method.return_value = mock_response_result()
164+
self.ts.add_repo(1, 'octocat', 're_oct')
165+
self.assertEqual(request_method.call_args[0],
166+
('put', _('teams/1/repos/octocat/re_oct')))
167+
168+
def test_REMOVE_TEAM_REPO(self, request_method):
169+
request_method.return_value = mock_response_result('delete')
170+
self.ts.remove_repo(1, 'octocat', 're_oct')
171+
self.assertEqual(request_method.call_args[0],
172+
('delete', _('teams/1/repos/octocat/re_oct')))

0 commit comments

Comments
 (0)