Skip to content

feat: add support for resource state events API #1364

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Apr 18, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions docs/gl_objects/events.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
Events
######

Events
======

Reference
---------

Expand Down Expand Up @@ -39,3 +42,42 @@ List the issue events on a project::
List the user events::

events = project.events.list()

Resource state events
=====================

Reference
---------

* v4 API:

+ :class:`gitlab.v4.objects.ProjectIssueResourceStateEvent`
+ :class:`gitlab.v4.objects.ProjectIssueResourceStateEventManager`
+ :attr:`gitlab.v4.objects.ProjectIssue.resourcestateevents`
+ :class:`gitlab.v4.objects.ProjectMergeRequestResourceStateEvent`
+ :class:`gitlab.v4.objects.ProjectMergeRequestResourceStateEventManager`
+ :attr:`gitlab.v4.objects.ProjectMergeRequest.resourcestateevents`

* GitLab API: https://docs.gitlab.com/ee/api/resource_state_events.html

Examples
--------

You can list and get specific resource state events (via their id) for project issues
and project merge requests.

List the state events of a project issue (paginated)::

state_events = issue.resourcestateevents.list()

Get a specific state event of a project issue by its id::

state_event = issue.resourcestateevents.get(1)

List the state events of a project merge request (paginated)::

state_events = mr.resourcestateevents.list()

Get a specific state event of a project merge request by its id::

state_event = mr.resourcestateevents.get(1)
10 changes: 10 additions & 0 deletions gitlab/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,16 @@ def project(gl):
return gl.projects.get(1, lazy=True)


@pytest.fixture
def project_issue(project):
return project.issues.get(1, lazy=True)


@pytest.fixture
def project_merge_request(project):
return project.mergerequests.get(1, lazy=True)


@pytest.fixture
def release(project, tag_name):
return project.releases.get(tag_name, lazy=True)
Expand Down
105 changes: 105 additions & 0 deletions gitlab/tests/objects/test_resource_state_events.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
"""
GitLab API: https://docs.gitlab.com/ee/api/resource_state_events.html
"""

import pytest
import responses

from gitlab.v4.objects import (
ProjectIssueResourceStateEvent,
ProjectMergeRequestResourceStateEvent,
)


issue_event_content = {"id": 1, "resource_type": "Issue"}
mr_event_content = {"id": 1, "resource_type": "MergeRequest"}


@pytest.fixture()
def resp_list_project_issue_state_events():
with responses.RequestsMock() as rsps:
rsps.add(
method=responses.GET,
url="http://localhost/api/v4/projects/1/issues/1/resource_state_events",
json=[issue_event_content],
content_type="application/json",
status=200,
)
yield rsps


@pytest.fixture()
def resp_get_project_issue_state_event():
with responses.RequestsMock() as rsps:
rsps.add(
method=responses.GET,
url="http://localhost/api/v4/projects/1/issues/1/resource_state_events/1",
json=issue_event_content,
content_type="application/json",
status=200,
)
yield rsps


@pytest.fixture()
def resp_list_merge_request_state_events():
with responses.RequestsMock() as rsps:
rsps.add(
method=responses.GET,
url="http://localhost/api/v4/projects/1/merge_requests/1/resource_state_events",
json=[mr_event_content],
content_type="application/json",
status=200,
)
yield rsps


@pytest.fixture()
def resp_get_merge_request_state_event():
with responses.RequestsMock() as rsps:
rsps.add(
method=responses.GET,
url="http://localhost/api/v4/projects/1/merge_requests/1/resource_state_events/1",
json=mr_event_content,
content_type="application/json",
status=200,
)
yield rsps


def test_list_project_issue_state_events(
project_issue, resp_list_project_issue_state_events
):
state_events = project_issue.resourcestateevents.list()
assert isinstance(state_events, list)

state_event = state_events[0]
assert isinstance(state_event, ProjectIssueResourceStateEvent)
assert state_event.resource_type == "Issue"


def test_get_project_issue_state_event(
project_issue, resp_get_project_issue_state_event
):
state_event = project_issue.resourcestateevents.get(1)
assert isinstance(state_event, ProjectIssueResourceStateEvent)
assert state_event.resource_type == "Issue"


