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.
- bytekit/__init__.py +8 -0
- bytekit/api/__init__.py +1 -0
- bytekit/api/account/__init__.py +1 -0
- bytekit/api/account/get_account.py +157 -0
- bytekit/api/bulk/__init__.py +1 -0
- bytekit/api/bulk/create_bulk.py +204 -0
- bytekit/api/bulk/delete_bulk.py +177 -0
- bytekit/api/bulk/get_bulk.py +157 -0
- bytekit/api/bulk/list_bulk_screenshots.py +152 -0
- bytekit/api/fetch/__init__.py +1 -0
- bytekit/api/fetch/get_fetch.py +254 -0
- bytekit/api/fetch/post_fetch.py +178 -0
- bytekit/api/fetch_bulk/__init__.py +1 -0
- bytekit/api/fetch_bulk/create_fetch_bulk.py +180 -0
- bytekit/api/fetch_bulk/get_fetch_bulk.py +157 -0
- bytekit/api/monitors/__init__.py +1 -0
- bytekit/api/monitors/create_monitor.py +180 -0
- bytekit/api/monitors/delete_monitor.py +155 -0
- bytekit/api/monitors/get_monitor.py +157 -0
- bytekit/api/monitors/list_monitor_captures.py +188 -0
- bytekit/api/monitors/list_monitors.py +193 -0
- bytekit/api/monitors/update_monitor.py +191 -0
- bytekit/api/scrape/__init__.py +1 -0
- bytekit/api/scrape/create_scrape.py +197 -0
- bytekit/api/scrape/get_scrape.py +231 -0
- bytekit/api/scrape_bulk/__init__.py +1 -0
- bytekit/api/scrape_bulk/create_scrape_bulk.py +188 -0
- bytekit/api/scrape_bulk/get_scrape_bulk.py +157 -0
- bytekit/api/screenshots/__init__.py +1 -0
- bytekit/api/screenshots/create_screenshot.py +208 -0
- bytekit/api/screenshots/get_screenshot.py +177 -0
- bytekit/api/search/__init__.py +1 -0
- bytekit/api/search/create_search.py +225 -0
- bytekit/api/sitemap/__init__.py +1 -0
- bytekit/api/sitemap/create_sitemap.py +192 -0
- bytekit/api/sitemap/get_sitemap.py +157 -0
- bytekit/api/usage/__init__.py +1 -0
- bytekit/api/usage/get_usage.py +126 -0
- bytekit/api/usage/get_usage_by_endpoint.py +215 -0
- bytekit/api/usage/get_usage_daily.py +203 -0
- bytekit/api/webhooks/__init__.py +1 -0
- bytekit/api/webhooks/list_webhook_deliveries.py +214 -0
- bytekit/api/webhooks/retry_webhook_delivery.py +165 -0
- bytekit/client.py +418 -0
- bytekit/errors.py +18 -0
- bytekit/models/__init__.py +401 -0
- bytekit/models/account_bearer_response.py +207 -0
- bytekit/models/account_bearer_response_api_key.py +134 -0
- bytekit/models/account_bearer_response_api_key_environment.py +8 -0
- bytekit/models/account_bearer_response_auto_topup.py +83 -0
- bytekit/models/account_bearer_response_plan.py +150 -0
- bytekit/models/account_bearer_response_subscription.py +85 -0
- bytekit/models/account_bearer_response_subscription_plan.py +99 -0
- bytekit/models/account_bearer_response_subscription_status.py +10 -0
- bytekit/models/account_session_response.py +164 -0
- bytekit/models/account_session_response_notifications.py +51 -0
- bytekit/models/account_session_response_plan.py +150 -0
- bytekit/models/bandwidth_balance.py +91 -0
- bytekit/models/capture_response.py +216 -0
- bytekit/models/capture_response_outcome.py +10 -0
- bytekit/models/clip.py +83 -0
- bytekit/models/cookie.py +90 -0
- bytekit/models/create_bulk_body.py +155 -0
- bytekit/models/create_bulk_body_defaults.py +423 -0
- bytekit/models/create_bulk_body_defaults_device.py +9 -0
- bytekit/models/create_bulk_body_defaults_device_scale_factor_type_1.py +9 -0
- bytekit/models/create_bulk_body_defaults_device_scale_factor_type_2_type_1.py +9 -0
- bytekit/models/create_bulk_body_defaults_device_scale_factor_type_3_type_1.py +9 -0
- bytekit/models/create_bulk_body_defaults_formats_item.py +12 -0
- bytekit/models/create_bulk_body_defaults_type.py +9 -0
- bytekit/models/create_bulk_body_defaults_viewport_type_0.py +67 -0
- bytekit/models/create_bulk_body_defaults_wait_until.py +10 -0
- bytekit/models/create_bulk_body_items_item.py +380 -0
- bytekit/models/create_bulk_body_items_item_device.py +9 -0
- bytekit/models/create_bulk_body_items_item_formats_item.py +12 -0
- bytekit/models/create_bulk_body_items_item_scenario.py +10 -0
- bytekit/models/create_bulk_body_items_item_type.py +9 -0
- bytekit/models/create_bulk_body_items_item_viewport_type_0.py +67 -0
- bytekit/models/create_bulk_body_items_item_wait_until.py +10 -0
- bytekit/models/create_bulk_response_202.py +164 -0
- bytekit/models/create_bulk_response_202_status.py +10 -0
- bytekit/models/create_fetch_bulk_body.py +161 -0
- bytekit/models/create_fetch_bulk_body_defaults.py +91 -0
- bytekit/models/create_fetch_bulk_body_defaults_format.py +9 -0
- bytekit/models/create_fetch_bulk_body_metadata.py +44 -0
- bytekit/models/create_fetch_bulk_body_urls_item_type_1.py +102 -0
- bytekit/models/create_fetch_bulk_body_urls_item_type_1_format.py +9 -0
- bytekit/models/create_fetch_bulk_response_202.py +44 -0
- bytekit/models/create_scrape_bulk_body.py +179 -0
- bytekit/models/create_scrape_bulk_body_custom.py +52 -0
- bytekit/models/create_scrape_bulk_body_defaults.py +167 -0
- bytekit/models/create_scrape_bulk_body_defaults_formats_item.py +12 -0
- bytekit/models/create_scrape_bulk_body_defaults_headers.py +44 -0
- bytekit/models/create_scrape_bulk_body_items_item.py +226 -0
- bytekit/models/create_scrape_bulk_body_items_item_custom.py +50 -0
- bytekit/models/create_scrape_bulk_body_items_item_formats_item.py +12 -0
- bytekit/models/create_scrape_bulk_body_items_item_headers.py +44 -0
- bytekit/models/create_scrape_bulk_body_items_item_metadata.py +44 -0
- bytekit/models/create_scrape_bulk_response_202.py +166 -0
- bytekit/models/create_scrape_bulk_response_202_status.py +10 -0
- bytekit/models/create_search_body.py +140 -0
- bytekit/models/create_search_body_date_range.py +13 -0
- bytekit/models/create_search_body_type.py +10 -0
- bytekit/models/create_search_response_200.py +119 -0
- bytekit/models/create_search_response_200_results_item.py +161 -0
- bytekit/models/create_search_response_200_results_item_image.py +113 -0
- bytekit/models/create_search_response_502.py +46 -0
- bytekit/models/create_search_response_502_error.py +8 -0
- bytekit/models/credit_balance.py +91 -0
- bytekit/models/delete_bulk_response_200.py +164 -0
- bytekit/models/delete_bulk_response_200_status.py +11 -0
- bytekit/models/error.py +83 -0
- bytekit/models/error_error.py +100 -0
- bytekit/models/error_status.py +8 -0
- bytekit/models/fetch_request.py +276 -0
- bytekit/models/fetch_request_cache_ttl_type_1.py +8 -0
- bytekit/models/fetch_request_custom.py +48 -0
- bytekit/models/fetch_request_format.py +9 -0
- bytekit/models/fetch_request_markdown_images.py +11 -0
- bytekit/models/fetch_request_markdown_links.py +11 -0
- bytekit/models/fetch_request_markdown_mode.py +10 -0
- bytekit/models/get_bulk_response_200.py +164 -0
- bytekit/models/get_bulk_response_200_status.py +11 -0
- bytekit/models/get_fetch_bulk_response_200.py +44 -0
- bytekit/models/get_fetch_cache_ttl_type_1.py +8 -0
- bytekit/models/get_fetch_format.py +9 -0
- bytekit/models/get_scrape_bulk_response_200.py +164 -0
- bytekit/models/get_scrape_bulk_response_200_status.py +11 -0
- bytekit/models/get_usage_by_endpoint_response_200.py +114 -0
- bytekit/models/get_usage_by_endpoint_response_200_rows_item.py +90 -0
- bytekit/models/get_usage_by_endpoint_response_200_rows_item_endpoint.py +17 -0
- bytekit/models/get_usage_by_endpoint_response_200_totals.py +67 -0
- bytekit/models/get_usage_daily_response_200.py +97 -0
- bytekit/models/get_usage_daily_response_200_data_item.py +219 -0
- bytekit/models/get_usage_response_200.py +344 -0
- bytekit/models/get_usage_response_200_plan_type.py +10 -0
- bytekit/models/list_bulk_screenshots_response_200.py +44 -0
- bytekit/models/list_monitor_captures_response_200.py +101 -0
- bytekit/models/list_monitors_response_200.py +101 -0
- bytekit/models/list_monitors_status.py +12 -0
- bytekit/models/list_webhook_deliveries_response_200.py +101 -0
- bytekit/models/list_webhook_deliveries_status.py +11 -0
- bytekit/models/metadata.py +44 -0
- bytekit/models/monitor_create_request.py +219 -0
- bytekit/models/monitor_create_request_interval_type.py +11 -0
- bytekit/models/monitor_create_request_notify_on.py +9 -0
- bytekit/models/monitor_create_request_options.py +44 -0
- bytekit/models/monitor_create_request_scrape_options.py +44 -0
- bytekit/models/monitor_create_request_type.py +9 -0
- bytekit/models/monitor_create_request_webhook_headers.py +44 -0
- bytekit/models/monitor_create_response.py +423 -0
- bytekit/models/monitor_response.py +411 -0
- bytekit/models/monitor_response_interval_type.py +11 -0
- bytekit/models/monitor_response_metadata_type_0.py +44 -0
- bytekit/models/monitor_response_status.py +12 -0
- bytekit/models/monitor_response_type.py +9 -0
- bytekit/models/monitor_response_webhook_headers_type_0.py +44 -0
- bytekit/models/monitor_update_request.py +223 -0
- bytekit/models/monitor_update_request_interval_type.py +11 -0
- bytekit/models/monitor_update_request_notify_on.py +9 -0
- bytekit/models/monitor_update_request_options.py +44 -0
- bytekit/models/monitor_update_request_scrape_options.py +44 -0
- bytekit/models/monitor_update_request_status.py +9 -0
- bytekit/models/monitor_update_request_webhook_headers.py +44 -0
- bytekit/models/scrape_error_envelope.py +113 -0
- bytekit/models/scrape_error_envelope_error.py +93 -0
- bytekit/models/scrape_error_envelope_error_code.py +18 -0
- bytekit/models/scrape_error_envelope_schema_version.py +8 -0
- bytekit/models/scrape_error_envelope_status.py +8 -0
- bytekit/models/scrape_formats.py +183 -0
- bytekit/models/scrape_markdown_tokens.py +75 -0
- bytekit/models/scrape_metadata.py +262 -0
- bytekit/models/scrape_queued_envelope.py +124 -0
- bytekit/models/scrape_queued_envelope_schema_version.py +8 -0
- bytekit/models/scrape_queued_envelope_status.py +8 -0
- bytekit/models/scrape_request.py +485 -0
- bytekit/models/scrape_request_cache_ttl_type_1.py +8 -0
- bytekit/models/scrape_request_custom.py +48 -0
- bytekit/models/scrape_request_events_item.py +10 -0
- bytekit/models/scrape_request_formats_item.py +12 -0
- bytekit/models/scrape_request_headers.py +44 -0
- bytekit/models/scrape_request_markdown_images.py +11 -0
- bytekit/models/scrape_request_markdown_links.py +11 -0
- bytekit/models/scrape_request_markdown_mode.py +10 -0
- bytekit/models/scrape_request_token_encoding.py +9 -0
- bytekit/models/scrape_request_x_internal_scrape_path.py +8 -0
- bytekit/models/scrape_scored_image.py +128 -0
- bytekit/models/scrape_scored_link.py +94 -0
- bytekit/models/scrape_stats.py +75 -0
- bytekit/models/scrape_success_envelope.py +345 -0
- bytekit/models/scrape_success_envelope_cache.py +10 -0
- bytekit/models/scrape_success_envelope_custom.py +48 -0
- bytekit/models/scrape_success_envelope_schema_version.py +8 -0
- bytekit/models/scrape_success_envelope_status.py +8 -0
- bytekit/models/scrape_table.py +96 -0
- bytekit/models/scrape_table_kind.py +10 -0
- bytekit/models/scrape_warning.py +88 -0
- bytekit/models/scrape_warning_code.py +17 -0
- bytekit/models/screenshot_request.py +445 -0
- bytekit/models/screenshot_request_device.py +9 -0
- bytekit/models/screenshot_request_device_scale_factor_type_1.py +9 -0
- bytekit/models/screenshot_request_device_scale_factor_type_2_type_1.py +9 -0
- bytekit/models/screenshot_request_device_scale_factor_type_3_type_1.py +9 -0
- bytekit/models/screenshot_request_format.py +9 -0
- bytekit/models/screenshot_request_headers.py +44 -0
- bytekit/models/screenshot_request_wait_until.py +10 -0
- bytekit/models/screenshot_response.py +264 -0
- bytekit/models/screenshot_response_status.py +11 -0
- bytekit/models/sitemap_request.py +210 -0
- bytekit/models/sitemap_request_process_type_0.py +90 -0
- bytekit/models/sitemap_request_process_type_0_options.py +44 -0
- bytekit/models/sitemap_request_strategy.py +10 -0
- bytekit/models/sitemap_response.py +418 -0
- bytekit/models/sitemap_response_cache.py +10 -0
- bytekit/models/sitemap_response_metadata_type_0.py +44 -0
- bytekit/models/sitemap_response_process_type_0.py +44 -0
- bytekit/models/sitemap_response_sources_type_0.py +44 -0
- bytekit/models/sitemap_response_status.py +11 -0
- bytekit/models/viewport.py +67 -0
- bytekit/models/webhook_delivery_response.py +270 -0
- bytekit/models/webhook_delivery_response_event_type.py +14 -0
- bytekit/models/webhook_delivery_response_status.py +11 -0
- bytekit/py.typed +0 -0
- bytekit/types.py +54 -0
- bytekit_sdk-0.3.0.dist-info/METADATA +141 -0
- bytekit_sdk-0.3.0.dist-info/RECORD +227 -0
- bytekit_sdk-0.3.0.dist-info/WHEEL +4 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
from collections.abc import Mapping
|
|
2
|
+
from typing import (
|
|
3
|
+
Any,
|
|
4
|
+
TypeVar,
|
|
5
|
+
Union,
|
|
6
|
+
cast,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
from attrs import define as _attrs_define
|
|
10
|
+
from attrs import field as _attrs_field
|
|
11
|
+
|
|
12
|
+
T = TypeVar("T", bound="ScrapeScoredImage")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@_attrs_define
|
|
16
|
+
class ScrapeScoredImage:
|
|
17
|
+
"""
|
|
18
|
+
Attributes:
|
|
19
|
+
url (str):
|
|
20
|
+
alt (Union[None, str]):
|
|
21
|
+
width (Union[None, int]):
|
|
22
|
+
height (Union[None, int]):
|
|
23
|
+
format_ (Union[None, str]):
|
|
24
|
+
score (float):
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
url: str
|
|
28
|
+
alt: Union[None, str]
|
|
29
|
+
width: Union[None, int]
|
|
30
|
+
height: Union[None, int]
|
|
31
|
+
format_: Union[None, str]
|
|
32
|
+
score: float
|
|
33
|
+
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
|
|
34
|
+
|
|
35
|
+
def to_dict(self) -> dict[str, Any]:
|
|
36
|
+
url = self.url
|
|
37
|
+
|
|
38
|
+
alt: Union[None, str]
|
|
39
|
+
alt = self.alt
|
|
40
|
+
|
|
41
|
+
width: Union[None, int]
|
|
42
|
+
width = self.width
|
|
43
|
+
|
|
44
|
+
height: Union[None, int]
|
|
45
|
+
height = self.height
|
|
46
|
+
|
|
47
|
+
format_: Union[None, str]
|
|
48
|
+
format_ = self.format_
|
|
49
|
+
|
|
50
|
+
score = self.score
|
|
51
|
+
|
|
52
|
+
field_dict: dict[str, Any] = {}
|
|
53
|
+
field_dict.update(self.additional_properties)
|
|
54
|
+
field_dict.update(
|
|
55
|
+
{
|
|
56
|
+
"url": url,
|
|
57
|
+
"alt": alt,
|
|
58
|
+
"width": width,
|
|
59
|
+
"height": height,
|
|
60
|
+
"format": format_,
|
|
61
|
+
"score": score,
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
return field_dict
|
|
66
|
+
|
|
67
|
+
@classmethod
|
|
68
|
+
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
|
|
69
|
+
d = dict(src_dict)
|
|
70
|
+
url = d.pop("url")
|
|
71
|
+
|
|
72
|
+
def _parse_alt(data: object) -> Union[None, str]:
|
|
73
|
+
if data is None:
|
|
74
|
+
return data
|
|
75
|
+
return cast(Union[None, str], data)
|
|
76
|
+
|
|
77
|
+
alt = _parse_alt(d.pop("alt"))
|
|
78
|
+
|
|
79
|
+
def _parse_width(data: object) -> Union[None, int]:
|
|
80
|
+
if data is None:
|
|
81
|
+
return data
|
|
82
|
+
return cast(Union[None, int], data)
|
|
83
|
+
|
|
84
|
+
width = _parse_width(d.pop("width"))
|
|
85
|
+
|
|
86
|
+
def _parse_height(data: object) -> Union[None, int]:
|
|
87
|
+
if data is None:
|
|
88
|
+
return data
|
|
89
|
+
return cast(Union[None, int], data)
|
|
90
|
+
|
|
91
|
+
height = _parse_height(d.pop("height"))
|
|
92
|
+
|
|
93
|
+
def _parse_format_(data: object) -> Union[None, str]:
|
|
94
|
+
if data is None:
|
|
95
|
+
return data
|
|
96
|
+
return cast(Union[None, str], data)
|
|
97
|
+
|
|
98
|
+
format_ = _parse_format_(d.pop("format"))
|
|
99
|
+
|
|
100
|
+
score = d.pop("score")
|
|
101
|
+
|
|
102
|
+
scrape_scored_image = cls(
|
|
103
|
+
url=url,
|
|
104
|
+
alt=alt,
|
|
105
|
+
width=width,
|
|
106
|
+
height=height,
|
|
107
|
+
format_=format_,
|
|
108
|
+
score=score,
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
scrape_scored_image.additional_properties = d
|
|
112
|
+
return scrape_scored_image
|
|
113
|
+
|
|
114
|
+
@property
|
|
115
|
+
def additional_keys(self) -> list[str]:
|
|
116
|
+
return list(self.additional_properties.keys())
|
|
117
|
+
|
|
118
|
+
def __getitem__(self, key: str) -> Any:
|
|
119
|
+
return self.additional_properties[key]
|
|
120
|
+
|
|
121
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
|
122
|
+
self.additional_properties[key] = value
|
|
123
|
+
|
|
124
|
+
def __delitem__(self, key: str) -> None:
|
|
125
|
+
del self.additional_properties[key]
|
|
126
|
+
|
|
127
|
+
def __contains__(self, key: str) -> bool:
|
|
128
|
+
return key in self.additional_properties
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
from collections.abc import Mapping
|
|
2
|
+
from typing import (
|
|
3
|
+
Any,
|
|
4
|
+
TypeVar,
|
|
5
|
+
Union,
|
|
6
|
+
cast,
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
from attrs import define as _attrs_define
|
|
10
|
+
from attrs import field as _attrs_field
|
|
11
|
+
|
|
12
|
+
T = TypeVar("T", bound="ScrapeScoredLink")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@_attrs_define
|
|
16
|
+
class ScrapeScoredLink:
|
|
17
|
+
"""
|
|
18
|
+
Attributes:
|
|
19
|
+
url (str):
|
|
20
|
+
text (str):
|
|
21
|
+
is_internal (bool):
|
|
22
|
+
rel (Union[None, str]):
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
url: str
|
|
26
|
+
text: str
|
|
27
|
+
is_internal: bool
|
|
28
|
+
rel: Union[None, str]
|
|
29
|
+
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
|
|
30
|
+
|
|
31
|
+
def to_dict(self) -> dict[str, Any]:
|
|
32
|
+
url = self.url
|
|
33
|
+
|
|
34
|
+
text = self.text
|
|
35
|
+
|
|
36
|
+
is_internal = self.is_internal
|
|
37
|
+
|
|
38
|
+
rel: Union[None, str]
|
|
39
|
+
rel = self.rel
|
|
40
|
+
|
|
41
|
+
field_dict: dict[str, Any] = {}
|
|
42
|
+
field_dict.update(self.additional_properties)
|
|
43
|
+
field_dict.update(
|
|
44
|
+
{
|
|
45
|
+
"url": url,
|
|
46
|
+
"text": text,
|
|
47
|
+
"isInternal": is_internal,
|
|
48
|
+
"rel": rel,
|
|
49
|
+
}
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
return field_dict
|
|
53
|
+
|
|
54
|
+
@classmethod
|
|
55
|
+
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
|
|
56
|
+
d = dict(src_dict)
|
|
57
|
+
url = d.pop("url")
|
|
58
|
+
|
|
59
|
+
text = d.pop("text")
|
|
60
|
+
|
|
61
|
+
is_internal = d.pop("isInternal")
|
|
62
|
+
|
|
63
|
+
def _parse_rel(data: object) -> Union[None, str]:
|
|
64
|
+
if data is None:
|
|
65
|
+
return data
|
|
66
|
+
return cast(Union[None, str], data)
|
|
67
|
+
|
|
68
|
+
rel = _parse_rel(d.pop("rel"))
|
|
69
|
+
|
|
70
|
+
scrape_scored_link = cls(
|
|
71
|
+
url=url,
|
|
72
|
+
text=text,
|
|
73
|
+
is_internal=is_internal,
|
|
74
|
+
rel=rel,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
scrape_scored_link.additional_properties = d
|
|
78
|
+
return scrape_scored_link
|
|
79
|
+
|
|
80
|
+
@property
|
|
81
|
+
def additional_keys(self) -> list[str]:
|
|
82
|
+
return list(self.additional_properties.keys())
|
|
83
|
+
|
|
84
|
+
def __getitem__(self, key: str) -> Any:
|
|
85
|
+
return self.additional_properties[key]
|
|
86
|
+
|
|
87
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
|
88
|
+
self.additional_properties[key] = value
|
|
89
|
+
|
|
90
|
+
def __delitem__(self, key: str) -> None:
|
|
91
|
+
del self.additional_properties[key]
|
|
92
|
+
|
|
93
|
+
def __contains__(self, key: str) -> bool:
|
|
94
|
+
return key in self.additional_properties
|
|
@@ -0,0 +1,75 @@
|
|
|
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="ScrapeStats")
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@_attrs_define
|
|
11
|
+
class ScrapeStats:
|
|
12
|
+
"""
|
|
13
|
+
Attributes:
|
|
14
|
+
chars (int):
|
|
15
|
+
tokens (int):
|
|
16
|
+
blocks (int):
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
chars: int
|
|
20
|
+
tokens: int
|
|
21
|
+
blocks: int
|
|
22
|
+
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
|
|
23
|
+
|
|
24
|
+
def to_dict(self) -> dict[str, Any]:
|
|
25
|
+
chars = self.chars
|
|
26
|
+
|
|
27
|
+
tokens = self.tokens
|
|
28
|
+
|
|
29
|
+
blocks = self.blocks
|
|
30
|
+
|
|
31
|
+
field_dict: dict[str, Any] = {}
|
|
32
|
+
field_dict.update(self.additional_properties)
|
|
33
|
+
field_dict.update(
|
|
34
|
+
{
|
|
35
|
+
"chars": chars,
|
|
36
|
+
"tokens": tokens,
|
|
37
|
+
"blocks": blocks,
|
|
38
|
+
}
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
return field_dict
|
|
42
|
+
|
|
43
|
+
@classmethod
|
|
44
|
+
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
|
|
45
|
+
d = dict(src_dict)
|
|
46
|
+
chars = d.pop("chars")
|
|
47
|
+
|
|
48
|
+
tokens = d.pop("tokens")
|
|
49
|
+
|
|
50
|
+
blocks = d.pop("blocks")
|
|
51
|
+
|
|
52
|
+
scrape_stats = cls(
|
|
53
|
+
chars=chars,
|
|
54
|
+
tokens=tokens,
|
|
55
|
+
blocks=blocks,
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
scrape_stats.additional_properties = d
|
|
59
|
+
return scrape_stats
|
|
60
|
+
|
|
61
|
+
@property
|
|
62
|
+
def additional_keys(self) -> list[str]:
|
|
63
|
+
return list(self.additional_properties.keys())
|
|
64
|
+
|
|
65
|
+
def __getitem__(self, key: str) -> Any:
|
|
66
|
+
return self.additional_properties[key]
|
|
67
|
+
|
|
68
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
|
69
|
+
self.additional_properties[key] = value
|
|
70
|
+
|
|
71
|
+
def __delitem__(self, key: str) -> None:
|
|
72
|
+
del self.additional_properties[key]
|
|
73
|
+
|
|
74
|
+
def __contains__(self, key: str) -> bool:
|
|
75
|
+
return key in self.additional_properties
|
|
@@ -0,0 +1,345 @@
|
|
|
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.scrape_success_envelope_cache import ScrapeSuccessEnvelopeCache
|
|
16
|
+
from ..models.scrape_success_envelope_schema_version import (
|
|
17
|
+
ScrapeSuccessEnvelopeSchemaVersion,
|
|
18
|
+
)
|
|
19
|
+
from ..models.scrape_success_envelope_status import ScrapeSuccessEnvelopeStatus
|
|
20
|
+
from ..types import UNSET, Unset
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from ..models.scrape_formats import ScrapeFormats
|
|
24
|
+
from ..models.scrape_markdown_tokens import ScrapeMarkdownTokens
|
|
25
|
+
from ..models.scrape_metadata import ScrapeMetadata
|
|
26
|
+
from ..models.scrape_stats import ScrapeStats
|
|
27
|
+
from ..models.scrape_success_envelope_custom import ScrapeSuccessEnvelopeCustom
|
|
28
|
+
from ..models.scrape_table import ScrapeTable
|
|
29
|
+
from ..models.scrape_warning import ScrapeWarning
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
T = TypeVar("T", bound="ScrapeSuccessEnvelope")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@_attrs_define
|
|
36
|
+
class ScrapeSuccessEnvelope:
|
|
37
|
+
r"""
|
|
38
|
+
Example:
|
|
39
|
+
{'schema_version': 1, 'status': 'success', 'id': 'sc_01j9abc123', 'url': 'https://example.com', 'final_url':
|
|
40
|
+
'https://example.com/', 'content_type': 'text/html; charset=UTF-8', 'content_length': 1256, 'status_code': 200,
|
|
41
|
+
'retrieved_at': datetime.datetime(2025, 1, 15, 12, 0, tzinfo=datetime.timezone(datetime.timedelta(0), 'Z')),
|
|
42
|
+
'formats': {'raw_html': '<html><body><h1>Hello World</h1><p>Example page with a <a href="/about">link</a> and an
|
|
43
|
+
image.</p></body></html>', 'html': '<html><body><h1>Hello World</h1><p>Example page with a <a
|
|
44
|
+
href="/about">link</a> and an image.</p></body></html>', 'markdown': '# Hello World\n\nExample page with a
|
|
45
|
+
[link](/about) and an image.\n\n', 'links': [{'url':
|
|
46
|
+
'https://example.com/about', 'text': 'link', 'isInternal': True, 'rel': None}], 'images': [{'url':
|
|
47
|
+
'https://example.com/photo.png', 'alt': 'Alt text', 'width': 800, 'height': 600, 'format': 'png', 'score':
|
|
48
|
+
0.95}]}, 'metadata': {'title': 'Example Domain', 'description': 'An example page for demonstration', 'language':
|
|
49
|
+
'en', 'canonicalUrl': 'https://example.com', 'ogTitle': 'Example Domain', 'ogDescription': None, 'ogImage':
|
|
50
|
+
None, 'byline': 'Jane Doe', 'publishedAt': datetime.datetime(2025, 1, 15, 9, 0,
|
|
51
|
+
tzinfo=datetime.timezone(datetime.timedelta(0), 'Z'))}, 'tables': [{'kind': 'data', 'gfm': '| Col1 | Col2
|
|
52
|
+
|\n|------|------|\n| A | B |', 'rows': 2, 'cols': 2}], 'warnings': [{'code': 'lossy_table', 'message': 'Table
|
|
53
|
+
at index 3 was simplified', 'element': '<table>...</table>'}], 'stats': {'chars': 1256, 'tokens': 312, 'blocks':
|
|
54
|
+
4}}
|
|
55
|
+
|
|
56
|
+
Attributes:
|
|
57
|
+
schema_version (ScrapeSuccessEnvelopeSchemaVersion): Envelope contract version emitted by current producers.
|
|
58
|
+
Consumers reading persisted envelopes must tolerate its absence as legacy v0 during rolling deploys.
|
|
59
|
+
status (ScrapeSuccessEnvelopeStatus):
|
|
60
|
+
id (str): Stable job identifier (sc_… prefixed). Canonical field. Example: sc_01j9abc123.
|
|
61
|
+
url (str):
|
|
62
|
+
final_url (str):
|
|
63
|
+
content_type (str):
|
|
64
|
+
content_length (int): Compressed wire bytes transferred for this request — the basis for
|
|
65
|
+
bandwidth-billed plans. Reflects what crossed the network on your behalf
|
|
66
|
+
(e.g. gzip/brotli-compressed size), not the decompressed content length.
|
|
67
|
+
status_code (Union[None, int]):
|
|
68
|
+
retrieved_at (datetime.datetime):
|
|
69
|
+
formats (ScrapeFormats):
|
|
70
|
+
metadata (ScrapeMetadata):
|
|
71
|
+
tables (Union[Unset, list['ScrapeTable']]): Tables extracted from the page. Present only when
|
|
72
|
+
markdown_include_media=true. Present only on the synchronous response and webhook delivery. Not included in `GET
|
|
73
|
+
/v1/scrape/:id`, bulk results, or cached hits.
|
|
74
|
+
warnings (Union[Unset, list['ScrapeWarning']]): Warnings about markdown processing, tag filtering, or requested
|
|
75
|
+
persisted artifacts. Markdown-pipeline and tag-filter warnings require `markdown_include_warnings=true`;
|
|
76
|
+
`artifact_unavailable` may appear independently when a requested persisted format cannot be rehydrated.
|
|
77
|
+
stats (Union[Unset, ScrapeStats]):
|
|
78
|
+
markdown_tokens (Union[Unset, ScrapeMarkdownTokens]):
|
|
79
|
+
billing_multiplier (Union[Unset, float]): The multiplier applied to wire bytes to compute `billed_bytes` for
|
|
80
|
+
this call (e.g. 0.5 for a cache hit, 1.0-2.0 for format combinations, or higher when `clean_markdown`
|
|
81
|
+
succeeded). Present whenever this call's billing amount has been finalized; omitted if unavailable.
|
|
82
|
+
billed_bytes (Union[Unset, int]): The actual bandwidth billed for this call — `round(content_length *
|
|
83
|
+
billing_multiplier)`. Present alongside `billing_multiplier`.
|
|
84
|
+
custom (Union[Unset, ScrapeSuccessEnvelopeCustom]): Custom metadata provided by the caller in the request
|
|
85
|
+
`custom` field. Stored verbatim and round-tripped on the synchronous response and webhook delivery. Not included
|
|
86
|
+
in `GET /v1/scrape/:id`, bulk results, or cached hits. Omitted when no custom metadata was provided.
|
|
87
|
+
cache (Union[Unset, ScrapeSuccessEnvelopeCache]): Cache verdict for the request that produced this envelope.
|
|
88
|
+
`hit` — served
|
|
89
|
+
from a prior cache entry (billed at 0.5×). `miss` — no reusable entry was
|
|
90
|
+
found, so the result was freshly fetched. `bypass` — `cache_ttl: '0'`
|
|
91
|
+
skipped the read. Cache-eligible fresh results are written through;
|
|
92
|
+
safety-classified WAF husks remain live-only. Present on the async success
|
|
93
|
+
envelope (synchronous and webhook delivery); omitted by paths with no cache
|
|
94
|
+
verdict (e.g. bulk results).
|
|
95
|
+
cache_age_s (Union[Unset, int]): Age in whole seconds of the cache entry replayed on a `hit`. Clamped to ≥ 0 to
|
|
96
|
+
absorb clock skew. Present only on `cache: hit`.
|
|
97
|
+
"""
|
|
98
|
+
|
|
99
|
+
schema_version: ScrapeSuccessEnvelopeSchemaVersion
|
|
100
|
+
status: ScrapeSuccessEnvelopeStatus
|
|
101
|
+
id: str
|
|
102
|
+
url: str
|
|
103
|
+
final_url: str
|
|
104
|
+
content_type: str
|
|
105
|
+
content_length: int
|
|
106
|
+
status_code: Union[None, int]
|
|
107
|
+
retrieved_at: datetime.datetime
|
|
108
|
+
formats: "ScrapeFormats"
|
|
109
|
+
metadata: "ScrapeMetadata"
|
|
110
|
+
tables: Union[Unset, list["ScrapeTable"]] = UNSET
|
|
111
|
+
warnings: Union[Unset, list["ScrapeWarning"]] = UNSET
|
|
112
|
+
stats: Union[Unset, "ScrapeStats"] = UNSET
|
|
113
|
+
markdown_tokens: Union[Unset, "ScrapeMarkdownTokens"] = UNSET
|
|
114
|
+
billing_multiplier: Union[Unset, float] = UNSET
|
|
115
|
+
billed_bytes: Union[Unset, int] = UNSET
|
|
116
|
+
custom: Union[Unset, "ScrapeSuccessEnvelopeCustom"] = UNSET
|
|
117
|
+
cache: Union[Unset, ScrapeSuccessEnvelopeCache] = UNSET
|
|
118
|
+
cache_age_s: Union[Unset, int] = UNSET
|
|
119
|
+
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
|
|
120
|
+
|
|
121
|
+
def to_dict(self) -> dict[str, Any]:
|
|
122
|
+
schema_version = self.schema_version.value
|
|
123
|
+
|
|
124
|
+
status = self.status.value
|
|
125
|
+
|
|
126
|
+
id = self.id
|
|
127
|
+
|
|
128
|
+
url = self.url
|
|
129
|
+
|
|
130
|
+
final_url = self.final_url
|
|
131
|
+
|
|
132
|
+
content_type = self.content_type
|
|
133
|
+
|
|
134
|
+
content_length = self.content_length
|
|
135
|
+
|
|
136
|
+
status_code: Union[None, int]
|
|
137
|
+
status_code = self.status_code
|
|
138
|
+
|
|
139
|
+
retrieved_at = self.retrieved_at.isoformat()
|
|
140
|
+
|
|
141
|
+
formats = self.formats.to_dict()
|
|
142
|
+
|
|
143
|
+
metadata = self.metadata.to_dict()
|
|
144
|
+
|
|
145
|
+
tables: Union[Unset, list[dict[str, Any]]] = UNSET
|
|
146
|
+
if not isinstance(self.tables, Unset):
|
|
147
|
+
tables = []
|
|
148
|
+
for tables_item_data in self.tables:
|
|
149
|
+
tables_item = tables_item_data.to_dict()
|
|
150
|
+
tables.append(tables_item)
|
|
151
|
+
|
|
152
|
+
warnings: Union[Unset, list[dict[str, Any]]] = UNSET
|
|
153
|
+
if not isinstance(self.warnings, Unset):
|
|
154
|
+
warnings = []
|
|
155
|
+
for warnings_item_data in self.warnings:
|
|
156
|
+
warnings_item = warnings_item_data.to_dict()
|
|
157
|
+
warnings.append(warnings_item)
|
|
158
|
+
|
|
159
|
+
stats: Union[Unset, dict[str, Any]] = UNSET
|
|
160
|
+
if not isinstance(self.stats, Unset):
|
|
161
|
+
stats = self.stats.to_dict()
|
|
162
|
+
|
|
163
|
+
markdown_tokens: Union[Unset, dict[str, Any]] = UNSET
|
|
164
|
+
if not isinstance(self.markdown_tokens, Unset):
|
|
165
|
+
markdown_tokens = self.markdown_tokens.to_dict()
|
|
166
|
+
|
|
167
|
+
billing_multiplier = self.billing_multiplier
|
|
168
|
+
|
|
169
|
+
billed_bytes = self.billed_bytes
|
|
170
|
+
|
|
171
|
+
custom: Union[Unset, dict[str, Any]] = UNSET
|
|
172
|
+
if not isinstance(self.custom, Unset):
|
|
173
|
+
custom = self.custom.to_dict()
|
|
174
|
+
|
|
175
|
+
cache: Union[Unset, str] = UNSET
|
|
176
|
+
if not isinstance(self.cache, Unset):
|
|
177
|
+
cache = self.cache.value
|
|
178
|
+
|
|
179
|
+
cache_age_s = self.cache_age_s
|
|
180
|
+
|
|
181
|
+
field_dict: dict[str, Any] = {}
|
|
182
|
+
field_dict.update(self.additional_properties)
|
|
183
|
+
field_dict.update(
|
|
184
|
+
{
|
|
185
|
+
"schema_version": schema_version,
|
|
186
|
+
"status": status,
|
|
187
|
+
"id": id,
|
|
188
|
+
"url": url,
|
|
189
|
+
"final_url": final_url,
|
|
190
|
+
"content_type": content_type,
|
|
191
|
+
"content_length": content_length,
|
|
192
|
+
"status_code": status_code,
|
|
193
|
+
"retrieved_at": retrieved_at,
|
|
194
|
+
"formats": formats,
|
|
195
|
+
"metadata": metadata,
|
|
196
|
+
}
|
|
197
|
+
)
|
|
198
|
+
if tables is not UNSET:
|
|
199
|
+
field_dict["tables"] = tables
|
|
200
|
+
if warnings is not UNSET:
|
|
201
|
+
field_dict["warnings"] = warnings
|
|
202
|
+
if stats is not UNSET:
|
|
203
|
+
field_dict["stats"] = stats
|
|
204
|
+
if markdown_tokens is not UNSET:
|
|
205
|
+
field_dict["markdown_tokens"] = markdown_tokens
|
|
206
|
+
if billing_multiplier is not UNSET:
|
|
207
|
+
field_dict["billing_multiplier"] = billing_multiplier
|
|
208
|
+
if billed_bytes is not UNSET:
|
|
209
|
+
field_dict["billed_bytes"] = billed_bytes
|
|
210
|
+
if custom is not UNSET:
|
|
211
|
+
field_dict["custom"] = custom
|
|
212
|
+
if cache is not UNSET:
|
|
213
|
+
field_dict["cache"] = cache
|
|
214
|
+
if cache_age_s is not UNSET:
|
|
215
|
+
field_dict["cache_age_s"] = cache_age_s
|
|
216
|
+
|
|
217
|
+
return field_dict
|
|
218
|
+
|
|
219
|
+
@classmethod
|
|
220
|
+
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
|
|
221
|
+
from ..models.scrape_formats import ScrapeFormats
|
|
222
|
+
from ..models.scrape_markdown_tokens import ScrapeMarkdownTokens
|
|
223
|
+
from ..models.scrape_metadata import ScrapeMetadata
|
|
224
|
+
from ..models.scrape_stats import ScrapeStats
|
|
225
|
+
from ..models.scrape_success_envelope_custom import ScrapeSuccessEnvelopeCustom
|
|
226
|
+
from ..models.scrape_table import ScrapeTable
|
|
227
|
+
from ..models.scrape_warning import ScrapeWarning
|
|
228
|
+
|
|
229
|
+
d = dict(src_dict)
|
|
230
|
+
schema_version = ScrapeSuccessEnvelopeSchemaVersion(d.pop("schema_version"))
|
|
231
|
+
|
|
232
|
+
status = ScrapeSuccessEnvelopeStatus(d.pop("status"))
|
|
233
|
+
|
|
234
|
+
id = d.pop("id")
|
|
235
|
+
|
|
236
|
+
url = d.pop("url")
|
|
237
|
+
|
|
238
|
+
final_url = d.pop("final_url")
|
|
239
|
+
|
|
240
|
+
content_type = d.pop("content_type")
|
|
241
|
+
|
|
242
|
+
content_length = d.pop("content_length")
|
|
243
|
+
|
|
244
|
+
def _parse_status_code(data: object) -> Union[None, int]:
|
|
245
|
+
if data is None:
|
|
246
|
+
return data
|
|
247
|
+
return cast(Union[None, int], data)
|
|
248
|
+
|
|
249
|
+
status_code = _parse_status_code(d.pop("status_code"))
|
|
250
|
+
|
|
251
|
+
retrieved_at = isoparse(d.pop("retrieved_at"))
|
|
252
|
+
|
|
253
|
+
formats = ScrapeFormats.from_dict(d.pop("formats"))
|
|
254
|
+
|
|
255
|
+
metadata = ScrapeMetadata.from_dict(d.pop("metadata"))
|
|
256
|
+
|
|
257
|
+
tables = []
|
|
258
|
+
_tables = d.pop("tables", UNSET)
|
|
259
|
+
for tables_item_data in _tables or []:
|
|
260
|
+
tables_item = ScrapeTable.from_dict(tables_item_data)
|
|
261
|
+
|
|
262
|
+
tables.append(tables_item)
|
|
263
|
+
|
|
264
|
+
warnings = []
|
|
265
|
+
_warnings = d.pop("warnings", UNSET)
|
|
266
|
+
for warnings_item_data in _warnings or []:
|
|
267
|
+
warnings_item = ScrapeWarning.from_dict(warnings_item_data)
|
|
268
|
+
|
|
269
|
+
warnings.append(warnings_item)
|
|
270
|
+
|
|
271
|
+
_stats = d.pop("stats", UNSET)
|
|
272
|
+
stats: Union[Unset, ScrapeStats]
|
|
273
|
+
if isinstance(_stats, Unset):
|
|
274
|
+
stats = UNSET
|
|
275
|
+
else:
|
|
276
|
+
stats = ScrapeStats.from_dict(_stats)
|
|
277
|
+
|
|
278
|
+
_markdown_tokens = d.pop("markdown_tokens", UNSET)
|
|
279
|
+
markdown_tokens: Union[Unset, ScrapeMarkdownTokens]
|
|
280
|
+
if isinstance(_markdown_tokens, Unset):
|
|
281
|
+
markdown_tokens = UNSET
|
|
282
|
+
else:
|
|
283
|
+
markdown_tokens = ScrapeMarkdownTokens.from_dict(_markdown_tokens)
|
|
284
|
+
|
|
285
|
+
billing_multiplier = d.pop("billing_multiplier", UNSET)
|
|
286
|
+
|
|
287
|
+
billed_bytes = d.pop("billed_bytes", UNSET)
|
|
288
|
+
|
|
289
|
+
_custom = d.pop("custom", UNSET)
|
|
290
|
+
custom: Union[Unset, ScrapeSuccessEnvelopeCustom]
|
|
291
|
+
if isinstance(_custom, Unset):
|
|
292
|
+
custom = UNSET
|
|
293
|
+
else:
|
|
294
|
+
custom = ScrapeSuccessEnvelopeCustom.from_dict(_custom)
|
|
295
|
+
|
|
296
|
+
_cache = d.pop("cache", UNSET)
|
|
297
|
+
cache: Union[Unset, ScrapeSuccessEnvelopeCache]
|
|
298
|
+
if isinstance(_cache, Unset):
|
|
299
|
+
cache = UNSET
|
|
300
|
+
else:
|
|
301
|
+
cache = ScrapeSuccessEnvelopeCache(_cache)
|
|
302
|
+
|
|
303
|
+
cache_age_s = d.pop("cache_age_s", UNSET)
|
|
304
|
+
|
|
305
|
+
scrape_success_envelope = cls(
|
|
306
|
+
schema_version=schema_version,
|
|
307
|
+
status=status,
|
|
308
|
+
id=id,
|
|
309
|
+
url=url,
|
|
310
|
+
final_url=final_url,
|
|
311
|
+
content_type=content_type,
|
|
312
|
+
content_length=content_length,
|
|
313
|
+
status_code=status_code,
|
|
314
|
+
retrieved_at=retrieved_at,
|
|
315
|
+
formats=formats,
|
|
316
|
+
metadata=metadata,
|
|
317
|
+
tables=tables,
|
|
318
|
+
warnings=warnings,
|
|
319
|
+
stats=stats,
|
|
320
|
+
markdown_tokens=markdown_tokens,
|
|
321
|
+
billing_multiplier=billing_multiplier,
|
|
322
|
+
billed_bytes=billed_bytes,
|
|
323
|
+
custom=custom,
|
|
324
|
+
cache=cache,
|
|
325
|
+
cache_age_s=cache_age_s,
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
scrape_success_envelope.additional_properties = d
|
|
329
|
+
return scrape_success_envelope
|
|
330
|
+
|
|
331
|
+
@property
|
|
332
|
+
def additional_keys(self) -> list[str]:
|
|
333
|
+
return list(self.additional_properties.keys())
|
|
334
|
+
|
|
335
|
+
def __getitem__(self, key: str) -> Any:
|
|
336
|
+
return self.additional_properties[key]
|
|
337
|
+
|
|
338
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
|
339
|
+
self.additional_properties[key] = value
|
|
340
|
+
|
|
341
|
+
def __delitem__(self, key: str) -> None:
|
|
342
|
+
del self.additional_properties[key]
|
|
343
|
+
|
|
344
|
+
def __contains__(self, key: str) -> bool:
|
|
345
|
+
return key in self.additional_properties
|
|
@@ -0,0 +1,48 @@
|
|
|
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="ScrapeSuccessEnvelopeCustom")
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@_attrs_define
|
|
11
|
+
class ScrapeSuccessEnvelopeCustom:
|
|
12
|
+
"""Custom metadata provided by the caller in the request `custom` field. Stored verbatim and round-tripped on the
|
|
13
|
+
synchronous response and webhook delivery. Not included in `GET /v1/scrape/:id`, bulk results, or cached hits.
|
|
14
|
+
Omitted when no custom metadata was provided.
|
|
15
|
+
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
|
|
19
|
+
|
|
20
|
+
def to_dict(self) -> dict[str, Any]:
|
|
21
|
+
field_dict: dict[str, Any] = {}
|
|
22
|
+
field_dict.update(self.additional_properties)
|
|
23
|
+
|
|
24
|
+
return field_dict
|
|
25
|
+
|
|
26
|
+
@classmethod
|
|
27
|
+
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
|
|
28
|
+
d = dict(src_dict)
|
|
29
|
+
scrape_success_envelope_custom = cls()
|
|
30
|
+
|
|
31
|
+
scrape_success_envelope_custom.additional_properties = d
|
|
32
|
+
return scrape_success_envelope_custom
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
def additional_keys(self) -> list[str]:
|
|
36
|
+
return list(self.additional_properties.keys())
|
|
37
|
+
|
|
38
|
+
def __getitem__(self, key: str) -> Any:
|
|
39
|
+
return self.additional_properties[key]
|
|
40
|
+
|
|
41
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
|
42
|
+
self.additional_properties[key] = value
|
|
43
|
+
|
|
44
|
+
def __delitem__(self, key: str) -> None:
|
|
45
|
+
del self.additional_properties[key]
|
|
46
|
+
|
|
47
|
+
def __contains__(self, key: str) -> bool:
|
|
48
|
+
return key in self.additional_properties
|