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

Commit59d6a88

Browse files
nejchJohnVillalovos
authored andcommitted
feat(api): add support for job token scope settings
1 parent7073a2d commit59d6a88

File tree

7 files changed

+151
-0
lines changed

7 files changed

+151
-0
lines changed

‎docs/api-objects.rst‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ API examples
2929
gl_objects/invitations
3030
gl_objects/issues
3131
gl_objects/iterations
32+
gl_objects/job_token_scope
3233
gl_objects/keys
3334
gl_objects/boards
3435
gl_objects/labels
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#####################
2+
CI/CD job token scope
3+
#####################
4+
5+
Reference
6+
---------
7+
8+
* v4 API:
9+
10+
+:class:`gitlab.v4.objects.ProjectJobTokenScope`
11+
+:class:`gitlab.v4.objects.ProjectJobTokenScopeManager`
12+
+:attr:`gitlab.v4.objects.Project.job_token_scope`
13+
14+
* GitLab API: https://docs.gitlab.com/ee/api/project_job_token_scopes.html
15+
16+
Examples
17+
--------
18+
19+
..warning::
20+
21+
The GitLab API does **not** return any data when saving or updating
22+
the job token scope settings. You need to call ``refresh()`` (or ``get()``
23+
a new object) as shown below to get the latest state.
24+
25+
Get a project's CI/CD job token access settings::
26+
27+
scope = project.job_token_scope.get()
28+
print(scope.inbound_enabled)
29+
# True
30+
31+
Update the job token scope settings::
32+
33+
scope.enabled = False
34+
scope.save()
35+
36+
..warning::
37+
38+
As you can see above, the attributes you receive from and send to the GitLab API
39+
are not consistent. GitLab returns `inbound_enabled` and `outbound_enabled`,
40+
but expects `enabled`, which only refers to the inbound scope. This is important
41+
when accessing and updating these attributes.
42+
43+
Or update the job token scope settings directly::
44+
45+
project.job_token_scope.update(new_data={"enabled": True})
46+
47+
Refresh the current state of job token scope::
48+
49+
scope.refresh()
50+
print(scope.inbound_enabled)
51+
# False

‎gitlab/mixins.py‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ def create(
309309
classUpdateMethod(enum.IntEnum):
310310
PUT=1
311311
POST=2
312+
PATCH=3
312313

313314

314315
classUpdateMixin(_RestManagerBase):
@@ -331,6 +332,9 @@ def _get_update_method(
331332
"""
332333
ifself._update_methodisUpdateMethod.POST:
333334
http_method=self.gitlab.http_post
335+
elifself._update_methodisUpdateMethod.PATCH:
336+
# only patch uses required kwargs, so our types are a bit misaligned
337+
http_method=self.gitlab.http_patch# type: ignore[assignment]
334338
else:
335339
http_method=self.gitlab.http_put
336340
returnhttp_method

‎gitlab/v4/objects/__init__.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
from .invitationsimport*
3333
from .issuesimport*
3434
from .iterationsimport*
35+
from .job_token_scopeimport*
3536
from .jobsimport*
3637
from .keysimport*
3738
from .labelsimport*
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
fromtypingimportAny,cast
2+
3+
fromgitlab.baseimportRESTManager,RESTObject
4+
fromgitlab.mixinsimport (
5+
GetWithoutIdMixin,
6+
RefreshMixin,
7+
SaveMixin,
8+
UpdateMethod,
9+
UpdateMixin,
10+
)
11+
12+
__all__= [
13+
"ProjectJobTokenScope",
14+
"ProjectJobTokenScopeManager",
15+
]
16+
17+
18+
classProjectJobTokenScope(RefreshMixin,SaveMixin,RESTObject):
19+
_id_attr=None
20+
21+
22+
classProjectJobTokenScopeManager(GetWithoutIdMixin,UpdateMixin,RESTManager):
23+
_path="/projects/{project_id}/job_token_scope"
24+
_obj_cls=ProjectJobTokenScope
25+
_from_parent_attrs= {"project_id":"id"}
26+
_update_method=UpdateMethod.PATCH
27+
28+
defget(self,**kwargs:Any)->ProjectJobTokenScope:
29+
returncast(ProjectJobTokenScope,super().get(**kwargs))

‎gitlab/v4/objects/projects.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
from .invitationsimportProjectInvitationManager# noqa: F401
6060
from .issuesimportProjectIssueManager# noqa: F401
6161
from .iterationsimportProjectIterationManager# noqa: F401
62+
from .job_token_scopeimportProjectJobTokenScopeManager# noqa: F401
6263
from .jobsimportProjectJobManager# noqa: F401
6364
from .labelsimportProjectLabelManager# noqa: F401
6465
from .membersimportProjectMemberAllManager,ProjectMemberManager# noqa: F401
@@ -191,6 +192,7 @@ class Project(RefreshMixin, SaveMixin, ObjectDeleteMixin, RepositoryMixin, RESTO
191192
issues_statistics:ProjectIssuesStatisticsManager
192193
iterations:ProjectIterationManager
193194
jobs:ProjectJobManager
195+
job_token_scope:ProjectJobTokenScopeManager
194196
keys:ProjectKeyManager
195197
labels:ProjectLabelManager
196198
members:ProjectMemberManager
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
"""
2+
GitLab API: https://docs.gitlab.com/ee/api/project_job_token_scopes.html
3+
"""
4+
5+
importpytest
6+
importresponses
7+
8+
fromgitlab.v4.objectsimportProjectJobTokenScope
9+
10+
job_token_scope_content= {
11+
"inbound_enabled":True,
12+
"outbound_enabled":False,
13+
}
14+
15+
16+
@pytest.fixture
17+
defresp_get_job_token_scope():
18+
withresponses.RequestsMock(assert_all_requests_are_fired=False)asrsps:
19+
rsps.add(
20+
method=responses.GET,
21+
url="http://localhost/api/v4/projects/1/job_token_scope",
22+
json=job_token_scope_content,
23+
content_type="application/json",
24+
status=200,
25+
)
26+
yieldrsps
27+
28+
29+
@pytest.fixture
30+
defresp_patch_job_token_scope():
31+
withresponses.RequestsMock(assert_all_requests_are_fired=False)asrsps:
32+
rsps.add(
33+
method=responses.PATCH,
34+
url="http://localhost/api/v4/projects/1/job_token_scope",
35+
status=204,
36+
match=[responses.matchers.json_params_matcher({"enabled":False})],
37+
)
38+
yieldrsps
39+
40+
41+
@pytest.fixture
42+
defjob_token_scope(project,resp_get_job_token_scope):
43+
returnproject.job_token_scope.get()
44+
45+
46+
deftest_get_job_token_scope(project,resp_get_job_token_scope):
47+
scope=project.job_token_scope.get()
48+
assertisinstance(scope,ProjectJobTokenScope)
49+
assertscope.inbound_enabledisTrue
50+
51+
52+
deftest_refresh_job_token_scope(job_token_scope,resp_get_job_token_scope):
53+
job_token_scope.refresh()
54+
assertjob_token_scope.inbound_enabledisTrue
55+
56+
57+
deftest_save_job_token_scope(job_token_scope,resp_patch_job_token_scope):
58+
job_token_scope.enabled=False
59+
job_token_scope.save()
60+
61+
62+
deftest_update_job_token_scope(project,resp_patch_job_token_scope):
63+
project.job_token_scope.update(new_data={"enabled":False})

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp