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

Commit5f46cfd

Browse files
udanejch
authored andcommitted
feat: Use requests AuthBase classes
1 parent3b83d5d commit5f46cfd

File tree

4 files changed

+86
-32
lines changed

4 files changed

+86
-32
lines changed

‎gitlab/_backends/__init__.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,21 @@
22
Defines http backends for processing http requests
33
"""
44

5-
from .requests_backendimportRequestsBackend,RequestsResponse
5+
from .requests_backendimport (
6+
JobTokenAuth,
7+
OAuthTokenAuth,
8+
PrivateTokenAuth,
9+
RequestsBackend,
10+
RequestsResponse,
11+
)
612

713
DefaultBackend=RequestsBackend
814
DefaultResponse=RequestsResponse
15+
16+
__all__= [
17+
"DefaultBackend",
18+
"DefaultResponse",
19+
"JobTokenAuth",
20+
"OAuthTokenAuth",
21+
"PrivateTokenAuth",
22+
]

‎gitlab/_backends/requests_backend.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,43 @@
44
fromtypingimportAny,Dict,Optional,TYPE_CHECKING,Union
55

66
importrequests
7+
fromrequestsimportPreparedRequest
8+
fromrequests.authimportAuthBase
79
fromrequests.structuresimportCaseInsensitiveDict
810
fromrequests_toolbelt.multipart.encoderimportMultipartEncoder# type: ignore
911

1012
from .importprotocol
1113

1214

15+
classTokenAuth:
16+
def__init__(self,token:str):
17+
self.token=token
18+
19+
20+
classOAuthTokenAuth(TokenAuth,AuthBase):
21+
def__call__(self,r:PreparedRequest)->PreparedRequest:
22+
r.headers["Authorization"]=f"Bearer{self.token}"
23+
r.headers.pop("PRIVATE-TOKEN",None)
24+
r.headers.pop("JOB-TOKEN",None)
25+
returnr
26+
27+
28+
classPrivateTokenAuth(TokenAuth,AuthBase):
29+
def__call__(self,r:PreparedRequest)->PreparedRequest:
30+
r.headers["PRIVATE-TOKEN"]=self.token
31+
r.headers.pop("JOB-TOKEN",None)
32+
r.headers.pop("Authorization",None)
33+
returnr
34+
35+
36+
classJobTokenAuth(TokenAuth,AuthBase):
37+
def__call__(self,r:PreparedRequest)->PreparedRequest:
38+
r.headers["JOB-TOKEN"]=self.token
39+
r.headers.pop("PRIVATE-TOKEN",None)
40+
r.headers.pop("Authorization",None)
41+
returnr
42+
43+
1344
@dataclasses.dataclass
1445
classSendData:
1546
content_type:str

‎gitlab/client.py

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -485,30 +485,24 @@ def _set_auth_info(self) -> None:
485485
notself.http_usernameandself.http_password
486486
):
487487
raiseValueError("Both http_username and http_password should be defined")
488-
ifself.oauth_tokenandself.http_username:
488+
iftokensandself.http_username:
489489
raiseValueError(
490-
"Only one ofoauth authentication or http "
490+
"Only one oftoken authentications or http "
491491
"authentication should be defined"
492492
)
493493

494-
self._http_auth=None
494+
self._auth:Optional[requests.auth.AuthBase]=None
495495
ifself.private_token:
496-
self.headers.pop("Authorization",None)
497-
self.headers["PRIVATE-TOKEN"]=self.private_token
498-
self.headers.pop("JOB-TOKEN",None)
496+
self._auth=_backends.PrivateTokenAuth(self.private_token)
499497

500498
ifself.oauth_token:
501-
self.headers["Authorization"]=f"Bearer{self.oauth_token}"
502-
self.headers.pop("PRIVATE-TOKEN",None)
503-
self.headers.pop("JOB-TOKEN",None)
499+
self._auth=_backends.OAuthTokenAuth(self.oauth_token)
504500

505501
ifself.job_token:
506-
self.headers.pop("Authorization",None)
507-
self.headers.pop("PRIVATE-TOKEN",None)
508-
self.headers["JOB-TOKEN"]=self.job_token
502+
self._auth=_backends.JobTokenAuth(self.job_token)
509503

510504
ifself.http_usernameandself.http_password:
511-
self._http_auth=requests.auth.HTTPBasicAuth(
505+
self._auth=requests.auth.HTTPBasicAuth(
512506
self.http_username,self.http_password
513507
)
514508

@@ -527,7 +521,7 @@ def enable_debug() -> None:
527521
def_get_session_opts(self)->Dict[str,Any]:
528522
return {
529523
"headers":self.headers.copy(),
530-
"auth":self._http_auth,
524+
"auth":self._auth,
531525
"timeout":self.timeout,
532526
"verify":self.ssl_verify,
533527
}

‎tests/unit/test_gitlab_auth.py

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
importpytest
22
importrequests
3+
fromrequestsimportPreparedRequest
34

45
fromgitlabimportGitlab
6+
fromgitlab._backendsimportJobTokenAuth,OAuthTokenAuth,PrivateTokenAuth
57
fromgitlab.configimportGitlabConfigParser
68

79

@@ -39,51 +41,64 @@ def test_invalid_auth_args():
3941

4042
deftest_private_token_auth():
4143
gl=Gitlab("http://localhost",private_token="private_token",api_version="4")
44+
p=PreparedRequest()
45+
p.prepare(url=gl.url,auth=gl._auth)
4246
assertgl.private_token=="private_token"
4347
assertgl.oauth_tokenisNone
4448
assertgl.job_tokenisNone
45-
assertgl._http_authisNone
46-
assert"Authorization"notingl.headers
47-
assertgl.headers["PRIVATE-TOKEN"]=="private_token"
48-
assert"JOB-TOKEN"notingl.headers
49+
assertisinstance(gl._auth,PrivateTokenAuth)
50+
assertgl._auth.token=="private_token"
51+
assertp.headers["PRIVATE-TOKEN"]=="private_token"
52+
assert"JOB-TOKEN"notinp.headers
53+
assert"Authorization"notinp.headers
4954

5055

5156
deftest_oauth_token_auth():
5257
gl=Gitlab("http://localhost",oauth_token="oauth_token",api_version="4")
58+
p=PreparedRequest()
59+
p.prepare(url=gl.url,auth=gl._auth)
5360
assertgl.private_tokenisNone
5461
assertgl.oauth_token=="oauth_token"
5562
assertgl.job_tokenisNone
56-
assertgl._http_authisNone
57-
assertgl.headers["Authorization"]=="Bearer oauth_token"
58-
assert"PRIVATE-TOKEN"notingl.headers
59-
assert"JOB-TOKEN"notingl.headers
63+
assertisinstance(gl._auth,OAuthTokenAuth)
64+
assertgl._auth.token=="oauth_token"
65+
assertp.headers["Authorization"]=="Bearer oauth_token"
66+
assert"PRIVATE-TOKEN"notinp.headers
67+
assert"JOB-TOKEN"notinp.headers
6068

6169

6270
deftest_job_token_auth():
6371
gl=Gitlab("http://localhost",job_token="CI_JOB_TOKEN",api_version="4")
72+
p=PreparedRequest()
73+
p.prepare(url=gl.url,auth=gl._auth)
6474
assertgl.private_tokenisNone
6575
assertgl.oauth_tokenisNone
6676
assertgl.job_token=="CI_JOB_TOKEN"
67-
assertgl._http_authisNone
68-
assert"Authorization"notingl.headers
69-
assert"PRIVATE-TOKEN"notingl.headers
70-
assertgl.headers["JOB-TOKEN"]=="CI_JOB_TOKEN"
77+
assertisinstance(gl._auth,JobTokenAuth)
78+
assertgl._auth.token=="CI_JOB_TOKEN"
79+
assertp.headers["JOB-TOKEN"]=="CI_JOB_TOKEN"
80+
assert"PRIVATE-TOKEN"notinp.headers
81+
assert"Authorization"notinp.headers
7182

7283

7384
deftest_http_auth():
7485
gl=Gitlab(
7586
"http://localhost",
76-
private_token="private_token",
7787
http_username="foo",
7888
http_password="bar",
7989
api_version="4",
8090
)
81-
assertgl.private_token=="private_token"
91+
p=PreparedRequest()
92+
p.prepare(url=gl.url,auth=gl._auth)
93+
assertgl.private_tokenisNone
8294
assertgl.oauth_tokenisNone
8395
assertgl.job_tokenisNone
84-
assertisinstance(gl._http_auth,requests.auth.HTTPBasicAuth)
85-
assertgl.headers["PRIVATE-TOKEN"]=="private_token"
86-
assert"Authorization"notingl.headers
96+
assertisinstance(gl._auth,requests.auth.HTTPBasicAuth)
97+
assertgl._auth.username=="foo"
98+
assertgl._auth.password=="bar"
99+
assertp.headers["Authorization"]=="Basic Zm9vOmJhcg=="
100+
assert"PRIVATE-TOKEN"notinp.headers
101+
assert"JOB-TOKEN"notinp.headers
87102

88103

89104
@pytest.mark.parametrize(

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp