bytekit-sdk 0.3.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.
Files changed (227) hide show
  1. bytekit/__init__.py +8 -0
  2. bytekit/api/__init__.py +1 -0
  3. bytekit/api/account/__init__.py +1 -0
  4. bytekit/api/account/get_account.py +157 -0
  5. bytekit/api/bulk/__init__.py +1 -0
  6. bytekit/api/bulk/create_bulk.py +204 -0
  7. bytekit/api/bulk/delete_bulk.py +177 -0
  8. bytekit/api/bulk/get_bulk.py +157 -0
  9. bytekit/api/bulk/list_bulk_screenshots.py +152 -0
  10. bytekit/api/fetch/__init__.py +1 -0
  11. bytekit/api/fetch/get_fetch.py +254 -0
  12. bytekit/api/fetch/post_fetch.py +178 -0
  13. bytekit/api/fetch_bulk/__init__.py +1 -0
  14. bytekit/api/fetch_bulk/create_fetch_bulk.py +180 -0
  15. bytekit/api/fetch_bulk/get_fetch_bulk.py +157 -0
  16. bytekit/api/monitors/__init__.py +1 -0
  17. bytekit/api/monitors/create_monitor.py +180 -0
  18. bytekit/api/monitors/delete_monitor.py +155 -0
  19. bytekit/api/monitors/get_monitor.py +157 -0
  20. bytekit/api/monitors/list_monitor_captures.py +188 -0
  21. bytekit/api/monitors/list_monitors.py +193 -0
  22. bytekit/api/monitors/update_monitor.py +191 -0
  23. bytekit/api/scrape/__init__.py +1 -0
  24. bytekit/api/scrape/create_scrape.py +197 -0
  25. bytekit/api/scrape/get_scrape.py +231 -0
  26. bytekit/api/scrape_bulk/__init__.py +1 -0
  27. bytekit/api/scrape_bulk/create_scrape_bulk.py +188 -0
  28. bytekit/api/scrape_bulk/get_scrape_bulk.py +157 -0
  29. bytekit/api/screenshots/__init__.py +1 -0
  30. bytekit/api/screenshots/create_screenshot.py +208 -0
  31. bytekit/api/screenshots/get_screenshot.py +177 -0
  32. bytekit/api/search/__init__.py +1 -0
  33. bytekit/api/search/create_search.py +225 -0
  34. bytekit/api/sitemap/__init__.py +1 -0
  35. bytekit/api/sitemap/create_sitemap.py +192 -0
  36. bytekit/api/sitemap/get_sitemap.py +157 -0
  37. bytekit/api/usage/__init__.py +1 -0
  38. bytekit/api/usage/get_usage.py +126 -0
  39. bytekit/api/usage/get_usage_by_endpoint.py +215 -0
  40. bytekit/api/usage/get_usage_daily.py +203 -0
  41. bytekit/api/webhooks/__init__.py +1 -0
  42. bytekit/api/webhooks/list_webhook_deliveries.py +214 -0
  43. bytekit/api/webhooks/retry_webhook_delivery.py +165 -0
  44. bytekit/client.py +418 -0
  45. bytekit/errors.py +18 -0
  46. bytekit/models/__init__.py +401 -0
  47. bytekit/models/account_bearer_response.py +207 -0
  48. bytekit/models/account_bearer_response_api_key.py +134 -0
  49. bytekit/models/account_bearer_response_api_key_environment.py +8 -0
  50. bytekit/models/account_bearer_response_auto_topup.py +83 -0
  51. bytekit/models/account_bearer_response_plan.py +150 -0
  52. bytekit/models/account_bearer_response_subscription.py +85 -0
  53. bytekit/models/account_bearer_response_subscription_plan.py +99 -0
  54. bytekit/models/account_bearer_response_subscription_status.py +10 -0
  55. bytekit/models/account_session_response.py +164 -0
  56. bytekit/models/account_session_response_notifications.py +51 -0
  57. bytekit/models/account_session_response_plan.py +150 -0
  58. bytekit/models/bandwidth_balance.py +91 -0
  59. bytekit/models/capture_response.py +216 -0
  60. bytekit/models/capture_response_outcome.py +10 -0
  61. bytekit/models/clip.py +83 -0
  62. bytekit/models/cookie.py +90 -0
  63. bytekit/models/create_bulk_body.py +155 -0
  64. bytekit/models/create_bulk_body_defaults.py +423 -0
  65. bytekit/models/create_bulk_body_defaults_device.py +9 -0
  66. bytekit/models/create_bulk_body_defaults_device_scale_factor_type_1.py +9 -0
  67. bytekit/models/create_bulk_body_defaults_device_scale_factor_type_2_type_1.py +9 -0
  68. bytekit/models/create_bulk_body_defaults_device_scale_factor_type_3_type_1.py +9 -0
  69. bytekit/models/create_bulk_body_defaults_formats_item.py +12 -0
  70. bytekit/models/create_bulk_body_defaults_type.py +9 -0
  71. bytekit/models/create_bulk_body_defaults_viewport_type_0.py +67 -0
  72. bytekit/models/create_bulk_body_defaults_wait_until.py +10 -0
  73. bytekit/models/create_bulk_body_items_item.py +380 -0
  74. bytekit/models/create_bulk_body_items_item_device.py +9 -0
  75. bytekit/models/create_bulk_body_items_item_formats_item.py +12 -0
  76. bytekit/models/create_bulk_body_items_item_scenario.py +10 -0
  77. bytekit/models/create_bulk_body_items_item_type.py +9 -0
  78. bytekit/models/create_bulk_body_items_item_viewport_type_0.py +67 -0
  79. bytekit/models/create_bulk_body_items_item_wait_until.py +10 -0
  80. bytekit/models/create_bulk_response_202.py +164 -0
  81. bytekit/models/create_bulk_response_202_status.py +10 -0
  82. bytekit/models/create_fetch_bulk_body.py +161 -0
  83. bytekit/models/create_fetch_bulk_body_defaults.py +91 -0
  84. bytekit/models/create_fetch_bulk_body_defaults_format.py +9 -0
  85. bytekit/models/create_fetch_bulk_body_metadata.py +44 -0
  86. bytekit/models/create_fetch_bulk_body_urls_item_type_1.py +102 -0
  87. bytekit/models/create_fetch_bulk_body_urls_item_type_1_format.py +9 -0
  88. bytekit/models/create_fetch_bulk_response_202.py +44 -0
  89. bytekit/models/create_scrape_bulk_body.py +179 -0
  90. bytekit/models/create_scrape_bulk_body_custom.py +52 -0
  91. bytekit/models/create_scrape_bulk_body_defaults.py +167 -0
  92. bytekit/models/create_scrape_bulk_body_defaults_formats_item.py +12 -0
  93. bytekit/models/create_scrape_bulk_body_defaults_headers.py +44 -0
  94. bytekit/models/create_scrape_bulk_body_items_item.py +226 -0
  95. bytekit/models/create_scrape_bulk_body_items_item_custom.py +50 -0
  96. bytekit/models/create_scrape_bulk_body_items_item_formats_item.py +12 -0
  97. bytekit/models/create_scrape_bulk_body_items_item_headers.py +44 -0
  98. bytekit/models/create_scrape_bulk_body_items_item_metadata.py +44 -0
  99. bytekit/models/create_scrape_bulk_response_202.py +166 -0
  100. bytekit/models/create_scrape_bulk_response_202_status.py +10 -0
  101. bytekit/models/create_search_body.py +140 -0
  102. bytekit/models/create_search_body_date_range.py +13 -0
  103. bytekit/models/create_search_body_type.py +10 -0
  104. bytekit/models/create_search_response_200.py +119 -0
  105. bytekit/models/create_search_response_200_results_item.py +161 -0
  106. bytekit/models/create_search_response_200_results_item_image.py +113 -0
  107. bytekit/models/create_search_response_502.py +46 -0
  108. bytekit/models/create_search_response_502_error.py +8 -0
  109. bytekit/models/credit_balance.py +91 -0
  110. bytekit/models/delete_bulk_response_200.py +164 -0
  111. bytekit/models/delete_bulk_response_200_status.py +11 -0
  112. bytekit/models/error.py +83 -0
  113. bytekit/models/error_error.py +100 -0
  114. bytekit/models/error_status.py +8 -0
  115. bytekit/models/fetch_request.py +276 -0
  116. bytekit/models/fetch_request_cache_ttl_type_1.py +8 -0
  117. bytekit/models/fetch_request_custom.py +48 -0
  118. bytekit/models/fetch_request_format.py +9 -0
  119. bytekit/models/fetch_request_markdown_images.py +11 -0
  120. bytekit/models/fetch_request_markdown_links.py +11 -0
  121. bytekit/models/fetch_request_markdown_mode.py +10 -0
  122. bytekit/models/get_bulk_response_200.py +164 -0
  123. bytekit/models/get_bulk_response_200_status.py +11 -0
  124. bytekit/models/get_fetch_bulk_response_200.py +44 -0
  125. bytekit/models/get_fetch_cache_ttl_type_1.py +8 -0
  126. bytekit/models/get_fetch_format.py +9 -0
  127. bytekit/models/get_scrape_bulk_response_200.py +164 -0
  128. bytekit/models/get_scrape_bulk_response_200_status.py +11 -0
  129. bytekit/models/get_usage_by_endpoint_response_200.py +114 -0
  130. bytekit/models/get_usage_by_endpoint_response_200_rows_item.py +90 -0
  131. bytekit/models/get_usage_by_endpoint_response_200_rows_item_endpoint.py +17 -0
  132. bytekit/models/get_usage_by_endpoint_response_200_totals.py +67 -0
  133. bytekit/models/get_usage_daily_response_200.py +97 -0
  134. bytekit/models/get_usage_daily_response_200_data_item.py +219 -0
  135. bytekit/models/get_usage_response_200.py +344 -0
  136. bytekit/models/get_usage_response_200_plan_type.py +10 -0
  137. bytekit/models/list_bulk_screenshots_response_200.py +44 -0
  138. bytekit/models/list_monitor_captures_response_200.py +101 -0
  139. bytekit/models/list_monitors_response_200.py +101 -0
  140. bytekit/models/list_monitors_status.py +12 -0
  141. bytekit/models/list_webhook_deliveries_response_200.py +101 -0
  142. bytekit/models/list_webhook_deliveries_status.py +11 -0
  143. bytekit/models/metadata.py +44 -0
  144. bytekit/models/monitor_create_request.py +219 -0
  145. bytekit/models/monitor_create_request_interval_type.py +11 -0
  146. bytekit/models/monitor_create_request_notify_on.py +9 -0
  147. bytekit/models/monitor_create_request_options.py +44 -0
  148. bytekit/models/monitor_create_request_scrape_options.py +44 -0
  149. bytekit/models/monitor_create_request_type.py +9 -0
  150. bytekit/models/monitor_create_request_webhook_headers.py +44 -0
  151. bytekit/models/monitor_create_response.py +423 -0
  152. bytekit/models/monitor_response.py +411 -0
  153. bytekit/models/monitor_response_interval_type.py +11 -0
  154. bytekit/models/monitor_response_metadata_type_0.py +44 -0
  155. bytekit/models/monitor_response_status.py +12 -0
  156. bytekit/models/monitor_response_type.py +9 -0
  157. bytekit/models/monitor_response_webhook_headers_type_0.py +44 -0
  158. bytekit/models/monitor_update_request.py +223 -0
  159. bytekit/models/monitor_update_request_interval_type.py +11 -0
  160. bytekit/models/monitor_update_request_notify_on.py +9 -0
  161. bytekit/models/monitor_update_request_options.py +44 -0
  162. bytekit/models/monitor_update_request_scrape_options.py +44 -0
  163. bytekit/models/monitor_update_request_status.py +9 -0
  164. bytekit/models/monitor_update_request_webhook_headers.py +44 -0
  165. bytekit/models/scrape_error_envelope.py +113 -0
  166. bytekit/models/scrape_error_envelope_error.py +93 -0
  167. bytekit/models/scrape_error_envelope_error_code.py +18 -0
  168. bytekit/models/scrape_error_envelope_schema_version.py +8 -0
  169. bytekit/models/scrape_error_envelope_status.py +8 -0
  170. bytekit/models/scrape_formats.py +183 -0
  171. bytekit/models/scrape_markdown_tokens.py +75 -0
  172. bytekit/models/scrape_metadata.py +262 -0
  173. bytekit/models/scrape_queued_envelope.py +124 -0
  174. bytekit/models/scrape_queued_envelope_schema_version.py +8 -0
  175. bytekit/models/scrape_queued_envelope_status.py +8 -0
  176. bytekit/models/scrape_request.py +485 -0
  177. bytekit/models/scrape_request_cache_ttl_type_1.py +8 -0
  178. bytekit/models/scrape_request_custom.py +48 -0
  179. bytekit/models/scrape_request_events_item.py +10 -0
  180. bytekit/models/scrape_request_formats_item.py +12 -0
  181. bytekit/models/scrape_request_headers.py +44 -0
  182. bytekit/models/scrape_request_markdown_images.py +11 -0
  183. bytekit/models/scrape_request_markdown_links.py +11 -0
  184. bytekit/models/scrape_request_markdown_mode.py +10 -0
  185. bytekit/models/scrape_request_token_encoding.py +9 -0
  186. bytekit/models/scrape_request_x_internal_scrape_path.py +8 -0
  187. bytekit/models/scrape_scored_image.py +128 -0
  188. bytekit/models/scrape_scored_link.py +94 -0
  189. bytekit/models/scrape_stats.py +75 -0
  190. bytekit/models/scrape_success_envelope.py +345 -0
  191. bytekit/models/scrape_success_envelope_cache.py +10 -0
  192. bytekit/models/scrape_success_envelope_custom.py +48 -0
  193. bytekit/models/scrape_success_envelope_schema_version.py +8 -0
  194. bytekit/models/scrape_success_envelope_status.py +8 -0
  195. bytekit/models/scrape_table.py +96 -0
  196. bytekit/models/scrape_table_kind.py +10 -0
  197. bytekit/models/scrape_warning.py +88 -0
  198. bytekit/models/scrape_warning_code.py +17 -0
  199. bytekit/models/screenshot_request.py +445 -0
  200. bytekit/models/screenshot_request_device.py +9 -0
  201. bytekit/models/screenshot_request_device_scale_factor_type_1.py +9 -0
  202. bytekit/models/screenshot_request_device_scale_factor_type_2_type_1.py +9 -0
  203. bytekit/models/screenshot_request_device_scale_factor_type_3_type_1.py +9 -0
  204. bytekit/models/screenshot_request_format.py +9 -0
  205. bytekit/models/screenshot_request_headers.py +44 -0
  206. bytekit/models/screenshot_request_wait_until.py +10 -0
  207. bytekit/models/screenshot_response.py +264 -0
  208. bytekit/models/screenshot_response_status.py +11 -0
  209. bytekit/models/sitemap_request.py +210 -0
  210. bytekit/models/sitemap_request_process_type_0.py +90 -0
  211. bytekit/models/sitemap_request_process_type_0_options.py +44 -0
  212. bytekit/models/sitemap_request_strategy.py +10 -0
  213. bytekit/models/sitemap_response.py +418 -0
  214. bytekit/models/sitemap_response_cache.py +10 -0
  215. bytekit/models/sitemap_response_metadata_type_0.py +44 -0
  216. bytekit/models/sitemap_response_process_type_0.py +44 -0
  217. bytekit/models/sitemap_response_sources_type_0.py +44 -0
  218. bytekit/models/sitemap_response_status.py +11 -0
  219. bytekit/models/viewport.py +67 -0
  220. bytekit/models/webhook_delivery_response.py +270 -0
  221. bytekit/models/webhook_delivery_response_event_type.py +14 -0
  222. bytekit/models/webhook_delivery_response_status.py +11 -0
  223. bytekit/py.typed +0 -0
  224. bytekit/types.py +54 -0
  225. bytekit_sdk-0.3.0.dist-info/METADATA +141 -0
  226. bytekit_sdk-0.3.0.dist-info/RECORD +227 -0
  227. bytekit_sdk-0.3.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,164 @@
