windmill-api 1.544.2__py3-none-any.whl → 1.546.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.

Potentially problematic release.


This version of windmill-api might be problematic. Click here for more details.

Files changed (129) hide show
  1. windmill_api/api/job/cancel_selection.py +20 -1
  2. windmill_api/api/{teams/sync_teams.py → job/get_started_at_by_ids.py} +64 -20
  3. windmill_api/api/workspace/list_available_teams_channels.py +40 -5
  4. windmill_api/api/workspace/list_available_teams_ids.py +21 -1
  5. windmill_api/models/completed_job_flow_status_failure_module.py +22 -0
  6. windmill_api/models/completed_job_flow_status_failure_module_flow_jobs_duration.py +71 -0
  7. windmill_api/models/completed_job_flow_status_modules_item.py +22 -0
  8. windmill_api/models/completed_job_flow_status_modules_item_flow_jobs_duration.py +71 -0
  9. windmill_api/models/completed_job_flow_status_preprocessor_module.py +22 -0
  10. windmill_api/models/completed_job_flow_status_preprocessor_module_flow_jobs_duration.py +71 -0
  11. windmill_api/models/create_account_json_body.py +8 -8
  12. windmill_api/models/delete_completed_job_response_200_flow_status_failure_module.py +24 -0
  13. windmill_api/models/delete_completed_job_response_200_flow_status_failure_module_flow_jobs_duration.py +71 -0
  14. windmill_api/models/delete_completed_job_response_200_flow_status_modules_item.py +24 -0
  15. windmill_api/models/delete_completed_job_response_200_flow_status_modules_item_flow_jobs_duration.py +71 -0
  16. windmill_api/models/delete_completed_job_response_200_flow_status_preprocessor_module.py +26 -0
  17. windmill_api/models/delete_completed_job_response_200_flow_status_preprocessor_module_flow_jobs_duration.py +71 -0
  18. windmill_api/models/extended_jobs_jobs_item_type_0_flow_status_failure_module.py +24 -0
  19. windmill_api/models/extended_jobs_jobs_item_type_0_flow_status_failure_module_flow_jobs_duration.py +71 -0
  20. windmill_api/models/extended_jobs_jobs_item_type_0_flow_status_modules_item.py +24 -0
  21. windmill_api/models/extended_jobs_jobs_item_type_0_flow_status_modules_item_flow_jobs_duration.py +71 -0
  22. windmill_api/models/extended_jobs_jobs_item_type_0_flow_status_preprocessor_module.py +24 -0
  23. windmill_api/models/extended_jobs_jobs_item_type_0_flow_status_preprocessor_module_flow_jobs_duration.py +71 -0
  24. windmill_api/models/extended_jobs_jobs_item_type_1_flow_status_failure_module.py +24 -0
  25. windmill_api/models/extended_jobs_jobs_item_type_1_flow_status_failure_module_flow_jobs_duration.py +71 -0
  26. windmill_api/models/extended_jobs_jobs_item_type_1_flow_status_modules_item.py +24 -0
  27. windmill_api/models/extended_jobs_jobs_item_type_1_flow_status_modules_item_flow_jobs_duration.py +71 -0
  28. windmill_api/models/extended_jobs_jobs_item_type_1_flow_status_preprocessor_module.py +24 -0
  29. windmill_api/models/extended_jobs_jobs_item_type_1_flow_status_preprocessor_module_flow_jobs_duration.py +71 -0
  30. windmill_api/models/flow_status_failure_module.py +18 -0
  31. windmill_api/models/flow_status_failure_module_flow_jobs_duration.py +71 -0
  32. windmill_api/models/flow_status_module.py +18 -0
  33. windmill_api/models/flow_status_module_flow_jobs_duration.py +71 -0
  34. windmill_api/models/flow_status_modules_item.py +18 -0
  35. windmill_api/models/flow_status_modules_item_flow_jobs_duration.py +71 -0
  36. windmill_api/models/flow_status_preprocessor_module.py +20 -0
  37. windmill_api/models/flow_status_preprocessor_module_flow_jobs_duration.py +71 -0
  38. windmill_api/models/get_completed_job_response_200_flow_status_failure_module.py +24 -0
  39. windmill_api/models/get_completed_job_response_200_flow_status_failure_module_flow_jobs_duration.py +71 -0
  40. windmill_api/models/get_completed_job_response_200_flow_status_modules_item.py +24 -0
  41. windmill_api/models/get_completed_job_response_200_flow_status_modules_item_flow_jobs_duration.py +71 -0
  42. windmill_api/models/get_completed_job_response_200_flow_status_preprocessor_module.py +24 -0
  43. windmill_api/models/get_completed_job_response_200_flow_status_preprocessor_module_flow_jobs_duration.py +71 -0
  44. windmill_api/models/get_job_response_200_type_0_flow_status_failure_module.py +24 -0
  45. windmill_api/models/get_job_response_200_type_0_flow_status_failure_module_flow_jobs_duration.py +71 -0
  46. windmill_api/models/get_job_response_200_type_0_flow_status_modules_item.py +24 -0
  47. windmill_api/models/get_job_response_200_type_0_flow_status_modules_item_flow_jobs_duration.py +71 -0
  48. windmill_api/models/get_job_response_200_type_0_flow_status_preprocessor_module.py +24 -0
  49. windmill_api/models/get_job_response_200_type_0_flow_status_preprocessor_module_flow_jobs_duration.py +71 -0
  50. windmill_api/models/get_job_response_200_type_1_flow_status_failure_module.py +24 -0
  51. windmill_api/models/get_job_response_200_type_1_flow_status_failure_module_flow_jobs_duration.py +71 -0
  52. windmill_api/models/get_job_response_200_type_1_flow_status_modules_item.py +24 -0
  53. windmill_api/models/get_job_response_200_type_1_flow_status_modules_item_flow_jobs_duration.py +71 -0
  54. windmill_api/models/get_job_response_200_type_1_flow_status_preprocessor_module.py +24 -0
  55. windmill_api/models/get_job_response_200_type_1_flow_status_preprocessor_module_flow_jobs_duration.py +71 -0
  56. windmill_api/models/get_job_updates_response_200_flow_status_failure_module.py +24 -0
  57. windmill_api/models/get_job_updates_response_200_flow_status_failure_module_flow_jobs_duration.py +71 -0
  58. windmill_api/models/get_job_updates_response_200_flow_status_modules_item.py +24 -0
  59. windmill_api/models/get_job_updates_response_200_flow_status_modules_item_flow_jobs_duration.py +71 -0
  60. windmill_api/models/get_job_updates_response_200_flow_status_preprocessor_module.py +24 -0
  61. windmill_api/models/get_job_updates_response_200_flow_status_preprocessor_module_flow_jobs_duration.py +71 -0
  62. windmill_api/models/get_suspended_job_flow_response_200_job_type_0_flow_status_failure_module.py +29 -0
  63. windmill_api/models/get_suspended_job_flow_response_200_job_type_0_flow_status_failure_module_flow_jobs_duration.py +73 -0
  64. windmill_api/models/get_suspended_job_flow_response_200_job_type_0_flow_status_modules_item.py +26 -0
  65. windmill_api/models/get_suspended_job_flow_response_200_job_type_0_flow_status_modules_item_flow_jobs_duration.py +73 -0
  66. windmill_api/models/get_suspended_job_flow_response_200_job_type_0_flow_status_preprocessor_module.py +31 -0
  67. windmill_api/models/get_suspended_job_flow_response_200_job_type_0_flow_status_preprocessor_module_flow_jobs_duration.py +73 -0
  68. windmill_api/models/get_suspended_job_flow_response_200_job_type_1_flow_status_failure_module.py +29 -0
  69. windmill_api/models/get_suspended_job_flow_response_200_job_type_1_flow_status_failure_module_flow_jobs_duration.py +73 -0
  70. windmill_api/models/get_suspended_job_flow_response_200_job_type_1_flow_status_modules_item.py +26 -0
  71. windmill_api/models/get_suspended_job_flow_response_200_job_type_1_flow_status_modules_item_flow_jobs_duration.py +73 -0
  72. windmill_api/models/get_suspended_job_flow_response_200_job_type_1_flow_status_preprocessor_module.py +31 -0
  73. windmill_api/models/get_suspended_job_flow_response_200_job_type_1_flow_status_preprocessor_module_flow_jobs_duration.py +73 -0
  74. windmill_api/models/job_type_0_flow_status_failure_module_flow_jobs_duration.py +71 -0
  75. windmill_api/models/job_type_0_flow_status_modules_item_flow_jobs_duration.py +71 -0
  76. windmill_api/models/job_type_0_flow_status_preprocessor_module_flow_jobs_duration.py +71 -0
  77. windmill_api/models/job_type_1_flow_status_failure_module_flow_jobs_duration.py +71 -0
  78. windmill_api/models/job_type_1_flow_status_modules_item_flow_jobs_duration.py +71 -0
  79. windmill_api/models/job_type_1_flow_status_preprocessor_module_flow_jobs_duration.py +71 -0
  80. windmill_api/models/list_available_teams_channels_response_200_item.py +0 -16
  81. windmill_api/models/list_completed_jobs_response_200_item_flow_status_failure_module.py +24 -0
  82. windmill_api/models/list_completed_jobs_response_200_item_flow_status_failure_module_flow_jobs_duration.py +71 -0
  83. windmill_api/models/list_completed_jobs_response_200_item_flow_status_modules_item.py +24 -0
  84. windmill_api/models/list_completed_jobs_response_200_item_flow_status_modules_item_flow_jobs_duration.py +71 -0
  85. windmill_api/models/list_completed_jobs_response_200_item_flow_status_preprocessor_module.py +26 -0
  86. windmill_api/models/list_completed_jobs_response_200_item_flow_status_preprocessor_module_flow_jobs_duration.py +73 -0
  87. windmill_api/models/list_extended_jobs_response_200_jobs_item_type_0_flow_status_failure_module.py +31 -0
  88. windmill_api/models/list_extended_jobs_response_200_jobs_item_type_0_flow_status_failure_module_flow_jobs_duration.py +73 -0
  89. windmill_api/models/list_extended_jobs_response_200_jobs_item_type_0_flow_status_modules_item.py +29 -0
  90. windmill_api/models/list_extended_jobs_response_200_jobs_item_type_0_flow_status_modules_item_flow_jobs_duration.py +73 -0
  91. windmill_api/models/list_extended_jobs_response_200_jobs_item_type_0_flow_status_preprocessor_module.py +31 -0
  92. windmill_api/models/list_extended_jobs_response_200_jobs_item_type_0_flow_status_preprocessor_module_flow_jobs_duration.py +73 -0
  93. windmill_api/models/list_extended_jobs_response_200_jobs_item_type_1_flow_status_failure_module.py +31 -0
  94. windmill_api/models/list_extended_jobs_response_200_jobs_item_type_1_flow_status_failure_module_flow_jobs_duration.py +73 -0
  95. windmill_api/models/list_extended_jobs_response_200_jobs_item_type_1_flow_status_modules_item.py +29 -0
  96. windmill_api/models/list_extended_jobs_response_200_jobs_item_type_1_flow_status_modules_item_flow_jobs_duration.py +73 -0
  97. windmill_api/models/list_extended_jobs_response_200_jobs_item_type_1_flow_status_preprocessor_module.py +31 -0
  98. windmill_api/models/list_extended_jobs_response_200_jobs_item_type_1_flow_status_preprocessor_module_flow_jobs_duration.py +73 -0
  99. windmill_api/models/list_jobs_response_200_item_type_0_flow_status_failure_module.py +24 -0
  100. windmill_api/models/list_jobs_response_200_item_type_0_flow_status_failure_module_flow_jobs_duration.py +71 -0
  101. windmill_api/models/list_jobs_response_200_item_type_0_flow_status_modules_item.py +24 -0
  102. windmill_api/models/list_jobs_response_200_item_type_0_flow_status_modules_item_flow_jobs_duration.py +71 -0
  103. windmill_api/models/list_jobs_response_200_item_type_0_flow_status_preprocessor_module.py +24 -0
  104. windmill_api/models/list_jobs_response_200_item_type_0_flow_status_preprocessor_module_flow_jobs_duration.py +71 -0
  105. windmill_api/models/list_jobs_response_200_item_type_1_flow_status_failure_module.py +24 -0
  106. windmill_api/models/list_jobs_response_200_item_type_1_flow_status_failure_module_flow_jobs_duration.py +71 -0
  107. windmill_api/models/list_jobs_response_200_item_type_1_flow_status_modules_item.py +24 -0
  108. windmill_api/models/list_jobs_response_200_item_type_1_flow_status_modules_item_flow_jobs_duration.py +71 -0
  109. windmill_api/models/list_jobs_response_200_item_type_1_flow_status_preprocessor_module.py +24 -0
  110. windmill_api/models/list_jobs_response_200_item_type_1_flow_status_preprocessor_module_flow_jobs_duration.py +71 -0
  111. windmill_api/models/list_queue_response_200_item_flow_status_failure_module.py +24 -0
  112. windmill_api/models/list_queue_response_200_item_flow_status_failure_module_flow_jobs_duration.py +71 -0
  113. windmill_api/models/list_queue_response_200_item_flow_status_modules_item.py +24 -0
  114. windmill_api/models/list_queue_response_200_item_flow_status_modules_item_flow_jobs_duration.py +71 -0
  115. windmill_api/models/list_queue_response_200_item_flow_status_preprocessor_module.py +24 -0
  116. windmill_api/models/list_queue_response_200_item_flow_status_preprocessor_module_flow_jobs_duration.py +71 -0
  117. windmill_api/models/queued_job_flow_status_failure_module.py +22 -0
  118. windmill_api/models/queued_job_flow_status_failure_module_flow_jobs_duration.py +71 -0
  119. windmill_api/models/queued_job_flow_status_modules_item.py +22 -0
  120. windmill_api/models/queued_job_flow_status_modules_item_flow_jobs_duration.py +71 -0
  121. windmill_api/models/queued_job_flow_status_preprocessor_module.py +22 -0
  122. windmill_api/models/queued_job_flow_status_preprocessor_module_flow_jobs_duration.py +71 -0
  123. {windmill_api-1.544.2.dist-info → windmill_api-1.546.0.dist-info}/METADATA +1 -1
  124. {windmill_api-1.544.2.dist-info → windmill_api-1.546.0.dist-info}/RECORD +126 -68
  125. windmill_api/models/sync_teams_response_200_item.py +0 -87
  126. windmill_api/models/sync_teams_response_200_item_channels_item.py +0 -80
  127. windmill_api/models/upload_file_part.py +0 -65
  128. {windmill_api-1.544.2.dist-info → windmill_api-1.546.0.dist-info}/LICENSE +0 -0
  129. {windmill_api-1.544.2.dist-info → windmill_api-1.546.0.dist-info}/WHEEL +0 -0
@@ -24,6 +24,9 @@ if TYPE_CHECKING:
24
24
  from ..models.list_queue_response_200_item_flow_status_preprocessor_module_branchall import (
25
25
  ListQueueResponse200ItemFlowStatusPreprocessorModuleBranchall,
26
26
  )
27
+ from ..models.list_queue_response_200_item_flow_status_preprocessor_module_flow_jobs_duration import (
28
+ ListQueueResponse200ItemFlowStatusPreprocessorModuleFlowJobsDuration,
29
+ )
27
30
  from ..models.list_queue_response_200_item_flow_status_preprocessor_module_iterator import (
28
31
  ListQueueResponse200ItemFlowStatusPreprocessorModuleIterator,
29
32
  )
@@ -44,6 +47,7 @@ class ListQueueResponse200ItemFlowStatusPreprocessorModule:
44
47
  iterator (Union[Unset, ListQueueResponse200ItemFlowStatusPreprocessorModuleIterator]):
45
48
  flow_jobs (Union[Unset, List[str]]):
46
49
  flow_jobs_success (Union[Unset, List[bool]]):
50
+ flow_jobs_duration (Union[Unset, ListQueueResponse200ItemFlowStatusPreprocessorModuleFlowJobsDuration]):
47
51
  branch_chosen (Union[Unset, ListQueueResponse200ItemFlowStatusPreprocessorModuleBranchChosen]):
