python-gitlab 4.3.0__py3-none-any.whl → 4.5.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.
Files changed (35) hide show
  1. gitlab/_backends/protocol.py +2 -4
  2. gitlab/_version.py +1 -1
  3. gitlab/cli.py +23 -5
  4. gitlab/client.py +0 -1
  5. gitlab/exceptions.py +5 -0
  6. gitlab/mixins.py +59 -0
  7. gitlab/utils.py +3 -3
  8. gitlab/v4/cli.py +9 -0
  9. gitlab/v4/objects/__init__.py +1 -0
  10. gitlab/v4/objects/artifacts.py +2 -1
  11. gitlab/v4/objects/audit_events.py +1 -0
  12. gitlab/v4/objects/branches.py +10 -3
  13. gitlab/v4/objects/deployments.py +1 -0
  14. gitlab/v4/objects/features.py +1 -0
  15. gitlab/v4/objects/group_access_tokens.py +19 -3
  16. gitlab/v4/objects/job_token_scope.py +48 -0
  17. gitlab/v4/objects/jobs.py +4 -1
  18. gitlab/v4/objects/merge_request_approvals.py +4 -56
  19. gitlab/v4/objects/merge_requests.py +3 -0
  20. gitlab/v4/objects/personal_access_tokens.py +10 -3
  21. gitlab/v4/objects/pipelines.py +2 -1
  22. gitlab/v4/objects/project_access_tokens.py +19 -3
  23. gitlab/v4/objects/projects.py +1 -0
  24. gitlab/v4/objects/repositories.py +1 -0
  25. gitlab/v4/objects/reviewers.py +17 -0
  26. gitlab/v4/objects/secure_files.py +1 -0
  27. gitlab/v4/objects/users.py +1 -0
  28. gitlab/v4/objects/variables.py +1 -0
  29. {python_gitlab-4.3.0.dist-info → python_gitlab-4.5.0.dist-info}/METADATA +18 -1
  30. {python_gitlab-4.3.0.dist-info → python_gitlab-4.5.0.dist-info}/RECORD +35 -34
  31. {python_gitlab-4.3.0.dist-info → python_gitlab-4.5.0.dist-info}/WHEEL +1 -1
  32. {python_gitlab-4.3.0.dist-info → python_gitlab-4.5.0.dist-info}/AUTHORS +0 -0
  33. {python_gitlab-4.3.0.dist-info → python_gitlab-4.5.0.dist-info}/COPYING +0 -0
  34. {python_gitlab-4.3.0.dist-info → python_gitlab-4.5.0.dist-info}/entry_points.txt +0 -0
  35. {python_gitlab-4.3.0.dist-info → python_gitlab-4.5.0.dist-info}/top_level.txt +0 -0
@@ -13,8 +13,7 @@ else:
13
13
 
14
14
  class BackendResponse(Protocol):
15
15
  @abc.abstractmethod
16
- def __init__(self, response: requests.Response) -> None:
17
- ...
16
+ def __init__(self, response: requests.Response) -> None: ...
18
17
 
19
18
 
20
19
  class Backend(Protocol):
@@ -30,5 +29,4 @@ class Backend(Protocol):
30
29
  verify: Optional[Union[bool, str]],
31
30
  stream: Optional[bool],
32
31
  **kwargs: Any,
33
- ) -> BackendResponse:
34
- ...
32
+ ) -> BackendResponse: ...
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__ = "4.3.0"
6
+ __version__ = "4.5.0"
gitlab/cli.py CHANGED
@@ -1,6 +1,7 @@
1
1
  import argparse
2
2
  import functools
3
3
  import os
4
+ import pathlib
4
5
  import re
5
6
  import sys
6
7
  import textwrap
@@ -281,6 +282,16 @@ def _get_base_parser(add_help: bool = True) -> argparse.ArgumentParser:
281
282
  help=("GitLab CI job token [env var: CI_JOB_TOKEN]"),
282
283
  required=False,
283
284
  )
285
+ parser.add_argument(
286
+ "--skip-login",
287
+ help=(
288
+ "Skip initial authenticated API call to the current user endpoint. "
289
+ "This may be useful when invoking the CLI in scripts. "
290
+ "[env var: GITLAB_SKIP_LOGIN]"
291
+ ),
292
+ action="store_true",
293
+ default=os.getenv("GITLAB_SKIP_LOGIN"),
294
+ )
284
295
  return parser
285
296
 
286
297
 
@@ -298,12 +309,17 @@ def _parse_value(v: Any) -> Any:
298
309
  return v[1:]
299
310
  if isinstance(v, str) and v.startswith("@"):
300
311
  # If the user-provided value starts with @, we try to read the file
301
- # path provided after @ as the real value. Exit on any error.
312
+ # path provided after @ as the real value.
313
+ filepath = pathlib.Path(v[1:]).expanduser().resolve()
302
314
  try:
303
- with open(v[1:], encoding="utf-8") as f:
315
+ with open(filepath, encoding="utf-8") as f:
316
+ return f.read()
317
+ except UnicodeDecodeError:
318
+ with open(filepath, "rb") as f:
304
319
  return f.read()
305
- except Exception as e:
306
- sys.stderr.write(f"{e}\n")
320
+ except OSError as exc:
321
+ exc_name = type(exc).__name__
322
+ sys.stderr.write(f"{exc_name}: {exc}\n")
307
323
  sys.exit(1)
308
324
 
309
325
  return v
@@ -362,6 +378,7 @@ def main() -> None:
362
378
  debug = args.debug
363
379
  gitlab_resource = args.gitlab_resource
364
380
  resource_action = args.resource_action
381
+ skip_login = args.skip_login
365
382
 
366
383
  args_dict = vars(args)
367
384
  # Remove CLI behavior-related args
@@ -384,6 +401,7 @@ def main() -> None:
384
401
  "private_token",
385
402
  "oauth_token",
386
403
  "job_token",
404
+ "skip_login",
387
405
  ):
388
406
  args_dict.pop(item)
389
407
  args_dict = {k: _parse_value(v) for k, v in args_dict.items() if v is not None}
@@ -392,7 +410,7 @@ def main() -> None:
392
410
  gl = gitlab.Gitlab.merge_config(vars(options), gitlab_id, config_files)
393
411
  if debug:
394
412
  gl.enable_debug()
395
- if gl.private_token or gl.oauth_token:
413
+ if not skip_login and (gl.private_token or gl.oauth_token):
396
414
  gl.auth()
397
415
  except Exception as e:
398
416
  die(str(e))
