fluidattacks_gitlab_sdk 1.0.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.
- fluidattacks_gitlab_sdk/__init__.py +22 -0
- fluidattacks_gitlab_sdk/_decoders.py +170 -0
- fluidattacks_gitlab_sdk/_gql_client/__init__.py +8 -0
- fluidattacks_gitlab_sdk/_gql_client/_client.py +101 -0
- fluidattacks_gitlab_sdk/_gql_client/_error.py +24 -0
- fluidattacks_gitlab_sdk/_gql_client/_handlers.py +87 -0
- fluidattacks_gitlab_sdk/_handlers.py +40 -0
- fluidattacks_gitlab_sdk/_http_client/__init__.py +28 -0
- fluidattacks_gitlab_sdk/_http_client/_client_1.py +206 -0
- fluidattacks_gitlab_sdk/_http_client/_core.py +152 -0
- fluidattacks_gitlab_sdk/_logger.py +36 -0
- fluidattacks_gitlab_sdk/ids.py +135 -0
- fluidattacks_gitlab_sdk/issues/__init__.py +7 -0
- fluidattacks_gitlab_sdk/issues/_client/__init__.py +28 -0
- fluidattacks_gitlab_sdk/issues/_client/_decode.py +165 -0
- fluidattacks_gitlab_sdk/issues/_client/_get_issue.py +79 -0
- fluidattacks_gitlab_sdk/issues/_client/_most_recent.py +119 -0
- fluidattacks_gitlab_sdk/issues/_client/_updated_by.py +157 -0
- fluidattacks_gitlab_sdk/issues/core.py +99 -0
- fluidattacks_gitlab_sdk/members/__init__.py +25 -0
- fluidattacks_gitlab_sdk/members/_client.py +49 -0
- fluidattacks_gitlab_sdk/members/_decode.py +40 -0
- fluidattacks_gitlab_sdk/members/core.py +23 -0
- fluidattacks_gitlab_sdk/merge_requests/__init__.py +9 -0
- fluidattacks_gitlab_sdk/merge_requests/_client.py +265 -0
- fluidattacks_gitlab_sdk/merge_requests/_decode.py +234 -0
- fluidattacks_gitlab_sdk/merge_requests/core.py +137 -0
- fluidattacks_gitlab_sdk/milestones/__init__.py +4 -0
- fluidattacks_gitlab_sdk/milestones/_client.py +147 -0
- fluidattacks_gitlab_sdk/milestones/_decode.py +78 -0
- fluidattacks_gitlab_sdk/milestones/core.py +40 -0
- fluidattacks_gitlab_sdk/mr_approvals/__init__.py +4 -0
- fluidattacks_gitlab_sdk/mr_approvals/_client.py +69 -0
- fluidattacks_gitlab_sdk/mr_approvals/_decode.py +30 -0
- fluidattacks_gitlab_sdk/mr_approvals/core.py +25 -0
- fluidattacks_gitlab_sdk/py.typed +0 -0
- fluidattacks_gitlab_sdk/users/__init__.py +5 -0
- fluidattacks_gitlab_sdk/users/core.py +26 -0
- fluidattacks_gitlab_sdk/users/decode.py +25 -0
- fluidattacks_gitlab_sdk-1.0.0.dist-info/METADATA +13 -0
- fluidattacks_gitlab_sdk-1.0.0.dist-info/RECORD +42 -0
- fluidattacks_gitlab_sdk-1.0.0.dist-info/WHEEL +4 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
from __future__ import (
|
|
2
|
+
annotations,
|
|
3
|
+
)
|
|
4
|
+
|
|
5
|
+
import inspect
|
|
6
|
+
import logging
|
|
7
|
+
from dataclasses import (
|
|
8
|
+
dataclass,
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
from fa_purity import (
|
|
12
|
+
Cmd,
|
|
13
|
+
Coproduct,
|
|
14
|
+
CoproductFactory,
|
|
15
|
+
FrozenDict,
|
|
16
|
+
FrozenList,
|
|
17
|
+
Maybe,
|
|
18
|
+
NewFrozenList,
|
|
19
|
+
Result,
|
|
20
|
+
ResultE,
|
|
21
|
+
cast_exception,
|
|
22
|
+
)
|
|
23
|
+
from fa_purity.json import JsonObj, Primitive, UnfoldedFactory
|
|
24
|
+
from fluidattacks_etl_utils.bug import Bug
|
|
25
|
+
from fluidattacks_etl_utils.decode import int_to_str
|
|
26
|
+
|
|
27
|
+
from fluidattacks_gitlab_sdk._decoders import assert_multiple, decode_maybe_single
|
|
28
|
+
from fluidattacks_gitlab_sdk._handlers import NotFound, handle_not_found
|
|
29
|
+
from fluidattacks_gitlab_sdk._http_client import (
|
|
30
|
+
ClientFactory,
|
|
31
|
+
Credentials,
|
|
32
|
+
HttpJsonClient,
|
|
33
|
+
RelativeEndpoint,
|
|
34
|
+
)
|
|
35
|
+
from fluidattacks_gitlab_sdk.ids import MilestoneFullId, MilestoneInternalId, ProjectId
|
|
36
|
+
|
|
37
|
+
from ._decode import decode_milestone_and_id
|
|
38
|
+
from .core import Milestone, MilestoneClient
|
|
39
|
+
|
|
40
|
+
LOG = logging.getLogger(__name__)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def handler_empty(
|
|
44
|
+
item: Maybe[tuple[MilestoneFullId, Milestone]],
|
|
45
|
+
) -> Result[tuple[MilestoneFullId, Milestone], Coproduct[NotFound, Exception]]:
|
|
46
|
+
return item.to_coproduct().map(
|
|
47
|
+
Result.success,
|
|
48
|
+
lambda _: Result.failure(Coproduct.inl(NotFound(ValueError("Milestone Not Found")))),
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def handler_empty_two(
|
|
53
|
+
item: ResultE[Maybe[tuple[MilestoneFullId, Milestone]]],
|
|
54
|
+
) -> Result[tuple[MilestoneFullId, Milestone], Coproduct[NotFound, Exception]]:
|
|
55
|
+
factory: CoproductFactory[NotFound, Exception] = CoproductFactory()
|
|
56
|
+
return item.alt(lambda i: factory.inr(i)).bind(handler_empty)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def get_milestone(
|
|
60
|
+
client: HttpJsonClient,
|
|
61
|
+
project: ProjectId,
|
|
62
|
+
milestone_id: MilestoneInternalId,
|
|
63
|
+
) -> Cmd[Result[tuple[MilestoneFullId, Milestone], Coproduct[NotFound, Exception]]]:
|
|
64
|
+
endpoint = RelativeEndpoint.new(
|
|
65
|
+
"projects",
|
|
66
|
+
int_to_str(project.project_id.value),
|
|
67
|
+
f"milestones?iids[]={int_to_str(milestone_id.internal.value)}", # cspell:ignore iids
|
|
68
|
+
)
|
|
69
|
+
msg = Cmd.wrap_impure(lambda: LOG.info("[API] get_milestone(%s, %s)", project, milestone_id))
|
|
70
|
+
return msg + client.get(
|
|
71
|
+
endpoint,
|
|
72
|
+
FrozenDict({}),
|
|
73
|
+
).map(
|
|
74
|
+
lambda r: r.alt(
|
|
75
|
+
lambda e: e.map(handle_not_found, lambda e: Coproduct.inr(cast_exception(e))),
|
|
76
|
+
)
|
|
77
|
+
.bind(lambda v: assert_multiple(v).alt(Coproduct.inr))
|
|
78
|
+
.bind(lambda v: handler_empty_two(decode_milestone_and_id(v)))
|
|
79
|
+
.alt(
|
|
80
|
+
lambda c: c.map(
|
|
81
|
+
Coproduct.inl,
|
|
82
|
+
lambda e: Coproduct.inr(
|
|
83
|
+
Bug.new(
|
|
84
|
+
"_get_milestone",
|
|
85
|
+
inspect.currentframe(),
|
|
86
|
+
e,
|
|
87
|
+
(),
|
|
88
|
+
),
|
|
89
|
+
),
|
|
90
|
+
),
|
|
91
|
+
),
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def most_recent_milestone(
|
|
96
|
+
client: HttpJsonClient,
|
|
97
|
+
project: ProjectId,
|
|
98
|
+
) -> Cmd[ResultE[Maybe[tuple[MilestoneFullId, Milestone]]]]:
|
|
99
|
+
endpoint = RelativeEndpoint.new(
|
|
100
|
+
"projects",
|
|
101
|
+
int_to_str(project.project_id.value),
|
|
102
|
+
"milestones",
|
|
103
|
+
)
|
|
104
|
+
params: dict[str, Primitive] = {
|
|
105
|
+
"order_by": "created_at",
|
|
106
|
+
"sort": "desc",
|
|
107
|
+
"per_page": 1,
|
|
108
|
+
}
|
|
109
|
+
empty: Maybe[tuple[MilestoneFullId, Milestone]] = Maybe.empty()
|
|
110
|
+
return client.get(
|
|
111
|
+
endpoint,
|
|
112
|
+
UnfoldedFactory.from_dict(params),
|
|
113
|
+
).map(
|
|
114
|
+
lambda r: r.alt(
|
|
115
|
+
lambda e: cast_exception(
|
|
116
|
+
Bug.new(
|
|
117
|
+
"most_recent_milestone",
|
|
118
|
+
inspect.currentframe(),
|
|
119
|
+
e,
|
|
120
|
+
(),
|
|
121
|
+
),
|
|
122
|
+
),
|
|
123
|
+
)
|
|
124
|
+
.bind(assert_multiple)
|
|
125
|
+
.map(NewFrozenList)
|
|
126
|
+
.map(decode_maybe_single)
|
|
127
|
+
.bind(
|
|
128
|
+
lambda m: m.to_coproduct().map(
|
|
129
|
+
lambda r: decode_milestone_and_id(FrozenList[JsonObj]((r,))),
|
|
130
|
+
lambda _: Result.success(empty),
|
|
131
|
+
),
|
|
132
|
+
),
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def _from_client(client: HttpJsonClient) -> MilestoneClient:
|
|
137
|
+
return MilestoneClient(
|
|
138
|
+
lambda p, i: get_milestone(client, p, i),
|
|
139
|
+
lambda p: most_recent_milestone(client, p),
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
@dataclass(frozen=True)
|
|
144
|
+
class MilestoneFactory:
|
|
145
|
+
@staticmethod
|
|
146
|
+
def new(creds: Credentials) -> MilestoneClient:
|
|
147
|
+
return _from_client(ClientFactory.new(creds))
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import inspect
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
from fa_purity import FrozenList, Maybe, Result, ResultE
|
|
5
|
+
from fa_purity.json import JsonObj, JsonUnfolder
|
|
6
|
+
from fluidattacks_etl_utils import smash
|
|
7
|
+
from fluidattacks_etl_utils.bug import Bug
|
|
8
|
+
from fluidattacks_etl_utils.decode import DecodeUtils
|
|
9
|
+
|
|
10
|
+
from fluidattacks_gitlab_sdk._decoders import (
|
|
11
|
+
decode_date,
|
|
12
|
+
decode_milestone_full_id,
|
|
13
|
+
)
|
|
14
|
+
from fluidattacks_gitlab_sdk.ids import MilestoneFullId
|
|
15
|
+
from fluidattacks_gitlab_sdk.milestones.core import Milestone, MilestoneDates
|
|
16
|
+
|
|
17
|
+
LOG = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def decode_milestone_dates(raw: JsonObj) -> ResultE[MilestoneDates]:
|
|
21
|
+
return smash.smash_result_4(
|
|
22
|
+
JsonUnfolder.require(raw, "created_at", DecodeUtils.to_date_time),
|
|
23
|
+
JsonUnfolder.optional(raw, "updated_at", DecodeUtils.to_opt_date_time).map(
|
|
24
|
+
lambda v: v.bind(lambda j: j),
|
|
25
|
+
),
|
|
26
|
+
JsonUnfolder.optional(
|
|
27
|
+
raw,
|
|
28
|
+
"due_date",
|
|
29
|
+
lambda v: DecodeUtils.to_maybe(v, lambda i: DecodeUtils.to_str(i).bind(decode_date)),
|
|
30
|
+
).map(lambda m: m.bind(lambda x: x)),
|
|
31
|
+
JsonUnfolder.optional(
|
|
32
|
+
raw,
|
|
33
|
+
"start_date",
|
|
34
|
+
lambda v: DecodeUtils.to_maybe(v, lambda i: DecodeUtils.to_str(i).bind(decode_date)),
|
|
35
|
+
).map(lambda m: m.bind(lambda x: x)),
|
|
36
|
+
).map(lambda v: MilestoneDates(*v))
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def decode_milestone(raw: JsonObj) -> ResultE[Milestone]:
|
|
40
|
+
dates = decode_milestone_dates(raw)
|
|
41
|
+
group = smash.smash_result_4(
|
|
42
|
+
JsonUnfolder.require(raw, "title", DecodeUtils.to_str),
|
|
43
|
+
JsonUnfolder.require(raw, "description", DecodeUtils.to_str),
|
|
44
|
+
JsonUnfolder.require(raw, "state", DecodeUtils.to_str),
|
|
45
|
+
JsonUnfolder.require(raw, "expired", DecodeUtils.to_bool),
|
|
46
|
+
)
|
|
47
|
+
return (
|
|
48
|
+
smash.smash_result_2(
|
|
49
|
+
group,
|
|
50
|
+
dates,
|
|
51
|
+
)
|
|
52
|
+
.map(
|
|
53
|
+
lambda v: Milestone(
|
|
54
|
+
*v[0],
|
|
55
|
+
v[1],
|
|
56
|
+
),
|
|
57
|
+
)
|
|
58
|
+
.alt(
|
|
59
|
+
lambda e: Bug.new(
|
|
60
|
+
"decode_mr",
|
|
61
|
+
inspect.currentframe(),
|
|
62
|
+
e,
|
|
63
|
+
(JsonUnfolder.dumps(raw),),
|
|
64
|
+
),
|
|
65
|
+
)
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def decode_milestone_and_id(
|
|
70
|
+
raw: FrozenList[JsonObj],
|
|
71
|
+
) -> ResultE[Maybe[tuple[MilestoneFullId, Milestone]]]:
|
|
72
|
+
if not raw:
|
|
73
|
+
return Result.success(Maybe.empty())
|
|
74
|
+
|
|
75
|
+
return smash.smash_result_2(
|
|
76
|
+
decode_milestone_full_id(raw[0]),
|
|
77
|
+
decode_milestone(raw[0]),
|
|
78
|
+
).map(Maybe.some)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from datetime import date
|
|
6
|
+
|
|
7
|
+
from fa_purity import Cmd, Coproduct, Maybe, Result, ResultE
|
|
8
|
+
from fa_purity.date_time import DatetimeUTC
|
|
9
|
+
|
|
10
|
+
from fluidattacks_gitlab_sdk._handlers import NotFound
|
|
11
|
+
from fluidattacks_gitlab_sdk.ids import MilestoneFullId, MilestoneInternalId, ProjectId
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass(frozen=True)
|
|
15
|
+
class Milestone:
|
|
16
|
+
title: str
|
|
17
|
+
description: str
|
|
18
|
+
state: str
|
|
19
|
+
expired: bool
|
|
20
|
+
dates: MilestoneDates
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass(frozen=True)
|
|
24
|
+
class MilestoneDates:
|
|
25
|
+
create_at: DatetimeUTC
|
|
26
|
+
update_at: Maybe[DatetimeUTC]
|
|
27
|
+
due_date: Maybe[date]
|
|
28
|
+
start_date: Maybe[date]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@dataclass(frozen=True)
|
|
32
|
+
class MilestoneClient:
|
|
33
|
+
get_milestone: Callable[
|
|
34
|
+
[ProjectId, MilestoneInternalId],
|
|
35
|
+
Cmd[Result[tuple[MilestoneFullId, Milestone], Coproduct[NotFound, Exception]]],
|
|
36
|
+
]
|
|
37
|
+
most_recent_milestone: Callable[
|
|
38
|
+
[ProjectId],
|
|
39
|
+
Cmd[ResultE[Maybe[tuple[MilestoneFullId, Milestone]]]],
|
|
40
|
+
]
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
from __future__ import (
|
|
2
|
+
annotations,
|
|
3
|
+
)
|
|
4
|
+
|
|
5
|
+
import inspect
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
|
|
8
|
+
from fa_purity import (
|
|
9
|
+
Cmd,
|
|
10
|
+
FrozenDict,
|
|
11
|
+
ResultE,
|
|
12
|
+
cast_exception,
|
|
13
|
+
)
|
|
14
|
+
from fluidattacks_etl_utils.bug import Bug
|
|
15
|
+
from fluidattacks_etl_utils.decode import int_to_str
|
|
16
|
+
|
|
17
|
+
from fluidattacks_gitlab_sdk._decoders import assert_single
|
|
18
|
+
from fluidattacks_gitlab_sdk._http_client import (
|
|
19
|
+
ClientFactory,
|
|
20
|
+
Credentials,
|
|
21
|
+
HttpJsonClient,
|
|
22
|
+
RelativeEndpoint,
|
|
23
|
+
)
|
|
24
|
+
from fluidattacks_gitlab_sdk.ids import MrFullId, MrInternalId, ProjectId
|
|
25
|
+
from fluidattacks_gitlab_sdk.mr_approvals.core import ApprovalsClient, MrApprovals
|
|
26
|
+
|
|
27
|
+
from ._decode import decode_id_and_mr_approvals
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _get_mr_approvals(
|
|
31
|
+
client: HttpJsonClient,
|
|
32
|
+
project: ProjectId,
|
|
33
|
+
mr_internal: MrInternalId,
|
|
34
|
+
) -> Cmd[ResultE[tuple[MrFullId, MrApprovals]]]:
|
|
35
|
+
endpoint = RelativeEndpoint.new(
|
|
36
|
+
"projects",
|
|
37
|
+
int_to_str(project.project_id.value),
|
|
38
|
+
"merge_requests",
|
|
39
|
+
int_to_str(mr_internal.internal.value),
|
|
40
|
+
"approvals",
|
|
41
|
+
)
|
|
42
|
+
return client.get(
|
|
43
|
+
endpoint,
|
|
44
|
+
FrozenDict({}),
|
|
45
|
+
).map(
|
|
46
|
+
lambda r: r.alt(
|
|
47
|
+
lambda e: cast_exception(
|
|
48
|
+
Bug.new(
|
|
49
|
+
"get_mr_approvals",
|
|
50
|
+
inspect.currentframe(),
|
|
51
|
+
e,
|
|
52
|
+
(),
|
|
53
|
+
),
|
|
54
|
+
),
|
|
55
|
+
)
|
|
56
|
+
.bind(assert_single)
|
|
57
|
+
.bind(decode_id_and_mr_approvals),
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _from_client(client: HttpJsonClient) -> ApprovalsClient:
|
|
62
|
+
return ApprovalsClient(lambda p, i: _get_mr_approvals(client, p, i))
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
@dataclass(frozen=True)
|
|
66
|
+
class MrApprovalsFactory:
|
|
67
|
+
@staticmethod
|
|
68
|
+
def new(creds: Credentials) -> ApprovalsClient:
|
|
69
|
+
return _from_client(ClientFactory.new(creds))
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from fa_purity import ResultE
|
|
2
|
+
from fa_purity.json import JsonObj, JsonUnfolder, Unfolder
|
|
3
|
+
from fluidattacks_etl_utils import smash
|
|
4
|
+
from fluidattacks_etl_utils.decode import DecodeUtils
|
|
5
|
+
|
|
6
|
+
from fluidattacks_gitlab_sdk._decoders import decode_mr_full_id
|
|
7
|
+
from fluidattacks_gitlab_sdk.ids import MrFullId
|
|
8
|
+
from fluidattacks_gitlab_sdk.mr_approvals.core import Approver, MrApprovals
|
|
9
|
+
from fluidattacks_gitlab_sdk.users.decode import decode_user_obj
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def decode_mr_approvals(raw: JsonObj) -> ResultE[MrApprovals]:
|
|
13
|
+
return smash.smash_result_2(
|
|
14
|
+
JsonUnfolder.require(raw, "approved", DecodeUtils.to_bool),
|
|
15
|
+
JsonUnfolder.require(
|
|
16
|
+
raw,
|
|
17
|
+
"approved_by",
|
|
18
|
+
lambda v: Unfolder.to_list_of(
|
|
19
|
+
v,
|
|
20
|
+
lambda x: Unfolder.to_json(x)
|
|
21
|
+
.bind(lambda user_obj: JsonUnfolder.require(user_obj, "user", Unfolder.to_json))
|
|
22
|
+
.bind(decode_user_obj)
|
|
23
|
+
.map(lambda u: Approver(u)),
|
|
24
|
+
).map(lambda approvers: tuple(approvers)),
|
|
25
|
+
),
|
|
26
|
+
).map(lambda v: MrApprovals(v[0], v[1]))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def decode_id_and_mr_approvals(raw: JsonObj) -> ResultE[tuple[MrFullId, MrApprovals]]:
|
|
30
|
+
return smash.smash_result_2(decode_mr_full_id(raw), decode_mr_approvals(raw))
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
|
|
6
|
+
from fa_purity import Cmd, FrozenList, ResultE
|
|
7
|
+
|
|
8
|
+
from fluidattacks_gitlab_sdk.ids import MrFullId, MrInternalId, ProjectId
|
|
9
|
+
from fluidattacks_gitlab_sdk.users import UserObj
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass(frozen=True)
|
|
13
|
+
class Approver:
|
|
14
|
+
user: UserObj
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass(frozen=True)
|
|
18
|
+
class MrApprovals:
|
|
19
|
+
approved: bool
|
|
20
|
+
approved_by: FrozenList[Approver]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass
|
|
24
|
+
class ApprovalsClient:
|
|
25
|
+
get_approvals: Callable[[ProjectId, MrInternalId], Cmd[ResultE[tuple[MrFullId, MrApprovals]]]]
|
|
File without changes
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
from fluidattacks_gitlab_sdk.ids import UserId
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass(frozen=True)
|
|
9
|
+
class User:
|
|
10
|
+
"""The name of the user in the system."""
|
|
11
|
+
|
|
12
|
+
value: str
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass(frozen=True)
|
|
16
|
+
class UserName:
|
|
17
|
+
"""The real name of the user."""
|
|
18
|
+
|
|
19
|
+
value: str
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass(frozen=True)
|
|
23
|
+
class UserObj:
|
|
24
|
+
user_id: UserId
|
|
25
|
+
user: User
|
|
26
|
+
name: UserName
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from fa_purity import ResultE
|
|
2
|
+
from fa_purity.json import JsonObj, JsonUnfolder
|
|
3
|
+
from fluidattacks_etl_utils.decode import DecodeUtils
|
|
4
|
+
from fluidattacks_etl_utils.natural import Natural
|
|
5
|
+
|
|
6
|
+
from fluidattacks_gitlab_sdk.ids import UserId
|
|
7
|
+
from fluidattacks_gitlab_sdk.users.core import User, UserName, UserObj
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def decode_user_obj(raw: JsonObj) -> ResultE[UserObj]:
|
|
11
|
+
return JsonUnfolder.require(raw, "id", DecodeUtils.to_int).bind(
|
|
12
|
+
lambda uid: Natural.from_int(uid)
|
|
13
|
+
.map(UserId)
|
|
14
|
+
.bind(
|
|
15
|
+
lambda user_id: JsonUnfolder.require(raw, "username", DecodeUtils.to_str)
|
|
16
|
+
.map(User)
|
|
17
|
+
.bind(
|
|
18
|
+
lambda user: JsonUnfolder.require(raw, "name", DecodeUtils.to_str)
|
|
19
|
+
.map(UserName)
|
|
20
|
+
.map(
|
|
21
|
+
lambda name: UserObj(user_id, user, name),
|
|
22
|
+
),
|
|
23
|
+
),
|
|
24
|
+
),
|
|
25
|
+
)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: fluidattacks_gitlab_sdk
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: gitlab SDK
|
|
5
|
+
Author-email: Product Team <development@fluidattacks.com>
|
|
6
|
+
Requires-Python: >=3.11
|
|
7
|
+
Requires-Dist: gql >=3.5.0, <4.0.0
|
|
8
|
+
Requires-Dist: requests-toolbelt >=1.0.0, <2.0.0
|
|
9
|
+
Requires-Dist: fa-purity >=2.5.2, <3.0.0
|
|
10
|
+
Requires-Dist: pure-requests >=3.0.0, <4.0.0
|
|
11
|
+
Requires-Dist: python-dateutil >=2.8.0, <3.0.0
|
|
12
|
+
Requires-Dist: fluidattacks-etl-utils >=1.0.0, <2.0.0
|
|
13
|
+
Requires-Dist: fluidattacks-utils-logger >=1.0.0, <2.0.0
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
fluidattacks_gitlab_sdk/__init__.py,sha256=AmTm9uvbmWfcQcTQFrXTaMRXErqCp2-mzZYRUfLIolw,348
|
|
2
|
+
fluidattacks_gitlab_sdk/_decoders.py,sha256=FWkAm3KgARFGL06GIF5UiPgvVpXVrHor3ysngHLVWng,4933
|
|
3
|
+
fluidattacks_gitlab_sdk/_handlers.py,sha256=OZD6ke6UYHmZuJb0KrU400eabOcZ7DbDf3sBt0WOkSs,1109
|
|
4
|
+
fluidattacks_gitlab_sdk/_logger.py,sha256=8pUsO-S3wlWfrGhAeZgsd9CqNQOaEFWkcoTtbR0vSZw,847
|
|
5
|
+
fluidattacks_gitlab_sdk/ids.py,sha256=U26vgVHOKlVv5ZSIF30MVqPiDv4_0lA2XoPPEEhJxz4,2258
|
|
6
|
+
fluidattacks_gitlab_sdk/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
7
|
+
fluidattacks_gitlab_sdk/_gql_client/__init__.py,sha256=J5w-T87PPUhVKl08-IEXbWZZXxVgah_fUrOhvtZ0oMw,156
|
|
8
|
+
fluidattacks_gitlab_sdk/_gql_client/_client.py,sha256=X9so6QnOHjSOxfKufP_pLm6aI6n85Eq9iwl4cBAOju8,2580
|
|
9
|
+
fluidattacks_gitlab_sdk/_gql_client/_error.py,sha256=2c6YyUzx6gMQVqhRMqDuzVM1tH2Uxpf5-g33bSSIwok,354
|
|
10
|
+
fluidattacks_gitlab_sdk/_gql_client/_handlers.py,sha256=KOueIk1B9e3MoJ4wslOuW5LOr8gUgDrzLvJMYaEN4yY,2394
|
|
11
|
+
fluidattacks_gitlab_sdk/_http_client/__init__.py,sha256=sV8TJlA8nkL10JzKPwlSbKdeARviKJCXkHZ5vljdvcY,556
|
|
12
|
+
fluidattacks_gitlab_sdk/_http_client/_client_1.py,sha256=XZ4Vibs-HgDXlCinNMUCEqwhwT4_Uifvs6_eh4ijpe0,5597
|
|
13
|
+
fluidattacks_gitlab_sdk/_http_client/_core.py,sha256=DyvtPFzjJkN0p5LSSclsA6_oDcx7WDjH1pdYpv936YQ,3529
|
|
14
|
+
fluidattacks_gitlab_sdk/issues/__init__.py,sha256=pgJHw1IRhp0EgLXydXGDPAIgcVDtCaMt5F-vOtr0PMc,130
|
|
15
|
+
fluidattacks_gitlab_sdk/issues/core.py,sha256=9PkRct6UJ3Pal7QPd376HO3ecwFa97Ge0hFZx939oF0,2119
|
|
16
|
+
fluidattacks_gitlab_sdk/issues/_client/__init__.py,sha256=A9n17RsnsuiYUMPh-DaG5QHRIUmKyk5EP2BAZEMFXAY,911
|
|
17
|
+
fluidattacks_gitlab_sdk/issues/_client/_decode.py,sha256=zy_Ulga-EeIkSNuO16LgVnGO2xlmu3hrydaMuy9h4ls,5411
|
|
18
|
+
fluidattacks_gitlab_sdk/issues/_client/_get_issue.py,sha256=AuKoV0KKT4m9Xhx9yWNuDUkykpcRoUdQ5ww6yRxIsmA,2609
|
|
19
|
+
fluidattacks_gitlab_sdk/issues/_client/_most_recent.py,sha256=zJd9-2A47Gi66QxNeRcsJtQuyH7TAfqYT-0H6m9nz_A,3807
|
|
20
|
+
fluidattacks_gitlab_sdk/issues/_client/_updated_by.py,sha256=D9-LMpadc-bgm2_pmo6w9hhS2xMelDBn_JXDTdhjp5o,4657
|
|
21
|
+
fluidattacks_gitlab_sdk/members/__init__.py,sha256=YiAfp-an9gfNZ5DLmyb6NWjueV8xGazJ6YQFhhBtoNE,586
|
|
22
|
+
fluidattacks_gitlab_sdk/members/_client.py,sha256=GusGlJb7bCxFLfPjuVcEX2WgAwNqgpViWbrZfvWnJKI,1276
|
|
23
|
+
fluidattacks_gitlab_sdk/members/_decode.py,sha256=26cDfzrB9Xpv5qBRyn8IKmhaffANcoEwR7R2hypsABQ,1408
|
|
24
|
+
fluidattacks_gitlab_sdk/members/core.py,sha256=x0PIggJfuJsaiNPDm7X1fx7QZpb6OLLOzJ9UTThHBLI,488
|
|
25
|
+
fluidattacks_gitlab_sdk/merge_requests/__init__.py,sha256=_0Fm7BvA0_rKh3ior9v1_1LwCRzpGQECSMJ4FcsAmfw,202
|
|
26
|
+
fluidattacks_gitlab_sdk/merge_requests/_client.py,sha256=Xr4ANyLeANBjuCGQcchGKNW9w5EaHTZKMhg0hi7pk_g,7099
|
|
27
|
+
fluidattacks_gitlab_sdk/merge_requests/_decode.py,sha256=yuK7igap9HGNW1Jh1QJi_y73OSY_W16lz8eQT_DT1AM,7980
|
|
28
|
+
fluidattacks_gitlab_sdk/merge_requests/core.py,sha256=-gSNX-6DH_EHVXXDHSn-cU5W0-QcFafu7Bx1ErNuG6c,3136
|
|
29
|
+
fluidattacks_gitlab_sdk/milestones/__init__.py,sha256=HimZnvYbXT6D731ijJ9q7Ak7iFWGRI3jv_YnfRcNenY,123
|
|
30
|
+
fluidattacks_gitlab_sdk/milestones/_client.py,sha256=0bcRxYsaLl8g84E-9M6L1T7AJej7iFzSpGS2q6XZxek,4291
|
|
31
|
+
fluidattacks_gitlab_sdk/milestones/_decode.py,sha256=2gpI2BMfFhnD7WCT4aE7DT4BB5yRP65bnS2Jc5f_D6A,2464
|
|
32
|
+
fluidattacks_gitlab_sdk/milestones/core.py,sha256=55xS5yzzjCQB9qQPMa7xng3AvEeFTBhVBgAMJGQffSU,1026
|
|
33
|
+
fluidattacks_gitlab_sdk/mr_approvals/__init__.py,sha256=EUEXhC5FPOACU0ZGo8TOfB91n3SwzakAk-dJMCuK-VA,149
|
|
34
|
+
fluidattacks_gitlab_sdk/mr_approvals/_client.py,sha256=PMbeyAulvW_HSfU2C6seuvljDavKUL546aOGnOdWjkc,1763
|
|
35
|
+
fluidattacks_gitlab_sdk/mr_approvals/_decode.py,sha256=oqGZgQGh90JtBUCt49JiojeMNUdCBCaTs8-vIbbPVno,1250
|
|
36
|
+
fluidattacks_gitlab_sdk/mr_approvals/core.py,sha256=lHUanNXpI6rj-w15zBBbTzM3pyxF-Nfg-RtutVUzaZs,577
|
|
37
|
+
fluidattacks_gitlab_sdk/users/__init__.py,sha256=gfG-LZrj-ZMZjhqA7_aamyrNGgBx1ZVa2bskbJ6F-eA,85
|
|
38
|
+
fluidattacks_gitlab_sdk/users/core.py,sha256=xzXBt3mxBMFatNP8bc6VeIBzUA3P8ffLUF-S6TUWOZs,408
|
|
39
|
+
fluidattacks_gitlab_sdk/users/decode.py,sha256=cDrGglJM32HPtPks-Hd-Yy-bqYLrIvpPVsS0R0kxLnU,885
|
|
40
|
+
fluidattacks_gitlab_sdk-1.0.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
|
|
41
|
+
fluidattacks_gitlab_sdk-1.0.0.dist-info/METADATA,sha256=iZe7qNWtgKyNh-tIJktBt-jXDTzS4jhX6pRlpxWQo1I,497
|
|
42
|
+
fluidattacks_gitlab_sdk-1.0.0.dist-info/RECORD,,
|