48
52
  branchall (Union[Unset, ListQueueResponse200ItemFlowStatusPreprocessorModuleBranchall]):
49
53
  approvers (Union[Unset, List['ListQueueResponse200ItemFlowStatusPreprocessorModuleApproversItem']]):
@@ -63,6 +67,7 @@ class ListQueueResponse200ItemFlowStatusPreprocessorModule:
63
67
  iterator: Union[Unset, "ListQueueResponse200ItemFlowStatusPreprocessorModuleIterator"] = UNSET
64
68
  flow_jobs: Union[Unset, List[str]] = UNSET
65
69
  flow_jobs_success: Union[Unset, List[bool]] = UNSET
70
+ flow_jobs_duration: Union[Unset, "ListQueueResponse200ItemFlowStatusPreprocessorModuleFlowJobsDuration"] = UNSET
66
71
  branch_chosen: Union[Unset, "ListQueueResponse200ItemFlowStatusPreprocessorModuleBranchChosen"] = UNSET
67
72
  branchall: Union[Unset, "ListQueueResponse200ItemFlowStatusPreprocessorModuleBranchall"] = UNSET
68
73
  approvers: Union[Unset, List["ListQueueResponse200ItemFlowStatusPreprocessorModuleApproversItem"]] = UNSET
@@ -103,6 +108,10 @@ class ListQueueResponse200ItemFlowStatusPreprocessorModule:
103
108
  if not isinstance(self.flow_jobs_success, Unset):
104
109
  flow_jobs_success = self.flow_jobs_success
105
110
 
111
+ flow_jobs_duration: Union[Unset, Dict[str, Any]] = UNSET
112
+ if not isinstance(self.flow_jobs_duration, Unset):
113
+ flow_jobs_duration = self.flow_jobs_duration.to_dict()
114
+
106
115
  branch_chosen: Union[Unset, Dict[str, Any]] = UNSET
107
116
  if not isinstance(self.branch_chosen, Unset):
108
117
  branch_chosen = self.branch_chosen.to_dict()
@@ -165,6 +174,8 @@ class ListQueueResponse200ItemFlowStatusPreprocessorModule:
165
174
  field_dict["flow_jobs"] = flow_jobs
166
175
  if flow_jobs_success is not UNSET:
167
176
  field_dict["flow_jobs_success"] = flow_jobs_success
177
+ if flow_jobs_duration is not UNSET:
178
+ field_dict["flow_jobs_duration"] = flow_jobs_duration
168
179
  if branch_chosen is not UNSET:
169
180
  field_dict["branch_chosen"] = branch_chosen
170
181
  if branchall is not UNSET:
@@ -199,6 +210,9 @@ class ListQueueResponse200ItemFlowStatusPreprocessorModule:
199
210
  from ..models.list_queue_response_200_item_flow_status_preprocessor_module_branchall import (
200
211
  ListQueueResponse200ItemFlowStatusPreprocessorModuleBranchall,
201
212
  )
213
+ from ..models.list_queue_response_200_item_flow_status_preprocessor_module_flow_jobs_duration import (
214
+ ListQueueResponse200ItemFlowStatusPreprocessorModuleFlowJobsDuration,
215
+ )
202
216
  from ..models.list_queue_response_200_item_flow_status_preprocessor_module_iterator import (
203
217
  ListQueueResponse200ItemFlowStatusPreprocessorModuleIterator,
204
218
  )
@@ -225,6 +239,15 @@ class ListQueueResponse200ItemFlowStatusPreprocessorModule:
225
239
 
226
240
  flow_jobs_success = cast(List[bool], d.pop("flow_jobs_success", UNSET))
227
241
 
242
+ _flow_jobs_duration = d.pop("flow_jobs_duration", UNSET)
243
+ flow_jobs_duration: Union[Unset, ListQueueResponse200ItemFlowStatusPreprocessorModuleFlowJobsDuration]
244
+ if isinstance(_flow_jobs_duration, Unset):
245
+ flow_jobs_duration = UNSET
246
+ else:
247
+ flow_jobs_duration = ListQueueResponse200ItemFlowStatusPreprocessorModuleFlowJobsDuration.from_dict(
248
+ _flow_jobs_duration
249
+ )
250
+
228
251
  _branch_chosen = d.pop("branch_chosen", UNSET)
229
252
  branch_chosen: Union[Unset, ListQueueResponse200ItemFlowStatusPreprocessorModuleBranchChosen]
230
253
  if isinstance(_branch_chosen, Unset):
@@ -295,6 +318,7 @@ class ListQueueResponse200ItemFlowStatusPreprocessorModule:
295
318
  iterator=iterator,
296
319
  flow_jobs=flow_jobs,
297
320
  flow_jobs_success=flow_jobs_success,
321
+ flow_jobs_duration=flow_jobs_duration,
298
322
  branch_chosen=branch_chosen,
299
323
  branchall=branchall,
300
324
  approvers=approvers,
@@ -0,0 +1,71 @@
1
+ from typing import Any, Dict, List, Type, TypeVar, Union, cast
2
+
3
+ from attrs import define as _attrs_define
4
+ from attrs import field as _attrs_field
5
+
6
+ from ..types import UNSET, Unset
7
+
8
+ T = TypeVar("T", bound="ListQueueResponse200ItemFlowStatusPreprocessorModuleFlowJobsDuration")
9
+
10
+
11
+ @_attrs_define
12
+ class ListQueueResponse200ItemFlowStatusPreprocessorModuleFlowJobsDuration:
13
+ """
14
+ Attributes:
15
+ started_at (Union[Unset, List[str]]):
16
+ duration_ms (Union[Unset, List[int]]):
17
+ """
18
+
19
+ started_at: Union[Unset, List[str]] = UNSET
20
+ duration_ms: Union[Unset, List[int]] = UNSET
21
+ additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
22
+
23
+ def to_dict(self) -> Dict[str, Any]:
24
+ started_at: Union[Unset, List[str]] = UNSET
25
+ if not isinstance(self.started_at, Unset):
26
+ started_at = self.started_at
27
+
28
+ duration_ms: Union[Unset, List[int]] = UNSET
29
+ if not isinstance(self.duration_ms, Unset):
30
+ duration_ms = self.duration_ms
31
+
32
+ field_dict: Dict[str, Any] = {}
33
+ field_dict.update(self.additional_properties)
34
+ field_dict.update({})
35
+ if started_at is not UNSET:
36
+ field_dict["started_at"] = started_at
37
+ if duration_ms is not UNSET:
38
+ field_dict["duration_ms"] = duration_ms
39
+
40
+ return field_dict
41
+
42
+ @classmethod
43
+ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
44
+ d = src_dict.copy()
45
+ started_at = cast(List[str], d.pop("started_at", UNSET))
46
+
47
+ duration_ms = cast(List[int], d.pop("duration_ms", UNSET))
48
+
49
+ list_queue_response_200_item_flow_status_preprocessor_module_flow_jobs_duration = cls(
50
+ started_at=started_at,
51
+ duration_ms=duration_ms,
52
+ )
53
+
54
+ list_queue_response_200_item_flow_status_preprocessor_module_flow_jobs_duration.additional_properties = d
55
+ return list_queue_response_200_item_flow_status_preprocessor_module_flow_jobs_duration
56
+
57
+ @property
58
+ def additional_keys(self) -> List[str]:
59
+ return list(self.additional_properties.keys())
60
+
61
+ def __getitem__(self, key: str) -> Any:
62
+ return self.additional_properties[key]
63
+
64
+ def __setitem__(self, key: str, value: Any) -> None:
65
+ self.additional_properties[key] = value
66
+
67
+ def __delitem__(self, key: str) -> None:
68
+ del self.additional_properties[key]
69
+
70
+ def __contains__(self, key: str) -> bool:
71
+ return key in self.additional_properties
@@ -20,6 +20,9 @@ if TYPE_CHECKING:
20
20
  QueuedJobFlowStatusFailureModuleBranchChosen,
21
21
  )
22
22
  from ..models.queued_job_flow_status_failure_module_branchall import QueuedJobFlowStatusFailureModuleBranchall
23
+ from ..models.queued_job_flow_status_failure_module_flow_jobs_duration import (
24
+ QueuedJobFlowStatusFailureModuleFlowJobsDuration,
25
+ )
23
26
  from ..models.queued_job_flow_status_failure_module_iterator import QueuedJobFlowStatusFailureModuleIterator
24
27
 
25
28
 
@@ -38,6 +41,7 @@ class QueuedJobFlowStatusFailureModule:
38
41
  iterator (Union[Unset, QueuedJobFlowStatusFailureModuleIterator]):
39
42
  flow_jobs (Union[Unset, List[str]]):
