Skip to content

Commit 689ecae

Browse files
author
Gauvain Pocentek
committed
Implement ProjectManager search/list methods
The existing Gitlab methods are deprecated. Unit tests have been added.
1 parent e48e149 commit 689ecae

File tree

3 files changed

+105
-0
lines changed

3 files changed

+105
-0
lines changed

gitlab/__init__.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,14 +469,23 @@ def search_projects(self, query, **kwargs):
469469
470470
Returns a list of matching projects.
471471
"""
472+
warnings.warn("`search_projects()` is deprecated, "
473+
"use `projects.search()` instead",
474+
DeprecationWarning)
472475
return self._list_projects("/projects/search/" + query, **kwargs)
473476

474477
def all_projects(self, **kwargs):
475478
"""Lists all the projects (need admin rights)."""
479+
warnings.warn("`all_projects()` is deprecated, "
480+
"use `projects.all()` instead",
481+
DeprecationWarning)
476482
return self._list_projects("/projects/all", **kwargs)
477483

478484
def owned_projects(self, **kwargs):
479485
"""Lists owned projects."""
486+
warnings.warn("`owned_projects()` is deprecated, "
487+
"use `projects.owned()` instead",
488+
DeprecationWarning)
480489
return self._list_projects("/projects/owned", **kwargs)
481490

482491
def Group(self, id=None, **kwargs):

gitlab/objects.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,6 +1016,33 @@ class UserProject(GitlabObject):
10161016
class ProjectManager(BaseManager):
10171017
obj_cls = Project
10181018

1019+
def _custom_list(self, url, **kwargs):
1020+
r = self.gitlab._raw_get(url, **kwargs)
1021+
raise_error_from_response(r, GitlabListError)
1022+
1023+
l = []
1024+
for o in r.json():
1025+
p = Project(self, o)
1026+
p._from_api = True
1027+
l.append(p)
1028+
1029+
return l
1030+
1031+
def search(self, query, **kwargs):
1032+
"""Searches projects by name.
1033+
1034+
Returns a list of matching projects.
1035+
"""
1036+
return self._custom_list("/projects/search/" + query, **kwargs)
1037+
1038+
def all(self, **kwargs):
1039+
"""Lists all the projects (need admin rights)."""
1040+
return self._custom_list("/projects/all", **kwargs)
1041+
1042+
def owned(self, **kwargs):
1043+
"""Lists owned projects."""
1044+
return self._custom_list("/projects/owned", **kwargs)
1045+
10191046

10201047
class UserProjectManager(BaseManager):
10211048
obj_cls = UserProject

gitlab/tests/test_manager.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,72 @@ def resp_post(url, request):
145145
self.assertIsInstance(fake_obj, FakeObject)
146146
self.assertEqual(fake_obj.id, 1)
147147
self.assertEqual(fake_obj.name, "fake_name")
148+
149+
def test_project_manager_owned(self):
150+
mgr = ProjectManager(self.gitlab)
151+
152+
@urlmatch(scheme="http", netloc="localhost",
153+
path="/api/v3/projects/owned", method="get")
154+
def resp_get_all(url, request):
155+
headers = {'content-type': 'application/json'}
156+
content = ('[{"name": "name1", "id": 1}, '
157+
'{"name": "name2", "id": 2}]')
158+
content = content.encode("utf-8")
159+
return response(200, content, headers, None, 5, request)
160+
161+
with HTTMock(resp_get_all):
162+
data = mgr.owned()
163+
self.assertEqual(type(data), list)
164+
self.assertEqual(2, len(data))
165+
self.assertEqual(type(data[0]), Project)
166+
self.assertEqual(type(data[1]), Project)
167+
self.assertEqual(data[0].name, "name1")
168+
self.assertEqual(data[1].name, "name2")
169+
self.assertEqual(data[0].id, 1)
170+
self.assertEqual(data[1].id, 2)
171+
172+
def test_project_manager_all(self):
173+
mgr = ProjectManager(self.gitlab)
174+
175+
@urlmatch(scheme="http", netloc="localhost",
176+
path="/api/v3/projects/all", method="get")
177+
def resp_get_all(url, request):
178+
headers = {'content-type': 'application/json'}
179+
content = ('[{"name": "name1", "id": 1}, '
180+
'{"name": "name2", "id": 2}]')
181+
content = content.encode("utf-8")
182+
return response(200, content, headers, None, 5, request)
183+
184+
with HTTMock(resp_get_all):
185+
data = mgr.all()
186+
self.assertEqual(type(data), list)
187+
self.assertEqual(2, len(data))
188+
self.assertEqual(type(data[0]), Project)
189+
self.assertEqual(type(data[1]), Project)
190+
self.assertEqual(data[0].name, "name1")
191+
self.assertEqual(data[1].name, "name2")
192+
self.assertEqual(data[0].id, 1)
193+
self.assertEqual(data[1].id, 2)
194+
195+
def test_project_manager_search(self):
196+
mgr = ProjectManager(self.gitlab)
197+
198+
@urlmatch(scheme="http", netloc="localhost",
199+
path="/api/v3/projects/search/foo", method="get")
200+
def resp_get_all(url, request):
201+
headers = {'content-type': 'application/json'}
202+
content = ('[{"name": "foo1", "id": 1}, '
203+
'{"name": "foo2", "id": 2}]')
204+
content = content.encode("utf-8")
205+
return response(200, content, headers, None, 5, request)
206+
207+
with HTTMock(resp_get_all):
208+
data = mgr.search('foo')
209+
self.assertEqual(type(data), list)
210+
self.assertEqual(2, len(data))
211+
self.assertEqual(type(data[0]), Project)
212+
self.assertEqual(type(data[1]), Project)
213+
self.assertEqual(data[0].name, "foo1")
214+
self.assertEqual(data[1].name, "foo2")
215+
self.assertEqual(data[0].id, 1)
216+
self.assertEqual(data[1].id, 2)

0 commit comments

Comments
 (0)