python-gitlab 8.1.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.1.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)
gitlab/types.py CHANGED
@@ -1,8 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import dataclasses
4
+ import json
4
5
  from typing import Any, TYPE_CHECKING
5
6
 
7
+ from gitlab import exceptions
8
+
6
9
 
7
10
  @dataclasses.dataclass(frozen=True)
8
11
  class RequiredOptional:
@@ -36,6 +39,13 @@ class RequiredOptional:
36
39
 
37
40
 
38
41
  class GitlabAttribute:
42
+ # Used in utils._transform_types() to decide if we should call get_for_api()
43
+ # on the attribute when transform_data is False (e.g. for POST/PUT/PATCH).
44
+ #
45
+ # This allows us to force transformation of data even when sending JSON bodies,
46
+ # which is useful for types like CommaSeparatedStringAttribute.
47
+ transform_in_body = False
48
+
39
49
  def __init__(self, value: Any = None) -> None:
40
50
  self._value = value
41
51
 
@@ -49,6 +59,16 @@ class GitlabAttribute:
49
59
  return (key, self._value)
50
60
 
51
61
 
62
+ class JsonAttribute(GitlabAttribute):
63
+ def set_from_cli(self, cli_value: str) -> None:
64
+ try:
65
+ self._value = json.loads(cli_value)
66
+ except (ValueError, TypeError) as e:
67
+ raise exceptions.GitlabParsingError(
68
+ f"Could not parse JSON data: {e}"
69
+ ) from e
70
+
71
+
52
72
  class _ListArrayAttribute(GitlabAttribute):
53
73
  """Helper class to support `list` / `array` types."""
54
74
 
@@ -82,9 +102,23 @@ class ArrayAttribute(_ListArrayAttribute):
82
102
 
83
103
 
84
104
  class CommaSeparatedListAttribute(_ListArrayAttribute):
85
- """For values which are sent to the server as a Comma Separated Values
86
- (CSV) string. We allow them to be specified as a list and we convert it
87
- into a CSV"""
105
+ """
106
+ For values which are sent to the server as a Comma Separated Values (CSV) string
107
+ in query parameters (GET), but as a list/array in JSON bodies (POST/PUT).
108
+ """
109
+
110
+
111
+ class CommaSeparatedStringAttribute(_ListArrayAttribute):
112
+ """
113
+ For values which are sent to the server as a Comma Separated Values (CSV) string.
114
+ Unlike CommaSeparatedListAttribute, this type ensures the value is converted
115
+ to a string even in JSON bodies (POST/PUT requests).
116
+ """
117
+
118
+ # Used in utils._transform_types() to ensure the value is converted to a string
119
+ # via get_for_api() even when transform_data is False (e.g. for POST/PUT/PATCH).
120
+ # This is needed because some APIs require a CSV string instead of a JSON array.
121
+ transform_in_body = True
88
122
 
89
123
 
90
124
  class LowercaseStringAttribute(GitlabAttribute):