40
43
  flow_jobs_success (Union[Unset, List[bool]]):
44
+ flow_jobs_duration (Union[Unset, QueuedJobFlowStatusFailureModuleFlowJobsDuration]):
41
45
  branch_chosen (Union[Unset, QueuedJobFlowStatusFailureModuleBranchChosen]):
42
46
  branchall (Union[Unset, QueuedJobFlowStatusFailureModuleBranchall]):
43
47
  approvers (Union[Unset, List['QueuedJobFlowStatusFailureModuleApproversItem']]):
@@ -57,6 +61,7 @@ class QueuedJobFlowStatusFailureModule:
57
61
  iterator: Union[Unset, "QueuedJobFlowStatusFailureModuleIterator"] = UNSET
58
62
  flow_jobs: Union[Unset, List[str]] = UNSET
59
63
  flow_jobs_success: Union[Unset, List[bool]] = UNSET
64
+ flow_jobs_duration: Union[Unset, "QueuedJobFlowStatusFailureModuleFlowJobsDuration"] = UNSET
60
65
  branch_chosen: Union[Unset, "QueuedJobFlowStatusFailureModuleBranchChosen"] = UNSET
61
66
  branchall: Union[Unset, "QueuedJobFlowStatusFailureModuleBranchall"] = UNSET
62
67
  approvers: Union[Unset, List["QueuedJobFlowStatusFailureModuleApproversItem"]] = UNSET
@@ -98,6 +103,10 @@ class QueuedJobFlowStatusFailureModule:
98
103
  if not isinstance(self.flow_jobs_success, Unset):
99
104
  flow_jobs_success = self.flow_jobs_success
100
105
 
106
+ flow_jobs_duration: Union[Unset, Dict[str, Any]] = UNSET
107
+ if not isinstance(self.flow_jobs_duration, Unset):
108
+ flow_jobs_duration = self.flow_jobs_duration.to_dict()
109
+
101
110
  branch_chosen: Union[Unset, Dict[str, Any]] = UNSET
102
111
  if not isinstance(self.branch_chosen, Unset):
103
112
  branch_chosen = self.branch_chosen.to_dict()
@@ -160,6 +169,8 @@ class QueuedJobFlowStatusFailureModule:
160
169
  field_dict["flow_jobs"] = flow_jobs
161
170
  if flow_jobs_success is not UNSET:
162
171
  field_dict["flow_jobs_success"] = flow_jobs_success
172
+ if flow_jobs_duration is not UNSET:
173
+ field_dict["flow_jobs_duration"] = flow_jobs_duration
163
174
  if branch_chosen is not UNSET:
164
175
  field_dict["branch_chosen"] = branch_chosen
165
176
  if branchall is not UNSET:
@@ -194,6 +205,9 @@ class QueuedJobFlowStatusFailureModule:
194
205
  QueuedJobFlowStatusFailureModuleBranchChosen,
195
206
  )
196
207
  from ..models.queued_job_flow_status_failure_module_branchall import QueuedJobFlowStatusFailureModuleBranchall
208
+ from ..models.queued_job_flow_status_failure_module_flow_jobs_duration import (
209
+ QueuedJobFlowStatusFailureModuleFlowJobsDuration,
210
+ )
197
211
  from ..models.queued_job_flow_status_failure_module_iterator import QueuedJobFlowStatusFailureModuleIterator
198
212
 
199
213
  d = src_dict.copy()
@@ -218,6 +232,13 @@ class QueuedJobFlowStatusFailureModule:
218
232
 
219
233
  flow_jobs_success = cast(List[bool], d.pop("flow_jobs_success", UNSET))
220
234
 
235
+ _flow_jobs_duration = d.pop("flow_jobs_duration", UNSET)
236
+ flow_jobs_duration: Union[Unset, QueuedJobFlowStatusFailureModuleFlowJobsDuration]
237
+ if isinstance(_flow_jobs_duration, Unset):
238
+ flow_jobs_duration = UNSET
239
+ else:
240
+ flow_jobs_duration = QueuedJobFlowStatusFailureModuleFlowJobsDuration.from_dict(_flow_jobs_duration)
241
+
221
242
  _branch_chosen = d.pop("branch_chosen", UNSET)
222
243
  branch_chosen: Union[Unset, QueuedJobFlowStatusFailureModuleBranchChosen]
223
244
  if isinstance(_branch_chosen, Unset):
@@ -284,6 +305,7 @@ class QueuedJobFlowStatusFailureModule:
284
305
  iterator=iterator,
285
306
  flow_jobs=flow_jobs,
286
307
  flow_jobs_success=flow_jobs_success,
308
+ flow_jobs_duration=flow_jobs_duration,
287
309
  branch_chosen=branch_chosen,
288
310
  branchall=branchall,
289
311
  approvers=approvers,
