aboutsummaryrefslogtreecommitdiffstats
path: root/pygithub3
diff options
context:
space:
mode:
Diffstat (limited to 'pygithub3')
-rw-r--r--pygithub3/requests/orgs/teams.py71
-rw-r--r--pygithub3/services/orgs/__init__.py2
-rw-r--r--pygithub3/services/orgs/teams.py147
-rw-r--r--pygithub3/tests/services/test_orgs.py83
4 files changed, 302 insertions, 1 deletions
diff --git a/pygithub3/requests/orgs/teams.py b/pygithub3/requests/orgs/teams.py
new file mode 100644
index 0000000..4b30533
--- /dev/null
+++ b/pygithub3/requests/orgs/teams.py
@@ -0,0 +1,71 @@
+# -*- encoding: utf-8 -*-
+
+from pygithub3.resources.orgs import Member, Team
+from pygithub3.resources.repos import Repo
+from . import Request
+
+
+class List(Request):
+ uri = 'orgs/{org}/teams'
+ resource = Team
+
+
+class Get(Request):
+ uri = 'teams/{id}'
+ resource = Team
+
+
+class Create(Request):
+ uri = 'orgs/{org}/teams'
+ resource = Team
+ body_schema = {
+ 'schema': ('name', 'repo_names', 'permission',),
+ 'required': ('name',),
+ }
+
+
+class Update(Request):
+ uri = 'teams/{id}'
+ resource = Team
+ body_schema = {
+ 'schema': ('name', 'permission',),
+ 'required': ('name',),
+ }
+
+
+class Delete(Request):
+ uri = 'teams/{id}'
+
+
+class List_members(Request):
+ uri = 'teams/{id}/members'
+ resource = Member
+
+
+class Is_member(Request):
+ uri = 'teams/{id}/members/{user}'
+
+
+class Add_member(Request):
+ uri = 'teams/{id}/members/{user}'
+
+
+class Remove_member(Request):
+ uri = 'teams/{id}/members/{user}'
+
+
+class List_repos(Request):
+ uri = 'teams/{id}/repos'
+ resource = Repo
+
+
+class Contains_repo(Request):
+ uri = 'teams/{id}/repos/{user}/{repo}'
+
+
+class Add_repo(Request):
+ uri = 'teams/{id}/repos/{user}/{repo}'
+
+
+class Remove_repo(Request):
+ uri = 'teams/{id}/repos/{user}/{repo}'
diff --git a/pygithub3/services/orgs/__init__.py b/pygithub3/services/orgs/__init__.py
index 6a75081..8499719 100644
--- a/pygithub3/services/orgs/__init__.py
+++ b/pygithub3/services/orgs/__init__.py
@@ -2,6 +2,7 @@
from pygithub3.services.base import Service
from .members import Members
+from .teams import Teams
class Org(Service):
@@ -9,6 +10,7 @@ class Org(Service):
def __init__(self, **config):
self.members = Members(**config)
+ self.teams = Teams(**config)
super(Org, self).__init__(**config)
def list(self, user=None):
diff --git a/pygithub3/services/orgs/teams.py b/pygithub3/services/orgs/teams.py
new file mode 100644
index 0000000..2e47803
--- /dev/null
+++ b/pygithub3/services/orgs/teams.py
@@ -0,0 +1,147 @@
+# -*- encoding: utf-8 -*-
+
+from . import Service
+
+
+class Teams(Service):
+ """ Consume `Teams API <http://developer.github.com/v3/orgs/teams/>`_
+
+ .. warning ::
+ You must be authenticated as an owner of the org
+ """
+
+ def list(self, org):
+ """ Get org's teams
+
+ :param str org: Organisation name
+ :returns: A :doc:`result`
+ """
+ request = self.request_builder('orgs.teams.list', org=org)
+ return self._get_result(request)
+
+ def get(self, id):
+ """ Get a team
+
+ :param int id: The team id
+ :returns: A :doc:`result`
+ """
+ request = self.request_builder('orgs.teams.get', id=id)
+ return self._get(request)
+
+ def create(self, org, name, repo_names=None, permission=None):
+ """ Create a new team
+
+ :param str org: Organisation name
+ :param str name: Team name
+ :param list repo_names: List of repo names to belong to the team
+ :param str permission: Permissions to be granted to members
+ """
+ data = {'name': name}
+ if repo_names:
+ data['repo_names'] = repo_names
+ if permission:
+ data['permission'] = permission
+ request = self.request_builder('orgs.teams.create', org=org, body=data)
+ return self._post(request)
+
+ def update(self, id, name, permission=None):
+ """ Update a team
+
+ :param int id: The team id
+ :param str name: Team name
+ :param str permission: Permissions to be granted to members
+ """
+ data = {'name': name}
+ if permission:
+ data['permission'] = permission
+ request = self.request_builder('orgs.teams.update', id=id, body=data)
+ return self._patch(request)
+
+ def delete(self, id):
+ """ Delete a team
+
+ :param int id: The team id
+ """
+ request = self.request_builder('orgs.teams.delete', id=id)
+ return self._delete(request)
+
+ def list_members(self, id):
+ """ List the members of a team
+
+ :param int id: The team id
+ :returns: A :doc:`result`
+ """
+ request = self.request_builder('orgs.teams.list_members', id=id)
+ return self._get_result(request)
+
+ def is_member(self, id, user):
+ """ Determine if user is a member of a team
+
+ :param int id: The team id
+ :param str user: User name
+ """
+ request = self.request_builder('orgs.teams.is_member',
+ id=id, user=user)
+ return self._bool(request)
+
+ def add_member(self, id, user):
+ """ Add a user to a team
+
+ :param int id: The team id
+ :param str user: User name
+ """
+ request = self.request_builder('orgs.teams.add_member',
+ id=id, user=user)
+ return self._put(request)
+
+ def remove_member(self, id, user):
+ """ Remove a member from a team
+
+ :param int id: The team id
+ :param str user: User name
+ """
+ request = self.request_builder('orgs.teams.remove_member',
+ id=id, user=user)
+ return self._delete(request)
+
+ def list_repos(self, id):
+ """ List the repos that a team's members get access to
+
+ :param int id: The team id
+ :returns: A :doc:`result`
+ """
+ request = self.request_builder('orgs.teams.list_repos', id=id)
+ return self._get_result(request)
+
+ def contains_repo(self, id, user, repo):
+ """ Determine if user is a member of a team
+
+ :param int id: The team id
+ :param str user: User name
+ :param str repo: Repo name
+ """
+ request = self.request_builder('orgs.teams.contains_repo',
+ id=id, user=user, repo=repo)
+ return self._bool(request)
+
+ def add_repo(self, id, user, repo):
+ """ Give team members access to a repo
+
+ :param int id: The team id
+ :param str user: User name
+ :param str repo: Repo name
+ """
+ request = self.request_builder('orgs.teams.add_repo',
+ id=id, user=user, repo=repo)
+ return self._put(request)
+
+ def remove_repo(self, id, user, repo):
+ """ Remove a repo from the a team
+
+ :param int id: The team id
+ :param str user: User name
+ :param str repo: Repo name
+ """
+ request = self.request_builder('orgs.teams.remove_repo',
+ id=id, user=user, repo=repo)
+ return self._delete(request)
diff --git a/pygithub3/tests/services/test_orgs.py b/pygithub3/tests/services/test_orgs.py
index e741666..4d4c1c9 100644
--- a/pygithub3/tests/services/test_orgs.py
+++ b/pygithub3/tests/services/test_orgs.py
@@ -6,7 +6,7 @@ from mock import patch, Mock
from pygithub3.tests.utils.core import TestCase
from pygithub3.resources.base import json
-from pygithub3.services.orgs import Org, Members
+from pygithub3.services.orgs import Org, Members, Teams
from pygithub3.tests.utils.base import (mock_response, mock_response_result,
mock_json)
from pygithub3.tests.utils.services import _
@@ -89,3 +89,84 @@ class TestOrgMemberService(TestCase):
self.ms.conceal_membership('acme', 'octocat')
self.assertEqual(request_method.call_args[0],
('delete', _('orgs/acme/public_members/octocat')))
+
+
+@patch.object(requests.sessions.Session, 'request')
+class TestOrgMemberService(TestCase):
+ def setUp(self):
+ self.ts = Teams()
+
+ def test_LIST(self, request_method):
+ request_method.return_value = mock_response_result()
+ self.ts.list('acme').all()
+ self.assertEqual(request_method.call_args[0],
+ ('get', _('orgs/acme/teams')))
+
+ def test_GET(self, request_method):
+ request_method.return_value = mock_response_result()
+ self.ts.get(1)
+ self.assertEqual(request_method.call_args[0], ('get', _('teams/1')))
+
+ def test_CREATE(self, request_method):
+ request_method.return_value = mock_response_result('post')
+ self.ts.create('acme', 'committers')
+ self.assertEqual(request_method.call_args[0],
+ ('post', _('orgs/acme/teams')))
+
+ def test_UPDATE(self, request_method):
+ request_method.return_value = mock_response_result()
+ self.ts.update(1, 'committers', 'push')
+ self.assertEqual(request_method.call_args[0], ('patch', _('teams/1')))
+
+ def test_DELETE(self, request_method):
+ request_method.return_value = mock_response_result('delete')
+ self.ts.delete(1)
+ self.assertEqual(request_method.call_args[0], ('delete', _('teams/1')))
+
+ def test_LIST_MEMBERS(self, request_method):
+ request_method.return_value = mock_response_result()
+ self.ts.list_members(1).all()
+ self.assertEqual(request_method.call_args[0],
+ ('get', _('teams/1/members')))
+
+ def test_IS_MEMBER(self, request_method):
+ request_method.return_value = mock_response_result()
+ self.ts.is_member(1, 'octocat')
+ self.assertEqual(request_method.call_args[0],
+ ('head', _('teams/1/members/octocat')))
+
+ def test_ADD_MEMBER(self, request_method):
+ request_method.return_value = mock_response_result()
+ self.ts.add_member(1, 'octocat')
+ self.assertEqual(request_method.call_args[0],
+ ('put', _('teams/1/members/octocat')))
+
+ def test_REMOVE_MEMBER(self, request_method):
+ request_method.return_value = mock_response_result('delete')
+ self.ts.remove_member(1, 'octocat')
+ self.assertEqual(request_method.call_args[0],
+ ('delete', _('teams/1/members/octocat')))
+
+ def test_LIST_REPOS(self, request_method):
+ request_method.return_value = mock_response_result()
+ self.ts.list_repos(1).all()
+ self.assertEqual(request_method.call_args[0],
+ ('get', _('teams/1/repos')))
+
+ def test_CONTAINS_REPO(self, request_method):
+ request_method.return_value = mock_response_result()
+ self.ts.contains_repo(1, 'octocat', 're_oct')
+ self.assertEqual(request_method.call_args[0],
+ ('head', _('teams/1/repos/octocat/re_oct')))
+
+ def test_ADD_TEAM_REPO(self, request_method):
+ request_method.return_value = mock_response_result()
+ self.ts.add_repo(1, 'octocat', 're_oct')
+ self.assertEqual(request_method.call_args[0],
+ ('put', _('teams/1/repos/octocat/re_oct')))
+
+ def test_REMOVE_TEAM_REPO(self, request_method):
+ request_method.return_value = mock_response_result('delete')
+ self.ts.remove_repo(1, 'octocat', 're_oct')
+ self.assertEqual(request_method.call_args[0],
+ ('delete', _('teams/1/repos/octocat/re_oct')))