Skip to content

Commit 750f4ee

Browse files
authored
Merge pull request #1157 from Shkurupii/issue-1154
Add support to resource milestone events
2 parents 26f95f3 + 6961479 commit 750f4ee

File tree

4 files changed

+143
-0
lines changed

4 files changed

+143
-0
lines changed

docs/gl_objects/milestones.rst

+33
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
Milestones
33
##########
44

5+
Project milestones
6+
==================
7+
58
Reference
69
---------
710

@@ -70,3 +73,33 @@ List the issues related to a milestone::
7073
List the merge requests related to a milestone::
7174

7275
merge_requests = milestone.merge_requests()
76+
77+
Milestone events
78+
============
79+
80+
Resource milestone events keep track of what happens to GitLab issues and merge requests.
81+
82+
Reference
83+
---------
84+
85+
* v4 API:
86+
87+
+ :class:`gitlab.v4.objects.ProjectIssueResourceMilestoneEvent`
88+
+ :class:`gitlab.v4.objects.ProjectIssueResourceMilestoneEventManager`
89+
+ :attr:`gitlab.v4.objects.ProjectIssue.resourcemilestoneevents`
90+
+ :class:`gitlab.v4.objects.ProjectMergeRequestResourceMilestoneEvent`
91+
+ :class:`gitlab.v4.objects.ProjectMergeRequestResourceMilestoneEventManager`
92+
+ :attr:`gitlab.v4.objects.ProjectMergeRequest.resourcemilestoneevents`
93+
94+
* GitLab API: https://docs.gitlab.com/ee/api/resource_milestone_events.html
95+
96+
Examples
97+
--------
98+
99+
Get milestones for a resource (issue, merge request)::
100+
101+
milestones = resource.resourcemilestoneevents.list()
102+
103+
Get a specific milestone for a resource::
104+
105+
milestone = resource.resourcemilestoneevents.get(milestone_id)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
"""
2+
GitLab API: https://docs.gitlab.com/ee/api/resource_milestone_events.html
3+
"""
4+
5+
import pytest
6+
import responses
7+
8+
from gitlab.v4.objects import (
9+
ProjectIssueResourceMilestoneEvent,
10+
ProjectMergeRequestResourceMilestoneEvent,
11+
)
12+
13+
14+
@pytest.fixture()
15+
def resp_merge_request_milestone_events():
16+
mr_content = {"iid": 1}
17+
events_content = {"id": 1, "resource_type": "MergeRequest"}
18+
with responses.RequestsMock() as rsps:
19+
rsps.add(
20+
method=responses.GET,
21+
url="http://localhost/api/v4/projects/1/merge_requests",
22+
json=[mr_content],
23+
content_type="application/json",
24+
status=200,
25+
)
26+
rsps.add(
27+
method=responses.GET,
28+
url="http://localhost/api/v4/projects/1/merge_requests/1/resource_milestone_events",
29+
json=[events_content],
30+
content_type="application/json",
31+
status=200,
32+
)
33+
yield rsps
34+
35+
36+
@pytest.fixture()
37+
def resp_project_issue_milestone_events():
38+
issue_content = {"iid": 1}
39+
events_content = {"id": 1, "resource_type": "Issue"}
40+
with responses.RequestsMock() as rsps:
41+
rsps.add(
42+
method=responses.GET,
43+
url="http://localhost/api/v4/projects/1/issues",
44+
json=[issue_content],
45+
content_type="application/json",
46+
status=200,
47+
)
48+
rsps.add(
49+
method=responses.GET,
50+
url="http://localhost/api/v4/projects/1/issues/1/resource_milestone_events",
51+
json=[events_content],
52+
content_type="application/json",
53+
status=200,
54+
)
55+
yield rsps
56+
57+
58+
def test_project_issue_milestone_events(project, resp_project_issue_milestone_events):
59+
issue = project.issues.list()[0]
60+
milestone_events = issue.resourcemilestoneevents.list()
61+
assert isinstance(milestone_events, list)
62+
milestone_event = milestone_events[0]
63+
assert isinstance(milestone_event, ProjectIssueResourceMilestoneEvent)
64+
assert milestone_event.resource_type == "Issue"
65+
66+
67+
def test_merge_request_milestone_events(project, resp_merge_request_milestone_events):
68+
mr = project.mergerequests.list()[0]
69+
milestone_events = mr.resourcemilestoneevents.list()
70+
assert isinstance(milestone_events, list)
71+
milestone_event = milestone_events[0]
72+
assert isinstance(milestone_event, ProjectMergeRequestResourceMilestoneEvent)
73+
assert milestone_event.resource_type == "MergeRequest"

