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

Commit4f30ec5

Browse files
committed
feat: add parameter for persist the base url
1 parentdf50f0f commit4f30ec5

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

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