python-gitlab 8.2.0__py3-none-any.whl → 8.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
gitlab/_version.py CHANGED
@@ -3,4 +3,4 @@ __copyright__ = "Copyright 2013-2019 Gauvain Pocentek, 2019-2023 python-gitlab t
3
3
  __email__ = "gauvainpocentek@gmail.com"
4
4
  __license__ = "LGPL3"
5
5
  __title__ = "python-gitlab"
6
- __version__ = "8.2.0"
6
+ __version__ = "8.3.0"
gitlab/client.py CHANGED
@@ -211,6 +211,8 @@ class Gitlab:
211
211
  """See :class:`~gitlab.v4.objects.PersonalAccessTokenManager`"""
212
212
  self.topics = objects.TopicManager(self)
213
213
  """See :class:`~gitlab.v4.objects.TopicManager`"""
214
+ self.service_accounts = objects.ServiceAccountManager(self)
215
+ """See :class:`~gitlab.v4.objects.ServiceAccountManager`"""
214
216
  self.statistics = objects.ApplicationStatisticsManager(self)
215
217
  """See :class:`~gitlab.v4.objects.ApplicationStatisticsManager`"""
216
218
 
gitlab/mixins.py CHANGED
@@ -619,6 +619,8 @@ class RotateMixin(base.RESTManager[base.TObjCls]):
619
619
  "PersonalAccessTokenManager",
620
620
  "GroupAccessTokenManager",
621
621
  "ProjectAccessTokenManager",
622
+ "GroupServiceAccountAccessTokenManager",
623
+ "ProjectServiceAccountAccessTokenManager",
622
624
  ),
623
625
  optional=("expires_at",),
624
626
  )
@@ -656,7 +658,13 @@ class ObjectRotateMixin(_RestObjectBase):
656
658
  manager: base.RESTManager[Any]
657
659
 
658
660
  @cli.register_custom_action(
659
- cls_names=("PersonalAccessToken", "GroupAccessToken", "ProjectAccessToken"),
661
+ cls_names=(
662
+ "PersonalAccessToken",
663
+ "GroupAccessToken",
664
+ "ProjectAccessToken",
665
+ "GroupServiceAccountAccessToken",
666
+ "ProjectServiceAccountAccessToken",
667
+ ),
660
668
  optional=("expires_at",),
661
669
  )
662
670
  @exc.on_http_error(exc.GitlabRotateError)
@@ -91,6 +91,7 @@ from .repositories import RepositoryMixin
91
91
  from .resource_groups import ProjectResourceGroupManager
92
92
  from .runners import ProjectRunnerManager # noqa: F401
93
93
  from .secure_files import ProjectSecureFileManager # noqa: F401
94
+ from .service_accounts import ProjectServiceAccountManager # noqa: F401
94
95
  from .snippets import ProjectSnippetManager # noqa: F401
