diff --git a/docs/gl_objects/merge_request_approvals.rst b/docs/gl_objects/merge_request_approvals.rst index 86659deb0..93ec6e426 100644 --- a/docs/gl_objects/merge_request_approvals.rst +++ b/docs/gl_objects/merge_request_approvals.rst @@ -78,6 +78,11 @@ List MR-level MR approval rules:: mr.approval_rules.list() +Get a single MR approval rule:: + + approval_rule_id = 123 + mr_approvalrule = mr.approval_rules.get(approval_rule_id) + Delete MR-level MR approval rule:: rules = mr.approval_rules.list() diff --git a/gitlab/v4/objects/merge_request_approvals.py b/gitlab/v4/objects/merge_request_approvals.py index a59fcd79e..ac89e56e1 100644 --- a/gitlab/v4/objects/merge_request_approvals.py +++ b/gitlab/v4/objects/merge_request_approvals.py @@ -1,9 +1,10 @@ -from typing import Any, cast, Dict, List, Optional, TYPE_CHECKING +from typing import Any, cast, Dict, List, Optional, TYPE_CHECKING, Union from gitlab import exceptions as exc from gitlab.base import RESTManager, RESTObject from gitlab.mixins import ( CreateMixin, + CRUDMixin, DeleteMixin, GetWithoutIdMixin, ListMixin, @@ -189,9 +190,7 @@ def save(self, **kwargs: Any) -> None: SaveMixin.save(self, **kwargs) -class ProjectMergeRequestApprovalRuleManager( - ListMixin, UpdateMixin, CreateMixin, DeleteMixin, RESTManager -): +class ProjectMergeRequestApprovalRuleManager(CRUDMixin, RESTManager): _path = "/projects/{project_id}/merge_requests/{mr_iid}/approval_rules" _obj_cls = ProjectMergeRequestApprovalRule _from_parent_attrs = {"project_id": "project_id", "mr_iid": "iid"} @@ -214,6 +213,13 @@ class ProjectMergeRequestApprovalRuleManager( optional=("approval_project_rule_id", "user_ids", "group_ids"), ) + def get( + self, id: Union[str, int], lazy: bool = False, **kwargs: Any + ) -> ProjectMergeRequestApprovalRule: + return cast( + ProjectMergeRequestApprovalRule, super().get(id=id, lazy=lazy, **kwargs) + ) + def create( self, data: Optional[Dict[str, Any]] = None, **kwargs: Any ) -> RESTObject: diff --git a/tests/unit/objects/test_project_merge_request_approvals.py b/tests/unit/objects/test_project_merge_request_approvals.py index 27bbc84a4..73eb8f8bc 100644 --- a/tests/unit/objects/test_project_merge_request_approvals.py +++ b/tests/unit/objects/test_project_merge_request_approvals.py @@ -100,6 +100,13 @@ def resp_mr_approval_rules(): content_type="application/json", status=200, ) + rsps.add( + method=responses.GET, + url="http://localhost/api/v4/projects/1/merge_requests/1/approval_rules/1", + json=mr_ars_content[0], + content_type="application/json", + status=200, + ) rsps.add( method=responses.GET, url="http://localhost/api/v4/projects/1/merge_requests/1/approval_state", @@ -243,6 +250,17 @@ def test_update_merge_request_approval_rule(project, resp_mr_approval_rules): assert ar_1.eligible_approvers[0]["id"] == updated_approval_rule_user_ids[0] +def test_get_merge_request_approval_rule(project, resp_mr_approval_rules): + merge_request = project.mergerequests.get(1, lazy=True) + approval_rule = merge_request.approval_rules.get(approval_rule_id) + assert isinstance( + approval_rule, + gitlab.v4.objects.merge_request_approvals.ProjectMergeRequestApprovalRule, + ) + assert approval_rule.name == approval_rule_name + assert approval_rule.id == approval_rule_id + + def test_get_merge_request_approval_state(project, resp_mr_approval_rules): merge_request = project.mergerequests.get(1, lazy=True) approval_state = merge_request.approval_state.get()