@@ -0,0 +1,71 @@
1
+ from typing import Any, Dict, List, Type, TypeVar, Union, cast
2
+
3
+ from attrs import define as _attrs_define
4
+ from attrs import field as _attrs_field
5
+
6
+ from ..types import UNSET, Unset
7
+
8
+ T = TypeVar("T", bound="QueuedJobFlowStatusFailureModuleFlowJobsDuration")
9
+
10
+
11
+ @_attrs_define
12
+ class QueuedJobFlowStatusFailureModuleFlowJobsDuration:
13
+ """
14
+ Attributes:
15
+ started_at (Union[Unset, List[str]]):
16
+ duration_ms (Union[Unset, List[int]]):
17
+ """
18
+
19
+ started_at: Union[Unset, List[str]] = UNSET
20
+ duration_ms: Union[Unset, List[int]] = UNSET
21
+ additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
22
+
23
+ def to_dict(self) -> Dict[str, Any]:
24
+ started_at: Union[Unset, List[str]] = UNSET
25
+ if not isinstance(self.started_at, Unset):
26
+ started_at = self.started_at
27
+
28
+ duration_ms: Union[Unset, List[int]] = UNSET
29
+ if not isinstance(self.duration_ms, Unset):
30
+ duration_ms = self.duration_ms
31
+
32
+ field_dict: Dict[str, Any] = {}
33
+ field_dict.update(self.additional_properties)
34
+ field_dict.update({})
35
+ if started_at is not UNSET:
36
+ field_dict["started_at"] = started_at
37
+ if duration_ms is not UNSET:
38
+ field_dict["duration_ms"] = duration_ms
39
+
40
+ return field_dict
41
+
42
+ @classmethod
43
+ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
44
+ d = src_dict.copy()
45
+ started_at = cast(List[str], d.pop("started_at", UNSET))
46
+
47
+ duration_ms = cast(List[int], d.pop("duration_ms", UNSET))
48
+
49
+ queued_job_flow_status_failure_module_flow_jobs_duration = cls(
50
+ started_at=started_at,
51
+ duration_ms=duration_ms,
52
+ )
53
+
54
+ queued_job_flow_status_failure_module_flow_jobs_duration.additional_properties = d
55
+ return queued_job_flow_status_failure_module_flow_jobs_duration
56
+
57
+ @property
58
+ def additional_keys(self) -> List[str]:
59
+ return list(self.additional_properties.keys())
60
+
61
+ def __getitem__(self, key: str) -> Any:
62
+ return self.additional_properties[key]
63
+
64
+ def __setitem__(self, key: str, value: Any) -> None:
65
+ self.additional_properties[key] = value
66
+
67
+ def __delitem__(self, key: str) -> None:
68
+ del self.additional_properties[key]
69
+
70
+ def __contains__(self, key: str) -> bool:
71
+ return key in self.additional_properties
@@ -16,6 +16,9 @@ if TYPE_CHECKING:
16
16
  from ..models.queued_job_flow_status_modules_item_approvers_item import QueuedJobFlowStatusModulesItemApproversItem
17
17
  from ..models.queued_job_flow_status_modules_item_branch_chosen import QueuedJobFlowStatusModulesItemBranchChosen
18
18
  from ..models.queued_job_flow_status_modules_item_branchall import QueuedJobFlowStatusModulesItemBranchall
19
+ from ..models.queued_job_flow_status_modules_item_flow_jobs_duration import (
20
+ QueuedJobFlowStatusModulesItemFlowJobsDuration,
21
+ )
19
22
  from ..models.queued_job_flow_status_modules_item_iterator import QueuedJobFlowStatusModulesItemIterator
20
23
 
21
24
 
@@ -34,6 +37,7 @@ class QueuedJobFlowStatusModulesItem:
34
37
  iterator (Union[Unset, QueuedJobFlowStatusModulesItemIterator]):
35
38
  flow_jobs (Union[Unset, List[str]]):
36
39
  flow_jobs_success (Union[Unset, List[bool]]):
40
+ flow_jobs_duration (Union[Unset, QueuedJobFlowStatusModulesItemFlowJobsDuration]):
37
41
  branch_chosen (Union[Unset, QueuedJobFlowStatusModulesItemBranchChosen]):
38
42
  branchall (Union[Unset, QueuedJobFlowStatusModulesItemBranchall]):
39
43
  approvers (Union[Unset, List['QueuedJobFlowStatusModulesItemApproversItem']]):
@@ -52,6 +56,7 @@ class QueuedJobFlowStatusModulesItem:
52
56
  iterator: Union[Unset, "QueuedJobFlowStatusModulesItemIterator"] = UNSET
53
57
  flow_jobs: Union[Unset, List[str]] = UNSET
54
58
  flow_jobs_success: Union[Unset, List[bool]] = UNSET
59
+ flow_jobs_duration: Union[Unset, "QueuedJobFlowStatusModulesItemFlowJobsDuration"] = UNSET
55
60
  branch_chosen: Union[Unset, "QueuedJobFlowStatusModulesItemBranchChosen"] = UNSET
56
61
  branchall: Union[Unset, "QueuedJobFlowStatusModulesItemBranchall"] = UNSET
57
62
  approvers: Union[Unset, List["QueuedJobFlowStatusModulesItemApproversItem"]] = UNSET
@@ -92,6 +97,10 @@ class QueuedJobFlowStatusModulesItem:
92
97
  if not isinstance(self.flow_jobs_success, Unset):
93
98
  flow_jobs_success = self.flow_jobs_success
94
99
 
100
+ flow_jobs_duration: Union[Unset, Dict[str, Any]] = UNSET
101
+ if not isinstance(self.flow_jobs_duration, Unset):
102
+ flow_jobs_duration = self.flow_jobs_duration.to_dict()
103
+
95
104
  branch_chosen: Union[Unset, Dict[str, Any]] = UNSET
96
105
  if not isinstance(self.branch_chosen, Unset):
97
106
  branch_chosen = self.branch_chosen.to_dict()
@@ -152,6 +161,8 @@ class QueuedJobFlowStatusModulesItem:
152
161
  field_dict["flow_jobs"] = flow_jobs
153
162
  if flow_jobs_success is not UNSET:
154
163
  field_dict["flow_jobs_success"] = flow_jobs_success
164
+ if flow_jobs_duration is not UNSET:
165
+ field_dict["flow_jobs_duration"] = flow_jobs_duration
155
166
  if branch_chosen is not UNSET:
156
167
  field_dict["branch_chosen"] = branch_chosen
157
168
  if branchall is not UNSET:
@@ -184,6 +195,9 @@ class QueuedJobFlowStatusModulesItem:
184
195
  QueuedJobFlowStatusModulesItemBranchChosen,
185
196
  )
186
197
  from ..models.queued_job_flow_status_modules_item_branchall import QueuedJobFlowStatusModulesItemBranchall
198
+ from ..models.queued_job_flow_status_modules_item_flow_jobs_duration import (
199
+ QueuedJobFlowStatusModulesItemFlowJobsDuration,
200
+ )
187
201
  from ..models.queued_job_flow_status_modules_item_iterator import QueuedJobFlowStatusModulesItemIterator
188
202
 
189
203
  d = src_dict.copy()
@@ -208,6 +222,13 @@ class QueuedJobFlowStatusModulesItem:
208
222
 
209
223
  flow_jobs_success = cast(List[bool], d.pop("flow_jobs_success", UNSET))
210
224
 
225
+ _flow_jobs_duration = d.pop("flow_jobs_duration", UNSET)
226
+ flow_jobs_duration: Union[Unset, QueuedJobFlowStatusModulesItemFlowJobsDuration]
227
+ if isinstance(_flow_jobs_duration, Unset):
228
+ flow_jobs_duration = UNSET
229
+ else:
230
+ flow_jobs_duration = QueuedJobFlowStatusModulesItemFlowJobsDuration.from_dict(_flow_jobs_duration)
231
+
211
232
  _branch_chosen = d.pop("branch_chosen", UNSET)
212
233
  branch_chosen: Union[Unset, QueuedJobFlowStatusModulesItemBranchChosen]
213
234
  if isinstance(_branch_chosen, Unset):
@@ -272,6 +293,7 @@ class QueuedJobFlowStatusModulesItem:
272
293
  iterator=iterator,
273
294
  flow_jobs=flow_jobs,
274
295
  flow_jobs_success=flow_jobs_success,
296
+ flow_jobs_duration=flow_jobs_duration,
275
297
  branch_chosen=branch_chosen,
276
298
  branchall=branchall,
277
299
  approvers=approvers,
@@ -0,0 +1,71 @@
1
+ from typing import Any, Dict, List, Type, TypeVar, Union, cast
2
+
3
+ from attrs import define as _attrs_define
4
+ from attrs import field as _attrs_field
5
+
6
+ from ..types import UNSET, Unset
7
+
8
+ T = TypeVar("T", bound="QueuedJobFlowStatusModulesItemFlowJobsDuration")
9
+
10
+
11
+ @_attrs_define
12
+ class QueuedJobFlowStatusModulesItemFlowJobsDuration:
13
+ """
14
+ Attributes:
15
+ started_at (Union[Unset, List[str]]):
16
+ duration_ms (Union[Unset, List[int]]):
17
+ """
18
+
19
+ started_at: Union[Unset, List[str]] = UNSET
20
+ duration_ms: Union[Unset, List[int]] = UNSET
21
+ additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
22
+
23
+ def to_dict(self) -> Dict[str, Any]:
24
+ started_at: Union[Unset, List[str]] = UNSET
25
+ if not isinstance(self.started_at, Unset):
26
+ started_at = self.started_at
27
+
28
+ duration_ms: Union[Unset, List[int]] = UNSET
29
+ if not isinstance(self.duration_ms, Unset):
30
+ duration_ms = self.duration_ms
31
+
32
+ field_dict: Dict[str, Any] = {}
33
+ field_dict.update(self.additional_properties)
34
+ field_dict.update({})
35
+ if started_at is not UNSET:
36
+ field_dict["started_at"] = started_at
37
+ if duration_ms is not UNSET:
38
+ field_dict["duration_ms"] = duration_ms
39
+
40
+ return field_dict
41
+
42
+ @classmethod
43
+ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
44
+ d = src_dict.copy()
45
+ started_at = cast(List[str], d.pop("started_at", UNSET))
46
+
47
+ duration_ms = cast(List[int], d.pop("duration_ms", UNSET))
48
+
49
+ queued_job_flow_status_modules_item_flow_jobs_duration = cls(
50
+ started_at=started_at,
51
+ duration_ms=duration_ms,
52
+ )
53
+
54
+ queued_job_flow_status_modules_item_flow_jobs_duration.additional_properties = d
55
+ return queued_job_flow_status_modules_item_flow_jobs_duration
56
+
57
+ @property
58
+ def additional_keys(self) -> List[str]:
59
+ return list(self.additional_properties.keys())
60
+
61
+ def __getitem__(self, key: str) -> Any:
62
+ return self.additional_properties[key]
63
+
64
+ def __setitem__(self, key: str, value: Any) -> None:
65
+ self.additional_properties[key] = value
66
+
67
+ def __delitem__(self, key: str) -> None:
68
+ del self.additional_properties[key]
69
+
70
+ def __contains__(self, key: str) -> bool:
71
+ return key in self.additional_properties
@@ -22,6 +22,9 @@ if TYPE_CHECKING:
22
22
  from ..models.queued_job_flow_status_preprocessor_module_branchall import (
23
23
  QueuedJobFlowStatusPreprocessorModuleBranchall,
24
24
  )
25
+ from ..models.queued_job_flow_status_preprocessor_module_flow_jobs_duration import (
26
+ QueuedJobFlowStatusPreprocessorModuleFlowJobsDuration,
27
+ )
25
28
  from ..models.queued_job_flow_status_preprocessor_module_iterator import (
26
29
  QueuedJobFlowStatusPreprocessorModuleIterator,
27
30
  )
@@ -42,6 +45,7 @@ class QueuedJobFlowStatusPreprocessorModule:
42
45
  iterator (Union[Unset, QueuedJobFlowStatusPreprocessorModuleIterator]):
43
46
  flow_jobs (Union[Unset, List[str]]):
44
47
  flow_jobs_success (Union[Unset, List[bool]]):
48
+ flow_jobs_duration (Union[Unset, QueuedJobFlowStatusPreprocessorModuleFlowJobsDuration]):
45
49
  branch_chosen (Union[Unset, QueuedJobFlowStatusPreprocessorModuleBranchChosen]):
46
50
  branchall (Union[Unset, QueuedJobFlowStatusPreprocessorModuleBranchall]):
47
51
  approvers (Union[Unset, List['QueuedJobFlowStatusPreprocessorModuleApproversItem']]):
@@ -60,6 +64,7 @@ class QueuedJobFlowStatusPreprocessorModule:
60
64
  iterator: Union[Unset, "QueuedJobFlowStatusPreprocessorModuleIterator"] = UNSET
61
65
  flow_jobs: Union[Unset, List[str]] = UNSET
62
66
  flow_jobs_success: Union[Unset, List[bool]] = UNSET
67
+ flow_jobs_duration: Union[Unset, "QueuedJobFlowStatusPreprocessorModuleFlowJobsDuration"] = UNSET
63
68
  branch_chosen: Union[Unset, "QueuedJobFlowStatusPreprocessorModuleBranchChosen"] = UNSET
64
69
  branchall: Union[Unset, "QueuedJobFlowStatusPreprocessorModuleBranchall"] = UNSET
65
70
  approvers: Union[Unset, List["QueuedJobFlowStatusPreprocessorModuleApproversItem"]] = UNSET
@@ -100,6 +105,10 @@ class QueuedJobFlowStatusPreprocessorModule:
100
105
  if not isinstance(self.flow_jobs_success, Unset):
101
106
  flow_jobs_success = self.flow_jobs_success
102
107
 
