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.
Files changed (96) hide show
  1. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/PKG-INFO +1 -1
  2. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/__init__.py +1 -1
  3. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/mr_approvals/_decode.py +10 -6
  4. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/mr_approvals/core.py +3 -1
  5. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/pyproject.toml +1 -1
  6. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/mr_approvals/data.json +4 -2
  7. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/mr_approvals/decoder_test.py +8 -0
  8. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/uv.lock +354 -382
  9. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/.envrc +0 -0
  10. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/build/default.nix +0 -0
  11. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/build/filter.nix +0 -0
  12. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/flake.lock +0 -0
  13. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/flake.nix +0 -0
  14. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_decoders.py +0 -0
  15. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_gql_client/__init__.py +0 -0
  16. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_gql_client/_client.py +0 -0
  17. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_gql_client/_error.py +0 -0
  18. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_gql_client/_handlers.py +0 -0
  19. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_handlers.py +0 -0
  20. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_http_client/__init__.py +0 -0
  21. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_http_client/_client_1.py +0 -0
  22. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_http_client/_core.py +0 -0
  23. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/_logger.py +0 -0
  24. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/ids.py +0 -0
  25. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/issues/__init__.py +0 -0
  26. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/issues/_client/__init__.py +0 -0
  27. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/issues/_client/_decode.py +0 -0
  28. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/issues/_client/_get_issue.py +0 -0
  29. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/issues/_client/_most_recent.py +0 -0
  30. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/issues/_client/_updated_by.py +0 -0
  31. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/issues/core.py +0 -0
  32. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/jobs/__init__.py +0 -0
  33. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/jobs/_client.py +0 -0
  34. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/jobs/_decode.py +0 -0
  35. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/jobs/core.py +0 -0
  36. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/members/__init__.py +0 -0
  37. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/members/_client.py +0 -0
  38. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/members/_decode.py +0 -0
  39. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/members/core.py +0 -0
  40. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/merge_requests/__init__.py +0 -0
  41. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/merge_requests/_client.py +0 -0
  42. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/merge_requests/_decode.py +0 -0
  43. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/merge_requests/core.py +0 -0
  44. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/milestones/__init__.py +0 -0
  45. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/milestones/_client.py +0 -0
  46. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/milestones/_decode.py +0 -0
  47. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/milestones/core.py +0 -0
  48. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/mr_approvals/__init__.py +0 -0
  49. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/mr_approvals/_client.py +0 -0
  50. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/mr_notes/__init__.py +0 -0
  51. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/mr_notes/_client.py +0 -0
  52. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/mr_notes/_core.py +0 -0
  53. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/mr_notes/_decode.py +0 -0
  54. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/py.typed +0 -0
  55. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/users/__init__.py +0 -0
  56. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/users/core.py +0 -0
  57. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/fluidattacks_gitlab_sdk/users/decode.py +0 -0
  58. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/mypy.ini +0 -0
  59. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/ruff.toml +0 -0
  60. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/__init__.py +0 -0
  61. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/arch/__init__.py +0 -0
  62. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/arch/arch.py +0 -0
  63. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/arch/test_arch.py +0 -0
  64. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/issues/__init__.py +0 -0
  65. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/issues/data.json +0 -0
  66. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/issues/test_decode.py +0 -0
  67. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/jobs/__init__.py +0 -0
  68. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/jobs/data.json +0 -0
  69. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/jobs/test_decode_job.py +0 -0
  70. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/members/__init__.py +0 -0
  71. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/members/data.json +0 -0
  72. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/members/test_decode_members.py +0 -0
  73. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/merge_request/__init__.py +0 -0
  74. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/merge_request/data.json +0 -0
  75. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/merge_request/data_mr_updates.json +0 -0
  76. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/merge_request/test_decode.py +0 -0
  77. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/mr_approvals/__init__.py +0 -0
  78. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/mr_notes/__init__.py +0 -0
  79. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/mr_notes/data.json +0 -0
  80. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/mr_notes/decoder_test.py +0 -0
  81. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests/py.typed +0 -0
  82. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/__init__.py +0 -0
  83. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/_utils.py +0 -0
  84. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/issues/__init__.py +0 -0
  85. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/issues/test_issue_client.py +0 -0
  86. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/jobs/__init__.py +0 -0
  87. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/jobs/client_test.py +0 -0
  88. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/members/__init__.py +0 -0
  89. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/members/test_client_members.py +0 -0
  90. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/milestones/__init__.py +0 -0
  91. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/milestones/client_test.py +0 -0
  92. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/mr_approvals/__init__.py +0 -0
  93. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/mr_approvals/client_test.py +0 -0
  94. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/py.typed +0 -0
  95. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/test_gql_client.py +0 -0
  96. {fluidattacks_gitlab_sdk-4.0.0 → fluidattacks_gitlab_sdk-5.0.0}/tests_fx/test_mr.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fluidattacks_gitlab_sdk
3
- Version: 4.0.0
3
+ Version: 5.0.0
4
4
  Summary: gitlab SDK
5
5
  Author-email: Product Team <development@fluidattacks.com>
6
6
  Requires-Python: >=3.11
@@ -11,7 +11,7 @@ from ._logger import (
11
11
  set_logger,
12
12
  )
13
13
 
14
- __version__ = "4.0.0"
14
+ __version__ = "5.0.0"
15
15
 
16
16
  Unsafe.compute(set_logger(__name__, __version__))
17
17
  LOG = logging.getLogger(__name__)
@@ -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-01", fluid-blends = "2099-01-01" , fluidattacks-utils-logger = "2099-01-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
  ]
@@ -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": [
@@ -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(