gitlab/v4/objects.py

+24
Original file line numberDiff line numberDiff line change
@@ -2682,6 +2682,16 @@ class ProjectIssueResourceLabelEventManager(RetrieveMixin, RESTManager):
26822682
_from_parent_attrs = {"project_id": "project_id", "issue_iid": "iid"}
26832683

26842684

2685+
class ProjectIssueResourceMilestoneEvent(RESTObject):
2686+
pass
2687+
2688+
2689+
class ProjectIssueResourceMilestoneEventManager(RetrieveMixin, RESTManager):
2690+
_path = "/projects/%(project_id)s/issues/%(issue_iid)s/resource_milestone_events"
2691+
_obj_cls = ProjectIssueResourceMilestoneEvent
2692+
_from_parent_attrs = {"project_id": "project_id", "issue_iid": "iid"}
2693+
2694+
26852695
class ProjectIssue(
26862696
UserAgentDetailMixin,
26872697
SubscribableMixin,
@@ -2700,6 +2710,7 @@ class ProjectIssue(
27002710
("links", "ProjectIssueLinkManager"),
27012711
("notes", "ProjectIssueNoteManager"),
27022712
("resourcelabelevents", "ProjectIssueResourceLabelEventManager"),
2713+
("resourcemilestoneevents", "ProjectIssueResourceMilestoneEventManager"),
27032714
)
27042715

27052716
@cli.register_custom_action("ProjectIssue", ("to_project_id",))
@@ -3109,6 +3120,18 @@ class ProjectMergeRequestResourceLabelEventManager(RetrieveMixin, RESTManager):
31093120
_from_parent_attrs = {"project_id": "project_id", "mr_iid": "iid"}
31103121

31113122

3123+
class ProjectMergeRequestResourceMilestoneEvent(RESTObject):
3124+
pass
3125+
3126+
3127+
class ProjectMergeRequestResourceMilestoneEventManager(RetrieveMixin, RESTManager):
3128+
_path = (
3129+
"/projects/%(project_id)s/merge_requests/%(mr_iid)s/resource_milestone_events"
3130+
)
3131+
_obj_cls = ProjectMergeRequestResourceMilestoneEvent
3132+
_from_parent_attrs = {"project_id": "project_id", "mr_iid": "iid"}
3133+
3134+
31123135
class ProjectMergeRequest(
31133136
SubscribableMixin,
31143137
TodoMixin,
@@ -3127,6 +3150,7 @@ class ProjectMergeRequest(
31273150
("discussions", "ProjectMergeRequestDiscussionManager"),
31283151
("notes", "ProjectMergeRequestNoteManager"),
31293152
("resourcelabelevents", "ProjectMergeRequestResourceLabelEventManager"),
3153+
("resourcemilestoneevents", "ProjectMergeRequestResourceMilestoneEventManager"),
31303154
)
31313155

31323156
@cli.register_custom_action("ProjectMergeRequest")

tools/python_test_v4.py

+13
Original file line numberDiff line numberDiff line change
@@ -787,6 +787,11 @@
787787
event = issue1.resourcelabelevents.get(events[0].id)
788788
assert event
789789

790+
# issue milestones
791+
milestones = issue1.resourcemilestoneevents.list()
792+
assert milestones
793+
milestone = issue1.resourcemilestoneevents.get(milestones[0].id)
794+
assert milestone
790795

791796
size = len(issue1.discussions.list())
792797
discussion = issue1.discussions.create({"body": "Discussion body"})
@@ -896,6 +901,14 @@
896901
event = mr.resourcelabelevents.get(events[0].id)
897902
assert event
898903

904+
# mr milestone events
905+
mr.milestone_id = m1.id
906+
mr.save()
907+
milestones = mr.resourcemilestoneevents.list()
908+
assert milestones
909+
milestone = mr.resourcemilestoneevents.get(milestones[0].id)
910+
assert milestone
911+
899912
# rebasing
900913
assert mr.rebase()
901914

0 commit comments

Comments
 (0)