Skip to content

Commit adbd90c

Browse files
Kęstutis Miknevičiusnejch
Kęstutis Miknevičius
authored andcommitted
feat(api): add reviewer_details manager for mergrequest to get reviewers of merge request
Those changes implements 'GET /projects/:id/merge_requests/:merge_request_iid/reviewers' gitlab API call. Naming for call is not reviewers because reviewers atribute already presen in merge request response
1 parent cbc13a6 commit adbd90c

File tree

5 files changed

+85
-1
lines changed

5 files changed

+85
-1
lines changed

docs/gl_objects/merge_requests.rst

+4
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ Get a single MR::
9494

9595
mr = project.mergerequests.get(mr_iid)
9696

97+
Get MR reviewer details::
98+
mr = project.mergerequests.get(mr_iid)
99+
reviewers = mr.reviewer_details.list()
100+
97101
Create a MR::
98102

99103
mr = project.mergerequests.create({'source_branch': 'cool_feature',

gitlab/v4/objects/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
from .releases import *
5757
from .repositories import *
5858
from .resource_groups import *
59+
from .reviewers import *
5960
from .runners import *
6061
from .secure_files import *
6162
from .settings import *

gitlab/v4/objects/merge_requests.py

+2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
)
4343
from .notes import ProjectMergeRequestNoteManager # noqa: F401
4444
from .pipelines import ProjectMergeRequestPipelineManager # noqa: F401
45+
from .reviewers import ProjectMergeRequestReviewerDetailManager
4546

4647
__all__ = [
4748
"MergeRequest",
@@ -164,6 +165,7 @@ class ProjectMergeRequest(
164165
resourcelabelevents: ProjectMergeRequestResourceLabelEventManager
165166
resourcemilestoneevents: ProjectMergeRequestResourceMilestoneEventManager
166167
resourcestateevents: ProjectMergeRequestResourceStateEventManager
168+
reviewer_details: ProjectMergeRequestReviewerDetailManager
167169

168170
@cli.register_custom_action("ProjectMergeRequest")
169171
@exc.on_http_error(exc.GitlabMROnBuildSuccessError)

gitlab/v4/objects/reviewers.py

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from gitlab.base import RESTManager, RESTObject
2+
from gitlab.mixins import ListMixin
3+
4+
__all__ = [
5+
"ProjectMergeRequestReviewerDetail",
6+
"ProjectMergeRequestReviewerDetailManager",
7+
]
8+
9+
10+
class ProjectMergeRequestReviewerDetail(RESTObject):
11+
pass
12+
13+
14+
class ProjectMergeRequestReviewerDetailManager(ListMixin, RESTManager):
15+
_path = "/projects/{project_id}/merge_requests/{mr_iid}/reviewers"
16+
_obj_cls = ProjectMergeRequestReviewerDetail
17+
_from_parent_attrs = {"project_id": "project_id", "mr_iid": "iid"}

tests/unit/objects/test_merge_requests.py

+61-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@
88
import pytest
99
import responses
1010

11-
from gitlab.v4.objects import ProjectDeploymentMergeRequest, ProjectMergeRequest
11+
from gitlab.v4.objects import (
12+
ProjectDeploymentMergeRequest,
13+
ProjectMergeRequest,
14+
ProjectMergeRequestReviewerDetail,
15+
)
1216

1317
mr_content = {
1418
"id": 1,
@@ -25,8 +29,33 @@
2529
"avatar_url": "https://gitlab.example.com/uploads/-/system/user/avatar/87854/avatar.png",
2630
"web_url": "https://gitlab.com/DouweM",
2731
},
32+
"reviewers": [
33+
{
34+
"id": 2,
35+
"name": "Sam Bauch",
36+
"username": "kenyatta_oconnell",
37+
"state": "active",
38+
"avatar_url": "https://www.gravatar.com/avatar/956c92487c6f6f7616b536927e22c9a0?s=80&d=identicon",
39+
"web_url": "http://gitlab.example.com//kenyatta_oconnell",
40+
}
41+
],
2842
}
2943

44+
reviewers_content = [
45+
{
46+
"user": {
47+
"id": 2,
48+
"name": "Sam Bauch",
49+
"username": "kenyatta_oconnell",
50+
"state": "active",
51+
"avatar_url": "https://www.gravatar.com/avatar/956c92487c6f6f7616b536927e22c9a0?s=80&d=identicon",
52+
"web_url": "http://gitlab.example.com//kenyatta_oconnell",
53+
},
54+
"state": "unreviewed",
55+
"created_at": "2022-07-27T17:03:27.684Z",
56+
}
57+
]
58+
3059

3160
@pytest.fixture
3261
def resp_list_merge_requests():
@@ -43,6 +72,26 @@ def resp_list_merge_requests():
4372
yield rsps
4473

4574

75+
@pytest.fixture
76+
def resp_get_merge_request_reviewers():
77+
with responses.RequestsMock() as rsps:
78+
rsps.add(
79+
method=responses.GET,
80+
url="http://localhost/api/v4/projects/1/merge_requests/1",
81+
json=mr_content,
82+
content_type="application/json",
83+
status=200,
84+
)
85+
rsps.add(
86+
method=responses.GET,
87+
url="http://localhost/api/v4/projects/3/merge_requests/1/reviewers",
88+
json=reviewers_content,
89+
content_type="application/json",
90+
status=200,
91+
)
92+
yield rsps
93+
94+
4695
def test_list_project_merge_requests(project, resp_list_merge_requests):
4796
mrs = project.mergerequests.list()
4897
assert isinstance(mrs[0], ProjectMergeRequest)
@@ -54,3 +103,14 @@ def test_list_deployment_merge_requests(project, resp_list_merge_requests):
54103
mrs = deployment.mergerequests.list()
55104
assert isinstance(mrs[0], ProjectDeploymentMergeRequest)
56105
assert mrs[0].iid == mr_content["iid"]
106+
107+
108+
def test_get_merge_request_reviewers(project, resp_get_merge_request_reviewers):
109+
mr = project.mergerequests.get(1)
110+
reviewers_details = mr.reviewer_details.list()
111+
assert isinstance(mr, ProjectMergeRequest)
112+
assert isinstance(reviewers_details, list)
113+
assert isinstance(reviewers_details[0], ProjectMergeRequestReviewerDetail)
114+
assert mr.reviewers[0]["name"] == reviewers_details[0].user["name"]
115+
assert reviewers_details[0].state == "unreviewed"
116+
assert reviewers_details[0].created_at == "2022-07-27T17:03:27.684Z"

0 commit comments

Comments
 (0)