Skip to content

Commit 916a7fe

Browse files
authored
Merge pull request #1364 from python-gitlab/feat/resource-state-events
feat: add support for resource state events API
2 parents af781c1 + c5e6fb3 commit 916a7fe

File tree

6 files changed

+185
-0
lines changed

6 files changed

+185
-0
lines changed

docs/gl_objects/events.rst

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
Events
33
######
44

5+
Events
6+
======
7+
58
Reference
69
---------
710

@@ -39,3 +42,42 @@ List the issue events on a project::
3942
List the user events::
4043

4144
events = project.events.list()
45+
46+
Resource state events
47+
=====================
48+
49+
Reference
50+
---------
51+
52+
* v4 API:
53+
54+
+ :class:`gitlab.v4.objects.ProjectIssueResourceStateEvent`
55+
+ :class:`gitlab.v4.objects.ProjectIssueResourceStateEventManager`
56+
+ :attr:`gitlab.v4.objects.ProjectIssue.resourcestateevents`
57+
+ :class:`gitlab.v4.objects.ProjectMergeRequestResourceStateEvent`
58+
+ :class:`gitlab.v4.objects.ProjectMergeRequestResourceStateEventManager`
59+
+ :attr:`gitlab.v4.objects.ProjectMergeRequest.resourcestateevents`
60+
61+
* GitLab API: https://docs.gitlab.com/ee/api/resource_state_events.html
62+
63+
Examples
64+
--------
65+
66+
You can list and get specific resource state events (via their id) for project issues
67+
and project merge requests.
68+
69+
List the state events of a project issue (paginated)::
70+
71+
state_events = issue.resourcestateevents.list()
72+
73+
Get a specific state event of a project issue by its id::
74+
75+
state_event = issue.resourcestateevents.get(1)
76+
77+
List the state events of a project merge request (paginated)::
78+
79+
state_events = mr.resourcestateevents.list()
80+
81+
Get a specific state event of a project merge request by its id::
82+
83+
state_event = mr.resourcestateevents.get(1)

gitlab/tests/conftest.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,16 @@ def project(gl):
5252
return gl.projects.get(1, lazy=True)
5353

5454

55+
@pytest.fixture
56+
def project_issue(project):
57+
return project.issues.get(1, lazy=True)
58+
59+
60+
@pytest.fixture
61+
def project_merge_request(project):
62+
return project.mergerequests.get(1, lazy=True)
63+
64+
5565
@pytest.fixture
5666
def release(project, tag_name):
5767
return project.releases.get(tag_name, lazy=True)
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
"""
2+
GitLab API: https://docs.gitlab.com/ee/api/resource_state_events.html
3+
"""
4+
5+
import pytest
6+
import responses
7+
8+
from gitlab.v4.objects import (
9+
ProjectIssueResourceStateEvent,
10+
ProjectMergeRequestResourceStateEvent,
11+
)
12+
13+
14+
issue_event_content = {"id": 1, "resource_type": "Issue"}
15+
mr_event_content = {"id": 1, "resource_type": "MergeRequest"}
16+
17+
18+
@pytest.fixture()
19+
def resp_list_project_issue_state_events():
20+
with responses.RequestsMock() as rsps:
21+
rsps.add(
22+
method=responses.GET,
23+
url="http://localhost/api/v4/projects/1/issues/1/resource_state_events",
24+
json=[issue_event_content],
25+
content_type="application/json",
26+
status=200,
27+
)
28+
yield rsps
29+
30+
31+
@pytest.fixture()
32+
def resp_get_project_issue_state_event():
33+
with responses.RequestsMock() as rsps:
34+
rsps.add(
35+
method=responses.GET,
36+
url="http://localhost/api/v4/projects/1/issues/1/resource_state_events/1",
37+
json=issue_event_content,
38+
content_type="application/json",
39+
status=200,
40+
)
41+
yield rsps
42+
43+
44+
@pytest.fixture()
45+
def resp_list_merge_request_state_events():
46+
with responses.RequestsMock() as rsps:
47+
rsps.add(
48+
method=responses.GET,
49+
url="http://localhost/api/v4/projects/1/merge_requests/1/resource_state_events",
50+
json=[mr_event_content],
51+
content_type="application/json",
52+
status=200,
53+
)
54+
yield rsps
55+
56+
57+
@pytest.fixture()
58+
def resp_get_merge_request_state_event():
59+
with responses.RequestsMock() as rsps:
60+
rsps.add(
61+
method=responses.GET,
62+
url="http://localhost/api/v4/projects/1/merge_requests/1/resource_state_events/1",
63+
json=mr_event_content,
64+
content_type="application/json",
65+
status=200,
66+
)
67+
yield rsps
68+
69+
70+
def test_list_project_issue_state_events(
71+
project_issue, resp_list_project_issue_state_events
72+
):
73+
state_events = project_issue.resourcestateevents.list()
74+
assert isinstance(state_events, list)
75+
76+
state_event = state_events[0]
77+
assert isinstance(state_event, ProjectIssueResourceStateEvent)
78+
assert state_event.resource_type == "Issue"
79+
80+
81+
def test_get_project_issue_state_event(
82+
project_issue, resp_get_project_issue_state_event
83+
):
84+
state_event = project_issue.resourcestateevents.get(1)
85+
assert isinstance(state_event, ProjectIssueResourceStateEvent)
86+
assert state_event.resource_type == "Issue"
87+
88+
89+
def test_list_merge_request_state_events(
90+
project_merge_request, resp_list_merge_request_state_events
91+
):
92+
state_events = project_merge_request.resourcestateevents.list()
93+
assert isinstance(state_events, list)
94+
95+
state_event = state_events[0]
96+
assert isinstance(state_event, ProjectMergeRequestResourceStateEvent)
97+
assert state_event.resource_type == "MergeRequest"
98+
99+
100+
def test_get_merge_request_state_event(
101+
project_merge_request, resp_get_merge_request_state_event
102+
):
103+
state_event = project_merge_request.resourcestateevents.get(1)
104+
assert isinstance(state_event, ProjectMergeRequestResourceStateEvent)
105+
assert state_event.resource_type == "MergeRequest"

