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,44 @@
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="MonitorCreateRequestScrapeOptions")
8
+
9
+
10
+ @_attrs_define
11
+ class MonitorCreateRequestScrapeOptions:
12
+ """Scrape monitor options (formats, country, headers, etc.). Only for type=scrape."""
13
+
14
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
15
+
16
+ def to_dict(self) -> dict[str, Any]:
17
+ field_dict: dict[str, Any] = {}
18
+ field_dict.update(self.additional_properties)
19
+
20
+ return field_dict
21
+
22
+ @classmethod
23
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
24
+ d = dict(src_dict)
25
+ monitor_create_request_scrape_options = cls()
26
+
27
+ monitor_create_request_scrape_options.additional_properties = d
28
+ return monitor_create_request_scrape_options
29
+
30
+ @property
31
+ def additional_keys(self) -> list[str]:
32
+ return list(self.additional_properties.keys())
33
+
34
+ def __getitem__(self, key: str) -> Any:
35
+ return self.additional_properties[key]
36
+
37
+ def __setitem__(self, key: str, value: Any) -> None:
38
+ self.additional_properties[key] = value
39
+
40
+ def __delitem__(self, key: str) -> None:
41
+ del self.additional_properties[key]
42
+
43
+ def __contains__(self, key: str) -> bool:
44
+ return key in self.additional_properties
@@ -0,0 +1,9 @@
1
+ from enum import Enum
2
+
3
+
4
+ class MonitorCreateRequestType(str, Enum):
5
+ SCRAPE = "scrape"
6
+ SCREENSHOT = "screenshot"
7
+
8
+ def __str__(self) -> str:
9
+ return str(self.value)
@@ -0,0 +1,44 @@
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="MonitorCreateRequestWebhookHeaders")
8
+
9
+
10
+ @_attrs_define
11
+ class MonitorCreateRequestWebhookHeaders:
12
+ """Max 20 headers. Keys must match /^[A-Za-z0-9-]+$/ and not be reserved."""
13
+
14
+ additional_properties: dict[str, str] = _attrs_field(init=False, factory=dict)
15
+
16
+ def to_dict(self) -> dict[str, Any]:
17
+ field_dict: dict[str, Any] = {}
18
+ field_dict.update(self.additional_properties)
19
+
20
+ return field_dict
21
+
22
+ @classmethod
23
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
24
+ d = dict(src_dict)
25
+ monitor_create_request_webhook_headers = cls()
26
+
27
+ monitor_create_request_webhook_headers.additional_properties = d
28
+ return monitor_create_request_webhook_headers
29
+
30
+ @property
31
+ def additional_keys(self) -> list[str]:
32
+ return list(self.additional_properties.keys())
33
+
34
+ def __getitem__(self, key: str) -> str:
35
+ return self.additional_properties[key]
36
+
37
+ def __setitem__(self, key: str, value: str) -> None:
38
+ self.additional_properties[key] = value
39
+
40
+ def __delitem__(self, key: str) -> None:
41
+ del self.additional_properties[key]
42
+
43
+ def __contains__(self, key: str) -> bool:
44
+ return key in self.additional_properties
@@ -0,0 +1,423 @@
1
+ import datetime
2
+ from collections.abc import Mapping
3
+ from typing import (
4
+ TYPE_CHECKING,
5
+ Any,
6
+ TypeVar,
7
+ Union,
8
+ cast,
9
+ )
10
+
11
+ from attrs import define as _attrs_define
12
+ from attrs import field as _attrs_field
13
+ from dateutil.parser import isoparse
14
+
15
+ from ..models.monitor_response_interval_type import MonitorResponseIntervalType
16
+ from ..models.monitor_response_status import MonitorResponseStatus
17
+ from ..models.monitor_response_type import MonitorResponseType
18
+ from ..types import UNSET, Unset
19
+
20
+ if TYPE_CHECKING:
21
+ from ..models.monitor_response_metadata_type_0 import MonitorResponseMetadataType0
22
+ from ..models.monitor_response_webhook_headers_type_0 import (
23
+ MonitorResponseWebhookHeadersType0,
24
+ )
25
+
26
+
27
+ T = TypeVar("T", bound="MonitorCreateResponse")
28
+
29
+
30
+ @_attrs_define
31
+ class MonitorCreateResponse:
32
+ """
33
+ Attributes:
34
+ id (str): Example: mon_01j9abc123.
35
+ type_ (MonitorResponseType):
36
+ url (str):
37
+ status (MonitorResponseStatus):
38
+ interval_type (MonitorResponseIntervalType):
39
+ cron_expression (Union[None, str]):
40
+ next_capture_at (datetime.datetime):
41
+ notify_on (str):
42
+ webhook_url (str): Webhook endpoint URL (HTTPS only; http:// rejected with 400 invalid_url, reason
43
+ scheme_unsupported)
44
+ webhook_headers (Union['MonitorResponseWebhookHeadersType0', None]):
45
+ captures_count (int):
46
+ changes_count (int):
47
+ skipped_captures (int):
48
+ last_captured_at (Union[None, datetime.datetime]):
49
+ last_changed_at (Union[None, datetime.datetime]):
50
+ consecutive_failures (int): Number of consecutive capture failures. Resets to 0 on success. Used to trigger
51
+ auto-suspension.
52
+ last_error_code (Union[None, str]): Error code from the most recent failed capture, if any.
53
+ suspension_reason (Union[None, str]): Reason the monitor was auto-suspended (e.g.
54
+ "auto_suspended_consecutive_failures"), if applicable.
55
+ metadata (Union['MonitorResponseMetadataType0', None]):
56
+ created_at (datetime.datetime):
57
+ updated_at (datetime.datetime):
58
+ cancelled_at (Union[None, datetime.datetime]):
59
+ change_threshold (Union[Unset, str]): Present on screenshot monitors only.
60
+ scrape_options (Union[Unset, Any]): Present on scrape monitors only.
61
+ last_content_hash (Union[None, Unset, str]): Present on scrape monitors only.
62
+ webhook_secret (Union[Unset, str]): The webhook signing secret — returned **once** at creation time only.
63
+ Subsequent GET requests omit this field. Always present on a create response (`webhook_url` is required on
64
+ create). Format: 64 lowercase hex characters (32 bytes of entropy).
65
+ Example: a3f1b2c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2.
66
+ """
67
+
68
+ id: str
69
+ type_: MonitorResponseType
70
+ url: str
71
+ status: MonitorResponseStatus
72
+ interval_type: MonitorResponseIntervalType
73
+ cron_expression: Union[None, str]
74
+ next_capture_at: datetime.datetime
75
+ notify_on: str
76
+ webhook_url: str
77
+ webhook_headers: Union["MonitorResponseWebhookHeadersType0", None]
78
+ captures_count: int
79
+ changes_count: int
80
+ skipped_captures: int
81
+ last_captured_at: Union[None, datetime.datetime]
82
+ last_changed_at: Union[None, datetime.datetime]
83
+ consecutive_failures: int
84
+ last_error_code: Union[None, str]
85
+ suspension_reason: Union[None, str]
86
+ metadata: Union["MonitorResponseMetadataType0", None]
87
+ created_at: datetime.datetime
88
+ updated_at: datetime.datetime
89
+ cancelled_at: Union[None, datetime.datetime]
90
+ change_threshold: Union[Unset, str] = UNSET
91
+ scrape_options: Union[Unset, Any] = UNSET
92
+ last_content_hash: Union[None, Unset, str] = UNSET
93
+ webhook_secret: Union[Unset, str] = UNSET
94
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
95
+
96
+ def to_dict(self) -> dict[str, Any]:
97
+ from ..models.monitor_response_metadata_type_0 import (
98
+ MonitorResponseMetadataType0,
99
+ )
100
+ from ..models.monitor_response_webhook_headers_type_0 import (
101
+ MonitorResponseWebhookHeadersType0,
102
+ )
103
+
104
+ id = self.id
105
+
106
+ type_ = self.type_.value
107
+
108
+ url = self.url
109
+
110
+ status = self.status.value
111
+
112
+ interval_type = self.interval_type.value
113
+
114
+ cron_expression: Union[None, str]
115
+ cron_expression = self.cron_expression
116
+
117
+ next_capture_at = self.next_capture_at.isoformat()
118
+
119
+ notify_on = self.notify_on
120
+
121
+ webhook_url = self.webhook_url
122
+
123
+ webhook_headers: Union[None, dict[str, Any]]
124
+ if isinstance(self.webhook_headers, MonitorResponseWebhookHeadersType0):
125
+ webhook_headers = self.webhook_headers.to_dict()
126
+ else:
127
+ webhook_headers = self.webhook_headers
128
+
129
+ captures_count = self.captures_count
130
+
131
+ changes_count = self.changes_count
132
+
133
+ skipped_captures = self.skipped_captures
134
+
135
+ last_captured_at: Union[None, str]
136
+ if isinstance(self.last_captured_at, datetime.datetime):
137
+ last_captured_at = self.last_captured_at.isoformat()
138
+ else:
139
+ last_captured_at = self.last_captured_at
140
+
141
+ last_changed_at: Union[None, str]
142
+ if isinstance(self.last_changed_at, datetime.datetime):
143
+ last_changed_at = self.last_changed_at.isoformat()
144
+ else:
145
+ last_changed_at = self.last_changed_at
146
+
147
+ consecutive_failures = self.consecutive_failures
148
+
149
+ last_error_code: Union[None, str]
150
+ last_error_code = self.last_error_code
151
+
152
+ suspension_reason: Union[None, str]
153
+ suspension_reason = self.suspension_reason
154
+
155
+ metadata: Union[None, dict[str, Any]]
156
+ if isinstance(self.metadata, MonitorResponseMetadataType0):
157
+ metadata = self.metadata.to_dict()
158
+ else:
159
+ metadata = self.metadata
160
+
161
+ created_at = self.created_at.isoformat()
162
+
163
+ updated_at = self.updated_at.isoformat()
164
+
165
+ cancelled_at: Union[None, str]
166
+ if isinstance(self.cancelled_at, datetime.datetime):
167
+ cancelled_at = self.cancelled_at.isoformat()
168
+ else:
169
+ cancelled_at = self.cancelled_at
170
+
171
+ change_threshold = self.change_threshold
172
+
173
+ scrape_options = self.scrape_options
174
+
175
+ last_content_hash: Union[None, Unset, str]
176
+ if isinstance(self.last_content_hash, Unset):
177
+ last_content_hash = UNSET
178
+ else:
179
+ last_content_hash = self.last_content_hash
180
+
181
+ webhook_secret = self.webhook_secret
182
+
183
+ field_dict: dict[str, Any] = {}
184
+ field_dict.update(self.additional_properties)
185
+ field_dict.update(
186
+ {
187
+ "id": id,
188
+ "type": type_,
189
+ "url": url,
190
+ "status": status,
191
+ "interval_type": interval_type,
192
+ "cron_expression": cron_expression,
193
+ "next_capture_at": next_capture_at,
194
+ "notify_on": notify_on,
195
+ "webhook_url": webhook_url,
196
+ "webhook_headers": webhook_headers,
197
+ "captures_count": captures_count,
198
+ "changes_count": changes_count,
199
+ "skipped_captures": skipped_captures,
200
+ "last_captured_at": last_captured_at,
201
+ "last_changed_at": last_changed_at,
202
+ "consecutive_failures": consecutive_failures,
203
+ "last_error_code": last_error_code,
204
+ "suspension_reason": suspension_reason,
205
+ "metadata": metadata,
206
+ "created_at": created_at,
207
+ "updated_at": updated_at,
208
+ "cancelled_at": cancelled_at,
209
+ }
210
+ )
211
+ if change_threshold is not UNSET:
212
+ field_dict["change_threshold"] = change_threshold
213
+ if scrape_options is not UNSET:
214
+ field_dict["scrape_options"] = scrape_options
215
+ if last_content_hash is not UNSET:
216
+ field_dict["last_content_hash"] = last_content_hash
217
+ if webhook_secret is not UNSET:
218
+ field_dict["webhook_secret"] = webhook_secret
219
+
220
+ return field_dict
221
+
222
+ @classmethod
223
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
224
+ from ..models.monitor_response_metadata_type_0 import (
225
+ MonitorResponseMetadataType0,
226
+ )
227
+ from ..models.monitor_response_webhook_headers_type_0 import (
228
+ MonitorResponseWebhookHeadersType0,
229
+ )
230
+
231
+ d = dict(src_dict)
232
+ id = d.pop("id")
233
+
234
+ type_ = MonitorResponseType(d.pop("type"))
235
+
236
+ url = d.pop("url")
237
+
238
+ status = MonitorResponseStatus(d.pop("status"))
239
+
240
+ interval_type = MonitorResponseIntervalType(d.pop("interval_type"))
241
+
242
+ def _parse_cron_expression(data: object) -> Union[None, str]:
243
+ if data is None:
244
+ return data
245
+ return cast(Union[None, str], data)
246
+
247
+ cron_expression = _parse_cron_expression(d.pop("cron_expression"))
248
+
249
+ next_capture_at = isoparse(d.pop("next_capture_at"))
250
+
251
+ notify_on = d.pop("notify_on")
252
+
253
+ webhook_url = d.pop("webhook_url")
254
+
255
+ def _parse_webhook_headers(
256
+ data: object,
257
+ ) -> Union["MonitorResponseWebhookHeadersType0", None]:
258
+ if data is None:
259
+ return data
260
+ try:
261
+ if not isinstance(data, dict):
262
+ raise TypeError()
263
+ webhook_headers_type_0 = MonitorResponseWebhookHeadersType0.from_dict(
264
+ data
265
+ )
266
+
267
+ return webhook_headers_type_0
268
+ except: # noqa: E722
269
+ pass
270
+ return cast(Union["MonitorResponseWebhookHeadersType0", None], data)
271
+
272
+ webhook_headers = _parse_webhook_headers(d.pop("webhook_headers"))
273
+
274
+ captures_count = d.pop("captures_count")
275
+
276
+ changes_count = d.pop("changes_count")
277
+
278
+ skipped_captures = d.pop("skipped_captures")
279
+
280
+ def _parse_last_captured_at(data: object) -> Union[None, datetime.datetime]:
281
+ if data is None:
282
+ return data
283
+ try:
284
+ if not isinstance(data, str):
285
+ raise TypeError()
286
+ last_captured_at_type_0 = isoparse(data)
287
+
288
+ return last_captured_at_type_0
289
+ except: # noqa: E722
290
+ pass
291
+ return cast(Union[None, datetime.datetime], data)
292
+
293
+ last_captured_at = _parse_last_captured_at(d.pop("last_captured_at"))
294
+
295
+ def _parse_last_changed_at(data: object) -> Union[None, datetime.datetime]:
296
+ if data is None:
297
+ return data
298
+ try:
299
+ if not isinstance(data, str):
300
+ raise TypeError()
301
+ last_changed_at_type_0 = isoparse(data)
302
+
303
+ return last_changed_at_type_0
304
+ except: # noqa: E722
305
+ pass
306
+ return cast(Union[None, datetime.datetime], data)
307
+
308
+ last_changed_at = _parse_last_changed_at(d.pop("last_changed_at"))
309
+
310
+ consecutive_failures = d.pop("consecutive_failures")
311
+
312
+ def _parse_last_error_code(data: object) -> Union[None, str]:
313
+ if data is None:
314
+ return data
315
+ return cast(Union[None, str], data)
316
+
317
+ last_error_code = _parse_last_error_code(d.pop("last_error_code"))
318
+
319
+ def _parse_suspension_reason(data: object) -> Union[None, str]:
320
+ if data is None:
321
+ return data
322
+ return cast(Union[None, str], data)
323
+
324
+ suspension_reason = _parse_suspension_reason(d.pop("suspension_reason"))
325
+
326
+ def _parse_metadata(
327
+ data: object,
328
+ ) -> Union["MonitorResponseMetadataType0", None]:
329
+ if data is None:
330
+ return data
331
+ try:
332
+ if not isinstance(data, dict):
333
+ raise TypeError()
334
+ metadata_type_0 = MonitorResponseMetadataType0.from_dict(data)
335
+
336
+ return metadata_type_0
337
+ except: # noqa: E722
338
+ pass
339
+ return cast(Union["MonitorResponseMetadataType0", None], data)
340
+
341
+ metadata = _parse_metadata(d.pop("metadata"))
342
+
343
+ created_at = isoparse(d.pop("created_at"))
344
+
345
+ updated_at = isoparse(d.pop("updated_at"))
346
+
347
+ def _parse_cancelled_at(data: object) -> Union[None, datetime.datetime]:
348
+ if data is None:
349
+ return data
350
+ try:
351
+ if not isinstance(data, str):
352
+ raise TypeError()
353
+ cancelled_at_type_0 = isoparse(data)
354
+
355
+ return cancelled_at_type_0
356
+ except: # noqa: E722
357
+ pass
358
+ return cast(Union[None, datetime.datetime], data)
359
+
360
+ cancelled_at = _parse_cancelled_at(d.pop("cancelled_at"))
361
+
362
+ change_threshold = d.pop("change_threshold", UNSET)
363
+
364
+ scrape_options = d.pop("scrape_options", UNSET)
365
+
366
+ def _parse_last_content_hash(data: object) -> Union[None, Unset, str]:
367
+ if data is None:
368
+ return data
369
+ if isinstance(data, Unset):
370
+ return data
371
+ return cast(Union[None, Unset, str], data)
372
+
373
+ last_content_hash = _parse_last_content_hash(d.pop("last_content_hash", UNSET))
374
+
375
+ webhook_secret = d.pop("webhook_secret", UNSET)
376
+
377
+ monitor_create_response = cls(
378
+ id=id,
379
+ type_=type_,
380
+ url=url,
381
+ status=status,
382
+ interval_type=interval_type,
383
+ cron_expression=cron_expression,
384
+ next_capture_at=next_capture_at,
385
+ notify_on=notify_on,
386
+ webhook_url=webhook_url,
387
+ webhook_headers=webhook_headers,
388
+ captures_count=captures_count,
389
+ changes_count=changes_count,
390
+ skipped_captures=skipped_captures,
391
+ last_captured_at=last_captured_at,
392
+ last_changed_at=last_changed_at,
393
+ consecutive_failures=consecutive_failures,
394
+ last_error_code=last_error_code,
395
+ suspension_reason=suspension_reason,
396
+ metadata=metadata,
397
+ created_at=created_at,
398
+ updated_at=updated_at,
399
+ cancelled_at=cancelled_at,
400
+ change_threshold=change_threshold,
401
+ scrape_options=scrape_options,
402
+ last_content_hash=last_content_hash,
403
+ webhook_secret=webhook_secret,
404
+ )
405
+
406
+ monitor_create_response.additional_properties = d
407
+ return monitor_create_response
408
+
409
+ @property
410
+ def additional_keys(self) -> list[str]:
411
+ return list(self.additional_properties.keys())
412
+
413
+ def __getitem__(self, key: str) -> Any:
414
+ return self.additional_properties[key]
415
+
416
+ def __setitem__(self, key: str, value: Any) -> None:
417
+ self.additional_properties[key] = value
418
+
419
+ def __delitem__(self, key: str) -> None:
420
+ del self.additional_properties[key]
421
+
422
+ def __contains__(self, key: str) -> bool:
423
+ return key in self.additional_properties