95
96
  from .statistics import ( # noqa: F401
96
97
  ProjectAdditionalStatisticsManager,
@@ -251,6 +252,7 @@ class Project(
251
252
  repositories: ProjectRegistryRepositoryManager
252
253
  runners: ProjectRunnerManager
253
254
  secure_files: ProjectSecureFileManager
255
+ service_accounts: ProjectServiceAccountManager
254
256
  services: ProjectServiceManager
255
257
  snippets: ProjectSnippetManager
256
258
  external_status_checks: ProjectExternalStatusCheckManager
@@ -1,20 +1,155 @@
1
+ """
2
+ GitLab API: https://docs.gitlab.com/api/service_accounts/
3
+ """
4
+
1
5
  from gitlab.base import RESTObject
2
- from gitlab.mixins import CreateMixin, DeleteMixin, ListMixin, ObjectDeleteMixin
3
- from gitlab.types import RequiredOptional
6
+ from gitlab.mixins import (
7
+ CreateMixin,
8
+ DeleteMixin,
9
+ ListMixin,
10
+ ObjectDeleteMixin,
11
+ ObjectRotateMixin,
12
+ RotateMixin,
13
+ SaveMixin,
14
+ UpdateMethod,
15
+ UpdateMixin,
16
+ )
17
+ from gitlab.types import ArrayAttribute, RequiredOptional
18
+
19
+ __all__ = [
20
+ "ServiceAccount",
21
+ "ServiceAccountManager",
22
+ "GroupServiceAccount",
23
+ "GroupServiceAccountManager",
24
+ "GroupServiceAccountAccessToken",
25
+ "GroupServiceAccountAccessTokenManager",
26
+ "ProjectServiceAccount",
27
+ "ProjectServiceAccountManager",
28
+ "ProjectServiceAccountAccessToken",
29
+ "ProjectServiceAccountAccessTokenManager",
30
+ ]
31
+
32
+ _SA_ACCOUNT_ATTRS = RequiredOptional(optional=("name", "username", "email"))
33
+
34
+ _SA_TOKEN_CREATE_ATTRS = RequiredOptional(
35
+ required=("name", "scopes"), optional=("description", "expires_at")
36
+ )
37
+
38
+ _SA_TOKEN_LIST_FILTERS = (
39
+ "created_after",
40
+ "created_before",
41
+ "expires_after",
42
+ "expires_before",
43
+ "last_used_after",
44
+ "last_used_before",
45
+ "revoked",
46
+ "search",
47
+ "sort",
48
+ "state",
49
+ )
4
50
 
5
- __all__ = ["GroupServiceAccount", "GroupServiceAccountManager"]
6
51
 
52
+ # ---------------------------------------------------------------------------
53
+ # Instance-level service accounts
54
+ # ---------------------------------------------------------------------------
7
55
 
8
- class GroupServiceAccount(ObjectDeleteMixin, RESTObject):
56
+
57
+ class ServiceAccount(SaveMixin, RESTObject):
9
58
  pass
10
59
 
11
60
 
61
+ class ServiceAccountManager(
62
+ CreateMixin[ServiceAccount], ListMixin[ServiceAccount], UpdateMixin[ServiceAccount]
63
+ ):
64
+ _path = "/service_accounts"
65
+ _obj_cls = ServiceAccount
66
+ _create_attrs = _SA_ACCOUNT_ATTRS
67
+ _update_attrs = _SA_ACCOUNT_ATTRS
68
+ _update_method = UpdateMethod.PATCH
69
+ _list_filters = ("order_by", "sort")
70
+
71
+
72
+ # ---------------------------------------------------------------------------
73
+ # Group-level service accounts
74
+ # ---------------------------------------------------------------------------
75
+
76
+
77
+ class GroupServiceAccountAccessToken(ObjectDeleteMixin, ObjectRotateMixin, RESTObject):
78
+ pass
79
+
80
+
81
+ class GroupServiceAccountAccessTokenManager(
82
+ CreateMixin[GroupServiceAccountAccessToken],
83
+ DeleteMixin[GroupServiceAccountAccessToken],
84
+ ListMixin[GroupServiceAccountAccessToken],
85
+ RotateMixin[GroupServiceAccountAccessToken],
86
+ ):
87
+ _path = "/groups/{group_id}/service_accounts/{user_id}/personal_access_tokens"
88
+ _obj_cls = GroupServiceAccountAccessToken
89
+ _from_parent_attrs = {"group_id": "group_id", "user_id": "id"}
90
+ _create_attrs = _SA_TOKEN_CREATE_ATTRS
91
+ _types = {"scopes": ArrayAttribute}
92
+ _list_filters = _SA_TOKEN_LIST_FILTERS
93
+
94
+
95
+ class GroupServiceAccount(SaveMixin, ObjectDeleteMixin, RESTObject):
96
+ access_tokens: GroupServiceAccountAccessTokenManager
97
+
98
+
12
99
  class GroupServiceAccountManager(
13
100
  CreateMixin[GroupServiceAccount],
14
101
  DeleteMixin[GroupServiceAccount],
15
102
  ListMixin[GroupServiceAccount],
103
+ UpdateMixin[GroupServiceAccount],
16
104
  ):
17
105
  _path = "/groups/{group_id}/service_accounts"
18
106
  _obj_cls = GroupServiceAccount
19
107
  _from_parent_attrs = {"group_id": "id"}
20
- _create_attrs = RequiredOptional(optional=("name", "username"))
108
+ _create_attrs = _SA_ACCOUNT_ATTRS
109
+ _update_attrs = _SA_ACCOUNT_ATTRS
110
+ _update_method = UpdateMethod.PATCH
111
+ _list_filters = ("order_by", "sort")
112
+
113
+
114
+ # ---------------------------------------------------------------------------
115
+ # Project-level service accounts
116
+ # ---------------------------------------------------------------------------
117
+
118
+
119
+ class ProjectServiceAccountAccessToken(
120
+ ObjectDeleteMixin, ObjectRotateMixin, RESTObject
121
+ ):
122
+ pass
123
+
124
+
125
+ class ProjectServiceAccountAccessTokenManager(
126
+ CreateMixin[ProjectServiceAccountAccessToken],
127
+ DeleteMixin[ProjectServiceAccountAccessToken],
128
+ ListMixin[ProjectServiceAccountAccessToken],
129
+ RotateMixin[ProjectServiceAccountAccessToken],
130
+ ):
131
+ _path = "/projects/{project_id}/service_accounts/{user_id}/personal_access_tokens"
132
+ _obj_cls = ProjectServiceAccountAccessToken
133
+ _from_parent_attrs = {"project_id": "project_id", "user_id": "id"}
134
+ _create_attrs = _SA_TOKEN_CREATE_ATTRS
135
+ _types = {"scopes": ArrayAttribute}
136
+ _list_filters = _SA_TOKEN_LIST_FILTERS
137
+
138
+
139
+ class ProjectServiceAccount(SaveMixin, ObjectDeleteMixin, RESTObject):
140
+ access_tokens: ProjectServiceAccountAccessTokenManager
141
+
142
+
143
+ class ProjectServiceAccountManager(
144
+ CreateMixin[ProjectServiceAccount],
145
+ DeleteMixin[ProjectServiceAccount],
146
+ ListMixin[ProjectServiceAccount],
147
+ UpdateMixin[ProjectServiceAccount],
148
+ ):
149
+ _path = "/projects/{project_id}/service_accounts"
150
+ _obj_cls = ProjectServiceAccount
151
+ _from_parent_attrs = {"project_id": "id"}
152
+ _create_attrs = _SA_ACCOUNT_ATTRS
153
+ _update_attrs = _SA_ACCOUNT_ATTRS
154
+ _update_method = UpdateMethod.PATCH
155
+ _list_filters = ("order_by", "sort")
@@ -27,10 +27,19 @@ class VariableManager(CRUDMixin[Variable]):
27
27
  _path = "/admin/ci/variables"
28
28
  _obj_cls = Variable
29
29
  _create_attrs = RequiredOptional(
30
- required=("key", "value"), optional=("protected", "variable_type", "masked")
30
+ required=("key", "value"),
31
+ optional=("description", "masked", "protected", "raw", "variable_type"),
31
32
  )
32
33
  _update_attrs = RequiredOptional(
33
- required=("key", "value"), optional=("protected", "variable_type", "masked")
34
+ required=("key",),
35
+ optional=(
36
+ "description",
37
+ "masked",
38
+ "protected",
39
+ "raw",
40
+ "value",
41
+ "variable_type",
42
+ ),
34
43
  )
35
44
 
36
45
 
@@ -43,10 +52,28 @@ class GroupVariableManager(CRUDMixin[GroupVariable]):
43
52
  _obj_cls = GroupVariable
44
53
  _from_parent_attrs = {"group_id": "id"}
45
54
  _create_attrs = RequiredOptional(
46
- required=("key", "value"), optional=("protected", "variable_type", "masked")
55
+ required=("key", "value"),
56
+ optional=(
57
+ "description",
58
+ "environment_scope",
59
+ "masked",
60
+ "masked_and_hidden",
61
+ "protected",
62
+ "raw",
63
+ "variable_type",
64
+ ),
47
65
  )
48
66
  _update_attrs = RequiredOptional(
49
- required=("key", "value"), optional=("protected", "variable_type", "masked")
67
+ required=("key",),
68
+ optional=(
69
+ "description",
70
+ "environment_scope",
71
+ "masked",
72
+ "protected",
73
+ "raw",
74
+ "value",
75
+ "variable_type",
76
+ ),
50
77
  )
51
78
 
52
79
 
@@ -60,9 +87,25 @@ class ProjectVariableManager(CRUDMixin[ProjectVariable]):
60
87
  _from_parent_attrs = {"project_id": "id"}
61
88
  _create_attrs = RequiredOptional(
62
89
  required=("key", "value"),
63
- optional=("protected", "variable_type", "masked", "environment_scope"),
90
+ optional=(
91
+ "description",
92
+ "environment_scope",
93
+ "masked",
94
+ "masked_and_hidden",
95
+ "protected",
96
+ "raw",
97
+ "variable_type",
98
+ ),
64
99
  )
65
100
  _update_attrs = RequiredOptional(
66
- required=("key", "value"),
67
- optional=("protected", "variable_type", "masked", "environment_scope"),
101
+ required=("key",),
102
+ optional=(
103
+ "description",
104
+ "environment_scope",
105
+ "masked",
106
+ "protected",
107
+ "raw",
108
+ "value",
109
+ "variable_type",
110
+ ),
68
111
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-gitlab
3
- Version: 8.2.0
3
+ Version: 8.3.0
4
4
  Summary: The python wrapper for the GitLab REST and GraphQL APIs.
5
5
  Author-email: Gauvain Pocentek <gauvain@pocentek.net>
6
6
  Maintainer-email: John Villalovos <john@sodarock.com>, Max Wittig <max.wittig@siemens.com>, Nejc Habjan <nejc.habjan@siemens.com>, Roger Meier <r.meier@siemens.com>
@@ -1,13 +1,13 @@
1
1
  gitlab/__init__.py,sha256=pdbvZNyXeXLn0fGXSTsBqi_ic7QLY7-9FL3uA6tvfdI,1416
2
2
  gitlab/__main__.py,sha256=HTesNl0UAU6mPb9EXWkTKMy6Q6pAUxGi3iPnDHTE2uE,68
3
- gitlab/_version.py,sha256=lO0jawqMtdMHwi5iH_-GrOtH6EP6byD_JGN0JLWF6wA,249
3
+ gitlab/_version.py,sha256=o1dD03OuH7EzNMRPgYnzWcmoyei5g3xzr9bwXNM2hqU,249
4
4
  gitlab/base.py,sha256=xynWUZcMIbxiWLO17nnvqCsbC-lBvsy0rvWtTJOpuug,13790
5
5
  gitlab/cli.py,sha256=Bnu7T2RgDHUdxYiORBdwM4Qj9hYxoMNtmV9DtNYbWCI,12353
6
- gitlab/client.py,sha256=2l5FZGp4n0XqTq73moLNGfsZTaQB7KMCFDTg_7waMjo,54385
6
+ gitlab/client.py,sha256=afCv5MQFhZzC_Tqg7u5teecqa58-zOa7Cgo6vufHTNc,54521
7
7
  gitlab/config.py,sha256=knMTQZSepMI9Z0_3CTgzqg5Wsrk_f3FNfxUM5RoeVx4,9022
8
8
  gitlab/const.py,sha256=IKpS-AQeRpAXIdT_KpzhDuTR8-KilbUudL-TQv4njFk,5179
9
9
  gitlab/exceptions.py,sha256=9Ql-z8qGQAmd_1rx1IAXzLRYmQThDeNq6vqOpCxXAjQ,8391
10
- gitlab/mixins.py,sha256=Z1LqcgN-kZBaxXnhk3h_j8TAmUPDxP0sSymP00hjPYQ,35515
10
+ gitlab/mixins.py,sha256=YdE0YGlw9CnwylkKh8zarRC1uzWDRMyR_ZdcsGqTRkA,35764
11
11
  gitlab/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  gitlab/types.py,sha256=fLexlOqtGDmHv1uqYlPzkFt2oHWtkpt6qjquionmFpk,4585
13
13
  gitlab/utils.py,sha256=PcXYTr_IkE1pS0-91PtCh-v7ElprbuAMef7Kzgu3_Mg,9769
@@ -76,7 +76,7 @@ gitlab/v4/objects/pages.py,sha256=wUioc0uYDMIU_K9GpAiS9bG45WnS0NXC5874h6VUebk,15
76
76
  gitlab/v4/objects/personal_access_tokens.py,sha256=bm-MawqOH1zH8PvVgxFpU9uQacUndhUCMMRQxBS8lSs,1147
77
77
  gitlab/v4/objects/pipelines.py,sha256=01WpGWYU5JdkCvkA_UhYx94ukEbyOeMrE-Da_tTaLa8,10030
78
78
  gitlab/v4/objects/project_access_tokens.py,sha256=FZMg0NIo5TpT_F_SBZ5nD76JjaYIBOL3RddfYTGwxt8,869
79
- gitlab/v4/objects/projects.py,sha256=h4MTmf9OpjMkKc8GeEgtrAcN1HzLhfjHKS2HZ9FAGyI,49859
79
+ gitlab/v4/objects/projects.py,sha256=PS6P-TiXzW3BIlLjKuOtr0whm38JJimjEwat-jFBgOM,49983
80
80
  gitlab/v4/objects/push_rules.py,sha256=CWOCljZupz2K1Wd2A2WP648alD0ux2FJQBydxDsPZd4,2902
81
81
  gitlab/v4/objects/registry_protection_repository_rules.py,sha256=T-8sO3Jg7ZL4KuI-paaQSrhx9gN22Hj3DD5Xa2FUAuw,1323
82
82
  gitlab/v4/objects/registry_protection_rules.py,sha256=FkhVtR5ugFlpdu5UO0Xuiy3WKKbo0JzY6sSXOjU4DZ0,1121
@@ -86,7 +86,7 @@ gitlab/v4/objects/resource_groups.py,sha256=k1IabzkYY1TdMSXDUgd3zS86NoGoT_rSHWoS
86
86
  gitlab/v4/objects/reviewers.py,sha256=BW87EGgnbUPGU41033QxMhaKG2JKYz_k7ZaVKKkjOb8,532
87
87
  gitlab/v4/objects/runners.py,sha256=BNlMI7EyogHxDCXmC-UwcbbEfS-m1IZ1irUOCgI0-3k,4804
88
88
  gitlab/v4/objects/secure_files.py,sha256=XePX4HurVlxwmb07nIQ4kZrcn0ph23y7Jf2u-kOdZHY,3098
89
- gitlab/v4/objects/service_accounts.py,sha256=-S_MKo7c7JGvxdJYZgj5K6e86nNf0eqdqXUFsLQcnpU,640
89
+ gitlab/v4/objects/service_accounts.py,sha256=mnEswtwGVzkYJ5YQA5dYMdrlemI958tBGnB1QwqVkxk,4682
90
90
  gitlab/v4/objects/settings.py,sha256=N1RyoX7oQ_zVhYkkEL4HM8z4OoWKLUkzDoqJnF0VAT8,4213
91
91
  gitlab/v4/objects/sidekiq.py,sha256=4o5YTft-5UScQ8Qu4KbtUKsB-49eCxBc6DfPZ_IJ5zo,3050
92
92
  gitlab/v4/objects/snippets.py,sha256=ZBvU8l6mrbHWlnG7zY6SInruAId3PioAv0zrxayzr2A,10507
@@ -98,12 +98,12 @@ gitlab/v4/objects/todos.py,sha256=6MOu74xrlJSnNYcsTW63AQIMfW0vG_5Nl4eyBn9uPfg,18
98
98
  gitlab/v4/objects/topics.py,sha256=tWc8eMuRqxtkEPp0dT2OJtycz4xo93xYrmKFOLQTtRE,1961
99
99
  gitlab/v4/objects/triggers.py,sha256=1iYdlP8qpqwEctr6kKJSDanRulaKEHYnVwYwVGainI4,581
100
100
  gitlab/v4/objects/users.py,sha256=0-aCUflt2Wzl338H_eIaTJ_ElsXwbkgoh_SEw38u6m0,20987
101
- gitlab/v4/objects/variables.py,sha256=B7XHDKPrRg-sboVpClO0vYbxe6egH9U1-SPgVHv6tPc,2051
101
+ gitlab/v4/objects/variables.py,sha256=W0WlSn-al_MYJsbV-fv0pd4mwJiisq7T68H6DkHQMFs,2769
102
102
  gitlab/v4/objects/wikis.py,sha256=fR4QG4WIBeG10eBNfCN3CG-w3qlEBJIBVsJFxVVVhEs,1364
103
- python_gitlab-8.2.0.dist-info/licenses/AUTHORS,sha256=Z0P61GJSVnp7iFbRcMezhx3f4zMyPkVmG--TWaRo768,526
104
- python_gitlab-8.2.0.dist-info/licenses/COPYING,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
105
- python_gitlab-8.2.0.dist-info/METADATA,sha256=72AgFjCm-EjnXopz9FVfARxiuqOqkjpOHK0Sy7gpQ7s,8503
106
- python_gitlab-8.2.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
107
- python_gitlab-8.2.0.dist-info/entry_points.txt,sha256=nhpKLLP_uQPFByn8UtE9zsvQQwa402t52o_Cw9IFXMo,43
108
- python_gitlab-8.2.0.dist-info/top_level.txt,sha256=MvIaP8p_Oaf4gO_hXmHkX-5y2deHLp1pe6tJR3ukQ6o,7
109
- python_gitlab-8.2.0.dist-info/RECORD,,
103
+ python_gitlab-8.3.0.dist-info/licenses/AUTHORS,sha256=Z0P61GJSVnp7iFbRcMezhx3f4zMyPkVmG--TWaRo768,526
104
+ python_gitlab-8.3.0.dist-info/licenses/COPYING,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
105
+ python_gitlab-8.3.0.dist-info/METADATA,sha256=qfYIO-fi6v88nnlRkTXpO7rR-wyj594mZjq29LumM0s,8503
106
+ python_gitlab-8.3.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
107
+ python_gitlab-8.3.0.dist-info/entry_points.txt,sha256=nhpKLLP_uQPFByn8UtE9zsvQQwa402t52o_Cw9IFXMo,43
108
+ python_gitlab-8.3.0.dist-info/top_level.txt,sha256=MvIaP8p_Oaf4gO_hXmHkX-5y2deHLp1pe6tJR3ukQ6o,7
109
+ python_gitlab-8.3.0.dist-info/RECORD,,