def test_list_merge_request_state_events(
project_merge_request, resp_list_merge_request_state_events
):
state_events = project_merge_request.resourcestateevents.list()
assert isinstance(state_events, list)

state_event = state_events[0]
assert isinstance(state_event, ProjectMergeRequestResourceStateEvent)
assert state_event.resource_type == "MergeRequest"


def test_get_merge_request_state_event(
project_merge_request, resp_get_merge_request_state_event
):
state_event = project_merge_request.resourcestateevents.get(1)
assert isinstance(state_event, ProjectMergeRequestResourceStateEvent)
assert state_event.resource_type == "MergeRequest"
24 changes: 24 additions & 0 deletions gitlab/v4/objects/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,14 @@
"ProjectIssueResourceLabelEventManager",
"ProjectIssueResourceMilestoneEvent",
"ProjectIssueResourceMilestoneEventManager",
"ProjectIssueResourceStateEvent",
"ProjectIssueResourceStateEventManager",
"ProjectMergeRequestResourceLabelEvent",
"ProjectMergeRequestResourceLabelEventManager",
"ProjectMergeRequestResourceMilestoneEvent",
"ProjectMergeRequestResourceMilestoneEventManager",
"ProjectMergeRequestResourceStateEvent",
"ProjectMergeRequestResourceStateEventManager",
"UserEvent",
"UserEventManager",
]
Expand Down Expand Up @@ -74,6 +78,16 @@ class ProjectIssueResourceMilestoneEventManager(RetrieveMixin, RESTManager):
_from_parent_attrs = {"project_id": "project_id", "issue_iid": "iid"}


class ProjectIssueResourceStateEvent(RESTObject):
pass


class ProjectIssueResourceStateEventManager(RetrieveMixin, RESTManager):
_path = "/projects/%(project_id)s/issues/%(issue_iid)s/resource_state_events"
_obj_cls = ProjectIssueResourceStateEvent
_from_parent_attrs = {"project_id": "project_id", "issue_iid": "iid"}


class ProjectMergeRequestResourceLabelEvent(RESTObject):
pass

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


class ProjectMergeRequestResourceStateEvent(RESTObject):
pass


class ProjectMergeRequestResourceStateEventManager(RetrieveMixin, RESTManager):
_path = "/projects/%(project_id)s/merge_requests/%(mr_iid)s/resource_state_events"
_obj_cls = ProjectMergeRequestResourceStateEvent
_from_parent_attrs = {"project_id": "project_id", "mr_iid": "iid"}


class UserEvent(Event):
pass

Expand Down
2 changes: 2 additions & 0 deletions gitlab/v4/objects/issues.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from .events import (
ProjectIssueResourceLabelEventManager,
ProjectIssueResourceMilestoneEventManager,
ProjectIssueResourceStateEventManager,
)
from .notes import ProjectIssueNoteManager

Expand Down Expand Up @@ -110,6 +111,7 @@ class ProjectIssue(
("notes", "ProjectIssueNoteManager"),
("resourcelabelevents", "ProjectIssueResourceLabelEventManager"),
("resourcemilestoneevents", "ProjectIssueResourceMilestoneEventManager"),
("resourcestateevents", "ProjectIssueResourceStateEventManager"),
)

@cli.register_custom_action("ProjectIssue", ("to_project_id",))
Expand Down
2 changes: 2 additions & 0 deletions gitlab/v4/objects/merge_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from .events import (
ProjectMergeRequestResourceLabelEventManager,
ProjectMergeRequestResourceMilestoneEventManager,
ProjectMergeRequestResourceStateEventManager,
)


Expand Down Expand Up @@ -121,6 +122,7 @@ class ProjectMergeRequest(
("notes", "ProjectMergeRequestNoteManager"),
("resourcelabelevents", "ProjectMergeRequestResourceLabelEventManager"),
("resourcemilestoneevents", "ProjectMergeRequestResourceMilestoneEventManager"),
("resourcestateevents", "ProjectMergeRequestResourceStateEventManager"),
)

@cli.register_custom_action("ProjectMergeRequest")
Expand Down