gcore 0.6.0__py3-none-any.whl → 0.8.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 gcore might be problematic. Click here for more details.

Files changed (185) hide show
  1. gcore/_client.py +9 -0
  2. gcore/_models.py +24 -3
  3. gcore/_version.py +1 -1
  4. gcore/pagination.py +101 -63
  5. gcore/resources/__init__.py +14 -0
  6. gcore/resources/cloud/__init__.py +28 -0
  7. gcore/resources/cloud/cloud.py +64 -0
  8. gcore/resources/cloud/cost_reports.py +811 -0
  9. gcore/resources/cloud/file_shares/file_shares.py +10 -0
  10. gcore/resources/cloud/gpu_baremetal_clusters/gpu_baremetal_clusters.py +61 -26
  11. gcore/resources/cloud/inference/registry_credentials.py +4 -6
  12. gcore/resources/cloud/usage_reports.py +337 -0
  13. gcore/resources/iam/users.py +5 -5
  14. gcore/resources/streaming/__init__.py +159 -0
  15. gcore/resources/streaming/ai_tasks.py +1288 -0
  16. gcore/resources/streaming/broadcasts.py +579 -0
  17. gcore/resources/streaming/directories.py +515 -0
  18. gcore/resources/streaming/players.py +577 -0
  19. gcore/resources/streaming/playlists.py +1059 -0
  20. gcore/resources/streaming/quality_sets.py +331 -0
  21. gcore/resources/streaming/restreams.py +484 -0
  22. gcore/resources/streaming/statistics.py +3224 -0
  23. gcore/resources/streaming/streaming.py +390 -0
  24. gcore/resources/streaming/streams/__init__.py +33 -0
  25. gcore/resources/streaming/streams/overlays.py +716 -0
  26. gcore/resources/streaming/streams/streams.py +1592 -0
  27. gcore/resources/streaming/videos/__init__.py +33 -0
  28. gcore/resources/streaming/videos/subtitles.py +623 -0
  29. gcore/resources/streaming/videos/videos.py +1553 -0
  30. gcore/resources/waap/ip_info.py +28 -10
  31. gcore/types/cloud/__init__.py +10 -0
  32. gcore/types/cloud/cost_report_aggregated.py +865 -0
  33. gcore/types/cloud/cost_report_aggregated_monthly.py +865 -0
  34. gcore/types/cloud/cost_report_detailed.py +1343 -0
  35. gcore/types/cloud/cost_report_get_aggregated_monthly_params.py +394 -0
  36. gcore/types/cloud/cost_report_get_aggregated_params.py +409 -0
  37. gcore/types/cloud/cost_report_get_detailed_params.py +435 -0
  38. gcore/types/cloud/file_share.py +37 -3
  39. gcore/types/cloud/file_share_create_params.py +16 -0
  40. gcore/types/cloud/floating_ip.py +0 -9
  41. gcore/types/cloud/floating_ip_detailed.py +0 -9
  42. gcore/types/cloud/gpu_baremetal_cluster.py +2 -2
  43. gcore/types/cloud/gpu_baremetal_cluster_create_params.py +9 -0
  44. gcore/types/cloud/quota_get_all_response.py +24 -2
  45. gcore/types/cloud/quota_get_by_region_response.py +24 -2
  46. gcore/types/cloud/quotas/request_create_params.py +12 -1
  47. gcore/types/cloud/quotas/request_get_response.py +12 -1
  48. gcore/types/cloud/quotas/request_list_response.py +12 -1
  49. gcore/types/cloud/subnet.py +1 -1
  50. gcore/types/cloud/usage_report.py +1612 -0
  51. gcore/types/cloud/usage_report_get_params.py +432 -0
  52. gcore/types/streaming/__init__.py +143 -0
  53. gcore/types/streaming/ai_contentmoderation_casm.py +39 -0
  54. gcore/types/streaming/ai_contentmoderation_hardnudity.py +54 -0
  55. gcore/types/streaming/ai_contentmoderation_nsfw.py +39 -0
  56. gcore/types/streaming/ai_contentmoderation_softnudity.py +66 -0
  57. gcore/types/streaming/ai_contentmoderation_sport.py +39 -0
  58. gcore/types/streaming/ai_contentmoderation_weapon.py +39 -0
  59. gcore/types/streaming/ai_task.py +205 -0
  60. gcore/types/streaming/ai_task_cancel_response.py +12 -0
  61. gcore/types/streaming/ai_task_create_params.py +168 -0
  62. gcore/types/streaming/ai_task_create_response.py +10 -0
  63. gcore/types/streaming/ai_task_get_ai_settings_params.py +27 -0
  64. gcore/types/streaming/ai_task_get_ai_settings_response.py +12 -0
  65. gcore/types/streaming/ai_task_get_response.py +313 -0
  66. gcore/types/streaming/ai_task_list_params.py +50 -0
  67. gcore/types/streaming/broadcast.py +71 -0
  68. gcore/types/streaming/broadcast_create_params.py +76 -0
  69. gcore/types/streaming/broadcast_list_params.py +12 -0
  70. gcore/types/streaming/broadcast_spectators_count.py +12 -0
  71. gcore/types/streaming/broadcast_update_params.py +76 -0
  72. gcore/types/streaming/clip.py +78 -0
  73. gcore/types/streaming/create_video_param.py +214 -0
  74. gcore/types/streaming/direct_upload_parameters.py +33 -0
  75. gcore/types/streaming/directories_tree.py +19 -0
  76. gcore/types/streaming/directory_base.py +31 -0
  77. gcore/types/streaming/directory_create_params.py +15 -0
  78. gcore/types/streaming/directory_get_response.py +19 -0
  79. gcore/types/streaming/directory_item.py +13 -0
  80. gcore/types/streaming/directory_update_params.py +18 -0
  81. gcore/types/streaming/directory_video.py +13 -0
  82. gcore/types/streaming/ffprobes.py +25 -0
  83. gcore/types/streaming/max_stream_series.py +21 -0
  84. gcore/types/streaming/meet_series.py +23 -0
  85. gcore/types/streaming/player.py +114 -0
  86. gcore/types/streaming/player_create_params.py +18 -0
  87. gcore/types/streaming/player_list_params.py +12 -0
  88. gcore/types/streaming/player_param.py +114 -0
  89. gcore/types/streaming/player_update_params.py +18 -0
  90. gcore/types/streaming/playlist.py +102 -0
  91. gcore/types/streaming/playlist_create.py +12 -0
  92. gcore/types/streaming/playlist_create_params.py +102 -0
  93. gcore/types/streaming/playlist_list_params.py +12 -0
  94. gcore/types/streaming/playlist_list_videos_response.py +10 -0
  95. gcore/types/streaming/playlist_update_params.py +102 -0
  96. gcore/types/streaming/playlist_video.py +215 -0
  97. gcore/types/streaming/popular_videos.py +17 -0
  98. gcore/types/streaming/quality_set_set_default_params.py +23 -0
  99. gcore/types/streaming/quality_sets.py +57 -0
  100. gcore/types/streaming/restream.py +37 -0
  101. gcore/types/streaming/restream_create_params.py +41 -0
  102. gcore/types/streaming/restream_list_params.py +12 -0
  103. gcore/types/streaming/restream_update_params.py +41 -0
  104. gcore/types/streaming/statistic_get_ffprobes_params.py +22 -0
  105. gcore/types/streaming/statistic_get_live_unique_viewers_params.py +26 -0
  106. gcore/types/streaming/statistic_get_live_unique_viewers_response.py +25 -0
  107. gcore/types/streaming/statistic_get_live_watch_time_cdn_params.py +32 -0
  108. gcore/types/streaming/statistic_get_live_watch_time_total_cdn_params.py +30 -0
  109. gcore/types/streaming/statistic_get_max_streams_series_params.py +20 -0
  110. gcore/types/streaming/statistic_get_meet_series_params.py +20 -0
  111. gcore/types/streaming/statistic_get_popular_videos_params.py +15 -0
  112. gcore/types/streaming/statistic_get_storage_series_params.py +20 -0
  113. gcore/types/streaming/statistic_get_stream_series_params.py +20 -0
  114. gcore/types/streaming/statistic_get_unique_viewers_cdn_params.py +27 -0
  115. gcore/types/streaming/statistic_get_unique_viewers_params.py +34 -0
  116. gcore/types/streaming/statistic_get_views_by_browsers_params.py +15 -0
  117. gcore/types/streaming/statistic_get_views_by_country_params.py +15 -0
  118. gcore/types/streaming/statistic_get_views_by_hostname_params.py +15 -0
  119. gcore/types/streaming/statistic_get_views_by_operating_system_params.py +15 -0
  120. gcore/types/streaming/statistic_get_views_by_referer_params.py +15 -0
  121. gcore/types/streaming/statistic_get_views_by_region_params.py +15 -0
  122. gcore/types/streaming/statistic_get_views_heatmap_params.py +21 -0
  123. gcore/types/streaming/statistic_get_views_params.py +34 -0
  124. gcore/types/streaming/statistic_get_vod_storage_volume_params.py +17 -0
  125. gcore/types/streaming/statistic_get_vod_transcoding_duration_params.py +17 -0
  126. gcore/types/streaming/statistic_get_vod_unique_viewers_cdn_params.py +26 -0
  127. gcore/types/streaming/statistic_get_vod_watch_time_cdn_params.py +32 -0
  128. gcore/types/streaming/statistic_get_vod_watch_time_total_cdn_params.py +30 -0
  129. gcore/types/streaming/statistic_get_vod_watch_time_total_cdn_response.py +22 -0
  130. gcore/types/streaming/storage_series.py +23 -0
  131. gcore/types/streaming/stream.py +420 -0
  132. gcore/types/streaming/stream_create_clip_params.py +48 -0
  133. gcore/types/streaming/stream_create_params.py +165 -0
  134. gcore/types/streaming/stream_list_clips_response.py +10 -0
  135. gcore/types/streaming/stream_list_params.py +18 -0
  136. gcore/types/streaming/stream_series.py +21 -0
  137. gcore/types/streaming/stream_start_recording_response.py +76 -0
  138. gcore/types/streaming/stream_update_params.py +169 -0
  139. gcore/types/streaming/streams/__init__.py +11 -0
  140. gcore/types/streaming/streams/overlay.py +43 -0
  141. gcore/types/streaming/streams/overlay_create_params.py +36 -0
  142. gcore/types/streaming/streams/overlay_create_response.py +10 -0
  143. gcore/types/streaming/streams/overlay_list_response.py +10 -0
  144. gcore/types/streaming/streams/overlay_update_multiple_params.py +39 -0
  145. gcore/types/streaming/streams/overlay_update_multiple_response.py +10 -0
  146. gcore/types/streaming/streams/overlay_update_params.py +33 -0
  147. gcore/types/streaming/subtitle.py +12 -0
  148. gcore/types/streaming/subtitle_base.py +18 -0
  149. gcore/types/streaming/subtitle_base_param.py +18 -0
  150. gcore/types/streaming/unique_viewers.py +35 -0
  151. gcore/types/streaming/unique_viewers_cdn.py +17 -0
  152. gcore/types/streaming/video.py +444 -0
  153. gcore/types/streaming/video_create_multiple_params.py +28 -0
  154. gcore/types/streaming/video_create_multiple_response.py +10 -0
  155. gcore/types/streaming/video_create_params.py +13 -0
  156. gcore/types/streaming/video_create_response.py +10 -0
  157. gcore/types/streaming/video_list_names_params.py +13 -0
  158. gcore/types/streaming/video_list_params.py +59 -0
  159. gcore/types/streaming/video_update_params.py +214 -0
  160. gcore/types/streaming/videos/__init__.py +7 -0
  161. gcore/types/streaming/videos/subtitle_create_params.py +17 -0
  162. gcore/types/streaming/videos/subtitle_list_response.py +10 -0
  163. gcore/types/streaming/videos/subtitle_update_params.py +20 -0
  164. gcore/types/streaming/views.py +35 -0
  165. gcore/types/streaming/views_by_browser.py +17 -0
  166. gcore/types/streaming/views_by_country.py +19 -0
  167. gcore/types/streaming/views_by_hostname.py +17 -0
  168. gcore/types/streaming/views_by_operating_system.py +17 -0
  169. gcore/types/streaming/views_by_referer.py +17 -0
  170. gcore/types/streaming/views_by_region.py +19 -0
  171. gcore/types/streaming/views_heatmap.py +19 -0
  172. gcore/types/streaming/vod_statistics_series.py +21 -0
  173. gcore/types/streaming/vod_total_stream_duration_series.py +22 -0
  174. gcore/types/waap/domains/custom_rule_create_params.py +4 -4
  175. gcore/types/waap/domains/custom_rule_update_params.py +4 -4
  176. gcore/types/waap/ip_info_get_blocked_requests_params.py +5 -1
  177. gcore/types/waap/ip_info_get_counts_params.py +2 -1
  178. gcore/types/waap/ip_info_get_top_sessions_params.py +5 -1
  179. gcore/types/waap/ip_info_get_top_urls_params.py +5 -1
  180. gcore/types/waap/ip_info_get_top_user_agents_params.py +5 -1
  181. gcore/types/waap/waap_custom_rule.py +4 -4
  182. {gcore-0.6.0.dist-info → gcore-0.8.0.dist-info}/METADATA +1 -1
  183. {gcore-0.6.0.dist-info → gcore-0.8.0.dist-info}/RECORD +185 -37
  184. {gcore-0.6.0.dist-info → gcore-0.8.0.dist-info}/WHEEL +0 -0
  185. {gcore-0.6.0.dist-info → gcore-0.8.0.dist-info}/licenses/LICENSE +0 -0
gcore/_client.py CHANGED
@@ -32,6 +32,7 @@ from .resources.iam import iam
32
32
  from .resources.waap import waap
33
33
  from .resources.cloud import cloud
34
34
  from .resources.fastedge import fastedge
35
+ from .resources.streaming import streaming
35
36
 
36
37
  __all__ = ["Timeout", "Transport", "ProxiesTypes", "RequestOptions", "Gcore", "AsyncGcore", "Client", "AsyncClient"]
37
38
 
@@ -41,6 +42,7 @@ class Gcore(SyncAPIClient):
41
42
  waap: waap.WaapResource
42
43
  iam: iam.IamResource
43
44
  fastedge: fastedge.FastedgeResource
45
+ streaming: streaming.StreamingResource
44
46
  with_raw_response: GcoreWithRawResponse
45
47
  with_streaming_response: GcoreWithStreamedResponse
46
48
 
@@ -123,6 +125,7 @@ class Gcore(SyncAPIClient):
123
125
  self.waap = waap.WaapResource(self)
124
126
  self.iam = iam.IamResource(self)
125
127
  self.fastedge = fastedge.FastedgeResource(self)
128
+ self.streaming = streaming.StreamingResource(self)
126
129
  self.with_raw_response = GcoreWithRawResponse(self)
127
130
  self.with_streaming_response = GcoreWithStreamedResponse(self)
128
131
 
@@ -260,6 +263,7 @@ class AsyncGcore(AsyncAPIClient):
260
263
  waap: waap.AsyncWaapResource
261
264
  iam: iam.AsyncIamResource
262
265
  fastedge: fastedge.AsyncFastedgeResource
266
+ streaming: streaming.AsyncStreamingResource
263
267
  with_raw_response: AsyncGcoreWithRawResponse
264
268
  with_streaming_response: AsyncGcoreWithStreamedResponse
265
269
 
@@ -342,6 +346,7 @@ class AsyncGcore(AsyncAPIClient):
342
346
  self.waap = waap.AsyncWaapResource(self)
343
347
  self.iam = iam.AsyncIamResource(self)
344
348
  self.fastedge = fastedge.AsyncFastedgeResource(self)
349
+ self.streaming = streaming.AsyncStreamingResource(self)
345
350
  self.with_raw_response = AsyncGcoreWithRawResponse(self)
346
351
  self.with_streaming_response = AsyncGcoreWithStreamedResponse(self)
347
352
 
@@ -480,6 +485,7 @@ class GcoreWithRawResponse:
480
485
  self.waap = waap.WaapResourceWithRawResponse(client.waap)
481
486
  self.iam = iam.IamResourceWithRawResponse(client.iam)
482
487
  self.fastedge = fastedge.FastedgeResourceWithRawResponse(client.fastedge)
488
+ self.streaming = streaming.StreamingResourceWithRawResponse(client.streaming)
483
489
 
484
490
 
485
491
  class AsyncGcoreWithRawResponse:
@@ -488,6 +494,7 @@ class AsyncGcoreWithRawResponse:
488
494
  self.waap = waap.AsyncWaapResourceWithRawResponse(client.waap)
489
495
  self.iam = iam.AsyncIamResourceWithRawResponse(client.iam)
490
496
  self.fastedge = fastedge.AsyncFastedgeResourceWithRawResponse(client.fastedge)
497
+ self.streaming = streaming.AsyncStreamingResourceWithRawResponse(client.streaming)
491
498
 
492
499
 
493
500
  class GcoreWithStreamedResponse:
@@ -496,6 +503,7 @@ class GcoreWithStreamedResponse:
496
503
  self.waap = waap.WaapResourceWithStreamingResponse(client.waap)
497
504
  self.iam = iam.IamResourceWithStreamingResponse(client.iam)
498
505
  self.fastedge = fastedge.FastedgeResourceWithStreamingResponse(client.fastedge)
506
+ self.streaming = streaming.StreamingResourceWithStreamingResponse(client.streaming)
499
507
 
500
508
 
501
509
  class AsyncGcoreWithStreamedResponse:
@@ -504,6 +512,7 @@ class AsyncGcoreWithStreamedResponse:
504
512
  self.waap = waap.AsyncWaapResourceWithStreamingResponse(client.waap)
505
513
  self.iam = iam.AsyncIamResourceWithStreamingResponse(client.iam)
506
514
  self.fastedge = fastedge.AsyncFastedgeResourceWithStreamingResponse(client.fastedge)
515
+ self.streaming = streaming.AsyncStreamingResourceWithStreamingResponse(client.streaming)
507
516
 
508
517
 
509
518
  Client = Gcore
gcore/_models.py CHANGED
@@ -208,14 +208,18 @@ class BaseModel(pydantic.BaseModel):
208
208
  else:
209
209
  fields_values[name] = field_get_default(field)
210
210
 
211
+ extra_field_type = _get_extra_fields_type(__cls)
212
+
211
213
  _extra = {}
212
214
  for key, value in values.items():
213
215
  if key not in model_fields:
216
+ parsed = construct_type(value=value, type_=extra_field_type) if extra_field_type is not None else value
217
+
214
218
  if PYDANTIC_V2:
215
- _extra[key] = value
219
+ _extra[key] = parsed
216
220
  else:
217
221
  _fields_set.add(key)
218
- fields_values[key] = value
222
+ fields_values[key] = parsed
219
223
 
220
224
  object.__setattr__(m, "__dict__", fields_values)
221
225
 
@@ -370,6 +374,23 @@ def _construct_field(value: object, field: FieldInfo, key: str) -> object:
370
374
  return construct_type(value=value, type_=type_, metadata=getattr(field, "metadata", None))
371
375
 
372
376
 
377
+ def _get_extra_fields_type(cls: type[pydantic.BaseModel]) -> type | None:
378
+ if not PYDANTIC_V2:
379
+ # TODO
380
+ return None
381
+
382
+ schema = cls.__pydantic_core_schema__
383
+ if schema["type"] == "model":
384
+ fields = schema["schema"]
385
+ if fields["type"] == "model-fields":
386
+ extras = fields.get("extras_schema")
387
+ if extras and "cls" in extras:
388
+ # mypy can't narrow the type
389
+ return extras["cls"] # type: ignore[no-any-return]
390
+
391
+ return None
392
+
393
+
373
394
  def is_basemodel(type_: type) -> bool:
374
395
  """Returns whether or not the given type is either a `BaseModel` or a union of `BaseModel`"""
375
396
  if is_union(type_):
@@ -439,7 +460,7 @@ def construct_type(*, value: object, type_: object, metadata: Optional[List[Any]
439
460
  type_ = type_.__value__ # type: ignore[unreachable]
440
461
 
441
462
  # unwrap `Annotated[T, ...]` -> `T`
442
- if metadata is not None:
463
+ if metadata is not None and len(metadata) > 0:
443
464
  meta: tuple[Any, ...] = tuple(metadata)
444
465
  elif is_annotated_type(type_):
445
466
  meta = get_args(type_)[1:]
gcore/_version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "gcore"
4
- __version__ = "0.6.0" # x-release-please-version
4
+ __version__ = "0.8.0" # x-release-please-version
gcore/pagination.py CHANGED
@@ -1,23 +1,31 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
- from typing import List, Generic, TypeVar, Optional
3
+ from typing import Any, List, Type, Generic, Mapping, TypeVar, Optional, cast
4
4
  from typing_extensions import override
5
5
 
6
+ from httpx import Response
7
+
8
+ from ._utils import is_mapping
9
+ from ._models import BaseModel
6
10
  from ._base_client import BasePage, PageInfo, BaseSyncPage, BaseAsyncPage
7
11
 
8
12
  __all__ = [
9
13
  "SyncOffsetPage",
10
14
  "AsyncOffsetPage",
11
- "SyncOffsetPageIam",
12
- "AsyncOffsetPageIam",
13
15
  "SyncOffsetPageFastedgeApps",
14
16
  "AsyncOffsetPageFastedgeApps",
15
17
  "SyncOffsetPageFastedgeTemplates",
16
18
  "AsyncOffsetPageFastedgeTemplates",
17
19
  "SyncOffsetPageFastedgeAppLogs",
18
20
  "AsyncOffsetPageFastedgeAppLogs",
21
+ "SyncPageStreamingAI",
22
+ "AsyncPageStreamingAI",
23
+ "SyncPageStreaming",
24
+ "AsyncPageStreaming",
19
25
  ]
20
26
 
27
+ _BaseModelT = TypeVar("_BaseModelT", bound=BaseModel)
28
+
21
29
  _T = TypeVar("_T")
22
30
 
23
31
 
@@ -81,66 +89,6 @@ class AsyncOffsetPage(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
81
89
  return None
82
90
 
83
91
 
84
- class SyncOffsetPageIam(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
85
- result: List[_T]
86
- count: Optional[int] = None
87
-
88
- @override
89
- def _get_page_items(self) -> List[_T]:
90
- result = self.result
91
- if not result:
92
- return []
93
- return result
94
-
95
- @override
96
- def next_page_info(self) -> Optional[PageInfo]:
97
- offset = self._options.params.get("offset") or 0
98
- if not isinstance(offset, int):
99
- raise ValueError(f'Expected "offset" param to be an integer but got {offset}')
100
-
101
- length = len(self._get_page_items())
102
- current_count = offset + length
103
-
104
- count = self.count
105
- if count is None:
106
- return None
107
-
108
- if current_count < count:
109
- return PageInfo(params={"offset": current_count})
110
-
111
- return None
112
-
113
-
114
- class AsyncOffsetPageIam(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
115
- result: List[_T]
116
- count: Optional[int] = None
117
-
118
- @override
119
- def _get_page_items(self) -> List[_T]:
120
- result = self.result
121
- if not result:
122
- return []
123
- return result
124
-
125
- @override
126
- def next_page_info(self) -> Optional[PageInfo]:
127
- offset = self._options.params.get("offset") or 0
128
- if not isinstance(offset, int):
129
- raise ValueError(f'Expected "offset" param to be an integer but got {offset}')
130
-
131
- length = len(self._get_page_items())
132
- current_count = offset + length
133
-
134
- count = self.count
135
- if count is None:
136
- return None
137
-
138
- if current_count < count:
139
- return PageInfo(params={"offset": current_count})
140
-
141
- return None
142
-
143
-
144
92
  class SyncOffsetPageFastedgeApps(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
145
93
  apps: List[_T]
146
94
  count: Optional[int] = None
@@ -319,3 +267,93 @@ class AsyncOffsetPageFastedgeAppLogs(BaseAsyncPage[_T], BasePage[_T], Generic[_T
319
267
  return PageInfo(params={"offset": current_count})
320
268
 
321
269
  return None
270
+
271
+
272
+ class SyncPageStreamingAI(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
273
+ results: List[_T]
274
+
275
+ @override
276
+ def _get_page_items(self) -> List[_T]:
277
+ results = self.results
278
+ if not results:
279
+ return []
280
+ return results
281
+
282
+ @override
283
+ def next_page_info(self) -> Optional[PageInfo]:
284
+ last_page = cast("int | None", self._options.params.get("page")) or 1
285
+
286
+ return PageInfo(params={"page": last_page + 1})
287
+
288
+
289
+ class AsyncPageStreamingAI(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
290
+ results: List[_T]
291
+
292
+ @override
293
+ def _get_page_items(self) -> List[_T]:
294
+ results = self.results
295
+ if not results:
296
+ return []
297
+ return results
298
+
299
+ @override
300
+ def next_page_info(self) -> Optional[PageInfo]:
301
+ last_page = cast("int | None", self._options.params.get("page")) or 1
302
+
303
+ return PageInfo(params={"page": last_page + 1})
304
+
305
+
306
+ class SyncPageStreaming(BaseSyncPage[_T], BasePage[_T], Generic[_T]):
307
+ items: List[_T]
308
+
309
+ @override
310
+ def _get_page_items(self) -> List[_T]:
311
+ items = self.items
312
+ if not items:
313
+ return []
314
+ return items
315
+
316
+ @override
317
+ def next_page_info(self) -> None:
318
+ """
319
+ This page represents a response that isn't actually paginated at the API level
320
+ so there will never be a next page.
321
+ """
322
+ return None
323
+
324
+ @classmethod
325
+ def build(cls: Type[_BaseModelT], *, response: Response, data: object) -> _BaseModelT: # noqa: ARG003
326
+ return cls.construct(
327
+ None,
328
+ **{
329
+ **(cast(Mapping[str, Any], data) if is_mapping(data) else {"items": data}),
330
+ },
331
+ )
332
+
333
+
334
+ class AsyncPageStreaming(BaseAsyncPage[_T], BasePage[_T], Generic[_T]):
335
+ items: List[_T]
336
+
337
+ @override
338
+ def _get_page_items(self) -> List[_T]:
339
+ items = self.items
340
+ if not items:
341
+ return []
342
+ return items
343
+
344
+ @override
345
+ def next_page_info(self) -> None:
346
+ """
347
+ This page represents a response that isn't actually paginated at the API level
348
+ so there will never be a next page.
349
+ """
350
+ return None
351
+
352
+ @classmethod
353
+ def build(cls: Type[_BaseModelT], *, response: Response, data: object) -> _BaseModelT: # noqa: ARG003
354
+ return cls.construct(
355
+ None,
356
+ **{
357
+ **(cast(Mapping[str, Any], data) if is_mapping(data) else {"items": data}),
358
+ },
359
+ )
@@ -32,6 +32,14 @@ from .fastedge import (
32
32
  FastedgeResourceWithStreamingResponse,
33
33
  AsyncFastedgeResourceWithStreamingResponse,
34
34
  )
35
+ from .streaming import (
36
+ StreamingResource,
37
+ AsyncStreamingResource,
38
+ StreamingResourceWithRawResponse,
39
+ AsyncStreamingResourceWithRawResponse,
40
+ StreamingResourceWithStreamingResponse,
41
+ AsyncStreamingResourceWithStreamingResponse,
42
+ )
35
43
 
36
44
  __all__ = [
37
45
  "CloudResource",
@@ -58,4 +66,10 @@ __all__ = [
58
66
  "AsyncFastedgeResourceWithRawResponse",
59
67
  "FastedgeResourceWithStreamingResponse",
60
68
  "AsyncFastedgeResourceWithStreamingResponse",
69
+ "StreamingResource",
70
+ "AsyncStreamingResource",
71
+ "StreamingResourceWithRawResponse",
72
+ "AsyncStreamingResourceWithRawResponse",
73
+ "StreamingResourceWithStreamingResponse",
74
+ "AsyncStreamingResourceWithStreamingResponse",
61
75
  ]
@@ -136,6 +136,14 @@ from .file_shares import (
136
136
  FileSharesResourceWithStreamingResponse,
137
137
  AsyncFileSharesResourceWithStreamingResponse,
138
138
  )
139
+ from .cost_reports import (
140
+ CostReportsResource,
141
+ AsyncCostReportsResource,
142
+ CostReportsResourceWithRawResponse,
143
+ AsyncCostReportsResourceWithRawResponse,
144
+ CostReportsResourceWithStreamingResponse,
145
+ AsyncCostReportsResourceWithStreamingResponse,
146
+ )
139
147
  from .floating_ips import (
140
148
  FloatingIPsResource,
141
149
  AsyncFloatingIPsResource,
@@ -144,6 +152,14 @@ from .floating_ips import (
144
152
  FloatingIPsResourceWithStreamingResponse,
145
153
  AsyncFloatingIPsResourceWithStreamingResponse,
146
154
  )
155
+ from .usage_reports import (
156
+ UsageReportsResource,
157
+ AsyncUsageReportsResource,
158
+ UsageReportsResourceWithRawResponse,
159
+ AsyncUsageReportsResourceWithRawResponse,
160
+ UsageReportsResourceWithStreamingResponse,
161
+ AsyncUsageReportsResourceWithStreamingResponse,
162
+ )
147
163
  from .load_balancers import (
148
164
  LoadBalancersResource,
149
165
  AsyncLoadBalancersResource,
@@ -332,6 +348,18 @@ __all__ = [
332
348
  "AsyncAuditLogsResourceWithRawResponse",
333
349
  "AuditLogsResourceWithStreamingResponse",
334
350
  "AsyncAuditLogsResourceWithStreamingResponse",
351
+ "CostReportsResource",
352
+ "AsyncCostReportsResource",
353
+ "CostReportsResourceWithRawResponse",
354
+ "AsyncCostReportsResourceWithRawResponse",
355
+ "CostReportsResourceWithStreamingResponse",
356
+ "AsyncCostReportsResourceWithStreamingResponse",
357
+ "UsageReportsResource",
358
+ "AsyncUsageReportsResource",
359
+ "UsageReportsResourceWithRawResponse",
360
+ "AsyncUsageReportsResourceWithRawResponse",
361
+ "UsageReportsResourceWithStreamingResponse",
362
+ "AsyncUsageReportsResourceWithStreamingResponse",
335
363
  "CloudResource",
336
364
  "AsyncCloudResource",
337
365
  "CloudResourceWithRawResponse",
@@ -76,6 +76,14 @@ from .users.users import (
76
76
  UsersResourceWithStreamingResponse,
77
77
  AsyncUsersResourceWithStreamingResponse,
78
78
  )
79
+ from .cost_reports import (
80
+ CostReportsResource,
81
+ AsyncCostReportsResource,
82
+ CostReportsResourceWithRawResponse,
83
+ AsyncCostReportsResourceWithRawResponse,
84
+ CostReportsResourceWithStreamingResponse,
85
+ AsyncCostReportsResourceWithStreamingResponse,
86
+ )
79
87
  from .floating_ips import (
80
88
  FloatingIPsResource,
81
89
  AsyncFloatingIPsResource,
@@ -92,6 +100,14 @@ from .quotas.quotas import (
92
100
  QuotasResourceWithStreamingResponse,
93
101
  AsyncQuotasResourceWithStreamingResponse,
94
102
  )
103
+ from .usage_reports import (
104
+ UsageReportsResource,
105
+ AsyncUsageReportsResource,
106
+ UsageReportsResourceWithRawResponse,
107
+ AsyncUsageReportsResourceWithRawResponse,
108
+ UsageReportsResourceWithStreamingResponse,
109
+ AsyncUsageReportsResourceWithStreamingResponse,
110
+ )
95
111
  from .placement_groups import (
96
112
  PlacementGroupsResource,
97
113
  AsyncPlacementGroupsResource,
@@ -285,6 +301,14 @@ class CloudResource(SyncAPIResource):
285
301
  def audit_logs(self) -> AuditLogsResource:
286
302
  return AuditLogsResource(self._client)
287
303
 
304
+ @cached_property
305
+ def cost_reports(self) -> CostReportsResource:
306
+ return CostReportsResource(self._client)
307
+
308
+ @cached_property
309
+ def usage_reports(self) -> UsageReportsResource:
310
+ return UsageReportsResource(self._client)
311
+
288
312
  @cached_property
289
313
  def with_raw_response(self) -> CloudResourceWithRawResponse:
290
314
  """
@@ -398,6 +422,14 @@ class AsyncCloudResource(AsyncAPIResource):
398
422
  def audit_logs(self) -> AsyncAuditLogsResource:
399
423
  return AsyncAuditLogsResource(self._client)
400
424
 
425
+ @cached_property
426
+ def cost_reports(self) -> AsyncCostReportsResource:
427
+ return AsyncCostReportsResource(self._client)
428
+
429
+ @cached_property
430
+ def usage_reports(self) -> AsyncUsageReportsResource:
431
+ return AsyncUsageReportsResource(self._client)
432
+
401
433
  @cached_property
402
434
  def with_raw_response(self) -> AsyncCloudResourceWithRawResponse:
403
435
  """
@@ -514,6 +546,14 @@ class CloudResourceWithRawResponse:
514
546
  def audit_logs(self) -> AuditLogsResourceWithRawResponse:
515
547
  return AuditLogsResourceWithRawResponse(self._cloud.audit_logs)
516
548
 
549
+ @cached_property
550
+ def cost_reports(self) -> CostReportsResourceWithRawResponse:
551
+ return CostReportsResourceWithRawResponse(self._cloud.cost_reports)
552
+
553
+ @cached_property
554
+ def usage_reports(self) -> UsageReportsResourceWithRawResponse:
555
+ return UsageReportsResourceWithRawResponse(self._cloud.usage_reports)
556
+
517
557
 
518
558
  class AsyncCloudResourceWithRawResponse:
519
559
  def __init__(self, cloud: AsyncCloudResource) -> None:
@@ -611,6 +651,14 @@ class AsyncCloudResourceWithRawResponse:
611
651
  def audit_logs(self) -> AsyncAuditLogsResourceWithRawResponse:
612
652
  return AsyncAuditLogsResourceWithRawResponse(self._cloud.audit_logs)
613
653
 
654
+ @cached_property
655
+ def cost_reports(self) -> AsyncCostReportsResourceWithRawResponse:
656
+ return AsyncCostReportsResourceWithRawResponse(self._cloud.cost_reports)
657
+
658
+ @cached_property
659
+ def usage_reports(self) -> AsyncUsageReportsResourceWithRawResponse:
660
+ return AsyncUsageReportsResourceWithRawResponse(self._cloud.usage_reports)
661
+
614
662
 
615
663
  class CloudResourceWithStreamingResponse:
616
664
  def __init__(self, cloud: CloudResource) -> None:
@@ -708,6 +756,14 @@ class CloudResourceWithStreamingResponse:
708
756
  def audit_logs(self) -> AuditLogsResourceWithStreamingResponse:
709
757
  return AuditLogsResourceWithStreamingResponse(self._cloud.audit_logs)
710
758
 
759
+ @cached_property
760
+ def cost_reports(self) -> CostReportsResourceWithStreamingResponse:
761
+ return CostReportsResourceWithStreamingResponse(self._cloud.cost_reports)
762
+
763
+ @cached_property
764
+ def usage_reports(self) -> UsageReportsResourceWithStreamingResponse:
765
+ return UsageReportsResourceWithStreamingResponse(self._cloud.usage_reports)
766
+
711
767
 
712
768
  class AsyncCloudResourceWithStreamingResponse:
713
769
  def __init__(self, cloud: AsyncCloudResource) -> None:
@@ -804,3 +860,11 @@ class AsyncCloudResourceWithStreamingResponse:
804
860
  @cached_property
805
861
  def audit_logs(self) -> AsyncAuditLogsResourceWithStreamingResponse:
806
862
  return AsyncAuditLogsResourceWithStreamingResponse(self._cloud.audit_logs)
863
+
864
+ @cached_property
865
+ def cost_reports(self) -> AsyncCostReportsResourceWithStreamingResponse:
866
+ return AsyncCostReportsResourceWithStreamingResponse(self._cloud.cost_reports)
867
+
868
+ @cached_property
869
+ def usage_reports(self) -> AsyncUsageReportsResourceWithStreamingResponse:
870
+ return AsyncUsageReportsResourceWithStreamingResponse(self._cloud.usage_reports)