gitlab/client.py CHANGED
@@ -40,7 +40,6 @@ _PAGINATION_URL = (
40
40
 
41
41
 
42
42
  class Gitlab:
43
-
44
43
  """Represents a GitLab server connection.
45
44
 
46
45
  Args:
gitlab/exceptions.py CHANGED
@@ -288,6 +288,10 @@ class GitlabRevertError(GitlabOperationError):
288
288
  pass
289
289
 
290
290
 
291
+ class GitlabRotateError(GitlabOperationError):
292
+ pass
293
+
294
+
291
295
  class GitlabLicenseError(GitlabOperationError):
292
296
  pass
293
297
 
@@ -397,6 +401,7 @@ __all__ = [
397
401
  "GitlabRestoreError",
398
402
  "GitlabRetryError",
399
403
  "GitlabRevertError",
404
+ "GitlabRotateError",
400
405
  "GitlabSearchError",
401
406
  "GitlabSetError",
402
407
  "GitlabStopError",
gitlab/mixins.py CHANGED
@@ -653,6 +653,65 @@ class DownloadMixin(_RestObjectBase):
653
653
  )
654
654
 
655
655
 
656
+ class RotateMixin(_RestManagerBase):
657
+ _computed_path: Optional[str]
658
+ _from_parent_attrs: Dict[str, Any]
659
+ _obj_cls: Optional[Type[base.RESTObject]]
660
+ _parent: Optional[base.RESTObject]
661
+ _parent_attrs: Dict[str, Any]
662
+ _path: Optional[str]
663
+ gitlab: gitlab.Gitlab
664
+
665
+ @exc.on_http_error(exc.GitlabRotateError)
666
+ def rotate(
667
+ self, id: Union[str, int], expires_at: Optional[str] = None, **kwargs: Any
668
+ ) -> Dict[str, Any]:
669
+ """Rotate an access token.
670
+
671
+ Args:
672
+ id: ID of the token to rotate
673
+ **kwargs: Extra options to send to the server (e.g. sudo)
674
+
675
+ Raises:
676
+ GitlabAuthenticationError: If authentication is not correct
677
+ GitlabRotateError: If the server cannot perform the request
678
+ """
679
+ path = f"{self.path}/{utils.EncodedId(id)}/rotate"
680
+ data: Dict[str, Any] = {}
681
+ if expires_at is not None:
682
+ data = {"expires_at": expires_at}
683
+
684
+ server_data = self.gitlab.http_post(path, post_data=data, **kwargs)
685
+ if TYPE_CHECKING:
686
+ assert not isinstance(server_data, requests.Response)
687
+ return server_data
688
+
689
+
690
+ class ObjectRotateMixin(_RestObjectBase):
691
+ _id_attr: Optional[str]
692
+ _attrs: Dict[str, Any]
693
+ _module: ModuleType
694
+ _parent_attrs: Dict[str, Any]
695
+ _updated_attrs: Dict[str, Any]
696
+ manager: base.RESTManager
697
+
698
+ def rotate(self, **kwargs: Any) -> None:
699
+ """Rotate the current access token object.
700
+
701
+ Args:
702
+ **kwargs: Extra options to send to the server (e.g. sudo)
703
+
704
+ Raises:
705
+ GitlabAuthenticationError: If authentication is not correct
706
+ GitlabRotateError: If the server cannot perform the request
707
+ """
708
+ if TYPE_CHECKING:
709
+ assert isinstance(self.manager, RotateMixin)
710
+ assert self.encoded_id is not None
711
+ server_data = self.manager.rotate(self.encoded_id, **kwargs)
712
+ self._update_attrs(server_data)
713
+
714
+
656
715
  class SubscribableMixin(_RestObjectBase):
657
716
  _id_attr: Optional[str]
658
717
  _attrs: Dict[str, Any]
gitlab/utils.py CHANGED
@@ -18,7 +18,8 @@ class _StdoutStream:
18
18
 
19
19
  def get_content_type(content_type: Optional[str]) -> str:
20
20
  message = email.message.Message()
21
- message["content-type"] = content_type
21
+ if content_type is not None:
22
+ message["content-type"] = content_type
22
23
 
23
24
  return message.get_content_type()
24
25
 
@@ -191,8 +192,7 @@ def warn(
191
192
  stacklevel = 1
192
193
  warning_from = ""
193
194
  for stacklevel, frame in enumerate(reversed(stack), start=1):
194
- if stacklevel == 2:
195
- warning_from = f" (python-gitlab: {frame.filename}:{frame.lineno})"
195
+ warning_from = f" (python-gitlab: {frame.filename}:{frame.lineno})"
196
196
  frame_dir = str(pathlib.Path(frame.filename).parent.resolve())
197
197
  if not frame_dir.startswith(str(pg_dir)):
198
198
  break
gitlab/v4/cli.py CHANGED
@@ -262,6 +262,10 @@ def _populate_sub_parser_by_class(
262
262
  sub_parser_action.add_argument(
263
263
  f"--{x.replace('_', '-')}", required=False
264
264
  )
265
+ if mgr_cls._create_attrs.exclusive:
266
+ group = sub_parser_action.add_mutually_exclusive_group()
267
+ for x in mgr_cls._create_attrs.exclusive:
268
+ group.add_argument(f"--{x.replace('_', '-')}")
265
269
 
266
270
  if action_name == "update":
267
271
  if cls._id_attr is not None:
@@ -280,6 +284,11 @@ def _populate_sub_parser_by_class(
280
284
  f"--{x.replace('_', '-')}", required=False
281
285
  )
282
286
 
287
+ if mgr_cls._update_attrs.exclusive:
288
+ group = sub_parser_action.add_mutually_exclusive_group()
289
+ for x in mgr_cls._update_attrs.exclusive:
290
+ group.add_argument(f"--{x.replace('_', '-')}")
291
+
283
292
  if cls.__name__ in cli.custom_actions:
284
293
  name = cls.__name__
285
294
  for action_name in cli.custom_actions[name]:
@@ -56,6 +56,7 @@ from .push_rules import *
56
56
  from .releases import *
57
57
  from .repositories import *
58
58
  from .resource_groups import *
59
+ from .reviewers import *
59
60
  from .runners import *
60
61
  from .secure_files import *
61
62
  from .settings import *
@@ -2,6 +2,7 @@
2
2
  GitLab API:
3
3
  https://docs.gitlab.com/ee/api/job_artifacts.html
4
4
  """
5
+
5
6
  from typing import Any, Callable, Iterator, Optional, TYPE_CHECKING, Union
6
7
 
7
8
  import requests
@@ -61,7 +62,7 @@ class ProjectArtifactManager(RESTManager):
61
62
 
62
63
  Args:
63
64
  ref_name: Branch or tag name in repository. HEAD or SHA references
64
- are not supported.
65
+ are not supported.
65
66
  job: The name of the job.
66
67
  job_token: Job token for multi-project pipeline triggers.
67
68
  streamed: If True the data will be processed by chunks of
@@ -2,6 +2,7 @@
2
2
  GitLab API:
3
3
  https://docs.gitlab.com/ee/api/audit_events.html
4
4
  """
5
+
5
6
  from typing import Any, cast, Union
6
7
 
7
8
  from gitlab.base import RESTManager, RESTObject
@@ -1,7 +1,13 @@
1
1
  from typing import Any, cast, Union
2
2
 
3
3
  from gitlab.base import RESTManager, RESTObject
4
- from gitlab.mixins import NoUpdateMixin, ObjectDeleteMixin
4
+ from gitlab.mixins import (
5
+ CRUDMixin,
6
+ NoUpdateMixin,
7
+ ObjectDeleteMixin,
8
+ SaveMixin,
9
+ UpdateMethod,
10
+ )
5
11
  from gitlab.types import RequiredOptional
6
12
 
7
13
  __all__ = [
@@ -28,11 +34,11 @@ class ProjectBranchManager(NoUpdateMixin, RESTManager):
28
34
  return cast(ProjectBranch, super().get(id=id, lazy=lazy, **kwargs))
29
35
 
30
36
 
31
- class ProjectProtectedBranch(ObjectDeleteMixin, RESTObject):
37
+ class ProjectProtectedBranch(SaveMixin, ObjectDeleteMixin, RESTObject):
32
38
  _id_attr = "name"
33
39
 
34
40
 
35
- class ProjectProtectedBranchManager(NoUpdateMixin, RESTManager):
41
+ class ProjectProtectedBranchManager(CRUDMixin, RESTManager):
36
42
  _path = "/projects/{project_id}/protected_branches"
37
43
  _obj_cls = ProjectProtectedBranch
38
44
  _from_parent_attrs = {"project_id": "id"}
@@ -49,6 +55,7 @@ class ProjectProtectedBranchManager(NoUpdateMixin, RESTManager):
49
55
  "code_owner_approval_required",
50
56
  ),
51
57
  )
58
+ _update_method = UpdateMethod.PATCH
52
59
 
53
60
  def get(
54
61
  self, id: Union[str, int], lazy: bool = False, **kwargs: Any
@@ -2,6 +2,7 @@
2
2
  GitLab API:
3
3
  https://docs.gitlab.com/ee/api/deployments.html
4
4
  """
5
+
5
6
  from typing import Any, cast, Dict, Optional, TYPE_CHECKING, Union
6
7
 
7
8
  from gitlab import cli
@@ -2,6 +2,7 @@
2
2
  GitLab API:
3
3
  https://docs.gitlab.com/ee/api/features.html
4
4
  """
5
+
5
6
  from typing import Any, Optional, TYPE_CHECKING, Union
6
7
 
7
8
  from gitlab import exceptions as exc
@@ -1,5 +1,14 @@
1
+ from typing import Any, cast, Union
2
+
1
3
  from gitlab.base import RESTManager, RESTObject
2
- from gitlab.mixins import CreateMixin, DeleteMixin, ListMixin, ObjectDeleteMixin
4
+ from gitlab.mixins import (
5
+ CreateMixin,
6
+ DeleteMixin,
7
+ ObjectDeleteMixin,
8
+ ObjectRotateMixin,
9
+ RetrieveMixin,
10
+ RotateMixin,
11
+ )
3
12
  from gitlab.types import ArrayAttribute, RequiredOptional
4
13
 
5
14
  __all__ = [
@@ -8,11 +17,13 @@ __all__ = [
8
17
  ]
9
18
 
10
19
 
11
- class GroupAccessToken(ObjectDeleteMixin, RESTObject):
20
+ class GroupAccessToken(ObjectDeleteMixin, ObjectRotateMixin, RESTObject):
12
21
  pass
13
22
 
14
23
 
15
- class GroupAccessTokenManager(ListMixin, CreateMixin, DeleteMixin, RESTManager):
24
+ class GroupAccessTokenManager(
25
+ CreateMixin, DeleteMixin, RetrieveMixin, RotateMixin, RESTManager
26
+ ):
16
27
  _path = "/groups/{group_id}/access_tokens"
17
28
  _obj_cls = GroupAccessToken
18
29
  _from_parent_attrs = {"group_id": "id"}
@@ -20,3 +31,8 @@ class GroupAccessTokenManager(ListMixin, CreateMixin, DeleteMixin, RESTManager):
20
31
  required=("name", "scopes"), optional=("access_level", "expires_at")
21
32
  )
22
33
  _types = {"scopes": ArrayAttribute}
34
+
35
+ def get(
36
+ self, id: Union[str, int], lazy: bool = False, **kwargs: Any
37
+ ) -> GroupAccessToken:
38
+ return cast(GroupAccessToken, super().get(id=id, lazy=lazy, **kwargs))
@@ -2,12 +2,17 @@ from typing import Any, cast
2
2
 
3
3
  from gitlab.base import RESTManager, RESTObject
4
4
  from gitlab.mixins import (
5
+ CreateMixin,
6
+ DeleteMixin,
5
7
  GetWithoutIdMixin,
8
+ ListMixin,
9
+ ObjectDeleteMixin,
6
10
  RefreshMixin,
7
11
  SaveMixin,
8
12
  UpdateMethod,
9
13
  UpdateMixin,
10
14
  )
15
+ from gitlab.types import RequiredOptional
11
16
 
12
17
  __all__ = [
13
18
  "ProjectJobTokenScope",
@@ -18,6 +23,9 @@ __all__ = [
18
23
  class ProjectJobTokenScope(RefreshMixin, SaveMixin, RESTObject):
19
24
  _id_attr = None
20
25
 
26
+ allowlist: "AllowlistProjectManager"
27
+ groups_allowlist: "AllowlistGroupManager"
28
+
21
29
 
22
30
  class ProjectJobTokenScopeManager(GetWithoutIdMixin, UpdateMixin, RESTManager):
23
31
  _path = "/projects/{project_id}/job_token_scope"
@@ -27,3 +35,43 @@ class ProjectJobTokenScopeManager(GetWithoutIdMixin, UpdateMixin, RESTManager):
27
35
 
28
36
  def get(self, **kwargs: Any) -> ProjectJobTokenScope:
29
37
  return cast(ProjectJobTokenScope, super().get(**kwargs))
38
+
39
+
40
+ class AllowlistProject(ObjectDeleteMixin, RESTObject):
41
+ _id_attr = "target_project_id" # note: only true for create endpoint
42
+
43
+ def get_id(self) -> int:
44
+ """Returns the id of the resource. This override deals with
45
+ the fact that either an `id` or a `target_project_id` attribute
46
+ is returned by the server depending on the endpoint called."""
47
+ target_project_id = cast(int, super().get_id())
48
+ if target_project_id is not None:
49
+ return target_project_id
50
+ return cast(int, self.id)
51
+
52
+
53
+ class AllowlistProjectManager(ListMixin, CreateMixin, DeleteMixin, RESTManager):
54
+ _path = "/projects/{project_id}/job_token_scope/allowlist"
55
+ _obj_cls = AllowlistProject
56
+ _from_parent_attrs = {"project_id": "project_id"}
57
+ _create_attrs = RequiredOptional(required=("target_project_id",))
58
+
59
+
60
+ class AllowlistGroup(ObjectDeleteMixin, RESTObject):
61
+ _id_attr = "target_group_id" # note: only true for create endpoint
62
+
63
+ def get_id(self) -> int:
64
+ """Returns the id of the resource. This override deals with
65
+ the fact that either an `id` or a `target_group_id` attribute
66
+ is returned by the server depending on the endpoint called."""
67
+ target_group_id = cast(int, super().get_id())
68
+ if target_group_id is not None:
69
+ return target_group_id
70
+ return cast(int, self.id)
71
+
72
+
73
+ class AllowlistGroupManager(ListMixin, CreateMixin, DeleteMixin, RESTManager):
74
+ _path = "/projects/{project_id}/job_token_scope/groups_allowlist"
75
+ _obj_cls = AllowlistGroup
76
+ _from_parent_attrs = {"project_id": "project_id"}
77
+ _create_attrs = RequiredOptional(required=("target_group_id",))
gitlab/v4/objects/jobs.py CHANGED
@@ -65,7 +65,10 @@ class ProjectJob(RefreshMixin, RESTObject):
65
65
  GitlabJobPlayError: If the job could not be triggered
66
66
  """
67
67
  path = f"{self.manager.path}/{self.encoded_id}/play"
68
- self.manager.gitlab.http_post(path, **kwargs)
68
+ result = self.manager.gitlab.http_post(path, **kwargs)
69
+ if TYPE_CHECKING:
70
+ assert isinstance(result, dict)
71
+ self._update_attrs(result)
69
72
 
70
73
  @cli.register_custom_action("ProjectJob")
71
74
  @exc.on_http_error(exc.GitlabJobEraseError)
@@ -1,4 +1,4 @@
1
- from typing import Any, cast, Dict, List, Optional, TYPE_CHECKING, Union
1
+ from typing import Any, cast, List, Optional, TYPE_CHECKING, Union
2
2
 
3
3
  from gitlab import exceptions as exc
4
4
  from gitlab.base import RESTManager, RESTObject
@@ -132,42 +132,16 @@ class ProjectMergeRequestApprovalManager(GetWithoutIdMixin, UpdateMixin, RESTMan
132
132
 
133
133
  class ProjectMergeRequestApprovalRule(SaveMixin, ObjectDeleteMixin, RESTObject):
134
134
  _repr_attr = "name"
135
- id: int
136
- approval_rule_id: int
137
- merge_request_iid: int
138
-
139
- @exc.on_http_error(exc.GitlabUpdateError)
140
- def save(self, **kwargs: Any) -> None:
141
- """Save the changes made to the object to the server.
142
-
143
- The object is updated to match what the server returns.
144
-
145
- Args:
146
- **kwargs: Extra options to send to the server (e.g. sudo)
147
-
148
- Raise:
149
- GitlabAuthenticationError: If authentication is not correct
150
- GitlabUpdateError: If the server cannot perform the request
151
- """
152
- # There is a mismatch between the name of our id attribute and the put
153
- # REST API name for the project_id, so we override it here.
154
- self.approval_rule_id = self.id
155
- self.merge_request_iid = self._parent_attrs["mr_iid"]
156
- self.id = self._parent_attrs["project_id"]
157
- # save will update self.id with the result from the server, so no need
158
- # to overwrite with what it was before we overwrote it.
159
- SaveMixin.save(self, **kwargs)
160
135
 
161
136
 
162
137
  class ProjectMergeRequestApprovalRuleManager(CRUDMixin, RESTManager):
163
- _path = "/projects/{project_id}/merge_requests/{mr_iid}/approval_rules"
138
+ _path = "/projects/{project_id}/merge_requests/{merge_request_iid}/approval_rules"
164
139
  _obj_cls = ProjectMergeRequestApprovalRule
165
- _from_parent_attrs = {"project_id": "project_id", "mr_iid": "iid"}
140
+ _from_parent_attrs = {"project_id": "project_id", "merge_request_iid": "iid"}
166
141
  _update_attrs = RequiredOptional(
167
142
  required=(
168
143
  "id",
169
144
  "merge_request_iid",
170
- "approval_rule_id",
171
145
  "name",
172
146
  "approvals_required",
173
147
  ),
@@ -177,7 +151,7 @@ class ProjectMergeRequestApprovalRuleManager(CRUDMixin, RESTManager):
177
151
  # groups of project-level rule will be copied. The approvals_required
178
152
  # specified will be used.
179
153
  _create_attrs = RequiredOptional(
180
- required=("id", "merge_request_iid", "name", "approvals_required"),
154
+ required=("name", "approvals_required"),
181
155
  optional=("approval_project_rule_id", "user_ids", "group_ids"),
182
156
  )
183
157
 
@@ -188,32 +162,6 @@ class ProjectMergeRequestApprovalRuleManager(CRUDMixin, RESTManager):
188
162
  ProjectMergeRequestApprovalRule, super().get(id=id, lazy=lazy, **kwargs)
189
163
  )
190
164
 
191
- def create(
192
- self, data: Optional[Dict[str, Any]] = None, **kwargs: Any
193
- ) -> RESTObject:
194
- """Create a new object.
195
-
196
- Args:
197
- data: Parameters to send to the server to create the
198
- resource
199
- **kwargs: Extra options to send to the server (e.g. sudo or
200
- 'ref_name', 'stage', 'name', 'all')
201
-
202
- Raises:
203
- GitlabAuthenticationError: If authentication is not correct
204
- GitlabCreateError: If the server cannot perform the request
205
-
206
- Returns:
207
- A new instance of the manage object class build with
208
- the data sent by the server
209
- """
210
- if TYPE_CHECKING:
211
- assert data is not None
212
- new_data = data.copy()
213
- new_data["id"] = self._from_parent_attrs["project_id"]
214
- new_data["merge_request_iid"] = self._from_parent_attrs["mr_iid"]
215
- return CreateMixin.create(self, new_data, **kwargs)
216
-
217
165
 
218
166
  class ProjectMergeRequestApprovalState(RESTObject):
219
167
  pass
@@ -3,6 +3,7 @@ GitLab API:
3
3
  https://docs.gitlab.com/ee/api/merge_requests.html
4
4
  https://docs.gitlab.com/ee/api/merge_request_approvals.html
5
5
  """
6
+
6
7
  from typing import Any, cast, Dict, Optional, TYPE_CHECKING, Union
7
8
 
8
9
  import requests
@@ -42,6 +43,7 @@ from .merge_request_approvals import ( # noqa: F401
42
43
  )
43
44
  from .notes import ProjectMergeRequestNoteManager # noqa: F401
44
45
  from .pipelines import ProjectMergeRequestPipelineManager # noqa: F401
46
+ from .reviewers import ProjectMergeRequestReviewerDetailManager
45
47
 
46
48
  __all__ = [
47
49
  "MergeRequest",
@@ -164,6 +166,7 @@ class ProjectMergeRequest(
164
166
  resourcelabelevents: ProjectMergeRequestResourceLabelEventManager
165
167
  resourcemilestoneevents: ProjectMergeRequestResourceMilestoneEventManager
166
168
  resourcestateevents: ProjectMergeRequestResourceStateEventManager
169
+ reviewer_details: ProjectMergeRequestReviewerDetailManager
167
170
 
168
171
  @cli.register_custom_action("ProjectMergeRequest")
169
172
  @exc.on_http_error(exc.GitlabMROnBuildSuccessError)
@@ -1,7 +1,14 @@
1
1
  from typing import Any, cast, Union
2
2
 
3
3
  from gitlab.base import RESTManager, RESTObject
4
- from gitlab.mixins import CreateMixin, DeleteMixin, ObjectDeleteMixin, RetrieveMixin
4
+ from gitlab.mixins import (
5
+ CreateMixin,
6
+ DeleteMixin,
7
+ ObjectDeleteMixin,
8
+ ObjectRotateMixin,
9
+ RetrieveMixin,
10
+ RotateMixin,
11
+ )
5
12
  from gitlab.types import ArrayAttribute, RequiredOptional
6
13
 
7
14
  __all__ = [
@@ -12,11 +19,11 @@ __all__ = [
12
19
  ]
13
20
 
14
21
 
15
- class PersonalAccessToken(ObjectDeleteMixin, RESTObject):
22
+ class PersonalAccessToken(ObjectDeleteMixin, ObjectRotateMixin, RESTObject):
16
23
  pass
17
24
 
18
25
 
19
- class PersonalAccessTokenManager(DeleteMixin, RetrieveMixin, RESTManager):
26
+ class PersonalAccessTokenManager(DeleteMixin, RetrieveMixin, RotateMixin, RESTManager):
20
27
  _path = "/personal_access_tokens"
21
28
  _obj_cls = PersonalAccessToken
22
29
  _list_filters = ("user_id",)
@@ -17,7 +17,7 @@ from gitlab.mixins import (
17
17
  SaveMixin,
18
18
  UpdateMixin,
19
19
  )
20
- from gitlab.types import RequiredOptional
20
+ from gitlab.types import ArrayAttribute, RequiredOptional
21
21
 
22
22
  __all__ = [
23
23
  "ProjectMergeRequestPipeline",
@@ -149,6 +149,7 @@ class ProjectPipelineJobManager(ListMixin, RESTManager):
149
149
  _obj_cls = ProjectPipelineJob
150
150
  _from_parent_attrs = {"project_id": "project_id", "pipeline_id": "id"}
151
151
  _list_filters = ("scope", "include_retried")
152
+ _types = {"scope": ArrayAttribute}
152
153
 
153
154
 
154
155
  class ProjectPipelineBridge(RESTObject):
@@ -1,5 +1,14 @@
1
+ from typing import Any, cast, Union
2
+
1
3
  from gitlab.base import RESTManager, RESTObject
2
- from gitlab.mixins import CreateMixin, DeleteMixin, ListMixin, ObjectDeleteMixin
4
+ from gitlab.mixins import (
5
+ CreateMixin,
6
+ DeleteMixin,
7
+ ObjectDeleteMixin,
8
+ ObjectRotateMixin,
9
+ RetrieveMixin,
10
+ RotateMixin,
11
+ )
3
12
  from gitlab.types import ArrayAttribute, RequiredOptional
4
13
 
5
14
  __all__ = [
@@ -8,11 +17,13 @@ __all__ = [
8
17
  ]
9
18
 
10
19
 
11
- class ProjectAccessToken(ObjectDeleteMixin, RESTObject):
20
+ class ProjectAccessToken(ObjectDeleteMixin, ObjectRotateMixin, RESTObject):
12
21
  pass
13
22
 
14
23
 
15
- class ProjectAccessTokenManager(ListMixin, CreateMixin, DeleteMixin, RESTManager):
24
+ class ProjectAccessTokenManager(
25
+ CreateMixin, DeleteMixin, RetrieveMixin, RotateMixin, RESTManager
26
+ ):
16
27
  _path = "/projects/{project_id}/access_tokens"
17
28
  _obj_cls = ProjectAccessToken
18
29
  _from_parent_attrs = {"project_id": "id"}
@@ -20,3 +31,8 @@ class ProjectAccessTokenManager(ListMixin, CreateMixin, DeleteMixin, RESTManager
20
31
  required=("name", "scopes"), optional=("access_level", "expires_at")
21
32
  )
22
33
  _types = {"scopes": ArrayAttribute}
34
+
35
+ def get(
36
+ self, id: Union[str, int], lazy: bool = False, **kwargs: Any
37
+ ) -> ProjectAccessToken:
38
+ return cast(ProjectAccessToken, super().get(id=id, lazy=lazy, **kwargs))
@@ -2,6 +2,7 @@
2
2
  GitLab API:
3
3
  https://docs.gitlab.com/ee/api/projects.html
4
4
  """
5
+
5
6
  from typing import (
6
7
  Any,
7
8
  Callable,
@@ -3,6 +3,7 @@ GitLab API: https://docs.gitlab.com/ee/api/repositories.html
3
3
 
4
4
  Currently this module only contains repository-related methods for projects.
5
5
  """
6
+
6
7
  from typing import Any, Callable, Dict, Iterator, List, Optional, TYPE_CHECKING, Union
7
8
 
8
9
  import requests
@@ -0,0 +1,17 @@
1
+ from gitlab.base import RESTManager, RESTObject
2
+ from gitlab.mixins import ListMixin
3
+
4
+ __all__ = [
5
+ "ProjectMergeRequestReviewerDetail",
6
+ "ProjectMergeRequestReviewerDetailManager",
7
+ ]
8
+
9
+
10
+ class ProjectMergeRequestReviewerDetail(RESTObject):
11
+ pass
12
+
13
+
14
+ class ProjectMergeRequestReviewerDetailManager(ListMixin, RESTManager):
15
+ _path = "/projects/{project_id}/merge_requests/{mr_iid}/reviewers"
16
+ _obj_cls = ProjectMergeRequestReviewerDetail
17
+ _from_parent_attrs = {"project_id": "project_id", "mr_iid": "iid"}
@@ -2,6 +2,7 @@
2
2
  GitLab API:
3
3
  https://docs.gitlab.com/ee/api/secure_files.html
4
4
  """
5
+
5
6
  from typing import Any, Callable, cast, Iterator, Optional, TYPE_CHECKING, Union
6
7
 
7
8
  import requests
@@ -3,6 +3,7 @@ GitLab API:
3
3
  https://docs.gitlab.com/ee/api/users.html
4
4
  https://docs.gitlab.com/ee/api/projects.html#list-projects-starred-by-a-user
5
5
  """
6
+
6
7
  from typing import Any, cast, Dict, List, Optional, Union
7
8
 
8
9
  import requests
@@ -4,6 +4,7 @@ https://docs.gitlab.com/ee/api/instance_level_ci_variables.html
4
4
  https://docs.gitlab.com/ee/api/project_level_variables.html
5
5
  https://docs.gitlab.com/ee/api/group_level_variables.html
6
6
  """
7
+
7
8
  from typing import Any, cast, Union
8
9
 
9
10
  from gitlab.base import RESTManager, RESTObject
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: python-gitlab
3
- Version: 4.3.0
3
+ Version: 4.5.0
4
4
  Summary: A python wrapper for the GitLab API
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>
@@ -149,6 +149,23 @@ You can also mount your own config file:
149
149
 
150
150
  $ docker run -it --rm -v /path/to/python-gitlab.cfg:/etc/python-gitlab.cfg registry.gitlab.com/python-gitlab/python-gitlab:latest <command> ...
151
151
 
152
+ Usage inside GitLab CI
153
+ ~~~~~~~~~~~~~~~~~~~~~~
154
+
155
+ If you want to use the Docker image directly inside your GitLab CI as an ``image``, you will need to override
156
+ the ``entrypoint``, `as noted in the official GitLab documentation <https://docs.gitlab.com/ee/ci/docker/using_docker_images.html#override-the-entrypoint-of-an-image>`__:
157
+
158
+ .. code-block:: yaml
159
+
160
+ Job Name:
161
+ image:
162
+ name: registry.gitlab.com/python-gitlab/python-gitlab:latest
163
+ entrypoint: [""]
164
+ before_script:
165
+ gitlab --version
166
+ script:
167
+ gitlab <command>
168
+
152
169
  Building the image
153
170
  ~~~~~~~~~~~~~~~~~~
154
171
 
@@ -1,31 +1,31 @@
1
1
  gitlab/__init__.py,sha256=bd8BSLyUUjtHMKtzmf-T5855W6FUHcuhIwx2hNu0w2o,1382
2
2
  gitlab/__main__.py,sha256=HTesNl0UAU6mPb9EXWkTKMy6Q6pAUxGi3iPnDHTE2uE,68
3
- gitlab/_version.py,sha256=EnVL4HosnyAh08nMliUnbiw04xwCLxEzUAq5bg-eHH0,249
3
+ gitlab/_version.py,sha256=IKQR7Eu8OdIn6KAmeOAIMU63Gvw3qzz4NlpqABZihBw,249
4
4
  gitlab/base.py,sha256=5cotawlHD01Vw88aN4o7wNIhDyk_bmcwubX4mbOpnVo,13780
5
- gitlab/cli.py,sha256=MwQVrmakE3LCgyfHHXINebuSVBlDhACv6T4GepnYCXE,12215
6
- gitlab/client.py,sha256=oRy02BFKd4RoCzybH0NbGryRw3UkaRa3BR0aNoxSKIc,48756
5
+ gitlab/cli.py,sha256=ddb3GPxOmxzaXahtvPKLw_mdgvXZWXNECyAMjgtjhwE,12870
6
+ gitlab/client.py,sha256=U5Q7yzapLyaDxxVvv5KCGlnYG9_K7YfD1senumyDh1Y,48755
7
7
  gitlab/config.py,sha256=T1DgUXD0-MN2qNszrv-SO5d4uy0FITnNN0vWJgOt2yo,9088
8
8
  gitlab/const.py,sha256=rtPU-fxVSOvgpueoQVTvZGQp6iAZ-aa3nsY4RcSs_M4,5352
9
- gitlab/exceptions.py,sha256=4CC99arH58PGH8cd7eCiFEVjjcw8CRmc1VFmChjqM1k,8220
10
- gitlab/mixins.py,sha256=bCa_sI4wbdDrugoMy17ouLeNL5i19hJBsqbSz2QAiP8,34376
9
+ gitlab/exceptions.py,sha256=Ruz9LusKMRu6SyV1vXpOu_UTCi3XU64A9BeHsqKASOw,8303
10
+ gitlab/mixins.py,sha256=whh6_Wq2Y9xWuyhIczfT9EdFVXIeA88LmAH0nsLNQ6A,36350
11
11
  gitlab/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  gitlab/types.py,sha256=lepiiI_YOr94B4koqIHuY70tszZC_X3YW4lDvbadbI8,3312
13
- gitlab/utils.py,sha256=Ppip4O1MsiNeddyWV4JZR9SNhgIag5MieN58ozoTAgo,6391
13
+ gitlab/utils.py,sha256=PNf4GT25MzgFIYa3e9_7FxleUYPqkt8DRPe4tYc0vUI,6396
14
14
  gitlab/_backends/__init__.py,sha256=WalQZRIDzw19FuNxraG7fvck6ddg4cdNd3bi53QKvZM,392
15
- gitlab/_backends/protocol.py,sha256=0pR5YdAvwuXlhpCeROF4EVaNxYFChBSaRDCHJvki3Lo,858
15
+ gitlab/_backends/protocol.py,sha256=m5qSz1o3i0H4XJCWnqx0wIFilOIU9cKxzFsYxLL6Big,842
16
16
  gitlab/_backends/requests_backend.py,sha256=CrSDTfkvi17dT4kTU8R3qQFBNCPJqEfBJq4gJ2GXleA,5534
17
17
  gitlab/v4/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- gitlab/v4/cli.py,sha256=YZ_UsSJ9K0jNBSVoVDpkXaUXnKlG-tibT4Rz31AJGbc,20962
19
- gitlab/v4/objects/__init__.py,sha256=BAmc0kwpQzWcqCZXo8MUfn7jK-i4Iodg4qZNlAIdgsM,1933
18
+ gitlab/v4/cli.py,sha256=IIc9wwRluD0Bo1KWRA7ZhwbWQvYBIhGy3fOYI7vYAKY,21455
19
+ gitlab/v4/objects/__init__.py,sha256=GvOZZN1lAA3FLSKbqf6nCKWVfdLqcYF_OFPql5ylPJI,1958
20
20
  gitlab/v4/objects/access_requests.py,sha256=pPYwB-b4fvKVdBoBRpzx2ensiMXbQwmBkN0XBh6ScaA,923
21
21
  gitlab/v4/objects/appearance.py,sha256=uMt0bjo_KlxwKHItFzGMY9vXm5e489UG_o0EcFVJE8E,1932
22
22
  gitlab/v4/objects/applications.py,sha256=FB1Se6Xa3CFLJlSeZ7lLoyAwY8cAF4DUDsuc59NGpcs,591
23
- gitlab/v4/objects/artifacts.py,sha256=RTOhaZXcdMJRNdtc096Okf3xShnwmFpxsBtPzh4U6dc,5020
24
- gitlab/v4/objects/audit_events.py,sha256=AFg-bHRxAqdtZAm2Nvpv4NLjxXmOMEeySURgL4oQmG4,1909
23
+ gitlab/v4/objects/artifacts.py,sha256=M-HQRqvnHcnyhrT7mPQMQ0WChVjQ2wQtTq_hJpKlKb8,5025
24
+ gitlab/v4/objects/audit_events.py,sha256=OPhGt3br-pOyqMGUvXKAVuBvEz9_TQttBfOnjytAtJY,1910
25
25
  gitlab/v4/objects/award_emojis.py,sha256=ASgIh4475tf1pq2xBHP2bYgKoQoP6UxgoZUHT65iYPM,5881
26
26
  gitlab/v4/objects/badges.py,sha256=wtL7u7qQ01vwUIpA_9RsztAWsVSNLnPsov9VAYyagLQ,1464
27
27
  gitlab/v4/objects/boards.py,sha256=J6ZeMELZXPzhd0obVZozTkAKXm-ivyQkLCjktwUDEkw,2680
28
- gitlab/v4/objects/branches.py,sha256=tie0dVxBkULHg8ntPSJyWE5Sk1eH88GOWRNBcFLatqU,1706
28
+ gitlab/v4/objects/branches.py,sha256=DgVwmi5CK9hW2ocGSdd-c71oDrq4WrOVEp0421S_iuY,1814
29
29
  gitlab/v4/objects/broadcast_messages.py,sha256=EtjzOFwIsjqZe5jaPwYMdUa1QjNcWfoCl6-M363HJbI,1103
30
30
  gitlab/v4/objects/bulk_imports.py,sha256=rexiCZiZLRdzDlFqRjW4MN8JGfbaYV71s1BxKZx3JQs,1573
31
31
  gitlab/v4/objects/ci_lint.py,sha256=h5z9gONn1iRTNR85GrLgPMTlp-3vY7g4mqecG4IF_WQ,2270
@@ -35,31 +35,31 @@ gitlab/v4/objects/container_registry.py,sha256=O6_fsdf0y8EG9fSeeDiazwenZbRlqlR2d
35
35
  gitlab/v4/objects/custom_attributes.py,sha256=48HKZ2C65UUU65FdvKrefFzRMVKRbG-rl58OE9FAuyI,1875
36
36
  gitlab/v4/objects/deploy_keys.py,sha256=muym5Y-s60kdft06MUbfPoNE9M8Isees1oR4t3_vl4c,1826
37
37
  gitlab/v4/objects/deploy_tokens.py,sha256=SEVSCr9D7LBj7qoE_D1-wK4pr2daFsVwBbhpm4m1Ey0,2110
38
- gitlab/v4/objects/deployments.py,sha256=wA1WsOtdCnWT1wF12FHkiscNCYBPAHVsWg3EBKgn25M,2879
38
+ gitlab/v4/objects/deployments.py,sha256=u4i3xf6utOqSuyaJ7HaHG-xrQ_T-ybB4hFZpI57HLY0,2880
39
39
  gitlab/v4/objects/discussions.py,sha256=LK-nyJx0ncevYXehiI4gyUQCrY3feZ5mUK6HpqhCeDU,3457
40
40
  gitlab/v4/objects/draft_notes.py,sha256=wMHm5eIgv-KlHlXf14s4mMKxZRi82WelAQ7HRHKtrIA,1450
41
41
  gitlab/v4/objects/environments.py,sha256=R5emAaZJkWnpqgb2ZR6BRxvI6RigRJKZtwc74-dYU_o,2726
42
42
  gitlab/v4/objects/epics.py,sha256=HKLpEL7_K54M6prGjga3qw5VfI2ZGGxBbfz42Oumvr0,4150
43
43
  gitlab/v4/objects/events.py,sha256=20yCSlR9XB75AwMzatmAt4VdT9PL2nX0t1p1sAWbrvI,7067
44
44
  gitlab/v4/objects/export_import.py,sha256=XVmrSq_qHwQr3XamFPfISEXnlBd-icJRm2CCa3V2puY,1909
45
- gitlab/v4/objects/features.py,sha256=65plz5Xy2wFKnHA6aBNV8eun2A2WrPTpoIqahOCBQSs,1972
45
+ gitlab/v4/objects/features.py,sha256=N7T52I2JyNIgD1JejrSr8fNa14ZlAUxrS2VceUekhj0,1973
46
46
  gitlab/v4/objects/files.py,sha256=kFSc2wNPgFxoheHO2tcrLn63v1GfNUagUvQhMSdW458,10283
47
47
  gitlab/v4/objects/geo_nodes.py,sha256=AWLZUMLR-rxqGz9pM_ysIEPeJUT8Zmser0hBbXj11CA,3646
48
- gitlab/v4/objects/group_access_tokens.py,sha256=Bj9JaRkNXPZcd5JzIPmuR690j8hY7Tk8ZUaASSx5cy4,690
48
+ gitlab/v4/objects/group_access_tokens.py,sha256=EijY0sfsp0Gtx_q4JLBeLL3jphx5b_6-nTzKxV272jc,1023
49
49
  gitlab/v4/objects/groups.py,sha256=tyEcWa60OAnfp-rr8pLbokKgPXVRZduexWUVnCdNN-I,15672
50
50
  gitlab/v4/objects/hooks.py,sha256=1uDYi09GOmgR6t7gVT06CeMGL0ZZ1N5swz1KMtsybDk,3598
51
51
  gitlab/v4/objects/integrations.py,sha256=26lk0pgwijhvaHfVPkLV_gTgRTuKVQh1Ji8NdyfV9_w,9205
52
52
  gitlab/v4/objects/invitations.py,sha256=ya9x7xhL1oSbx-FLJud-lHKmbYQoTplZlAbjsZip2CI,2734
53
53
  gitlab/v4/objects/issues.py,sha256=GnvwNEk5Egsb18wtjnfkLPYTcYce4oefZkJOEFjNIpo,10162
54
54
  gitlab/v4/objects/iterations.py,sha256=vtxrq8uFRTKvhUzJIyVi2TV2wod52I1JMejLCPXp3CI,718
55
- gitlab/v4/objects/job_token_scope.py,sha256=UOUlfC2RorvT7diPoJtQalnwr48ytulaevVCt2FFPrA,745
56
- gitlab/v4/objects/jobs.py,sha256=Fix4lnAE8PU4IchP2CjNJsr0vN70QVj6Ss-mbNTdlgg,9025
55
+ gitlab/v4/objects/job_token_scope.py,sha256=J69VVjtRgnTYQrFHFxOWQv3T2s6XRxb7uz57IAhnsdU,2622
56
+ gitlab/v4/objects/jobs.py,sha256=85i68QXwfUOQ-lrqQaH1Q0Ksujz-QLZh0-7zYBZIstU,9139
57
57
  gitlab/v4/objects/keys.py,sha256=IclYGSzcVEZPIhDdIz-p16rvb68FnBTgAf1cWCXWjkY,882
58
58
  gitlab/v4/objects/labels.py,sha256=JvOciJ6V76pF9HuJp5OT_Ykq8oqaa6ItxvpKf3hiEzs,4736
59
59
  gitlab/v4/objects/ldap.py,sha256=adpkdfk7VBjshuh8SpCsc77Pax4QgqCx1N12CuzitDE,1662
60
60
  gitlab/v4/objects/members.py,sha256=knzhMYLqaKWAUbTX4QAowMmtMirU2Kizt85zZRcpgmA,3836
61
- gitlab/v4/objects/merge_request_approvals.py,sha256=lxNu-pzuIdfvC4CUhwl47GIhW2Ek_IJFImPNamYAEgM,8181
62
- gitlab/v4/objects/merge_requests.py,sha256=7xzHeUpXVvhyE_ZfEFqtV051ut-xO_s_6IfrMeaFq2o,17178
61
+ gitlab/v4/objects/merge_request_approvals.py,sha256=eI5Qll2JYBqaIj9v1nrhSbVyF_NEVk9_wLFv0bZlc1U,6146
62
+ gitlab/v4/objects/merge_requests.py,sha256=vNjC5fn3bJeIWJTUGlXF_CAtGJWbuA348LQpLzetE4o,17306
63
63
  gitlab/v4/objects/merge_trains.py,sha256=e0Gp2Ri75elcG_r9w8qxdrcWW_YiebPRwUYIH5od8kc,422
64
64
  gitlab/v4/objects/milestones.py,sha256=NhondaCyl7_UmaZYv--IpFADHz5hDHYhcK1EKdl3pII,7033
65
65
  gitlab/v4/objects/namespaces.py,sha256=FhxumYKpw6OKte7nEkN6EQxIVQggdhQ546nD93LYAiE,1502
@@ -67,16 +67,17 @@ gitlab/v4/objects/notes.py,sha256=Y0wrSD2pwvzX1RfyzyeXMMBy0_jOsWsaIUpa6CYWprg,85
67
67
  gitlab/v4/objects/notification_settings.py,sha256=zhltGjuu1HiqdON2v9-uKu7Z6TOOBOgQ3GdWgfEAJ64,2061
68
68
  gitlab/v4/objects/packages.py,sha256=ZI0H6omYNtffGqWOO3RzxQnRyjUlvynQ8rYNyfzXVBw,7187
69
69
  gitlab/v4/objects/pages.py,sha256=o6EHYJa-4qo8-IolppZk5Y5o64CAIlLceW2LPNR3nM4,1141
70
- gitlab/v4/objects/personal_access_tokens.py,sha256=5ynVC-tdi3U4hZSMBJfJsQeEh5PbxVF6LxnW00H8Te8,1222
71
- gitlab/v4/objects/pipelines.py,sha256=wOSbwULKHVQuoRcoFw-hwkmoZz08LVs2IFNSef9sJhg,9723
72
- gitlab/v4/objects/project_access_tokens.py,sha256=I730Y14izzXLbcuhxHbxzASt00i-EUKqb7ynicTP99o,706
73
- gitlab/v4/objects/projects.py,sha256=RFfIZQsM3DztpqHSjQpzgDaL1BMYiFZIBNbJlH0t_gE,44126
70
+ gitlab/v4/objects/personal_access_tokens.py,sha256=vMsAytE5czai3fpyTCyV1sR3cZDZRhvI06u08L8O7mw,1315
71
+ gitlab/v4/objects/pipelines.py,sha256=A2sbneq5IDS_huHDPQuplloRLZpQV9mTzsmpouwrR8Q,9778
72
+ gitlab/v4/objects/project_access_tokens.py,sha256=z_BCaBtXC7wzGVN6Ip0H72VwHID8XEBHDddCw0J8hO0,1043
73
+ gitlab/v4/objects/projects.py,sha256=S6M6bmXf1CATRMHlD2chpuJG_nnwDTMZ-Gv6Hwm0IMM,44127
74
74
  gitlab/v4/objects/push_rules.py,sha256=0dKMWEzF5h1zATh0_j_SvjQ7HKx9_5M7J9hzDGB66Rc,3041
75
75
  gitlab/v4/objects/releases.py,sha256=j4_45oOj2yaA2XZ3fwBcKhFJ6li4vQy_zyr013LKfvY,1972
76
- gitlab/v4/objects/repositories.py,sha256=A4Dtr8fay_LBUImdtVEkp7c5P2mjgE8SYItKCEM6a8Y,11047
76
+ gitlab/v4/objects/repositories.py,sha256=td4wMPMEpdJAS_4maQ1zBXf23Luv0hOBsChpzTPY-D0,11048
77
77
  gitlab/v4/objects/resource_groups.py,sha256=fYYnA2YO9CSTzxwImVCVPSiPkIeNpKRrPj7dpzwati4,1427
78
+ gitlab/v4/objects/reviewers.py,sha256=HTU8hw09fRofvoj5V4kde1PLK3QSe1uY3BVUtxOvJ00,517
78
79
  gitlab/v4/objects/runners.py,sha256=y20HG1l3h6o5rPyPWdyeBfWPrfbpBZ_B2FEbBRYxvws,4883
79
- gitlab/v4/objects/secure_files.py,sha256=1dgocFufMlR2b270YsUGPgIl_efosqPfh_leOWpUNuc,2510
80
+ gitlab/v4/objects/secure_files.py,sha256=UAjPmjwGiCxkzTXXr2dxSaCCMbHab_pPGYPM2Vx3pzA,2511
80
81
  gitlab/v4/objects/settings.py,sha256=LTkdyhhU2MTA15EJw2lZeqDKfK_Bg65CV1CchPljrqY,4295
81
82
  gitlab/v4/objects/sidekiq.py,sha256=DD1XKrV5uaZIcWpwxRAsfVhn3NR9MPEnWbgwG-hBWMw,2956
82
83
  gitlab/v4/objects/snippets.py,sha256=rNpHJXBLa8bEC-lHuMhC56lt8IfRNl8BqPG_4RTCV_M,6018
@@ -86,13 +87,13 @@ gitlab/v4/objects/templates.py,sha256=DWbb46-SiusrbW7OuMfBJLrH0rqpRV0G6gzFLbaLpO
86
87
  gitlab/v4/objects/todos.py,sha256=WOLycLoNlRcwxczpLiUjTowGFcndXe20OQsAV0cEV00,1826
87
88
  gitlab/v4/objects/topics.py,sha256=24QtZfMcTjFZacLF6GVhdvb267n_ScXQjYfa3Ru_sd4,2199
88
89
  gitlab/v4/objects/triggers.py,sha256=UAERq_C-QdPBbBQPHLh5IfhpkdDeIxdnVGPHfu9Qy5Y,824
89
- gitlab/v4/objects/users.py,sha256=AavShuFgTH4cOHS1AWrv16_JPLvw2lESHYao_sxOnYc,21280
90
- gitlab/v4/objects/variables.py,sha256=BZ-DaASsguYKSp1wZ-vuuaUN8OUsMm9jMsAegl-URzc,2626
90
+ gitlab/v4/objects/users.py,sha256=jzT21VVGK3YCRKXEAGZ8HD2pOfeqX17AH4U3S1_H0fM,21281
91
+ gitlab/v4/objects/variables.py,sha256=S0Vz32jEpUbo4J2js8gMPPTVpcy1ge5FYVHLiPz9c-A,2627
91
92
  gitlab/v4/objects/wikis.py,sha256=JtI1cQqZV1_PRfKVlQRMh4LZjdxEfi9T2VuFYv6PrV8,1775
92
- python_gitlab-4.3.0.dist-info/AUTHORS,sha256=Z0P61GJSVnp7iFbRcMezhx3f4zMyPkVmG--TWaRo768,526
93
- python_gitlab-4.3.0.dist-info/COPYING,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
94
- python_gitlab-4.3.0.dist-info/METADATA,sha256=Cr5fgYDxcvCwvUfVeVbHqKnyxn_ra7l13yH6llNk-Ns,7668
95
- python_gitlab-4.3.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
96
- python_gitlab-4.3.0.dist-info/entry_points.txt,sha256=nhpKLLP_uQPFByn8UtE9zsvQQwa402t52o_Cw9IFXMo,43
97
- python_gitlab-4.3.0.dist-info/top_level.txt,sha256=MvIaP8p_Oaf4gO_hXmHkX-5y2deHLp1pe6tJR3ukQ6o,7
98
- python_gitlab-4.3.0.dist-info/RECORD,,
93
+ python_gitlab-4.5.0.dist-info/AUTHORS,sha256=Z0P61GJSVnp7iFbRcMezhx3f4zMyPkVmG--TWaRo768,526
94
+ python_gitlab-4.5.0.dist-info/COPYING,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651
95
+ python_gitlab-4.5.0.dist-info/METADATA,sha256=9UqlvS3C-cqrBkI6PzdG4RJfd6dsQ_lWdc-W_N9Q0fc,8229
96
+ python_gitlab-4.5.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
97
+ python_gitlab-4.5.0.dist-info/entry_points.txt,sha256=nhpKLLP_uQPFByn8UtE9zsvQQwa402t52o_Cw9IFXMo,43
98
+ python_gitlab-4.5.0.dist-info/top_level.txt,sha256=MvIaP8p_Oaf4gO_hXmHkX-5y2deHLp1pe6tJR3ukQ6o,7
99
+ python_gitlab-4.5.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
2
+ Generator: bdist_wheel (0.43.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5