summaryrefslogtreecommitdiff
path: root/gitlab
diff options
context:
space:
mode:
authorGauvain Pocentek <gauvain.pocentek@objectif-libre.com>2016-01-09 08:36:18 +0100
committerGauvain Pocentek <gauvain.pocentek@objectif-libre.com>2016-01-09 08:36:18 +0100
commit5513d0f52cd488b14c94389a09d01877fa5596e0 (patch)
tree4e8dab28f2c95e8214cfc1a4d4d39f1e4295007d /gitlab
parent0ae315a4d1d154122208883bd006b2b882cb5113 (diff)
downloadgitlab-5513d0f52cd488b14c94389a09d01877fa5596e0.tar.gz
Add support for groups search
Factorize the code to avoid duplication with the ProjectManager class. Implement unit tests for the group search. Original patchh from Daniel Serodio (PR #55).
Diffstat (limited to 'gitlab')
-rw-r--r--gitlab/objects.py39
-rw-r--r--gitlab/tests/test_manager.py23
2 files changed, 47 insertions, 15 deletions
diff --git a/gitlab/objects.py b/gitlab/objects.py
index aaaadbb..ccd4f0a 100644
--- a/gitlab/objects.py
+++ b/gitlab/objects.py
@@ -70,6 +70,18 @@ class BaseManager(object):
raise NotImplementedError
return self.obj_cls.create(self.gitlab, data, **kwargs)
+ def _custom_list(self, url, cls, **kwargs):
+ r = self.gitlab._raw_get(url, **kwargs)
+ raise_error_from_response(r, GitlabListError)
+
+ l = []
+ for j in r.json():
+ o = cls(self, j)
+ o._from_api = True
+ l.append(o)
+
+ return l
+
class GitlabObject(object):
"""Base class for all classes that interface with GitLab
@@ -433,6 +445,14 @@ class Group(GitlabObject):
class GroupManager(BaseManager):
obj_cls = Group
+ def search(self, query, **kwargs):
+ """Searches groups by name.
+
+ Returns a list of matching groups.
+ """
+ url = '/groups?search=' + query
+ return self._custom_list(url, Group, **kwargs)
+
class Hook(GitlabObject):
_url = '/hooks'
@@ -1016,32 +1036,21 @@ class UserProject(GitlabObject):
class ProjectManager(BaseManager):
obj_cls = Project
- def _custom_list(self, url, **kwargs):
- r = self.gitlab._raw_get(url, **kwargs)
- raise_error_from_response(r, GitlabListError)
-
- l = []
- for o in r.json():
- p = Project(self, o)
- p._from_api = True
- l.append(p)
-
- return l
-
def search(self, query, **kwargs):
"""Searches projects by name.
Returns a list of matching projects.
"""
- return self._custom_list("/projects/search/" + query, **kwargs)
+ return self._custom_list("/projects/search/" + query, Project,
+ **kwargs)
def all(self, **kwargs):
"""Lists all the projects (need admin rights)."""
- return self._custom_list("/projects/all", **kwargs)
+ return self._custom_list("/projects/all", Project, **kwargs)
def owned(self, **kwargs):
"""Lists owned projects."""
- return self._custom_list("/projects/owned", **kwargs)
+ return self._custom_list("/projects/owned", Project, **kwargs)
class UserProjectManager(BaseManager):
diff --git a/gitlab/tests/test_manager.py b/gitlab/tests/test_manager.py
index bba278f..041537c 100644
--- a/gitlab/tests/test_manager.py
+++ b/gitlab/tests/test_manager.py
@@ -214,3 +214,26 @@ class TestGitlabManager(unittest.TestCase):
self.assertEqual(data[1].name, "foo2")
self.assertEqual(data[0].id, 1)
self.assertEqual(data[1].id, 2)
+
+ def test_group_manager_search(self):
+ mgr = GroupManager(self.gitlab)
+
+ @urlmatch(scheme="http", netloc="localhost", path="/api/v3/groups",
+ query="search=foo", method="get")
+ def resp_get_search(url, request):
+ headers = {'content-type': 'application/json'}
+ content = ('[{"name": "foo1", "id": 1}, '
+ '{"name": "foo2", "id": 2}]')
+ content = content.encode("utf-8")
+ return response(200, content, headers, None, 5, request)
+
+ with HTTMock(resp_get_search):
+ data = mgr.search('foo')
+ self.assertEqual(type(data), list)
+ self.assertEqual(2, len(data))
+ self.assertEqual(type(data[0]), Group)
+ self.assertEqual(type(data[1]), Group)
+ self.assertEqual(data[0].name, "foo1")
+ self.assertEqual(data[1].name, "foo2")
+ self.assertEqual(data[0].id, 1)
+ self.assertEqual(data[1].id, 2)