Skip to content

Commit ac2e534

Browse files
committed
define UserManager.get_by_username() to get a user by username
1 parent 8f59516 commit ac2e534

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed

gitlab/objects.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,20 @@ def search(self, query, **kwargs):
573573
url = self.obj_cls._url + '?search=' + query
574574
return self._custom_list(url, self.obj_cls, **kwargs)
575575

576+
def get_by_username(self, username, **kwargs):
577+
"""Get a user by its username.
578+
579+
Returns a User object or None if the named user does not
580+
exist.
581+
"""
582+
url = self.obj_cls._url + '?username=' + username
583+
results = self._custom_list(url, self.obj_cls, **kwargs)
584+
assert len(results) in (0, 1)
585+
try:
586+
return results[0]
587+
except IndexError:
588+
raise GitlabGetError('no such user: ' + username)
589+
576590

577591
class CurrentUserKey(GitlabObject):
578592
_url = '/user/keys'

gitlab/tests/test_manager.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,32 @@ def resp_get_search(url, request):
258258
self.assertEqual(data[0].id, 1)
259259
self.assertEqual(data[1].id, 2)
260260

261+
def test_user_manager_get_by_username(self):
262+
mgr = UserManager(self.gitlab)
263+
264+
@urlmatch(scheme="http", netloc="localhost", path="/api/v3/users",
265+
query="username=foo", method="get")
266+
def resp_get_username(url, request):
267+
headers = {'content-type': 'application/json'}
268+
content = '[{"name": "foo", "id": 1}]'.encode("utf-8")
269+
return response(200, content, headers, None, 5, request)
270+
271+
with HTTMock(resp_get_username):
272+
data = mgr.get_by_username('foo')
273+
self.assertEqual(type(data), User)
274+
self.assertEqual(data.name, "foo")
275+
self.assertEqual(data.id, 1)
276+
277+
@urlmatch(scheme="http", netloc="localhost", path="/api/v3/users",
278+
query="username=foo", method="get")
279+
def resp_get_username_nomatch(url, request):
280+
headers = {'content-type': 'application/json'}
281+
content = '[]'.encode("utf-8")
282+
return response(200, content, headers, None, 5, request)
283+
284+
with HTTMock(resp_get_username_nomatch):
285+
self.assertRaises(GitlabGetError, mgr.get_by_username, 'foo')
286+
261287
def test_group_manager_search(self):
262288
mgr = GroupManager(self.gitlab)
263289

tools/python_test.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,15 @@
5454
assert expected == actual
5555
assert gl.users.search('asdf') == []
5656

57+
assert gl.users.get_by_username('foobar') == foobar_user
58+
assert gl.users.get_by_username('foo') == new_user
59+
try:
60+
gl.users.get_by_username('asdf')
61+
except gitlab.GitlabGetError:
62+
pass
63+
else:
64+
assert False
65+
5766
# SSH keys
5867
key = new_user.keys.create({'title': 'testkey', 'key': SSH_KEY})
5968
assert(len(new_user.keys.list()) == 1)

0 commit comments

Comments
 (0)