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.
- gitlab/_backends/protocol.py +2 -4
- gitlab/_version.py +1 -1
- gitlab/cli.py +23 -5
- gitlab/client.py +0 -1
- gitlab/exceptions.py +5 -0
- gitlab/mixins.py +59 -0
- gitlab/utils.py +3 -3
- gitlab/v4/cli.py +9 -0
- gitlab/v4/objects/__init__.py +1 -0
- gitlab/v4/objects/artifacts.py +2 -1
- gitlab/v4/objects/audit_events.py +1 -0
- gitlab/v4/objects/branches.py +10 -3
- gitlab/v4/objects/deployments.py +1 -0
- gitlab/v4/objects/features.py +1 -0
- gitlab/v4/objects/group_access_tokens.py +19 -3
- gitlab/v4/objects/job_token_scope.py +48 -0
- gitlab/v4/objects/jobs.py +4 -1
- gitlab/v4/objects/merge_request_approvals.py +4 -56
- gitlab/v4/objects/merge_requests.py +3 -0
- gitlab/v4/objects/personal_access_tokens.py +10 -3
- gitlab/v4/objects/pipelines.py +2 -1
- gitlab/v4/objects/project_access_tokens.py +19 -3
- gitlab/v4/objects/projects.py +1 -0
- gitlab/v4/objects/repositories.py +1 -0
- gitlab/v4/objects/reviewers.py +17 -0
- gitlab/v4/objects/secure_files.py +1 -0
- gitlab/v4/objects/users.py +1 -0
- gitlab/v4/objects/variables.py +1 -0
- {python_gitlab-4.3.0.dist-info → python_gitlab-4.5.0.dist-info}/METADATA +18 -1
- {python_gitlab-4.3.0.dist-info → python_gitlab-4.5.0.dist-info}/RECORD +35 -34
- {python_gitlab-4.3.0.dist-info → python_gitlab-4.5.0.dist-info}/WHEEL +1 -1
- {python_gitlab-4.3.0.dist-info → python_gitlab-4.5.0.dist-info}/AUTHORS +0 -0
- {python_gitlab-4.3.0.dist-info → python_gitlab-4.5.0.dist-info}/COPYING +0 -0
- {python_gitlab-4.3.0.dist-info → python_gitlab-4.5.0.dist-info}/entry_points.txt +0 -0
- {python_gitlab-4.3.0.dist-info → python_gitlab-4.5.0.dist-info}/top_level.txt +0 -0
gitlab/_backends/protocol.py
CHANGED
@@ -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
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.
|
312
|
+
# path provided after @ as the real value.
|
313
|
+
filepath = pathlib.Path(v[1:]).expanduser().resolve()
|
302
314
|
try:
|
303
|
-
with open(
|
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
|
306
|
-
|
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
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
|
-
|
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
|
-
|
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]:
|
gitlab/v4/objects/__init__.py
CHANGED
gitlab/v4/objects/artifacts.py
CHANGED
@@ -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
|
-
|
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
|
gitlab/v4/objects/branches.py
CHANGED
@@ -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
|
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(
|
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
|
gitlab/v4/objects/deployments.py
CHANGED
gitlab/v4/objects/features.py
CHANGED
@@ -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
|
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(
|
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,
|
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/{
|
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", "
|
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=("
|
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
|
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",)
|
gitlab/v4/objects/pipelines.py
CHANGED
@@ -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
|
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(
|
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))
|
gitlab/v4/objects/projects.py
CHANGED
@@ -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"}
|
gitlab/v4/objects/users.py
CHANGED
gitlab/v4/objects/variables.py
CHANGED
@@ -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
|
+
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=
|
3
|
+
gitlab/_version.py,sha256=IKQR7Eu8OdIn6KAmeOAIMU63Gvw3qzz4NlpqABZihBw,249
|
4
4
|
gitlab/base.py,sha256=5cotawlHD01Vw88aN4o7wNIhDyk_bmcwubX4mbOpnVo,13780
|
5
|
-
gitlab/cli.py,sha256=
|
6
|
-
gitlab/client.py,sha256=
|
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=
|
10
|
-
gitlab/mixins.py,sha256=
|
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=
|
13
|
+
gitlab/utils.py,sha256=PNf4GT25MzgFIYa3e9_7FxleUYPqkt8DRPe4tYc0vUI,6396
|
14
14
|
gitlab/_backends/__init__.py,sha256=WalQZRIDzw19FuNxraG7fvck6ddg4cdNd3bi53QKvZM,392
|
15
|
-
gitlab/_backends/protocol.py,sha256=
|
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=
|
19
|
-
gitlab/v4/objects/__init__.py,sha256=
|
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=
|
24
|
-
gitlab/v4/objects/audit_events.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
56
|
-
gitlab/v4/objects/jobs.py,sha256=
|
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=
|
62
|
-
gitlab/v4/objects/merge_requests.py,sha256=
|
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=
|
71
|
-
gitlab/v4/objects/pipelines.py,sha256=
|
72
|
-
gitlab/v4/objects/project_access_tokens.py,sha256=
|
73
|
-
gitlab/v4/objects/projects.py,sha256=
|
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=
|
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=
|
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=
|
90
|
-
gitlab/v4/objects/variables.py,sha256=
|
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.
|
93
|
-
python_gitlab-4.
|
94
|
-
python_gitlab-4.
|
95
|
-
python_gitlab-4.
|
96
|
-
python_gitlab-4.
|
97
|
-
python_gitlab-4.
|
98
|
-
python_gitlab-4.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|