Skip to content

Commit f731707

Browse files
nejchJohnVillalovos
authored andcommitted
feat(objects): support all issues statistics endpoints
1 parent 1b70580 commit f731707

File tree

6 files changed

+96
-29
lines changed

6 files changed

+96
-29
lines changed

docs/gl_objects/issues.rst

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,3 +225,51 @@ Link issue ``i1`` to issue ``i2``::
225225
Delete a link::
226226

227227
i1.links.delete(issue_link_id)
228+
229+
Issues statistics
230+
=========================
231+
232+
Reference
233+
---------
234+
235+
* v4 API:
236+
237+
+ :class:`gitlab.v4.objects.IssuesStatistics`
238+
+ :class:`gitlab.v4.objects.IssuesStatisticsManager`
239+
+ :attr:`gitlab.issuesstatistics`
240+
+ :class:`gitlab.v4.objects.GroupIssuesStatistics`
241+
+ :class:`gitlab.v4.objects.GroupIssuesStatisticsManager`
242+
+ :attr:`gitlab.v4.objects.Group.issuesstatistics`
243+
+ :class:`gitlab.v4.objects.ProjectIssuesStatistics`
244+
+ :class:`gitlab.v4.objects.ProjectIssuesStatisticsManager`
245+
+ :attr:`gitlab.v4.objects.Project.issuesstatistics`
246+
247+
248+
* GitLab API: https://docs.gitlab.com/ce/api/issues_statistics.htm
249+
250+
Examples
251+
---------
252+
253+
Get statistics of all issues the user has access to::
254+
255+
statistics = gl.issuesstatistics.get()
256+
257+
Get statistics of issues for the user with ``foobar`` in ``title`` and ``description``::
258+
259+
statistics = gl.issuesstatistics.get(search='foobar')
260+
261+
Get statistics of all issues in a group::
262+
263+
statistics = group.issuesstatistics.get()
264+
265+
Get statistics of issues in a group with ``foobar`` in ``title`` and ``description``::
266+
267+
statistics = group.issuesstatistics.get(search='foobar')
268+
269+
Get statistics of all issues in a project::
270+
271+
statistics = project.issuesstatistics.get()
272+
273+
Get statistics of issues in a project with ``foobar`` in ``title`` and ``description``::
274+
275+
statistics = project.issuesstatistics.get(search='foobar')

docs/gl_objects/projects.rst

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -768,29 +768,3 @@ Get all additional statistics of a project::
768768
Get total fetches in last 30 days of a project::
769769

770770
total_fetches = project.additionalstatistics.get().fetches['total']
771-
772-
Project issues statistics
773-
=========================
774-
775-
Reference
776-
---------
777-
778-
* v4 API:
779-
780-
+ :class:`gitlab.v4.objects.ProjectIssuesStatistics`
781-
+ :class:`gitlab.v4.objects.ProjectIssuesStatisticsManager`
782-
+ :attr:`gitlab.v4.objects.Project.issuesstatistics`
783-
784-
* GitLab API: https://docs.gitlab.com/ce/api/issues_statistics.html#get-project-issues-statistics
785-
786-
Examples
787-
---------
788-
789-
Get statistics of all issues in a project::
790-
791-
statistics = project.issuesstatistics.get()
792-
793-
Get statistics of issues in a project with ``foobar`` in ``title`` and
794-
``description``::
795-
796-
statistics = project.issuesstatistics.get(search='foobar')

