fluidattacks_gitlab_sdk 4.0.0__tar.gz → 5.0.0__tar.gz
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-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/PKG-INFO +1 -1
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/__init__.py +1 -1
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/mr_approvals/_decode.py +10 -6
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/mr_approvals/core.py +3 -1
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/pyproject.toml +1 -1
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/mr_approvals/data.json +4 -2
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/mr_approvals/decoder_test.py +8 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/uv.lock +354 -382
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/.envrc +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/build/default.nix +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/build/filter.nix +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/flake.lock +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/flake.nix +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_decoders.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_gql_client/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_gql_client/_client.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_gql_client/_error.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_gql_client/_handlers.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_handlers.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_http_client/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_http_client/_client_1.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_http_client/_core.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_logger.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/ids.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/issues/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/issues/_client/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/issues/_client/_decode.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/issues/_client/_get_issue.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/issues/_client/_most_recent.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/issues/_client/_updated_by.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/issues/core.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/jobs/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/jobs/_client.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/jobs/_decode.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/jobs/core.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/members/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/members/_client.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/members/_decode.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/members/core.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/merge_requests/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/merge_requests/_client.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/merge_requests/_decode.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/merge_requests/core.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/milestones/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/milestones/_client.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/milestones/_decode.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/milestones/core.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/mr_approvals/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/mr_approvals/_client.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/mr_notes/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/mr_notes/_client.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/mr_notes/_core.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/mr_notes/_decode.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/py.typed +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/users/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/users/core.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/users/decode.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/mypy.ini +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/ruff.toml +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/arch/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/arch/arch.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/arch/test_arch.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/issues/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/issues/data.json +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/issues/test_decode.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/jobs/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/jobs/data.json +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/jobs/test_decode_job.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/members/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/members/data.json +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/members/test_decode_members.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/merge_request/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/merge_request/data.json +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/merge_request/data_mr_updates.json +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/merge_request/test_decode.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/mr_approvals/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/mr_notes/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/mr_notes/data.json +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/mr_notes/decoder_test.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/py.typed +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/_utils.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/issues/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/issues/test_issue_client.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/jobs/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/jobs/client_test.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/members/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/members/test_client_members.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/milestones/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/milestones/client_test.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/mr_approvals/__init__.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/mr_approvals/client_test.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/py.typed +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/test_gql_client.py +0 -0
- {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/test_mr.py +0 -0
|
@@ -9,6 +9,15 @@ from fluidattacks_gitlab_sdk.mr_approvals.core import Approver, MrApprovals
|
|
|
9
9
|
from fluidattacks_gitlab_sdk.users.decode import decode_user_obj
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
def _decode_approver(entry: JsonObj) -> ResultE[Approver]:
|
|
13
|
+
return smash.smash_result_2(
|
|
14
|
+
JsonUnfolder.require(entry, "user", Unfolder.to_json).bind(decode_user_obj),
|
|
15
|
+
JsonUnfolder.optional(entry, "approved_at", DecodeUtils.to_opt_date_time).map(
|
|
16
|
+
lambda m: m.bind(lambda x: x),
|
|
17
|
+
),
|
|
18
|
+
).map(lambda v: Approver(v[0], v[1]))
|
|
19
|
+
|
|
20
|
+
|
|
12
21
|
def decode_mr_approvals(raw: JsonObj) -> ResultE[MrApprovals]:
|
|
13
22
|
return smash.smash_result_2(
|
|
14
23
|
JsonUnfolder.require(raw, "approved", DecodeUtils.to_bool),
|
|
@@ -17,12 +26,7 @@ def decode_mr_approvals(raw: JsonObj) -> ResultE[MrApprovals]:
|
|
|
17
26
|
"approved_by",
|
|
18
27
|
lambda v: Unfolder.to_list_of(
|
|
19
28
|
v,
|
|
20
|
-
lambda x: (
|
|
21
|
-
Unfolder.to_json(x)
|
|
22
|
-
.bind(lambda user_obj: JsonUnfolder.require(user_obj, "user", Unfolder.to_json))
|
|
23
|
-
.bind(decode_user_obj)
|
|
24
|
-
.map(Approver)
|
|
25
|
-
),
|
|
29
|
+
lambda x: Unfolder.to_json(x).bind(_decode_approver),
|
|
26
30
|
).map(tuple),
|
|
27
31
|
),
|
|
28
32
|
).map(lambda v: MrApprovals(v[0], v[1]))
|
|
@@ -3,7 +3,8 @@ from __future__ import annotations
|
|
|
3
3
|
from collections.abc import Callable
|
|
4
4
|
from dataclasses import dataclass
|
|
5
5
|
|
|
6
|
-
from fa_purity import Cmd, FrozenList, ResultE
|
|
6
|
+
from fa_purity import Cmd, FrozenList, Maybe, ResultE
|
|
7
|
+
from fa_purity.date_time import DatetimeUTC
|
|
7
8
|
|
|
8
9
|
from fluidattacks_gitlab_sdk.ids import MrFullId, MrInternalId, ProjectId
|
|
9
10
|
from fluidattacks_gitlab_sdk.users import UserObj
|
|
@@ -12,6 +13,7 @@ from fluidattacks_gitlab_sdk.users import UserObj
|
|
|
12
13
|
@dataclass(frozen=True)
|
|
13
14
|
class Approver:
|
|
14
15
|
user: UserObj
|
|
16
|
+
approved_at: Maybe[DatetimeUTC]
|
|
15
17
|
|
|
16
18
|
|
|
17
19
|
@dataclass(frozen=True)
|
|
@@ -34,7 +34,7 @@ dev = [
|
|
|
34
34
|
|
|
35
35
|
[tool.uv]
|
|
36
36
|
exclude-newer = "7 days"
|
|
37
|
-
exclude-newer-package = { fluidattacks-core = "2099-01-
|
|
37
|
+
exclude-newer-package = { fluidattacks-core = "2099-01-02T00:00:00Z", fluid-blends = "2099-01-02T00:00:00Z" , fluidattacks-utils-logger = "2099-01-02T00:00:00Z" }
|
|
38
38
|
override-dependencies = [
|
|
39
39
|
"cryptography==48.0.1"
|
|
40
40
|
]
|
{fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/mr_approvals/data.json
RENAMED
|
@@ -23,7 +23,8 @@
|
|
|
23
23
|
"locked": false,
|
|
24
24
|
"avatar_url": "https://secure.gravatar.com/avatar/2928a4bece9cd58167f81bd00ce77a48546cfc36556731cec749ea6125?s=80&d=identicon",
|
|
25
25
|
"web_url": "https://gitlab.com/useratfluid"
|
|
26
|
-
}
|
|
26
|
+
},
|
|
27
|
+
"approved_at": "2025-05-27T10:15:30.500Z"
|
|
27
28
|
},
|
|
28
29
|
{
|
|
29
30
|
"user": {
|
|
@@ -35,7 +36,8 @@
|
|
|
35
36
|
"locked": false,
|
|
36
37
|
"avatar_url": "https://secure.gravatar.com/avatar/749adaea75210e02e7554347f5d6e6b65c8ff746a4fa26ef2d?s=80&d=identicon",
|
|
37
38
|
"web_url": "https://gitlab.com/project_20741933_bot_7328383692d79816c341e690"
|
|
38
|
-
}
|
|
39
|
+
},
|
|
40
|
+
"approved_at": null
|
|
39
41
|
}
|
|
40
42
|
],
|
|
41
43
|
"suggested_approvers": [
|
{fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/mr_approvals/decoder_test.py
RENAMED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
from datetime import UTC, datetime
|
|
1
2
|
from pathlib import Path
|
|
2
3
|
|
|
3
4
|
from fa_purity import FrozenList, Maybe, Unsafe
|
|
5
|
+
from fa_purity.date_time import DatetimeUTC
|
|
4
6
|
from fa_purity.json import JsonValueFactory, Unfolder
|
|
5
7
|
from fluidattacks_etl_utils.natural import NaturalOperations
|
|
6
8
|
|
|
@@ -17,6 +19,10 @@ from fluidattacks_gitlab_sdk.mr_approvals.core import Approver, MrApprovals
|
|
|
17
19
|
from fluidattacks_gitlab_sdk.users.core import User, UserName, UserObj
|
|
18
20
|
|
|
19
21
|
|
|
22
|
+
def _assert_utc(date_time: datetime) -> DatetimeUTC:
|
|
23
|
+
return DatetimeUTC.assert_utc(date_time).alt(Unsafe.raise_exception).to_union()
|
|
24
|
+
|
|
25
|
+
|
|
20
26
|
def test_decode() -> None:
|
|
21
27
|
mr_ids = MrFullId(
|
|
22
28
|
MrGlobalId(NaturalOperations.absolute(345678912)),
|
|
@@ -33,6 +39,7 @@ def test_decode() -> None:
|
|
|
33
39
|
UserName("User Fluid"),
|
|
34
40
|
Maybe.some(""),
|
|
35
41
|
),
|
|
42
|
+
Maybe.some(_assert_utc(datetime(2025, 5, 27, 10, 15, 30, 500000, tzinfo=UTC))),
|
|
36
43
|
),
|
|
37
44
|
Approver(
|
|
38
45
|
UserObj(
|
|
@@ -41,6 +48,7 @@ def test_decode() -> None:
|
|
|
41
48
|
UserName("****"),
|
|
42
49
|
Maybe.empty(),
|
|
43
50
|
),
|
|
51
|
+
Maybe.empty(),
|
|
44
52
|
),
|
|
45
53
|
)
|
|
46
54
|
mr_approvers = MrApprovals(
|