1
+ import datetime
2
+ from collections.abc import Mapping
3
+ from typing import (
4
+ Any,
5
+ TypeVar,
6
+ Union,
7
+ cast,
8
+ )
9
+
10
+ from attrs import define as _attrs_define
11
+ from attrs import field as _attrs_field
12
+ from dateutil.parser import isoparse
13
+
14
+ from ..models.get_scrape_bulk_response_200_status import GetScrapeBulkResponse200Status
15
+
16
+ T = TypeVar("T", bound="GetScrapeBulkResponse200")
17
+
18
+
19
+ @_attrs_define
20
+ class GetScrapeBulkResponse200:
21
+ """
22
+ Attributes:
23
+ id (str): Example: bulk_01j9abc123.
24
+ status (GetScrapeBulkResponse200Status):
25
+ total (int):
26
+ completed (int):
27
+ failed (int):
28
+ created_at (datetime.datetime):
29
+ completed_at (Union[None, datetime.datetime]):
30
+ total_credits_charged (int):
31
+ estimated_credits (Union[None, int]): Null in GET responses (computed at submission time only).
32
+ webhook_url (str): Webhook endpoint URL (HTTPS only; http:// rejected with 400 invalid_url, reason
33
+ scheme_unsupported)
34
+ """
35
+
36
+ id: str
37
+ status: GetScrapeBulkResponse200Status
38
+ total: int
39
+ completed: int
40
+ failed: int
41
+ created_at: datetime.datetime
42
+ completed_at: Union[None, datetime.datetime]
43
+ total_credits_charged: int
44
+ estimated_credits: Union[None, int]
45
+ webhook_url: str
46
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
47
+
48
+ def to_dict(self) -> dict[str, Any]:
49
+ id = self.id
50
+
51
+ status = self.status.value
52
+
53
+ total = self.total
54
+
55
+ completed = self.completed
56
+
57
+ failed = self.failed
58
+
59
+ created_at = self.created_at.isoformat()
60
+
61
+ completed_at: Union[None, str]
62
+ if isinstance(self.completed_at, datetime.datetime):
63
+ completed_at = self.completed_at.isoformat()
64
+ else:
65
+ completed_at = self.completed_at
66
+
67
+ total_credits_charged = self.total_credits_charged
68
+
69
+ estimated_credits: Union[None, int]
70
+ estimated_credits = self.estimated_credits
71
+
72
+ webhook_url = self.webhook_url
73
+
74
+ field_dict: dict[str, Any] = {}
75
+ field_dict.update(self.additional_properties)
76
+ field_dict.update(
77
+ {
78
+ "id": id,
79
+ "status": status,
80
+ "total": total,
81
+ "completed": completed,
82
+ "failed": failed,
83
+ "created_at": created_at,
84
+ "completed_at": completed_at,
85
+ "total_credits_charged": total_credits_charged,
86
+ "estimated_credits": estimated_credits,
87
+ "webhook_url": webhook_url,
88
+ }
89
+ )
90
+
91
+ return field_dict
92
+
93
+ @classmethod
94
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
95
+ d = dict(src_dict)
96
+ id = d.pop("id")
97
+
98
+ status = GetScrapeBulkResponse200Status(d.pop("status"))
99
+
100
+ total = d.pop("total")
101
+
102
+ completed = d.pop("completed")
103
+
104
+ failed = d.pop("failed")
105
+
106
+ created_at = isoparse(d.pop("created_at"))
107
+
108
+ def _parse_completed_at(data: object) -> Union[None, datetime.datetime]:
109
+ if data is None:
110
+ return data
111
+ try:
112
+ if not isinstance(data, str):
113
+ raise TypeError()
114
+ completed_at_type_0 = isoparse(data)
115
+
116
+ return completed_at_type_0
117
+ except: # noqa: E722
118
+ pass
119
+ return cast(Union[None, datetime.datetime], data)
120
+
121
+ completed_at = _parse_completed_at(d.pop("completed_at"))
122
+
123
+ total_credits_charged = d.pop("total_credits_charged")
124
+
125
+ def _parse_estimated_credits(data: object) -> Union[None, int]:
126
+ if data is None:
127
+ return data
128
+ return cast(Union[None, int], data)
129
+
130
+ estimated_credits = _parse_estimated_credits(d.pop("estimated_credits"))
131
+
132
+ webhook_url = d.pop("webhook_url")
133
+
134
+ get_scrape_bulk_response_200 = cls(
135
+ id=id,
136
+ status=status,
137
+ total=total,
138
+ completed=completed,
139
+ failed=failed,
140
+ created_at=created_at,
141
+ completed_at=completed_at,
142
+ total_credits_charged=total_credits_charged,
143
+ estimated_credits=estimated_credits,
144
+ webhook_url=webhook_url,
145
+ )
146
+
147
+ get_scrape_bulk_response_200.additional_properties = d
148
+ return get_scrape_bulk_response_200
149
+
150
+ @property
151
+ def additional_keys(self) -> list[str]:
152
+ return list(self.additional_properties.keys())
153
+
154
+ def __getitem__(self, key: str) -> Any:
155
+ return self.additional_properties[key]
156
+
157
+ def __setitem__(self, key: str, value: Any) -> None:
158
+ self.additional_properties[key] = value
159
+
160
+ def __delitem__(self, key: str) -> None:
161
+ del self.additional_properties[key]
162
+
163
+ def __contains__(self, key: str) -> bool:
164
+ return key in self.additional_properties
@@ -0,0 +1,11 @@
1
+ from enum import Enum
2
+
3
+
4
+ class GetScrapeBulkResponse200Status(str, Enum):
5
+ CANCELLED = "cancelled"
6
+ COMPLETED = "completed"
7
+ FAILED = "failed"
8
+ PROCESSING = "processing"
9
+
10
+ def __str__(self) -> str:
11
+ return str(self.value)
@@ -0,0 +1,114 @@
1
+ import datetime
2
+ from collections.abc import Mapping
3
+ from typing import (
4
+ TYPE_CHECKING,
5
+ Any,
6
+ TypeVar,
7
+ )
8
+
9
+ from attrs import define as _attrs_define
10
+ from attrs import field as _attrs_field
11
+ from dateutil.parser import isoparse
12
+
13
+ if TYPE_CHECKING:
14
+ from ..models.get_usage_by_endpoint_response_200_rows_item import (
15
+ GetUsageByEndpointResponse200RowsItem,
16
+ )
17
+ from ..models.get_usage_by_endpoint_response_200_totals import (
18
+ GetUsageByEndpointResponse200Totals,
19
+ )
20
+
21
+
22
+ T = TypeVar("T", bound="GetUsageByEndpointResponse200")
23
+
24
+
25
+ @_attrs_define
26
+ class GetUsageByEndpointResponse200:
27
+ """
28
+ Attributes:
29
+ from_ (datetime.date):
30
+ to (datetime.date):
31
+ rows (list['GetUsageByEndpointResponse200RowsItem']): One entry per endpoint with non-zero usage in the range.
32
+ Zero-byte endpoints are omitted.
33
+ totals (GetUsageByEndpointResponse200Totals):
34
+ """
35
+
36
+ from_: datetime.date
37
+ to: datetime.date
38
+ rows: list["GetUsageByEndpointResponse200RowsItem"]
39
+ totals: "GetUsageByEndpointResponse200Totals"
40
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
41
+
42
+ def to_dict(self) -> dict[str, Any]:
43
+ from_ = self.from_.isoformat()
44
+
45
+ to = self.to.isoformat()
46
+
47
+ rows = []
48
+ for rows_item_data in self.rows:
49
+ rows_item = rows_item_data.to_dict()
50
+ rows.append(rows_item)
51
+
52
+ totals = self.totals.to_dict()
53
+
54
+ field_dict: dict[str, Any] = {}
55
+ field_dict.update(self.additional_properties)
56
+ field_dict.update(
57
+ {
58
+ "from": from_,
59
+ "to": to,
60
+ "rows": rows,
61
+ "totals": totals,
62
+ }
63
+ )
64
+
65
+ return field_dict
66
+
67
+ @classmethod
68
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
69
+ from ..models.get_usage_by_endpoint_response_200_rows_item import (
70
+ GetUsageByEndpointResponse200RowsItem,
71
+ )
72
+ from ..models.get_usage_by_endpoint_response_200_totals import (
73
+ GetUsageByEndpointResponse200Totals,
74
+ )
75
+
76
+ d = dict(src_dict)
77
+ from_ = isoparse(d.pop("from")).date()
78
+
79
+ to = isoparse(d.pop("to")).date()
80
+
81
+ rows = []
82
+ _rows = d.pop("rows")
83
+ for rows_item_data in _rows:
84
+ rows_item = GetUsageByEndpointResponse200RowsItem.from_dict(rows_item_data)
85
+
86
+ rows.append(rows_item)
87
+
88
+ totals = GetUsageByEndpointResponse200Totals.from_dict(d.pop("totals"))
89
+
90
+ get_usage_by_endpoint_response_200 = cls(
91
+ from_=from_,
92
+ to=to,
93
+ rows=rows,
94
+ totals=totals,
95
+ )
96
+
97
+ get_usage_by_endpoint_response_200.additional_properties = d
98
+ return get_usage_by_endpoint_response_200
99
+
100
+ @property
101
+ def additional_keys(self) -> list[str]:
102
+ return list(self.additional_properties.keys())
103
+
104
+ def __getitem__(self, key: str) -> Any:
105
+ return self.additional_properties[key]
106
+
107
+ def __setitem__(self, key: str, value: Any) -> None:
108
+ self.additional_properties[key] = value
109
+
110
+ def __delitem__(self, key: str) -> None:
111
+ del self.additional_properties[key]
112
+
113
+ def __contains__(self, key: str) -> bool:
114
+ return key in self.additional_properties
@@ -0,0 +1,90 @@
1
+ from collections.abc import Mapping
2
+ from typing import Any, TypeVar
3
+
4
+ from attrs import define as _attrs_define
5
+ from attrs import field as _attrs_field
6
+
7
+ from ..models.get_usage_by_endpoint_response_200_rows_item_endpoint import (
8
+ GetUsageByEndpointResponse200RowsItemEndpoint,
9
+ )
10
+
11
+ T = TypeVar("T", bound="GetUsageByEndpointResponse200RowsItem")
12
+
13
+
14
+ @_attrs_define
15
+ class GetUsageByEndpointResponse200RowsItem:
16
+ """
17
+ Attributes:
18
+ endpoint (GetUsageByEndpointResponse200RowsItemEndpoint):
19
+ raw_bytes (int): Raw upstream wire bytes for the endpoint. Screenshot and recording rows created before issue
20
+ 2179 may reflect legacy billable Phase 1 bytes because exact raw totals cannot be recovered after per-job
21
+ rounding.
22
+ multiplier (float): Billing multiplier applied to raw bytes (e.g. 1.5 for
23
+ screenshots/recordings/scrape_md/crawl, 1.0 otherwise).
24
+ billable_bytes (int): raw_bytes × multiplier, rounded.
25
+ """
26
+
27
+ endpoint: GetUsageByEndpointResponse200RowsItemEndpoint
28
+ raw_bytes: int
29
+ multiplier: float
30
+ billable_bytes: int
31
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
32
+
33
+ def to_dict(self) -> dict[str, Any]:
34
+ endpoint = self.endpoint.value
35
+
36
+ raw_bytes = self.raw_bytes
37
+
38
+ multiplier = self.multiplier
39
+
40
+ billable_bytes = self.billable_bytes
41
+
42
+ field_dict: dict[str, Any] = {}
43
+ field_dict.update(self.additional_properties)
44
+ field_dict.update(
45
+ {
46
+ "endpoint": endpoint,
47
+ "raw_bytes": raw_bytes,
48
+ "multiplier": multiplier,
49
+ "billable_bytes": billable_bytes,
50
+ }
51
+ )
52
+
53
+ return field_dict
54
+
55
+ @classmethod
56
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
57
+ d = dict(src_dict)
58
+ endpoint = GetUsageByEndpointResponse200RowsItemEndpoint(d.pop("endpoint"))
59
+
60
+ raw_bytes = d.pop("raw_bytes")
61
+
62
+ multiplier = d.pop("multiplier")
63
+
64
+ billable_bytes = d.pop("billable_bytes")
65
+
66
+ get_usage_by_endpoint_response_200_rows_item = cls(
67
+ endpoint=endpoint,
68
+ raw_bytes=raw_bytes,
69
+ multiplier=multiplier,
70
+ billable_bytes=billable_bytes,
71
+ )
72
+
73
+ get_usage_by_endpoint_response_200_rows_item.additional_properties = d
74
+ return get_usage_by_endpoint_response_200_rows_item
75
+
76
+ @property
77
+ def additional_keys(self) -> list[str]:
78
+ return list(self.additional_properties.keys())
79
+
80
+ def __getitem__(self, key: str) -> Any:
81
+ return self.additional_properties[key]
82
+
83
+ def __setitem__(self, key: str, value: Any) -> None:
84
+ self.additional_properties[key] = value
85
+
86
+ def __delitem__(self, key: str) -> None:
87
+ del self.additional_properties[key]
88
+
89
+ def __contains__(self, key: str) -> bool:
90
+ return key in self.additional_properties
@@ -0,0 +1,17 @@
1
+ from enum import Enum
2
+
3
+
4
+ class GetUsageByEndpointResponse200RowsItemEndpoint(str, Enum):
5
+ CRAWL = "crawl"
6
+ CRAWL_LINKS = "crawl_links"
7
+ FETCH = "fetch"
8
+ FETCH_MD = "fetch_md"
9
+ MONITORS = "monitors"
10
+ RECORDINGS = "recordings"
11
+ SCRAPE = "scrape"
12
+ SCRAPE_MD = "scrape_md"
13
+ SCREENSHOTS = "screenshots"
14
+ SITEMAP = "sitemap"
15
+
16
+ def __str__(self) -> str:
17
+ return str(self.value)
@@ -0,0 +1,67 @@
1
+ from collections.abc import Mapping
2
+ from typing import Any, TypeVar
3
+
4
+ from attrs import define as _attrs_define
5
+ from attrs import field as _attrs_field
6
+
7
+ T = TypeVar("T", bound="GetUsageByEndpointResponse200Totals")
8
+
9
+
10
+ @_attrs_define
11
+ class GetUsageByEndpointResponse200Totals:
12
+ """
13
+ Attributes:
14
+ raw_bytes (int):
15
+ billable_bytes (int):
16
+ """
17
+
18
+ raw_bytes: int
19
+ billable_bytes: int
20
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
21
+
22
+ def to_dict(self) -> dict[str, Any]:
23
+ raw_bytes = self.raw_bytes
24
+
25
+ billable_bytes = self.billable_bytes
26
+
27
+ field_dict: dict[str, Any] = {}
28
+ field_dict.update(self.additional_properties)
29
+ field_dict.update(
30
+ {
31
+ "raw_bytes": raw_bytes,
32
+ "billable_bytes": billable_bytes,
33
+ }
34
+ )
35
+
36
+ return field_dict
37
+
38
+ @classmethod
39
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
40
+ d = dict(src_dict)
41
+ raw_bytes = d.pop("raw_bytes")
42
+
43
+ billable_bytes = d.pop("billable_bytes")
44
+
45
+ get_usage_by_endpoint_response_200_totals = cls(
46
+ raw_bytes=raw_bytes,
47
+ billable_bytes=billable_bytes,
48
+ )
49
+
50
+ get_usage_by_endpoint_response_200_totals.additional_properties = d
51
+ return get_usage_by_endpoint_response_200_totals
52
+
53
+ @property
54
+ def additional_keys(self) -> list[str]:
55
+ return list(self.additional_properties.keys())
56
+
57
+ def __getitem__(self, key: str) -> Any:
58
+ return self.additional_properties[key]
59
+
60
+ def __setitem__(self, key: str, value: Any) -> None:
61
+ self.additional_properties[key] = value
62
+
63
+ def __delitem__(self, key: str) -> None:
64
+ del self.additional_properties[key]
65
+
66
+ def __contains__(self, key: str) -> bool:
67
+ return key in self.additional_properties
@@ -0,0 +1,97 @@
1
+ from collections.abc import Mapping
2
+ from typing import (
3
+ TYPE_CHECKING,
4
+ Any,
5
+ TypeVar,
6
+ )
7
+
8
+ from attrs import define as _attrs_define
9
+ from attrs import field as _attrs_field
10
+
11
+ if TYPE_CHECKING:
12
+ from ..models.get_usage_daily_response_200_data_item import (
13
+ GetUsageDailyResponse200DataItem,
14
+ )
15
+
16
+
17
+ T = TypeVar("T", bound="GetUsageDailyResponse200")
18
+
19
+
20
+ @_attrs_define
21
+ class GetUsageDailyResponse200:
22
+ """
23
+ Attributes:
24
+ from_ (str):
25
+ to (str):
26
+ data (list['GetUsageDailyResponse200DataItem']):
27
+ """
28
+
29
+ from_: str
30
+ to: str
31
+ data: list["GetUsageDailyResponse200DataItem"]
32
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
33
+
34
+ def to_dict(self) -> dict[str, Any]:
35
+ from_ = self.from_
36
+
37
+ to = self.to
38
+
39
+ data = []
40
+ for data_item_data in self.data:
41
+ data_item = data_item_data.to_dict()
42
+ data.append(data_item)
43
+
44
+ field_dict: dict[str, Any] = {}
45
+ field_dict.update(self.additional_properties)
46
+ field_dict.update(
47
+ {
48
+ "from": from_,
49
+ "to": to,
50
+ "data": data,
51
+ }
52
+ )
53
+
54
+ return field_dict
55
+
56
+ @classmethod
57
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
58
+ from ..models.get_usage_daily_response_200_data_item import (
59
+ GetUsageDailyResponse200DataItem,
60
+ )
61
+
62
+ d = dict(src_dict)
63
+ from_ = d.pop("from")
64
+
65
+ to = d.pop("to")
66
+
67
+ data = []
68
+ _data = d.pop("data")
69
+ for data_item_data in _data:
70
+ data_item = GetUsageDailyResponse200DataItem.from_dict(data_item_data)
71
+
72
+ data.append(data_item)
73
+
74
+ get_usage_daily_response_200 = cls(
75
+ from_=from_,
76
+ to=to,
77
+ data=data,
78
+ )
79
+
80
+ get_usage_daily_response_200.additional_properties = d
81
+ return get_usage_daily_response_200
82
+
83
+ @property
84
+ def additional_keys(self) -> list[str]:
85
+ return list(self.additional_properties.keys())
86
+
87
+ def __getitem__(self, key: str) -> Any:
88
+ return self.additional_properties[key]
89
+
90
+ def __setitem__(self, key: str, value: Any) -> None:
91
+ self.additional_properties[key] = value
92
+
93
+ def __delitem__(self, key: str) -> None:
94
+ del self.additional_properties[key]
95
+
96
+ def __contains__(self, key: str) -> bool:
97
+ return key in self.additional_properties