gitlab/client.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ def __init__(
118118
self.groups = objects.GroupManager(self)
119119
self.hooks = objects.HookManager(self)
120120
self.issues = objects.IssueManager(self)
121+
self.issuesstatistics = objects.IssuesStatisticsManager(self)
121122
self.ldapgroups = objects.LDAPGroupManager(self)
122123
self.licenses = objects.LicenseManager(self)
123124
self.namespaces = objects.NamespaceManager(self)

gitlab/v4/objects/groups.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from .packages import GroupPackageManager # noqa: F401
2727
from .projects import GroupProjectManager # noqa: F401
2828
from .runners import GroupRunnerManager # noqa: F401
29+
from .statistics import GroupIssuesStatisticsManager # noqa: F401
2930
from .variables import GroupVariableManager # noqa: F401
3031

3132
__all__ = [
@@ -52,6 +53,7 @@ class Group(SaveMixin, ObjectDeleteMixin, RESTObject):
5253
("epics", "GroupEpicManager"),
5354
("imports", "GroupImportManager"),
5455
("issues", "GroupIssueManager"),
56+
("issuesstatistics", "GroupIssuesStatisticsManager"),
5557
("labels", "GroupLabelManager"),
5658
("members", "GroupMemberManager"),
5759
("members_all", "GroupMemberAllManager"),

gitlab/v4/objects/statistics.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@
22
from gitlab.mixins import GetWithoutIdMixin, RefreshMixin
33

44
__all__ = [
5+
"GroupIssuesStatistics",
6+
"GroupIssuesStatisticsManager",
57
"ProjectAdditionalStatistics",
68
"ProjectAdditionalStatisticsManager",
9+
"IssuesStatistics",
10+
"IssuesStatisticsManager",
711
"ProjectIssuesStatistics",
812
"ProjectIssuesStatisticsManager",
913
]
@@ -19,6 +23,25 @@ class ProjectAdditionalStatisticsManager(GetWithoutIdMixin, RESTManager):
1923
_from_parent_attrs = {"project_id": "id"}
2024

2125

26+
class IssuesStatistics(RefreshMixin, RESTObject):
27+
_id_attr = None
28+
29+
30+
class IssuesStatisticsManager(GetWithoutIdMixin, RESTManager):
31+
_path = "/issues_statistics"
32+
_obj_cls = IssuesStatistics
33+
34+
35+
class GroupIssuesStatistics(RefreshMixin, RESTObject):
36+
_id_attr = None
37+
38+
39+
class GroupIssuesStatisticsManager(GetWithoutIdMixin, RESTManager):
40+
_path = "/groups/%(group_id)s/issues_statistics"
41+
_obj_cls = GroupIssuesStatistics
42+
_from_parent_attrs = {"group_id": "id"}
43+
44+
2245
class ProjectIssuesStatistics(RefreshMixin, RESTObject):
2346
_id_attr = None
2447

tests/unit/objects/test_issues.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
"""
22
GitLab API: https://docs.gitlab.com/ce/api/issues.html
33
"""
4+
import re
45

56
import pytest
67
import responses
78

8-
from gitlab.v4.objects import ProjectIssuesStatistics
9+
from gitlab.v4.objects import (
10+
GroupIssuesStatistics,
11+
IssuesStatistics,
12+
ProjectIssuesStatistics,
13+
)
914

1015

1116
@pytest.fixture
@@ -43,7 +48,9 @@ def resp_issue_statistics():
4348
with responses.RequestsMock() as rsps:
4449
rsps.add(
4550
method=responses.GET,
46-
url="http://localhost/api/v4/projects/1/issues_statistics",
51+
url=re.compile(
52+
r"http://localhost/api/v4/((groups|projects)/1/)?issues_statistics"
53+
),
4754
json=content,
4855
content_type="application/json",
4956
status=200,
@@ -63,7 +70,19 @@ def test_get_issue(gl, resp_get_issue):
6370
assert issue.name == "name"
6471

6572

66-
def test_project_issues_statistics(project, resp_issue_statistics):
73+
def test_get_issues_statistics(gl, resp_issue_statistics):
74+
statistics = gl.issuesstatistics.get()
75+
assert isinstance(statistics, IssuesStatistics)
76+
assert statistics.statistics["counts"]["all"] == 20
77+
78+
79+
def test_get_group_issues_statistics(group, resp_issue_statistics):
80+
statistics = group.issuesstatistics.get()
81+
assert isinstance(statistics, GroupIssuesStatistics)
82+
assert statistics.statistics["counts"]["all"] == 20
83+
84+
85+
def test_get_project_issues_statistics(project, resp_issue_statistics):
6786
statistics = project.issuesstatistics.get()
6887
assert isinstance(statistics, ProjectIssuesStatistics)
6988
assert statistics.statistics["counts"]["all"] == 20

0 commit comments

Comments
 (0)