Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitc0f35d4

Browse files
committed
feat: add parameter for persist the base url
1 parent896938f commitc0f35d4

File tree

2 files changed

+62
-15
lines changed

2 files changed

+62
-15
lines changed

‎gitlab/client.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class Gitlab:
6666
user_agent: A custom user agent to use for making HTTP requests.
6767
retry_transient_errors: Whether to retry after 500, 502, 503, 504
6868
or 52x responses. Defaults to False.
69+
persist_base_url: reconstruct next url if found not same as user provided url
6970
"""
7071

7172
def__init__(
@@ -85,6 +86,7 @@ def __init__(
8586
order_by:Optional[str]=None,
8687
user_agent:str=gitlab.const.USER_AGENT,
8788
retry_transient_errors:bool=False,
89+
persist_base_url:bool=False,
8890
)->None:
8991

9092
self._api_version=str(api_version)
@@ -95,6 +97,7 @@ def __init__(
9597
#: Timeout to use for requests to gitlab server
9698
self.timeout=timeout
9799
self.retry_transient_errors=retry_transient_errors
100+
self.persist_base_url=persist_base_url
98101
#: Headers that will be used in request to GitLab
99102
self.headers= {"User-Agent":user_agent}
100103

@@ -1131,8 +1134,29 @@ def _query(
11311134
next_url=requests.utils.parse_header_links(result.headers["links"])[
11321135
0
11331136
]["url"]
1134-
ifnotnext_url.startswith(self._gl._base_url):
1135-
next_url=re.sub(r"^.*?/api",f"{self._gl._base_url}/api",next_url)
1137+
# if the next url is different with user provided server URL
1138+
# then give a warning it may because of misconfiguration
1139+
# but if the option to fix provided then just reconstruct it
1140+
ifnotnext_url.startswith(self._gl.url):
1141+
search_api_url=re.search(r"(^.*?/api)",next_url)
1142+
ifsearch_api_url:
1143+
next_api_url=search_api_url.group(1)
1144+
ifself._gl.persist_base_url:
1145+
next_url=next_url.replace(
1146+
next_api_url,f"{self._gl._base_url}/api"
1147+
)
1148+
else:
1149+
utils.warn(
1150+
message=(
1151+
f"The base url of the returned next page got "
1152+
f"different with the user provided "
1153+
f"{self._gl.url}/api* ~>{next_api_url}*, "
1154+
f"since this may can lead to unexpected behaviour. "
1155+
f"set argument persist_base_url to True for "
1156+
f"resonctruct it with the origin one."
1157+
),
1158+
category=UserWarning,
1159+
)
11361160
self._next_url=next_url
11371161
exceptKeyError:
11381162
self._next_url=None

‎tests/unit/test_gitlab.py

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,33 @@ def test_gitlab_plain_const_does_not_warn(recwarn):
356356

357357

358358
@responses.activate
359-
deftest_gitlab_keep_base_url(gl):
359+
@pytest.mark.parametrize(
360+
"kwargs,link_header,expected_next_url,show_warning",
361+
[
362+
# normal execution
363+
(
364+
{},
365+
"<http://localhost/api/v4/tests?per_page=1&page=2>;"' rel="next"',
366+
"http://localhost/api/v4/tests?per_page=1&page=2",
367+
False,
368+
),
369+
# got different url and will show the warning
370+
(
371+
{},
372+
"<http://orig_host/api/v4/tests?per_page=1&page=2>;"' rel="next"',
373+
"http://orig_host/api/v4/tests?per_page=1&page=2",
374+
True,
375+
),
376+
# persist the base url
377+
(
378+
{"persist_base_url":True},
379+
"<http://orig_host/api/v4/tests?per_page=1&page=2>;"' rel="next"',
380+
"http://localhost/api/v4/tests?per_page=1&page=2",
381+
False,
382+
),
383+
],
384+
)
385+
deftest_gitlab_persist_base_url(kwargs,link_header,expected_next_url,show_warning):
360386
responses.add(
361387
**{
362388
"method":responses.GET,
@@ -368,22 +394,19 @@ def test_gitlab_keep_base_url(gl):
368394
"X-Per-Page":"1",
369395
"X-Total-Pages":"2",
370396
"X-Total":"2",
371-
"Link": (
372-
"<http://orig_host/api/v4/tests?per_page=1&page=2>;"' rel="next"'
373-
),
397+
"Link": (link_header),
374398
},
375399
"content_type":"application/json",
376400
"status":200,
377401
"match":helpers.MATCH_EMPTY_QUERY_PARAMS,
378402
}
379403
)
380404

381-
obj=gl.http_list("/tests",iterator=True)
382-
assertlen(obj)==2
383-
assertobj._next_url=="http://localhost/api/v4/tests?per_page=1&page=2"
384-
assertobj.current_page==1
385-
assertobj.prev_pageisNone
386-
assertobj.next_page==2
387-
assertobj.per_page==1
388-
assertobj.total_pages==2
389-
assertobj.total==2
405+
gl=gitlab.Gitlab(url="http://localhost",**kwargs)
406+
ifshow_warning:
407+
withpytest.warns(UserWarning)aswarn_record:
408+
obj=gl.http_list("/tests",iterator=True)
409+
assertlen(warn_record)==1
410+
else:
411+
obj=gl.http_list("/tests",iterator=True)
412+
assertobj._next_url==expected_next_url

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp