mithril-client 0.1.0a1__cp314-cp314-macosx_11_0_arm64.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.
Files changed (163) hide show
  1. mithril/__init__.py +7 -0
  2. mithril/_mcli.cpython-314-darwin.so +0 -0
  3. mithril/_mcli.pyi +7 -0
  4. mithril/_mcli_entry.py +75 -0
  5. mithril/api/__init__.py +7 -0
  6. mithril/api/bindings/.gitattributes +2 -0
  7. mithril/api/bindings/__init__.py +10 -0
  8. mithril/api/bindings/api/__init__.py +1 -0
  9. mithril/api/bindings/api/api_keys/__init__.py +1 -0
  10. mithril/api/bindings/api/api_keys/create_api_key_v2_api_keys_post.py +179 -0
  11. mithril/api/bindings/api/api_keys/get_api_keys_v2_api_keys_get.py +141 -0
  12. mithril/api/bindings/api/api_keys/revoke_api_key_v2_api_keys_key_fid_delete.py +173 -0
  13. mithril/api/bindings/api/image_versions/__init__.py +1 -0
  14. mithril/api/bindings/api/image_versions/get_image_versions_v2_image_versions_get.py +141 -0
  15. mithril/api/bindings/api/image_versions/get_mcc_image_versions_v2_mcc_image_versions_get.py +179 -0
  16. mithril/api/bindings/api/instance_types/__init__.py +1 -0
  17. mithril/api/bindings/api/instance_types/get_instance_types_v2_instance_types_get.py +137 -0
  18. mithril/api/bindings/api/instances/__init__.py +1 -0
  19. mithril/api/bindings/api/instances/get_instance_status_v2_instances_instance_id_status_get.py +165 -0
  20. mithril/api/bindings/api/instances/get_instances_v2_instances_get.py +409 -0
  21. mithril/api/bindings/api/kubernetes_clusters/__init__.py +1 -0
  22. mithril/api/bindings/api/kubernetes_clusters/create_kubernetes_cluster_v2_kubernetes_clusters_post.py +171 -0
  23. mithril/api/bindings/api/kubernetes_clusters/delete_kubernetes_cluster_v2_kubernetes_clusters_cluster_fid_delete.py +163 -0
  24. mithril/api/bindings/api/kubernetes_clusters/get_kubernetes_cluster_v2_kubernetes_clusters_cluster_fid_get.py +165 -0
  25. mithril/api/bindings/api/kubernetes_clusters/get_kubernetes_clusters_v2_kubernetes_clusters_get.py +175 -0
  26. mithril/api/bindings/api/lifecycle_scripts/__init__.py +1 -0
  27. mithril/api/bindings/api/lifecycle_scripts/create_lifecycle_script_v2_lifecycle_scripts_post.py +171 -0
  28. mithril/api/bindings/api/lifecycle_scripts/delete_lifecycle_script_v2_lifecycle_scripts_ls_fid_delete.py +155 -0
  29. mithril/api/bindings/api/lifecycle_scripts/get_lifecycle_script_content_v2_lifecycle_scripts_ls_fid_content_get.py +155 -0
  30. mithril/api/bindings/api/lifecycle_scripts/list_lifecycle_scripts_v2_lifecycle_scripts_get.py +247 -0
  31. mithril/api/bindings/api/lifecycle_scripts/update_lifecycle_script_v2_lifecycle_scripts_ls_fid_patch.py +179 -0
  32. mithril/api/bindings/api/pricing/__init__.py +1 -0
  33. mithril/api/bindings/api/pricing/get_current_prices_v2_v2_pricing_current_get.py +217 -0
  34. mithril/api/bindings/api/pricing/get_historical_prices_v2_v2_pricing_history_get.py +222 -0
  35. mithril/api/bindings/api/profile/__init__.py +1 -0
  36. mithril/api/bindings/api/profile/get_me_v2_me_get.py +132 -0
  37. mithril/api/bindings/api/profile/get_my_teammates_v2_me_teammates_get.py +153 -0
  38. mithril/api/bindings/api/projects/__init__.py +1 -0
  39. mithril/api/bindings/api/projects/get_projects_v2_projects_get.py +137 -0
  40. mithril/api/bindings/api/quotas/__init__.py +1 -0
  41. mithril/api/bindings/api/quotas/get_quotas_v2_quotas_get.py +175 -0
  42. mithril/api/bindings/api/reservations/__init__.py +1 -0
  43. mithril/api/bindings/api/reservations/create_reservation_v2_reservation_post.py +171 -0
  44. mithril/api/bindings/api/reservations/extend_reservation_v2_reservation_reservation_fid_extend_post.py +187 -0
  45. mithril/api/bindings/api/reservations/get_availability_v2_reservation_availability_get.py +664 -0
  46. mithril/api/bindings/api/reservations/get_extension_availability_v2_reservation_reservation_fid_extension_availability_get.py +165 -0
  47. mithril/api/bindings/api/reservations/get_reservations_v2_reservation_get.py +309 -0
  48. mithril/api/bindings/api/reservations/update_reservation_v2_reservation_reservation_fid_patch.py +187 -0
  49. mithril/api/bindings/api/spot/__init__.py +1 -0
  50. mithril/api/bindings/api/spot/cancel_bid_v2_spot_bids_bid_fid_delete.py +161 -0
  51. mithril/api/bindings/api/spot/create_bid_v2_spot_bids_post.py +171 -0
  52. mithril/api/bindings/api/spot/get_auctions_v2_spot_availability_get.py +137 -0
  53. mithril/api/bindings/api/spot/get_bid_history_v2_spot_bids_bid_fid_history_get.py +193 -0
  54. mithril/api/bindings/api/spot/get_bid_status_v2_spot_bids_bid_fid_status_get.py +189 -0
  55. mithril/api/bindings/api/spot/get_bid_v2_spot_bids_bid_fid_get.py +163 -0
  56. mithril/api/bindings/api/spot/get_bids_v2_spot_bids_get.py +330 -0
  57. mithril/api/bindings/api/spot/update_bid_v2_spot_bids_bid_fid_patch.py +185 -0
  58. mithril/api/bindings/api/ssh_keys/__init__.py +1 -0
  59. mithril/api/bindings/api/ssh_keys/create_ssh_key_v2_ssh_keys_post.py +175 -0
  60. mithril/api/bindings/api/ssh_keys/delete_ssh_key_v2_ssh_keys_ssh_key_fid_delete.py +167 -0
  61. mithril/api/bindings/api/ssh_keys/get_ssh_keys_v2_ssh_keys_get.py +175 -0
  62. mithril/api/bindings/api/ssh_keys/update_ssh_key_v2_ssh_keys_ssh_key_fid_patch.py +187 -0
  63. mithril/api/bindings/api/volumes/__init__.py +1 -0
  64. mithril/api/bindings/api/volumes/create_volume_v2_volumes_post.py +211 -0
  65. mithril/api/bindings/api/volumes/delete_volume_v2_volumes_volume_fid_delete.py +199 -0
  66. mithril/api/bindings/api/volumes/get_volumes_v2_volumes_get.py +239 -0
  67. mithril/api/bindings/api/volumes/update_volume_v2_volumes_volume_fid_patch.py +243 -0
  68. mithril/api/bindings/client.py +284 -0
  69. mithril/api/bindings/errors.py +18 -0
  70. mithril/api/bindings/models/__init__.py +169 -0
  71. mithril/api/bindings/models/api_key_model.py +114 -0
  72. mithril/api/bindings/models/auction_model.py +146 -0
  73. mithril/api/bindings/models/availability_slot_model.py +76 -0
  74. mithril/api/bindings/models/bid_history_event_model.py +157 -0
  75. mithril/api/bindings/models/bid_history_event_model_event_type.py +19 -0
  76. mithril/api/bindings/models/bid_history_response.py +84 -0
  77. mithril/api/bindings/models/bid_model.py +191 -0
  78. mithril/api/bindings/models/bid_model_status.py +14 -0
  79. mithril/api/bindings/models/bid_status_response.py +72 -0
  80. mithril/api/bindings/models/bid_status_response_status.py +15 -0
  81. mithril/api/bindings/models/check_availability_response.py +60 -0
  82. mithril/api/bindings/models/create_api_key_request.py +68 -0
  83. mithril/api/bindings/models/create_api_key_response.py +122 -0
  84. mithril/api/bindings/models/create_bid_request.py +116 -0
  85. mithril/api/bindings/models/create_kubernetes_cluster_request.py +136 -0
  86. mithril/api/bindings/models/create_kubernetes_cluster_request_k8s_version.py +11 -0
  87. mithril/api/bindings/models/create_lifecycle_script_request.py +115 -0
  88. mithril/api/bindings/models/create_reservation_request.py +124 -0
  89. mithril/api/bindings/models/create_ssh_key_request.py +99 -0
  90. mithril/api/bindings/models/create_volume_request.py +98 -0
  91. mithril/api/bindings/models/create_volume_request_disk_interface.py +11 -0
  92. mithril/api/bindings/models/created_ssh_key_model.py +122 -0
  93. mithril/api/bindings/models/current_prices_response.py +202 -0
  94. mithril/api/bindings/models/extend_reservation_request.py +60 -0
  95. mithril/api/bindings/models/extension_availability_response.py +68 -0
  96. mithril/api/bindings/models/get_availability_v2_reservation_availability_get_mode.py +12 -0
  97. mithril/api/bindings/models/get_bids_response.py +96 -0
  98. mithril/api/bindings/models/get_bids_v2_spot_bids_get_sort_by.py +11 -0
  99. mithril/api/bindings/models/get_bids_v2_spot_bids_get_status.py +14 -0
  100. mithril/api/bindings/models/get_instances_response.py +96 -0
  101. mithril/api/bindings/models/get_instances_v2_instances_get_order_type_in_type_0_item.py +11 -0
  102. mithril/api/bindings/models/get_instances_v2_instances_get_sort_by.py +12 -0
  103. mithril/api/bindings/models/get_instances_v2_instances_get_status_in_type_0_item.py +24 -0
  104. mithril/api/bindings/models/get_latest_end_time_response.py +68 -0
  105. mithril/api/bindings/models/get_reservations_response.py +96 -0
  106. mithril/api/bindings/models/get_reservations_v2_reservation_get_sort_by.py +11 -0
  107. mithril/api/bindings/models/get_reservations_v2_reservation_get_status.py +14 -0
  108. mithril/api/bindings/models/historical_price_point_model.py +94 -0
  109. mithril/api/bindings/models/historical_prices_response_model.py +76 -0
  110. mithril/api/bindings/models/http_validation_error.py +78 -0
  111. mithril/api/bindings/models/image_version_model.py +224 -0
  112. mithril/api/bindings/models/instance_model.py +211 -0
  113. mithril/api/bindings/models/instance_model_status.py +24 -0
  114. mithril/api/bindings/models/instance_status_response.py +141 -0
  115. mithril/api/bindings/models/instance_status_response_status.py +24 -0
  116. mithril/api/bindings/models/instance_type_model.py +170 -0
  117. mithril/api/bindings/models/kubernetes_cluster_model.py +207 -0
  118. mithril/api/bindings/models/kubernetes_cluster_model_status.py +12 -0
  119. mithril/api/bindings/models/launch_specification_model.py +152 -0
  120. mithril/api/bindings/models/lifecycle_script_model.py +134 -0
  121. mithril/api/bindings/models/lifecycle_script_scope.py +12 -0
  122. mithril/api/bindings/models/list_lifecycle_scripts_response.py +96 -0
  123. mithril/api/bindings/models/list_lifecycle_scripts_v2_lifecycle_scripts_get_sort_by.py +11 -0
  124. mithril/api/bindings/models/me_response.py +126 -0
  125. mithril/api/bindings/models/new_ssh_key_model.py +100 -0
  126. mithril/api/bindings/models/persistent_disk_change.py +92 -0
  127. mithril/api/bindings/models/project_model.py +76 -0
  128. mithril/api/bindings/models/public_lifecycle_script_scope.py +11 -0
  129. mithril/api/bindings/models/quota_model.py +132 -0
  130. mithril/api/bindings/models/reservation_model.py +215 -0
  131. mithril/api/bindings/models/reservation_model_status.py +14 -0
  132. mithril/api/bindings/models/size.py +70 -0
  133. mithril/api/bindings/models/size_unit.py +18 -0
  134. mithril/api/bindings/models/sort_direction.py +11 -0
  135. mithril/api/bindings/models/teammate_response.py +158 -0
  136. mithril/api/bindings/models/update_bid_request.py +143 -0
  137. mithril/api/bindings/models/update_lifecycle_script_request.py +109 -0
  138. mithril/api/bindings/models/update_reservation_request.py +103 -0
  139. mithril/api/bindings/models/update_ssh_key_request.py +60 -0
  140. mithril/api/bindings/models/update_volume_request.py +65 -0
  141. mithril/api/bindings/models/validation_error.py +89 -0
  142. mithril/api/bindings/models/volume_model.py +140 -0
  143. mithril/api/bindings/models/volume_model_attachments.py +46 -0
  144. mithril/api/bindings/models/volume_model_interface.py +11 -0
  145. mithril/api/bindings/types.py +56 -0
  146. mithril/api/client.py +138 -0
  147. mithril/cli/__init__.py +7 -0
  148. mithril/cli/commands/__init__.py +15 -0
  149. mithril/cli/commands/help.py +88 -0
  150. mithril/cli/commands/launch.py +353 -0
  151. mithril/cli/main.py +68 -0
  152. mithril/cli/utils/__init__.py +1 -0
  153. mithril/cli/utils/skypilot_passthrough.py +38 -0
  154. mithril/cli/utils/streaming.py +235 -0
  155. mithril/cli/utils/volumes.py +110 -0
  156. mithril/config.py +47 -0
  157. mithril/py.typed +0 -0
  158. mithril/sky/__init__.py +141 -0
  159. mithril/sky/client.py +176 -0
  160. mithril_client-0.1.0a1.dist-info/METADATA +56 -0
  161. mithril_client-0.1.0a1.dist-info/RECORD +163 -0
  162. mithril_client-0.1.0a1.dist-info/WHEEL +4 -0
  163. mithril_client-0.1.0a1.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,126 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, Self, TypeVar, cast
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ from ..types import UNSET, Unset
10
+
11
+ T = TypeVar("T", bound="MeResponse")
12
+
13
+
14
+ @_attrs_define
15
+ class MeResponse:
16
+ """Attributes:
17
+ id (str):
18
+ fid (str):
19
+ email (str):
20
+ organization_id (str):
21
+ user_name (None | str | Unset):
22
+ organization_role (None | str | Unset):
23
+ """
24
+
25
+ id: str
26
+ fid: str
27
+ email: str
28
+ organization_id: str
29
+ user_name: None | str | Unset = UNSET
30
+ organization_role: None | str | Unset = UNSET
31
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
32
+
33
+ def to_dict(self) -> dict[str, Any]:
34
+ id = self.id
35
+
36
+ fid = self.fid
37
+
38
+ email = self.email
39
+
40
+ organization_id = self.organization_id
41
+
42
+ user_name: None | str | Unset
43
+ if isinstance(self.user_name, Unset):
44
+ user_name = UNSET
45
+ else:
46
+ user_name = self.user_name
47
+
48
+ organization_role: None | str | Unset
49
+ if isinstance(self.organization_role, Unset):
50
+ organization_role = UNSET
51
+ else:
52
+ organization_role = self.organization_role
53
+
54
+ field_dict: dict[str, Any] = {}
55
+ field_dict.update(self.additional_properties)
56
+ field_dict.update(
57
+ {
58
+ "id": id,
59
+ "fid": fid,
60
+ "email": email,
61
+ "organization_id": organization_id,
62
+ }
63
+ )
64
+ if user_name is not UNSET:
65
+ field_dict["user_name"] = user_name
66
+ if organization_role is not UNSET:
67
+ field_dict["organization_role"] = organization_role
68
+
69
+ return field_dict
70
+
71
+ @classmethod
72
+ def from_dict(cls, src_dict: Mapping[str, Any]) -> Self:
73
+ d = dict(src_dict)
74
+ id = d.pop("id")
75
+
76
+ fid = d.pop("fid")
77
+
78
+ email = d.pop("email")
79
+
80
+ organization_id = d.pop("organization_id")
81
+
82
+ def _parse_user_name(data: object) -> None | str | Unset:
83
+ if data is None:
84
+ return data
85
+ if isinstance(data, Unset):
86
+ return data
87
+ return cast(None | str | Unset, data)
88
+
89
+ user_name = _parse_user_name(d.pop("user_name", UNSET))
90
+
91
+ def _parse_organization_role(data: object) -> None | str | Unset:
92
+ if data is None:
93
+ return data
94
+ if isinstance(data, Unset):
95
+ return data
96
+ return cast(None | str | Unset, data)
97
+
98
+ organization_role = _parse_organization_role(d.pop("organization_role", UNSET))
99
+
100
+ me_response = cls(
101
+ id=id,
102
+ fid=fid,
103
+ email=email,
104
+ organization_id=organization_id,
105
+ user_name=user_name,
106
+ organization_role=organization_role,
107
+ )
108
+
109
+ me_response.additional_properties = d
110
+ return me_response
111
+
112
+ @property
113
+ def additional_keys(self) -> list[str]:
114
+ return list(self.additional_properties.keys())
115
+
116
+ def __getitem__(self, key: str) -> Any:
117
+ return self.additional_properties[key]
118
+
119
+ def __setitem__(self, key: str, value: Any) -> None:
120
+ self.additional_properties[key] = value
121
+
122
+ def __delitem__(self, key: str) -> None:
123
+ del self.additional_properties[key]
124
+
125
+ def __contains__(self, key: str) -> bool:
126
+ return key in self.additional_properties
@@ -0,0 +1,100 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, Self, TypeVar
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ T = TypeVar("T", bound="NewSshKeyModel")
10
+
11
+
12
+ @_attrs_define
13
+ class NewSshKeyModel:
14
+ """Attributes:
15
+ fid (str):
16
+ name (str):
17
+ project (str):
18
+ public_key (str):
19
+ created_at (str):
20
+ required (bool):
21
+ """
22
+
23
+ fid: str
24
+ name: str
25
+ project: str
26
+ public_key: str
27
+ created_at: str
28
+ required: bool
29
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
30
+
31
+ def to_dict(self) -> dict[str, Any]:
32
+ fid = self.fid
33
+
34
+ name = self.name
35
+
36
+ project = self.project
37
+
38
+ public_key = self.public_key
39
+
40
+ created_at = self.created_at
41
+
42
+ required = self.required
43
+
44
+ field_dict: dict[str, Any] = {}
45
+ field_dict.update(self.additional_properties)
46
+ field_dict.update(
47
+ {
48
+ "fid": fid,
49
+ "name": name,
50
+ "project": project,
51
+ "public_key": public_key,
52
+ "created_at": created_at,
53
+ "required": required,
54
+ }
55
+ )
56
+
57
+ return field_dict
58
+
59
+ @classmethod
60
+ def from_dict(cls, src_dict: Mapping[str, Any]) -> Self:
61
+ d = dict(src_dict)
62
+ fid = d.pop("fid")
63
+
64
+ name = d.pop("name")
65
+
66
+ project = d.pop("project")
67
+
68
+ public_key = d.pop("public_key")
69
+
70
+ created_at = d.pop("created_at")
71
+
72
+ required = d.pop("required")
73
+
74
+ new_ssh_key_model = cls(
75
+ fid=fid,
76
+ name=name,
77
+ project=project,
78
+ public_key=public_key,
79
+ created_at=created_at,
80
+ required=required,
81
+ )
82
+
83
+ new_ssh_key_model.additional_properties = d
84
+ return new_ssh_key_model
85
+
86
+ @property
87
+ def additional_keys(self) -> list[str]:
88
+ return list(self.additional_properties.keys())
89
+
90
+ def __getitem__(self, key: str) -> Any:
91
+ return self.additional_properties[key]
92
+
93
+ def __setitem__(self, key: str, value: Any) -> None:
94
+ self.additional_properties[key] = value
95
+
96
+ def __delitem__(self, key: str) -> None:
97
+ del self.additional_properties[key]
98
+
99
+ def __contains__(self, key: str) -> bool:
100
+ return key in self.additional_properties
@@ -0,0 +1,92 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, Self, TypeVar, cast
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ from ..types import UNSET, Unset
10
+
11
+ T = TypeVar("T", bound="PersistentDiskChange")
12
+
13
+
14
+ @_attrs_define
15
+ class PersistentDiskChange:
16
+ """Attributes:
17
+ attached (None | str | Unset):
18
+ removed (None | str | Unset):
19
+ """
20
+
21
+ attached: None | str | Unset = UNSET
22
+ removed: None | str | Unset = UNSET
23
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
24
+
25
+ def to_dict(self) -> dict[str, Any]:
26
+ attached: None | str | Unset
27
+ if isinstance(self.attached, Unset):
28
+ attached = UNSET
29
+ else:
30
+ attached = self.attached
31
+
32
+ removed: None | str | Unset
33
+ if isinstance(self.removed, Unset):
34
+ removed = UNSET
35
+ else:
36
+ removed = self.removed
37
+
38
+ field_dict: dict[str, Any] = {}
39
+ field_dict.update(self.additional_properties)
40
+ field_dict.update({})
41
+ if attached is not UNSET:
42
+ field_dict["attached"] = attached
43
+ if removed is not UNSET:
44
+ field_dict["removed"] = removed
45
+
46
+ return field_dict
47
+
48
+ @classmethod
49
+ def from_dict(cls, src_dict: Mapping[str, Any]) -> Self:
50
+ d = dict(src_dict)
51
+
52
+ def _parse_attached(data: object) -> None | str | Unset:
53
+ if data is None:
54
+ return data
55
+ if isinstance(data, Unset):
56
+ return data
57
+ return cast(None | str | Unset, data)
58
+
59
+ attached = _parse_attached(d.pop("attached", UNSET))
60
+
61
+ def _parse_removed(data: object) -> None | str | Unset:
62
+ if data is None:
63
+ return data
64
+ if isinstance(data, Unset):
65
+ return data
66
+ return cast(None | str | Unset, data)
67
+
68
+ removed = _parse_removed(d.pop("removed", UNSET))
69
+
70
+ persistent_disk_change = cls(
71
+ attached=attached,
72
+ removed=removed,
73
+ )
74
+
75
+ persistent_disk_change.additional_properties = d
76
+ return persistent_disk_change
77
+
78
+ @property
79
+ def additional_keys(self) -> list[str]:
80
+ return list(self.additional_properties.keys())
81
+
82
+ def __getitem__(self, key: str) -> Any:
83
+ return self.additional_properties[key]
84
+
85
+ def __setitem__(self, key: str, value: Any) -> None:
86
+ self.additional_properties[key] = value
87
+
88
+ def __delitem__(self, key: str) -> None:
89
+ del self.additional_properties[key]
90
+
91
+ def __contains__(self, key: str) -> bool:
92
+ return key in self.additional_properties
@@ -0,0 +1,76 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, Self, TypeVar
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ T = TypeVar("T", bound="ProjectModel")
10
+
11
+
12
+ @_attrs_define
13
+ class ProjectModel:
14
+ """Attributes:
15
+ fid (str):
16
+ name (str):
17
+ created_at (str):
18
+ """
19
+
20
+ fid: str
21
+ name: str
22
+ created_at: str
23
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
24
+
25
+ def to_dict(self) -> dict[str, Any]:
26
+ fid = self.fid
27
+
28
+ name = self.name
29
+
30
+ created_at = self.created_at
31
+
32
+ field_dict: dict[str, Any] = {}
33
+ field_dict.update(self.additional_properties)
34
+ field_dict.update(
35
+ {
36
+ "fid": fid,
37
+ "name": name,
38
+ "created_at": created_at,
39
+ }
40
+ )
41
+
42
+ return field_dict
43
+
44
+ @classmethod
45
+ def from_dict(cls, src_dict: Mapping[str, Any]) -> Self:
46
+ d = dict(src_dict)
47
+ fid = d.pop("fid")
48
+
49
+ name = d.pop("name")
50
+
51
+ created_at = d.pop("created_at")
52
+
53
+ project_model = cls(
54
+ fid=fid,
55
+ name=name,
56
+ created_at=created_at,
57
+ )
58
+
59
+ project_model.additional_properties = d
60
+ return project_model
61
+
62
+ @property
63
+ def additional_keys(self) -> list[str]:
64
+ return list(self.additional_properties.keys())
65
+
66
+ def __getitem__(self, key: str) -> Any:
67
+ return self.additional_properties[key]
68
+
69
+ def __setitem__(self, key: str, value: Any) -> None:
70
+ self.additional_properties[key] = value
71
+
72
+ def __delitem__(self, key: str) -> None:
73
+ del self.additional_properties[key]
74
+
75
+ def __contains__(self, key: str) -> bool:
76
+ return key in self.additional_properties
@@ -0,0 +1,11 @@
1
+ from __future__ import annotations
2
+
3
+ from enum import Enum
4
+
5
+
6
+ class PublicLifecycleScriptScope(str, Enum):
7
+ ORGANIZATION = "ORGANIZATION"
8
+ PROJECT = "PROJECT"
9
+
10
+ def __str__(self) -> str:
11
+ return str(self.value)
@@ -0,0 +1,132 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, Self, TypeVar, cast
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ from ..types import UNSET, Unset
10
+
11
+ T = TypeVar("T", bound="QuotaModel")
12
+
13
+
14
+ @_attrs_define
15
+ class QuotaModel:
16
+ """Unified quota model for all quota types (instances, storage, Kubernetes).
17
+
18
+ Attributes:
19
+ fid (str): Unique identifier for the quota
20
+ project (str): Project FID this quota belongs to
21
+ product_type (str): Type of product (e.g., 'Spot', 'Reservations', 'Storage')
22
+ total_quantity (int): Total quota quantity used
23
+ used_quantity (int): Total quota quantity used
24
+ units (str): Units for the quota (e.g., 'instances', 'GB')
25
+ name (str): Human-readable display name for the quota
26
+ instance_type (None | str | Unset):
27
+ """
28
+
29
+ fid: str
30
+ project: str
31
+ product_type: str
32
+ total_quantity: int
33
+ used_quantity: int
34
+ units: str
35
+ name: str
36
+ instance_type: None | str | Unset = UNSET
37
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
38
+
39
+ def to_dict(self) -> dict[str, Any]:
40
+ fid = self.fid
41
+
42
+ project = self.project
43
+
44
+ product_type = self.product_type
45
+
46
+ total_quantity = self.total_quantity
47
+
48
+ used_quantity = self.used_quantity
49
+
50
+ units = self.units
51
+
52
+ name = self.name
53
+
54
+ instance_type: None | str | Unset
55
+ if isinstance(self.instance_type, Unset):
56
+ instance_type = UNSET
57
+ else:
58
+ instance_type = self.instance_type
59
+
60
+ field_dict: dict[str, Any] = {}
61
+ field_dict.update(self.additional_properties)
62
+ field_dict.update(
63
+ {
64
+ "fid": fid,
65
+ "project": project,
66
+ "product_type": product_type,
67
+ "total_quantity": total_quantity,
68
+ "used_quantity": used_quantity,
69
+ "units": units,
70
+ "name": name,
71
+ }
72
+ )
73
+ if instance_type is not UNSET:
74
+ field_dict["instance_type"] = instance_type
75
+
76
+ return field_dict
77
+
78
+ @classmethod
79
+ def from_dict(cls, src_dict: Mapping[str, Any]) -> Self:
80
+ d = dict(src_dict)
81
+ fid = d.pop("fid")
82
+
83
+ project = d.pop("project")
84
+
85
+ product_type = d.pop("product_type")
86
+
87
+ total_quantity = d.pop("total_quantity")
88
+
89
+ used_quantity = d.pop("used_quantity")
90
+
91
+ units = d.pop("units")
92
+
93
+ name = d.pop("name")
94
+
95
+ def _parse_instance_type(data: object) -> None | str | Unset:
96
+ if data is None:
97
+ return data
98
+ if isinstance(data, Unset):
99
+ return data
100
+ return cast(None | str | Unset, data)
101
+
102
+ instance_type = _parse_instance_type(d.pop("instance_type", UNSET))
103
+
104
+ quota_model = cls(
105
+ fid=fid,
106
+ project=project,
107
+ product_type=product_type,
108
+ total_quantity=total_quantity,
109
+ used_quantity=used_quantity,
110
+ units=units,
111
+ name=name,
112
+ instance_type=instance_type,
113
+ )
114
+
115
+ quota_model.additional_properties = d
116
+ return quota_model
117
+
118
+ @property
119
+ def additional_keys(self) -> list[str]:
120
+ return list(self.additional_properties.keys())
121
+
122
+ def __getitem__(self, key: str) -> Any:
123
+ return self.additional_properties[key]
124
+
125
+ def __setitem__(self, key: str, value: Any) -> None:
126
+ self.additional_properties[key] = value
127
+
128
+ def __delitem__(self, key: str) -> None:
129
+ del self.additional_properties[key]
130
+
131
+ def __contains__(self, key: str) -> bool:
132
+ return key in self.additional_properties