diff options
Diffstat (limited to 'pygithub3')
-rw-r--r-- | pygithub3/requests/orgs/teams.py | 71 | ||||
-rw-r--r-- | pygithub3/services/orgs/__init__.py | 2 | ||||
-rw-r--r-- | pygithub3/services/orgs/teams.py | 147 | ||||
-rw-r--r-- | pygithub3/tests/services/test_orgs.py | 83 |
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'))) |