Skip to content

Commit f6c94f5

Browse files
committed
Fixed _fetch_all_pages params and get_schedules is now multipaged.
1 parent a85b038 commit f6c94f5

2 files changed

Lines changed: 50 additions & 65 deletions

File tree

gitlab_api/gitlab_api.py

Lines changed: 36 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -157,12 +157,11 @@ def _fetch_next_page(
157157
return data.data if isinstance(data.data, list) else []
158158

159159
def _fetch_all_pages(
160-
self, endpoint: str, model: T, id_field: str, id_value: Any
160+
self, endpoint: str, model: T, id_field: str = None, id_value: Any = None
161161
) -> List[dict]:
162162
"""Generic method to fetch all pages with parallelization"""
163-
if getattr(model, id_field) is None:
163+
if id_field and getattr(model, id_field) is None:
164164
raise MissingParameterError
165-
166165
all_data = []
167166
headers_to_use = (
168167
self.headers_parallel if self.headers_parallel else [self.headers]
@@ -1289,7 +1288,10 @@ def get_groups(self, **kwargs) -> Union[Response, requests.Response]:
12891288
group = GroupModel(**kwargs)
12901289
try:
12911290
all_groups = self._fetch_all_pages(
1292-
"/groups", group, "group_id", group.group_id
1291+
endpoint="/groups",
1292+
model=group,
1293+
id_field="group_id",
1294+
id_value=group.group_id,
12931295
)
12941296
response = Response(data=all_groups, status_code=200)
12951297
return process_response(response=response)
@@ -1372,7 +1374,10 @@ def get_group_subgroups(self, **kwargs) -> Union[Response, requests.Response]:
13721374
group = GroupModel(**kwargs)
13731375
try:
13741376
all_subgroups = self._fetch_all_pages(
1375-
"/groups/{id}/subgroups", group, "group_id", group.group_id
1377+
endpoint="/groups/{id}/subgroups",
1378+
model=group,
1379+
id_field="group_id",
1380+
id_value=group.group_id,
13761381
)
13771382
return Response(data=all_subgroups, status_code=200)
13781383
except ValidationError as e:
@@ -1398,7 +1403,10 @@ def get_group_descendant_groups(
13981403
group = GroupModel(**kwargs)
13991404
try:
14001405
all_descendant_groups = self._fetch_all_pages(
1401-
"/groups/{id}/descendant_groups", group, "group_id", group.group_id
1406+
endpoint="/groups/{id}/descendant_groups",
1407+
model=group,
1408+
id_field="group_id",
1409+
id_value=group.group_id,
14021410
)
14031411
return Response(data=all_descendant_groups, status_code=200)
14041412
except ValidationError as e:
@@ -1422,7 +1430,10 @@ def get_group_projects(self, **kwargs) -> Union[Response, requests.Response]:
14221430
group = GroupModel(**kwargs)
14231431
try:
14241432
all_projects = self._fetch_all_pages(
1425-
"/groups/{id}/projects", group, "group_id", group.group_id
1433+
endpoint="/groups/{id}/projects",
1434+
model=group,
1435+
id_field="group_id",
1436+
id_value=group.group_id,
14261437
)
14271438
return Response(data=all_projects, status_code=200)
14281439
except ValidationError as e:
@@ -1434,7 +1445,10 @@ def get_group_merge_requests(self, **kwargs) -> Union[Response, requests.Respons
14341445
group = GroupModel(**kwargs)
14351446
try:
14361447
all_merge_requests = self._fetch_all_pages(
1437-
"/groups/{id}/merge_requests", group, "group_id", group.group_id
1448+
endpoint="/groups/{id}/merge_requests",
1449+
model=group,
1450+
id_field="group_id",
1451+
id_value=group.group_id,
14381452
)
14391453
return Response(data=all_merge_requests, status_code=200)
14401454
except ValidationError as e:
@@ -1838,7 +1852,7 @@ def get_merge_requests(self, **kwargs) -> Union[Response, requests.Response]:
18381852
merge_request = MergeRequestModel(**kwargs)
18391853
try:
18401854
all_merge_requests = self._fetch_all_pages(
1841-
"/merge_requests", merge_request, "group_id", merge_request.group_id
1855+
endpoint="/merge_requests", model=merge_request
18421856
)
18431857
response = Response(data=all_merge_requests, status_code=200)
18441858
return process_response(response=response)
@@ -2586,14 +2600,16 @@ def get_pipeline_schedules(self, **kwargs) -> Union[Response, requests.Response]
25862600
project = ProjectModel(**kwargs)
25872601
if project.project_id is None:
25882602
raise MissingParameterError
2589-
response = self._session.get(
2590-
url=f"{self.url}/projects/{project.project_id}/pipeline_schedules",
2591-
headers=self.headers,
2592-
verify=self.verify,
2593-
proxies=self.proxies,
2594-
)
2595-
response = process_response(response=response)
2596-
return response
2603+
try:
2604+
all_projects = self._fetch_all_pages(
2605+
endpoint="/projects/{id}/pipeline_schedules",
2606+
model=project,
2607+
id_field="project_id",
2608+
id_value=project.project_id,
2609+
)
2610+
return Response(data=all_projects, status_code=200)
2611+
except ValidationError as e:
2612+
raise ParameterError(f"Invalid parameters: {e.errors()}")
25972613

25982614
@require_auth
25992615
def get_pipeline_schedule(self, **kwargs) -> Union[Response, requests.Response]:
@@ -2750,56 +2766,11 @@ def get_projects(self, **kwargs) -> Union[Response, requests.Response]:
27502766
- ParameterError: If invalid parameters are provided.
27512767
"""
27522768
project = ProjectModel(**kwargs)
2753-
all_projects = []
2754-
if project.project_id is None:
2755-
raise MissingParameterError
27562769
try:
2757-
if project.project_id is None:
2758-
raise MissingParameterError
2759-
total_pages_response = self._session.get(
2760-
url=f"{self.url}" f"/projects/{project.project_id}/projects",
2761-
params=project.api_parameters,
2762-
headers=self.headers,
2763-
verify=self.verify,
2764-
proxies=self.proxies,
2765-
)
2766-
total_pages = int(total_pages_response.headers.get("X-Total-Pages"))
2767-
projects = Response(data=total_pages_response.json(), status_code=200)
2768-
if (
2769-
isinstance(projects.data, list)
2770-
and projects.data
2771-
and len(projects.data) > 0
2772-
):
2773-
all_projects = all_projects + projects.data
2774-
if (
2775-
not project.max_pages
2776-
or project.max_pages == 0
2777-
or project.max_pages > total_pages
2778-
):
2779-
project.max_pages = total_pages
2780-
for page in range(
2781-
1, project.max_pages
2782-
): # Start index at 1 because we get the first one from getting total_pages
2783-
project.page = page
2784-
project.model_post_init(project)
2785-
projects_response = self._session.get(
2786-
url=f"{self.url}/projects/{project.project_id}/projects",
2787-
params=project.api_parameters,
2788-
headers=self.headers,
2789-
verify=self.verify,
2790-
proxies=self.proxies,
2791-
)
2792-
projects = Response(data=projects_response.json(), status_code=200)
2793-
if (
2794-
isinstance(projects.data, list)
2795-
and projects.data
2796-
and len(projects.data) > 0
2797-
):
2798-
all_projects = all_projects + projects.data
2799-
response = Response(data=all_projects, status_code=200)
2770+
all_projects = self._fetch_all_pages(endpoint="/projects", model=project)
2771+
return Response(data=all_projects, status_code=200)
28002772
except ValidationError as e:
28012773
raise ParameterError(f"Invalid parameters: {e.errors()}")
2802-
return response
28032774

28042775
@require_auth
28052776
def get_project(self, **kwargs) -> Union[Response, requests.Response]:
@@ -2866,7 +2837,7 @@ def get_nested_projects_by_group(
28662837
for group in all_groups:
28672838
endpoint = f"/groups/{group.id}/projects"
28682839
group_projects = self._fetch_all_pages(
2869-
endpoint, project, "group_id", group.id
2840+
endpoint=endpoint, model=project, id_field="group_id", id_value=group.id
28702841
)
28712842
all_projects.extend(group_projects)
28722843

test/test_gitlab_api.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,18 @@ def test_get_nested_projects():
4242
assert isinstance(projects.data, list)
4343

4444

45+
@pytest.mark.skipif(
46+
sys.platform in ["darwin"] or skip,
47+
reason=reason,
48+
)
49+
def test_get_projects():
50+
# Get nested projects
51+
group_id = 6
52+
projects = client.get_projects(group_id=group_id, per_page=3)
53+
assert len(projects.data) > 0
54+
assert isinstance(projects.data, list)
55+
56+
4557
@pytest.mark.skipif(
4658
sys.platform in ["darwin"] or skip,
4759
reason=reason,
@@ -181,6 +193,8 @@ def test_get_project_pipeline_schedules():
181193

182194

183195
if __name__ == "__main__":
196+
test_get_projects()
197+
test_get_project_pipeline_schedules()
184198
test_get_nested_projects()
185199
test_create_branch()
186200
test_create_project_rule()

0 commit comments

Comments
 (0)