gitlab/utils.py CHANGED
@@ -198,7 +198,15 @@ def _transform_types(
198
198
  files[attr_name] = (key, data.pop(attr_name))
199
199
  continue
200
200
 
201
- if not transform_data:
201
+ # If transform_data is False, it means we are preparing data for a JSON body
202
+ # (POST/PUT/PATCH). In this case, we normally skip transformation because
203
+ # most types (like ArrayAttribute) only need transformation for query
204
+ # parameters (GET).
205
+ #
206
+ # However, some types (like CommaSeparatedStringAttribute) need to be
207
+ # transformed even in JSON bodies (e.g. converting a list to a CSV string).
208
+ # The 'transform_in_body' flag on the attribute class controls this behavior.
209
+ if not transform_data and not gitlab_attribute.transform_in_body:
202
210
  continue
203
211
 
204
212
  if isinstance(gitlab_attribute, types.GitlabAttribute):
@@ -24,6 +24,8 @@ from .environments import *
24
24
  from .epics import *
25
25
  from .events import *
26
26
  from .export_import import *
27
+ from .feature_flag_user_lists import *
28
+ from .feature_flags import *
27
29
  from .features import *
28
30
  from .files import *
29
31
  from .geo_nodes import *
@@ -0,0 +1,27 @@
1
+ """
2
+ GitLab API:
3
+ https://docs.gitlab.com/api/feature_flag_user_lists
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from gitlab import types
9
+ from gitlab.base import RESTObject
10
+ from gitlab.mixins import CRUDMixin, ObjectDeleteMixin, SaveMixin
11
+ from gitlab.types import RequiredOptional
12
+
13
+ __all__ = ["ProjectFeatureFlagUserList", "ProjectFeatureFlagUserListManager"]
14
+
15
+
16
+ class ProjectFeatureFlagUserList(SaveMixin, ObjectDeleteMixin, RESTObject):
17
+ _id_attr = "iid"
18
+
19
+
20
+ class ProjectFeatureFlagUserListManager(CRUDMixin[ProjectFeatureFlagUserList]):
21
+ _path = "/projects/{project_id}/feature_flags_user_lists"
22
+ _obj_cls = ProjectFeatureFlagUserList
23
+ _from_parent_attrs = {"project_id": "id"}
24
+ _create_attrs = RequiredOptional(required=("name", "user_xids"))
25
+ _update_attrs = RequiredOptional(optional=("name", "user_xids"))
26
+ _list_filters = ("search",)
27
+ _types = {"user_xids": types.CommaSeparatedStringAttribute}
@@ -0,0 +1,106 @@
1
+ """
2
+ GitLab API:
3
+ https://docs.gitlab.com/api/feature_flags
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from typing import Any
9
+
10
+ from gitlab import types, utils
11
+ from gitlab.base import RESTObject
12
+ from gitlab.mixins import CRUDMixin, ObjectDeleteMixin, SaveMixin
13
+ from gitlab.types import RequiredOptional
14
+
15
+ __all__ = ["ProjectFeatureFlag", "ProjectFeatureFlagManager"]
16
+
17
+
18
+ class ProjectFeatureFlag(SaveMixin, ObjectDeleteMixin, RESTObject):
19
+ _id_attr = "name"
20
+ manager: ProjectFeatureFlagManager
21
+
22
+ def _get_save_url_id(self) -> str | int | None:
23
+ """Get the ID used to construct the API URL for the save operation.
24
+
25
+ For renames, this must be the *original* name of the flag. For other
26
+ updates, it is the current name.
27
+ """
28
+ if self._id_attr in self._updated_attrs:
29
+ # If the name is being changed, use the original name for the URL.
30
+ obj_id = self._attrs.get(self._id_attr)
31
+ if isinstance(obj_id, str):
32
+ return utils.EncodedId(obj_id)
33
+ return obj_id
34
+ return self.encoded_id
35
+
36
+ def save(self, **kwargs: Any) -> dict[str, Any] | None:
37
+ """Save the changes made to the object to the server.
38
+
39
+ This is the standard method to use when updating a feature flag object
40
+ that you have already retrieved.
41
+
42
+ It is overridden here to correctly handle renaming. When `name` is
43
+ changed, the API requires the *original* name in the URL, and this
44
+ method provides it.
45
+
46
+ Args:
47
+ **kwargs: Extra options to send to the server (e.g. sudo)
48
+
49
+ Returns:
50
+ The new object data (*not* a RESTObject)
51
+
52
+ Raises:
53
+ GitlabAuthenticationError: If authentication is not correct
54
+ GitlabUpdateError: If the server cannot perform the request
55
+ """
56
+ updated_data = self._get_updated_data()
57
+ if not updated_data:
58
+ return None
59
+
60
+ obj_id = self._get_save_url_id()
61
+ server_data = self.manager.update(obj_id, updated_data, **kwargs)
62
+ self._update_attrs(server_data)
63
+ return server_data
64
+
65
+
66
+ class ProjectFeatureFlagManager(CRUDMixin[ProjectFeatureFlag]):
67
+ _path = "/projects/{project_id}/feature_flags"
68
+ _obj_cls = ProjectFeatureFlag
69
+ _from_parent_attrs = {"project_id": "id"}
70
+ _create_attrs = RequiredOptional(
71
+ required=("name",), optional=("version", "description", "active", "strategies")
72
+ )
73
+ _update_attrs = RequiredOptional(
74
+ # new_name is used for renaming via CLI and mapped to 'name' in update()
75
+ optional=("name", "new_name", "description", "active", "strategies")
76
+ )
77
+ _list_filters = ("scope",)
78
+ _types = {"strategies": types.JsonAttribute}
79
+
80
+ def update(
81
+ self,
82
+ id: str | int | None = None,
83
+ new_data: dict[str, Any] | None = None,
84
+ **kwargs: Any,
85
+ ) -> dict[str, Any]:
86
+ """Update a Project Feature Flag.
87
+
88
+ This is a lower-level method called by `ProjectFeatureFlag.save()` and
89
+ is also used directly by the CLI.
90
+
91
+ The `new_name` parameter is a special case to support renaming via the
92
+ CLI (`--new-name`). It is converted to the `name` parameter that the
93
+ GitLab API expects in the request body.
94
+
95
+ Args:
96
+ id: The current name of the feature flag.
97
+ new_data: The dictionary of attributes to update.
98
+ **kwargs: Extra options to send to the server (e.g. sudo)
99
+ """
100
+ # Avoid mutating the caller-provided new_data dict by working on a copy.
101
+ data = dict(new_data or {})
102
+ # When used via CLI, we have 'new_name' to distinguish from the ID 'name'.
103
+ # When used via .save(), the object passes 'name' directly in new_data.
104
+ if "new_name" in data:
105
+ data["name"] = data.pop("new_name")
106
+ return super().update(id, data, **kwargs)
@@ -90,7 +90,13 @@ class ProjectApprovalRuleManager(
90
90
  _from_parent_attrs = {"project_id": "id"}
91
91
  _create_attrs = RequiredOptional(
92
92
  required=("name", "approvals_required"),
93
- optional=("user_ids", "group_ids", "protected_branch_ids", "usernames"),
93
+ optional=(
94
+ "user_ids",
95
+ "group_ids",
96
+ "protected_branch_ids",
97
+ "usernames",
98
+ "applies_to_all_protected_branches",
99
+ ),
94
100
  )
95
101
 
96
102
 
@@ -49,6 +49,8 @@ from .environments import ( # noqa: F401
49
49
  )
50
50
  from .events import ProjectEventManager # noqa: F401
51
51
  from .export_import import ProjectExportManager, ProjectImportManager # noqa: F401
52
+ from .feature_flag_user_lists import ProjectFeatureFlagUserListManager # noqa: F401
53
+ from .feature_flags import ProjectFeatureFlagManager # noqa: F401
52
54
  from .files import ProjectFileManager # noqa: F401
53
55
  from .hooks import ProjectHookManager # noqa: F401
54
56
  from .integrations import ProjectIntegrationManager, ProjectServiceManager # noqa: F401
@@ -89,6 +91,7 @@ from .repositories import RepositoryMixin
89
91
  from .resource_groups import ProjectResourceGroupManager
90
92
  from .runners import ProjectRunnerManager # noqa: F401
91
93
  from .secure_files import ProjectSecureFileManager # noqa: F401
94
+ from .service_accounts import ProjectServiceAccountManager # noqa: F401
92
95
  from .snippets import ProjectSnippetManager # noqa: F401
93
96
  from .statistics import ( # noqa: F401
94
97
  ProjectAdditionalStatisticsManager,
@@ -201,6 +204,8 @@ class Project(
201
204
  environments: ProjectEnvironmentManager
202
205
  events: ProjectEventManager
203
206
  exports: ProjectExportManager
207
+ feature_flags: ProjectFeatureFlagManager
208
+ feature_flags_user_lists: ProjectFeatureFlagUserListManager
204
209
  files: ProjectFileManager
205
210
  forks: ProjectForkManager
206
211
  generic_packages: GenericPackageManager
@@ -247,6 +252,7 @@ class Project(
247
252
  repositories: ProjectRegistryRepositoryManager
248
253
  runners: ProjectRunnerManager
249
254
  secure_files: ProjectSecureFileManager
255
+ service_accounts: ProjectServiceAccountManager
250
256
  services: ProjectServiceManager
251
257
  snippets: ProjectSnippetManager
252
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.1.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,23 +1,23 @@
1
1
  gitlab/__init__.py,sha256=pdbvZNyXeXLn0fGXSTsBqi_ic7QLY7-9FL3uA6tvfdI,1416
2
2
  gitlab/__main__.py,sha256=HTesNl0UAU6mPb9EXWkTKMy6Q6pAUxGi3iPnDHTE2uE,68
3
- gitlab/_version.py,sha256=fmbieGFl1TfIO1D_qz_FF7-WHedfYeAfqxnCwHWIaNk,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
- gitlab/types.py,sha256=sBDnQgyxtNUR_5MWfCN8y8EZdxbyBlvMknnJpGIIppI,3282
13
- gitlab/utils.py,sha256=Fni1PAI84cAdz4AYWxOtxnTxSKoKbYyvbiIVHVBIoqk,9195
12
+ gitlab/types.py,sha256=fLexlOqtGDmHv1uqYlPzkFt2oHWtkpt6qjquionmFpk,4585
13
+ gitlab/utils.py,sha256=PcXYTr_IkE1pS0-91PtCh-v7ElprbuAMef7Kzgu3_Mg,9769
14
14
  gitlab/_backends/__init__.py,sha256=WalQZRIDzw19FuNxraG7fvck6ddg4cdNd3bi53QKvZM,392
15
15
  gitlab/_backends/graphql.py,sha256=wUEjrtz4KAFIFLc13cTj8D1757yeSeViX-xzoDy90Is,1450
16
16
  gitlab/_backends/protocol.py,sha256=_53iLo017Reni0GoxUR4sQcM5pWxOFY0ljQsYUwpFCU,705
17
17
  gitlab/_backends/requests_backend.py,sha256=BmIcITkrxfJtNTYrjqbT7ldXZsjlbGU2n8xBdBaPAQ0,5443
18
18
  gitlab/v4/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  gitlab/v4/cli.py,sha256=kZh-VdoEZTd9dQ6t2MeUPGf26t5StlD-tnrcXptbp4k,22849
20
- gitlab/v4/objects/__init__.py,sha256=cWZQgpn8TqbjmrNstzR_YlK3NntZT7zGrjQ1vbwQ0OM,2210
20
+ gitlab/v4/objects/__init__.py,sha256=xQG6MN27v4-4jdN0RMv832VhBFJBIA6YCThS5x-WS_k,2278
21
21
  gitlab/v4/objects/access_requests.py,sha256=QQ7cj6W4VYE8UH5HIwBO47MjXemMnO6jOqhTQttfM5I,1040
22
22
  gitlab/v4/objects/appearance.py,sha256=NGN4BJT5AqN3Ex1io7ZJjOK91oOkwvx_6JXjYG474MI,1815
23
23
  gitlab/v4/objects/applications.py,sha256=WddNZhXWrQsb4IPwanQStAVVCLCaA_4QN6_VnggldFs,599
@@ -44,6 +44,8 @@ gitlab/v4/objects/environments.py,sha256=sg80VwquEWWQXMtQXEq6NOZFllodXeTNJs4YKBf
44
44
  gitlab/v4/objects/epics.py,sha256=4H3mHQRQPitFmiGjgEelrKkeqBvJs3iWBscavY2AKlw,4018
45
45
  gitlab/v4/objects/events.py,sha256=SsMI5btCfHVMFcrNE601-2rLEIVnyOpuFuKAYQftfh8,5009
46
46
  gitlab/v4/objects/export_import.py,sha256=V0K4nOzDIm4NV1HB92kByvRjHojmfUP8m6KCR20opiI,1472
47
+ gitlab/v4/objects/feature_flag_user_lists.py,sha256=xQjzH0ZWRlJxI4Fh2SiGq5Hq15i-WbI59j59cljCIgY,921
48
+ gitlab/v4/objects/feature_flags.py,sha256=i3_r7OQPZ-MIAAcXBBKdHa1Ji7HEvg8ME4l6miEfHBY,3878
47
49
  gitlab/v4/objects/features.py,sha256=ZwuvXWWOb5rrBOpMQ-B9oGGVbtyn-bjzW9K7BwJL3Rs,1955
48
50
  gitlab/v4/objects/files.py,sha256=JWJ2FkyJLK2V5ATl6dhjVPv5JkDKuUSno6heJGIb4Ko,13148
49
51
  gitlab/v4/objects/geo_nodes.py,sha256=ebCfIulBIbmwdp_CfLxANDzsUdeFoxQTjfshlz0t_-E,3511
@@ -61,7 +63,7 @@ gitlab/v4/objects/labels.py,sha256=3zO2LkITsMI7NQTYknWspZvTpy8nSU7j_F58SuWtxFY,4
61
63
  gitlab/v4/objects/ldap.py,sha256=5UFQfP-2ULa2d025JlAwYFeLZGXpbAE6z2PX0Z_vQ_g,2171
62
64
  gitlab/v4/objects/member_roles.py,sha256=c98LD4i2ZQyP3uMrZz_cWJbl3LV0ivwKiPzKw4y6tn4,2833
63
65
  gitlab/v4/objects/members.py,sha256=0PEVwIcq4KzrA56a54NKdQFIKfd-OylCPNO7f4J1Y3k,3213
64
- gitlab/v4/objects/merge_request_approvals.py,sha256=N4Fx3AmTlc9cFa4JaP32ffxFFoTmN3TFNyic0CUiu40,6509
66
+ gitlab/v4/objects/merge_request_approvals.py,sha256=TW3nvWIzQsaKin9ATfTJsJOQ7cofMJT6q1Ujdw1Aiow,6617
65
67
  gitlab/v4/objects/merge_requests.py,sha256=P_QST0VT66UFbmDAOS84ROWE2w8RRdCiI1ypPRYj2cc,18279
66
68
  gitlab/v4/objects/merge_trains.py,sha256=32LD41AGkS0G921BDHnJevCYNOgcjVW3bH3vNJY-HB4,404
67
69
  gitlab/v4/objects/milestones.py,sha256=ZrW90nFEhNbIAS-8BNjHgBCeZ0FiCTS7ta9LGg4K8fY,6841
@@ -74,7 +76,7 @@ gitlab/v4/objects/pages.py,sha256=wUioc0uYDMIU_K9GpAiS9bG45WnS0NXC5874h6VUebk,15
74
76
  gitlab/v4/objects/personal_access_tokens.py,sha256=bm-MawqOH1zH8PvVgxFpU9uQacUndhUCMMRQxBS8lSs,1147
75
77
  gitlab/v4/objects/pipelines.py,sha256=01WpGWYU5JdkCvkA_UhYx94ukEbyOeMrE-Da_tTaLa8,10030
76
78
  gitlab/v4/objects/project_access_tokens.py,sha256=FZMg0NIo5TpT_F_SBZ5nD76JjaYIBOL3RddfYTGwxt8,869
77
- gitlab/v4/objects/projects.py,sha256=-UYTzcfoWW8_tT7VPuWhRb_QeGOluP3Me1PfMOeuUH4,49598
79
+ gitlab/v4/objects/projects.py,sha256=PS6P-TiXzW3BIlLjKuOtr0whm38JJimjEwat-jFBgOM,49983
78
80
  gitlab/v4/objects/push_rules.py,sha256=CWOCljZupz2K1Wd2A2WP648alD0ux2FJQBydxDsPZd4,2902
79
81
  gitlab/v4/objects/registry_protection_repository_rules.py,sha256=T-8sO3Jg7ZL4KuI-paaQSrhx9gN22Hj3DD5Xa2FUAuw,1323
80
82
  gitlab/v4/objects/registry_protection_rules.py,sha256=FkhVtR5ugFlpdu5UO0Xuiy3WKKbo0JzY6sSXOjU4DZ0,1121
@@ -84,7 +86,7 @@ gitlab/v4/objects/resource_groups.py,sha256=k1IabzkYY1TdMSXDUgd3zS86NoGoT_rSHWoS
84
86
  gitlab/v4/objects/reviewers.py,sha256=BW87EGgnbUPGU41033QxMhaKG2JKYz_k7ZaVKKkjOb8,532
85
87
  gitlab/v4/objects/runners.py,sha256=BNlMI7EyogHxDCXmC-UwcbbEfS-m1IZ1irUOCgI0-3k,4804
86
88
  gitlab/v4/objects/secure_files.py,sha256=XePX4HurVlxwmb07nIQ4kZrcn0ph23y7Jf2u-kOdZHY,3098
87
- gitlab/v4/objects/service_accounts.py,sha256=-S_MKo7c7JGvxdJYZgj5K6e86nNf0eqdqXUFsLQcnpU,640
89
+ gitlab/v4/objects/service_accounts.py,sha256=mnEswtwGVzkYJ5YQA5dYMdrlemI958tBGnB1QwqVkxk,4682
88
90
  gitlab/v4/objects/settings.py,sha256=N1RyoX7oQ_zVhYkkEL4HM8z4OoWKLUkzDoqJnF0VAT8,4213
89
91
  gitlab/v4/objects/sidekiq.py,sha256=4o5YTft-5UScQ8Qu4KbtUKsB-49eCxBc6DfPZ_IJ5zo,3050
90
92
  gitlab/v4/objects/snippets.py,sha256=ZBvU8l6mrbHWlnG7zY6SInruAId3PioAv0zrxayzr2A,10507
@@ -96,12 +98,12 @@ gitlab/v4/objects/todos.py,sha256=6MOu74xrlJSnNYcsTW63AQIMfW0vG_5Nl4eyBn9uPfg,18
96
98
  gitlab/v4/objects/topics.py,sha256=tWc8eMuRqxtkEPp0dT2OJtycz4xo93xYrmKFOLQTtRE,1961
97
99
  gitlab/v4/objects/triggers.py,sha256=1iYdlP8qpqwEctr6kKJSDanRulaKEHYnVwYwVGainI4,581
98
100
  gitlab/v4/objects/users.py,sha256=0-aCUflt2Wzl338H_eIaTJ_ElsXwbkgoh_SEw38u6m0,20987
99
- gitlab/v4/objects/variables.py,sha256=B7XHDKPrRg-sboVpClO0vYbxe6egH9U1-SPgVHv6tPc,2051
101
+ gitlab/v4/objects/variables.py,sha256=W0WlSn-al_MYJsbV-fv0pd4mwJiisq7T68H6DkHQMFs,2769
100
102
  gitlab/v4/objects/wikis.py,sha256=fR4QG4WIBeG10eBNfCN3CG-w3qlEBJIBVsJFxVVVhEs,1364
101
- python_gitlab-8.1.0.dist-info/licenses/AUTHORS,sha256=Z0P61GJSVnp7iFbRcMezhx3f4zMyPkVmG--TWaRo768,526
102
- python_gitlab-8.1.0.dist-info/licenses/COPYING,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
103
- python_gitlab-8.1.0.dist-info/METADATA,sha256=T-tDiVp4NB3btOzL2SBtYm4AFDK6fctDNeDaNbPKTzQ,8503
104
- python_gitlab-8.1.0.dist-info/WHEEL,sha256=YCfwYGOYMi5Jhw2fU4yNgwErybb2IX5PEwBKV4ZbdBo,91
105
- python_gitlab-8.1.0.dist-info/entry_points.txt,sha256=nhpKLLP_uQPFByn8UtE9zsvQQwa402t52o_Cw9IFXMo,43
106
- python_gitlab-8.1.0.dist-info/top_level.txt,sha256=MvIaP8p_Oaf4gO_hXmHkX-5y2deHLp1pe6tJR3ukQ6o,7
107
- python_gitlab-8.1.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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (82.0.0)
2
+ Generator: setuptools (82.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5