108
+ flow_jobs_duration: Union[Unset, Dict[str, Any]] = UNSET
109
+ if not isinstance(self.flow_jobs_duration, Unset):
110
+ flow_jobs_duration = self.flow_jobs_duration.to_dict()
111
+
103
112
  branch_chosen: Union[Unset, Dict[str, Any]] = UNSET
104
113
  if not isinstance(self.branch_chosen, Unset):
105
114
  branch_chosen = self.branch_chosen.to_dict()
@@ -160,6 +169,8 @@ class QueuedJobFlowStatusPreprocessorModule:
160
169
  field_dict["flow_jobs"] = flow_jobs
161
170
  if flow_jobs_success is not UNSET:
162
171
  field_dict["flow_jobs_success"] = flow_jobs_success
172
+ if flow_jobs_duration is not UNSET:
173
+ field_dict["flow_jobs_duration"] = flow_jobs_duration
163
174
  if branch_chosen is not UNSET:
164
175
  field_dict["branch_chosen"] = branch_chosen
165
176
  if branchall is not UNSET:
@@ -194,6 +205,9 @@ class QueuedJobFlowStatusPreprocessorModule:
194
205
  from ..models.queued_job_flow_status_preprocessor_module_branchall import (
195
206
  QueuedJobFlowStatusPreprocessorModuleBranchall,
196
207
  )
208
+ from ..models.queued_job_flow_status_preprocessor_module_flow_jobs_duration import (
209
+ QueuedJobFlowStatusPreprocessorModuleFlowJobsDuration,
210
+ )
197
211
  from ..models.queued_job_flow_status_preprocessor_module_iterator import (
198
212
  QueuedJobFlowStatusPreprocessorModuleIterator,
199
213
  )
@@ -220,6 +234,13 @@ class QueuedJobFlowStatusPreprocessorModule:
220
234
 
221
235
  flow_jobs_success = cast(List[bool], d.pop("flow_jobs_success", UNSET))
222
236
 
237
+ _flow_jobs_duration = d.pop("flow_jobs_duration", UNSET)
238
+ flow_jobs_duration: Union[Unset, QueuedJobFlowStatusPreprocessorModuleFlowJobsDuration]
239
+ if isinstance(_flow_jobs_duration, Unset):
240
+ flow_jobs_duration = UNSET
241
+ else:
242
+ flow_jobs_duration = QueuedJobFlowStatusPreprocessorModuleFlowJobsDuration.from_dict(_flow_jobs_duration)
243
+
223
244
  _branch_chosen = d.pop("branch_chosen", UNSET)
224
245
  branch_chosen: Union[Unset, QueuedJobFlowStatusPreprocessorModuleBranchChosen]
225
246
  if isinstance(_branch_chosen, Unset):
@@ -286,6 +307,7 @@ class QueuedJobFlowStatusPreprocessorModule:
286
307
  iterator=iterator,
287
308
  flow_jobs=flow_jobs,
288
309
  flow_jobs_success=flow_jobs_success,
310
+ flow_jobs_duration=flow_jobs_duration,
289
311
  branch_chosen=branch_chosen,
290
312
  branchall=branchall,
291
313
  approvers=approvers,
@@ -0,0 +1,71 @@
1
+ from typing import Any, Dict, List, Type, TypeVar, Union, cast
2
+
3
+ from attrs import define as _attrs_define
4
+ from attrs import field as _attrs_field
5
+
6
+ from ..types import UNSET, Unset
7
+
8
+ T = TypeVar("T", bound="QueuedJobFlowStatusPreprocessorModuleFlowJobsDuration")
9
+
10
+
11
+ @_attrs_define
12
+ class QueuedJobFlowStatusPreprocessorModuleFlowJobsDuration:
13
+ """
14
+ Attributes:
15
+ started_at (Union[Unset, List[str]]):
16
+ duration_ms (Union[Unset, List[int]]):
17
+ """
18
+
19
+ started_at: Union[Unset, List[str]] = UNSET
20
+ duration_ms: Union[Unset, List[int]] = UNSET
21
+ additional_properties: Dict[str, Any] = _attrs_field(init=False, factory=dict)
22
+
23
+ def to_dict(self) -> Dict[str, Any]:
24
+ started_at: Union[Unset, List[str]] = UNSET
25
+ if not isinstance(self.started_at, Unset):
26
+ started_at = self.started_at
27
+
28
+ duration_ms: Union[Unset, List[int]] = UNSET
29
+ if not isinstance(self.duration_ms, Unset):
30
+ duration_ms = self.duration_ms
31
+
32
+ field_dict: Dict[str, Any] = {}
33
+ field_dict.update(self.additional_properties)
34
+ field_dict.update({})
35
+ if started_at is not UNSET:
36
+ field_dict["started_at"] = started_at
37
+ if duration_ms is not UNSET:
38
+ field_dict["duration_ms"] = duration_ms
39
+
40
+ return field_dict
41
+
42
+ @classmethod
43
+ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
44
+ d = src_dict.copy()
45
+ started_at = cast(List[str], d.pop("started_at", UNSET))
46
+
47
+ duration_ms = cast(List[int], d.pop("duration_ms", UNSET))
48
+
49
+ queued_job_flow_status_preprocessor_module_flow_jobs_duration = cls(
50
+ started_at=started_at,
51
+ duration_ms=duration_ms,
52
+ )
53
+
54
+ queued_job_flow_status_preprocessor_module_flow_jobs_duration.additional_properties = d
55
+ return queued_job_flow_status_preprocessor_module_flow_jobs_duration
56
+
57
+ @property
58
+ def additional_keys(self) -> List[str]:
59
+ return list(self.additional_properties.keys())
60
+
61
+ def __getitem__(self, key: str) -> Any:
62
+ return self.additional_properties[key]
63
+
64
+ def __setitem__(self, key: str, value: Any) -> None:
65
+ self.additional_properties[key] = value
66
+
67
+ def __delitem__(self, key: str) -> None:
68
+ del self.additional_properties[key]
69
+
70
+ def __contains__(self, key: str) -> bool:
71
+ return key in self.additional_properties
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: windmill-api
3
- Version: 1.544.2
3
+ Version: 1.546.0
4
4
  Summary: A client library for accessing Windmill API
5
5
  License: Apache-2.0
6
6
  Author: Ruben Fiszel