From 4d00c12723d565dc0a83670f62e3f5102650d822 Mon Sep 17 00:00:00 2001 From: Nejc Habjan Date: Sun, 7 Mar 2021 18:04:03 +0100 Subject: [PATCH 1/4] docs(api): add examples for resource state events --- docs/gl_objects/events.rst | 42 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/docs/gl_objects/events.rst b/docs/gl_objects/events.rst index 8071b00fb..5dc03c713 100644 --- a/docs/gl_objects/events.rst +++ b/docs/gl_objects/events.rst @@ -2,6 +2,9 @@ Events ###### +Events +====== + Reference --------- @@ -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) From 10225cf26095efe82713136ddde3330e7afc6d10 Mon Sep 17 00:00:00 2001 From: Nejc Habjan Date: Sun, 7 Mar 2021 18:05:23 +0100 Subject: [PATCH 2/4] test(objects): add tests for resource state events --- gitlab/tests/conftest.py | 10 ++ .../objects/test_resource_state_events.py | 105 ++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 gitlab/tests/objects/test_resource_state_events.py diff --git a/gitlab/tests/conftest.py b/gitlab/tests/conftest.py index fc8312f34..74fb858fa 100644 --- a/gitlab/tests/conftest.py +++ b/gitlab/tests/conftest.py @@ -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) diff --git a/gitlab/tests/objects/test_resource_state_events.py b/gitlab/tests/objects/test_resource_state_events.py new file mode 100644 index 000000000..01c18870f --- /dev/null +++ b/gitlab/tests/objects/test_resource_state_events.py @@ -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" From d4799c40bd12ed85d4bb834464fdb36c4dadcab6 Mon Sep 17 00:00:00 2001 From: Nejc Habjan Date: Sun, 7 Mar 2021 18:06:17 +0100 Subject: [PATCH 3/4] feat(objects): add support for resource state events API --- gitlab/v4/objects/events.py | 26 ++++++++++++++++++++++++++ gitlab/v4/objects/issues.py | 2 ++ gitlab/v4/objects/merge_requests.py | 2 ++ 3 files changed, 30 insertions(+) diff --git a/gitlab/v4/objects/events.py b/gitlab/v4/objects/events.py index d1c3cb4a9..af2f0aa74 100644 --- a/gitlab/v4/objects/events.py +++ b/gitlab/v4/objects/events.py @@ -14,10 +14,14 @@ "ProjectIssueResourceLabelEventManager", "ProjectIssueResourceMilestoneEvent", "ProjectIssueResourceMilestoneEventManager", + "ProjectIssueResourceStateEvent", + "ProjectIssueResourceStateEventManager", "ProjectMergeRequestResourceLabelEvent", "ProjectMergeRequestResourceLabelEventManager", "ProjectMergeRequestResourceMilestoneEvent", "ProjectMergeRequestResourceMilestoneEventManager", + "ProjectMergeRequestResourceStateEvent", + "ProjectMergeRequestResourceStateEventManager", "UserEvent", "UserEventManager", ] @@ -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 @@ -98,6 +112,18 @@ 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/%(issue_iid)s/resource_state_events" + ) + _obj_cls = ProjectMergeRequestResourceStateEvent + _from_parent_attrs = {"project_id": "project_id", "issue_iid": "iid"} + + class UserEvent(Event): pass diff --git a/gitlab/v4/objects/issues.py b/gitlab/v4/objects/issues.py index 4da7f910c..9d38d721d 100644 --- a/gitlab/v4/objects/issues.py +++ b/gitlab/v4/objects/issues.py @@ -20,6 +20,7 @@ from .events import ( ProjectIssueResourceLabelEventManager, ProjectIssueResourceMilestoneEventManager, + ProjectIssueResourceStateEventManager, ) from .notes import ProjectIssueNoteManager @@ -110,6 +111,7 @@ class ProjectIssue( ("notes", "ProjectIssueNoteManager"), ("resourcelabelevents", "ProjectIssueResourceLabelEventManager"), ("resourcemilestoneevents", "ProjectIssueResourceMilestoneEventManager"), + ("resourcestateevents", "ProjectIssueResourceStateEventManager"), ) @cli.register_custom_action("ProjectIssue", ("to_project_id",)) diff --git a/gitlab/v4/objects/merge_requests.py b/gitlab/v4/objects/merge_requests.py index f9b305a1a..938cb5a09 100644 --- a/gitlab/v4/objects/merge_requests.py +++ b/gitlab/v4/objects/merge_requests.py @@ -24,6 +24,7 @@ from .events import ( ProjectMergeRequestResourceLabelEventManager, ProjectMergeRequestResourceMilestoneEventManager, + ProjectMergeRequestResourceStateEventManager, ) @@ -121,6 +122,7 @@ class ProjectMergeRequest( ("notes", "ProjectMergeRequestNoteManager"), ("resourcelabelevents", "ProjectMergeRequestResourceLabelEventManager"), ("resourcemilestoneevents", "ProjectMergeRequestResourceMilestoneEventManager"), + ("resourcestateevents", "ProjectMergeRequestResourceStateEventManager"), ) @cli.register_custom_action("ProjectMergeRequest") From c5e6fb3bc74c509f35f973e291a7551b2b64dba5 Mon Sep 17 00:00:00 2001 From: Nejc Habjan Date: Mon, 8 Mar 2021 08:40:43 +0100 Subject: [PATCH 4/4] chore: fix typo in mr events --- gitlab/v4/objects/events.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/gitlab/v4/objects/events.py b/gitlab/v4/objects/events.py index af2f0aa74..bb76b81fa 100644 --- a/gitlab/v4/objects/events.py +++ b/gitlab/v4/objects/events.py @@ -117,11 +117,9 @@ class ProjectMergeRequestResourceStateEvent(RESTObject): class ProjectMergeRequestResourceStateEventManager(RetrieveMixin, RESTManager): - _path = ( - "/projects/%(project_id)s/merge_requests/%(issue_iid)s/resource_state_events" - ) + _path = "/projects/%(project_id)s/merge_requests/%(mr_iid)s/resource_state_events" _obj_cls = ProjectMergeRequestResourceStateEvent - _from_parent_attrs = {"project_id": "project_id", "issue_iid": "iid"} + _from_parent_attrs = {"project_id": "project_id", "mr_iid": "iid"} class UserEvent(Event):