gitlab/v4/objects/events.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,14 @@
1414
"ProjectIssueResourceLabelEventManager",
1515
"ProjectIssueResourceMilestoneEvent",
1616
"ProjectIssueResourceMilestoneEventManager",
17+
"ProjectIssueResourceStateEvent",
18+
"ProjectIssueResourceStateEventManager",
1719
"ProjectMergeRequestResourceLabelEvent",
1820
"ProjectMergeRequestResourceLabelEventManager",
1921
"ProjectMergeRequestResourceMilestoneEvent",
2022
"ProjectMergeRequestResourceMilestoneEventManager",
23+
"ProjectMergeRequestResourceStateEvent",
24+
"ProjectMergeRequestResourceStateEventManager",
2125
"UserEvent",
2226
"UserEventManager",
2327
]
@@ -74,6 +78,16 @@ class ProjectIssueResourceMilestoneEventManager(RetrieveMixin, RESTManager):
7478
_from_parent_attrs = {"project_id": "project_id", "issue_iid": "iid"}
7579

7680

81+
class ProjectIssueResourceStateEvent(RESTObject):
82+
pass
83+
84+
85+
class ProjectIssueResourceStateEventManager(RetrieveMixin, RESTManager):
86+
_path = "/projects/%(project_id)s/issues/%(issue_iid)s/resource_state_events"
87+
_obj_cls = ProjectIssueResourceStateEvent
88+
_from_parent_attrs = {"project_id": "project_id", "issue_iid": "iid"}
89+
90+
7791
class ProjectMergeRequestResourceLabelEvent(RESTObject):
7892
pass
7993

@@ -98,6 +112,16 @@ class ProjectMergeRequestResourceMilestoneEventManager(RetrieveMixin, RESTManage
98112
_from_parent_attrs = {"project_id": "project_id", "mr_iid": "iid"}
99113

100114

115+
class ProjectMergeRequestResourceStateEvent(RESTObject):
116+
pass
117+
118+
119+
class ProjectMergeRequestResourceStateEventManager(RetrieveMixin, RESTManager):
120+
_path = "/projects/%(project_id)s/merge_requests/%(mr_iid)s/resource_state_events"
121+
_obj_cls = ProjectMergeRequestResourceStateEvent
122+
_from_parent_attrs = {"project_id": "project_id", "mr_iid": "iid"}
123+
124+
101125
class UserEvent(Event):
102126
pass
103127

gitlab/v4/objects/issues.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from .events import (
2121
ProjectIssueResourceLabelEventManager,
2222
ProjectIssueResourceMilestoneEventManager,
23+
ProjectIssueResourceStateEventManager,
2324
)
2425
from .notes import ProjectIssueNoteManager
2526

@@ -110,6 +111,7 @@ class ProjectIssue(
110111
("notes", "ProjectIssueNoteManager"),
111112
("resourcelabelevents", "ProjectIssueResourceLabelEventManager"),
112113
("resourcemilestoneevents", "ProjectIssueResourceMilestoneEventManager"),
114+
("resourcestateevents", "ProjectIssueResourceStateEventManager"),
113115
)
114116

115117
@cli.register_custom_action("ProjectIssue", ("to_project_id",))

gitlab/v4/objects/merge_requests.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from .events import (
2525
ProjectMergeRequestResourceLabelEventManager,
2626
ProjectMergeRequestResourceMilestoneEventManager,
27+
ProjectMergeRequestResourceStateEventManager,
2728
)
2829

2930

@@ -121,6 +122,7 @@ class ProjectMergeRequest(
121122
("notes", "ProjectMergeRequestNoteManager"),
122123
("resourcelabelevents", "ProjectMergeRequestResourceLabelEventManager"),
123124
("resourcemilestoneevents", "ProjectMergeRequestResourceMilestoneEventManager"),
125+
("resourcestateevents", "ProjectMergeRequestResourceStateEventManager"),
124126
)
125127

126128
@cli.register_custom_action("ProjectMergeRequest")

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy