context.dev 2.18.0 → 2.20.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +220 -0
- data/README.md +1 -1
- data/lib/context_dev/client.rb +0 -4
- data/lib/context_dev/models/monitor_retrieve_run_params.rb +26 -0
- data/lib/context_dev/models/monitor_retrieve_run_response.rb +232 -0
- data/lib/context_dev/models/monitor_rotate_webhook_secret_params.rb +20 -0
- data/lib/context_dev/models/monitor_rotate_webhook_secret_response.rb +765 -0
- data/lib/context_dev/models/{web_web_scrape_sitemap_params.rb → web_map_urls_params.rb} +14 -14
- data/lib/context_dev/models/web_map_urls_response.rb +123 -0
- data/lib/context_dev/models/web_scrape_params.rb +1035 -0
- data/lib/context_dev/models/web_scrape_response.rb +974 -0
- data/lib/context_dev/models/web_screenshot_params.rb +15 -1
- data/lib/context_dev/models/web_screenshot_response.rb +3 -3
- data/lib/context_dev/models.rb +8 -22
- data/lib/context_dev/resources/brand.rb +0 -36
- data/lib/context_dev/resources/monitors.rb +47 -0
- data/lib/context_dev/resources/web.rb +118 -486
- data/lib/context_dev/version.rb +1 -1
- data/lib/context_dev.rb +8 -23
- data/rbi/context_dev/client.rbi +0 -3
- data/rbi/context_dev/models/monitor_retrieve_run_params.rbi +46 -0
- data/rbi/context_dev/models/monitor_retrieve_run_response.rbi +452 -0
- data/rbi/context_dev/models/monitor_rotate_webhook_secret_params.rbi +38 -0
- data/rbi/context_dev/models/monitor_rotate_webhook_secret_response.rbi +1367 -0
- data/rbi/context_dev/models/{web_web_scrape_sitemap_params.rbi → web_map_urls_params.rbi} +23 -45
- data/rbi/context_dev/models/web_map_urls_response.rbi +226 -0
- data/rbi/context_dev/models/web_scrape_params.rbi +2221 -0
- data/rbi/context_dev/models/web_scrape_response.rbi +1874 -0
- data/rbi/context_dev/models/web_screenshot_params.rbi +23 -0
- data/rbi/context_dev/models/web_screenshot_response.rbi +4 -4
- data/rbi/context_dev/models.rbi +9 -24
- data/rbi/context_dev/resources/brand.rbi +0 -35
- data/rbi/context_dev/resources/monitors.rbi +24 -0
- data/rbi/context_dev/resources/web.rbi +152 -654
- data/sig/context_dev/client.rbs +0 -2
- data/sig/context_dev/models/monitor_retrieve_run_params.rbs +28 -0
- data/sig/context_dev/models/monitor_retrieve_run_response.rbs +182 -0
- data/sig/context_dev/models/monitor_rotate_webhook_secret_params.rbs +23 -0
- data/sig/context_dev/models/monitor_rotate_webhook_secret_response.rbs +545 -0
- data/sig/context_dev/models/{web_web_scrape_sitemap_params.rbs → web_map_urls_params.rbs} +22 -22
- data/sig/context_dev/models/web_map_urls_response.rbs +125 -0
- data/sig/context_dev/models/web_scrape_params.rbs +925 -0
- data/sig/context_dev/models/web_scrape_response.rbs +782 -0
- data/sig/context_dev/models/web_screenshot_params.rbs +7 -0
- data/sig/context_dev/models.rbs +8 -22
- data/sig/context_dev/resources/brand.rbs +0 -9
- data/sig/context_dev/resources/monitors.rbs +11 -0
- data/sig/context_dev/resources/web.rbs +33 -128
- metadata +26 -71
- data/lib/context_dev/models/ai_extract_product_params.rb +0 -125
- data/lib/context_dev/models/ai_extract_product_response.rb +0 -402
- data/lib/context_dev/models/ai_extract_products_params.rb +0 -233
- data/lib/context_dev/models/ai_extract_products_response.rb +0 -370
- data/lib/context_dev/models/brand_retrieve_simplified_params.rb +0 -120
- data/lib/context_dev/models/brand_retrieve_simplified_response.rb +0 -441
- data/lib/context_dev/models/web_extract_fonts_params.rb +0 -114
- data/lib/context_dev/models/web_extract_fonts_response.rb +0 -291
- data/lib/context_dev/models/web_extract_params.rb +0 -419
- data/lib/context_dev/models/web_extract_response.rb +0 -287
- data/lib/context_dev/models/web_web_scrape_bytes_params.rb +0 -346
- data/lib/context_dev/models/web_web_scrape_bytes_response.rb +0 -135
- data/lib/context_dev/models/web_web_scrape_html_params.rb +0 -812
- data/lib/context_dev/models/web_web_scrape_html_response.rb +0 -628
- data/lib/context_dev/models/web_web_scrape_images_params.rb +0 -373
- data/lib/context_dev/models/web_web_scrape_images_response.rb +0 -409
- data/lib/context_dev/models/web_web_scrape_md_params.rb +0 -670
- data/lib/context_dev/models/web_web_scrape_md_response.rb +0 -567
- data/lib/context_dev/models/web_web_scrape_screenshot_params.rb +0 -471
- data/lib/context_dev/models/web_web_scrape_screenshot_response.rb +0 -169
- data/lib/context_dev/models/web_web_scrape_sitemap_response.rb +0 -144
- data/lib/context_dev/resources/ai.rb +0 -71
- data/rbi/context_dev/models/ai_extract_product_params.rbi +0 -253
- data/rbi/context_dev/models/ai_extract_product_response.rbi +0 -791
- data/rbi/context_dev/models/ai_extract_products_params.rbi +0 -490
- data/rbi/context_dev/models/ai_extract_products_response.rbi +0 -718
- data/rbi/context_dev/models/brand_retrieve_simplified_params.rbi +0 -256
- data/rbi/context_dev/models/brand_retrieve_simplified_response.rbi +0 -1040
- data/rbi/context_dev/models/web_extract_fonts_params.rbi +0 -223
- data/rbi/context_dev/models/web_extract_fonts_response.rbi +0 -563
- data/rbi/context_dev/models/web_extract_params.rbi +0 -781
- data/rbi/context_dev/models/web_extract_response.rbi +0 -512
- data/rbi/context_dev/models/web_web_scrape_bytes_params.rbi +0 -702
- data/rbi/context_dev/models/web_web_scrape_bytes_response.rbi +0 -238
- data/rbi/context_dev/models/web_web_scrape_html_params.rbi +0 -1690
- data/rbi/context_dev/models/web_web_scrape_html_response.rbi +0 -1287
- data/rbi/context_dev/models/web_web_scrape_images_params.rbi +0 -728
- data/rbi/context_dev/models/web_web_scrape_images_response.rbi +0 -910
- data/rbi/context_dev/models/web_web_scrape_md_params.rbi +0 -1052
- data/rbi/context_dev/models/web_web_scrape_md_response.rbi +0 -1088
- data/rbi/context_dev/models/web_web_scrape_screenshot_params.rbi +0 -1580
- data/rbi/context_dev/models/web_web_scrape_screenshot_response.rbi +0 -332
- data/rbi/context_dev/models/web_web_scrape_sitemap_response.rbi +0 -258
- data/rbi/context_dev/resources/ai.rbi +0 -63
- data/sig/context_dev/models/ai_extract_product_params.rbs +0 -106
- data/sig/context_dev/models/ai_extract_product_response.rbs +0 -314
- data/sig/context_dev/models/ai_extract_products_params.rbs +0 -202
- data/sig/context_dev/models/ai_extract_products_response.rbs +0 -293
- data/sig/context_dev/models/brand_retrieve_simplified_params.rbs +0 -104
- data/sig/context_dev/models/brand_retrieve_simplified_response.rbs +0 -413
- data/sig/context_dev/models/web_extract_fonts_params.rbs +0 -93
- data/sig/context_dev/models/web_extract_fonts_response.rbs +0 -230
- data/sig/context_dev/models/web_extract_params.rbs +0 -324
- data/sig/context_dev/models/web_extract_response.rbs +0 -239
- data/sig/context_dev/models/web_web_scrape_bytes_params.rbs +0 -531
- data/sig/context_dev/models/web_web_scrape_bytes_response.rbs +0 -108
- data/sig/context_dev/models/web_web_scrape_html_params.rbs +0 -878
- data/sig/context_dev/models/web_web_scrape_html_response.rbs +0 -525
- data/sig/context_dev/models/web_web_scrape_images_params.rbs +0 -281
- data/sig/context_dev/models/web_web_scrape_images_response.rbs +0 -371
- data/sig/context_dev/models/web_web_scrape_md_params.rbs +0 -758
- data/sig/context_dev/models/web_web_scrape_md_response.rbs +0 -465
- data/sig/context_dev/models/web_web_scrape_screenshot_params.rbs +0 -619
- data/sig/context_dev/models/web_web_scrape_screenshot_response.rbs +0 -127
- data/sig/context_dev/models/web_web_scrape_sitemap_response.rbs +0 -117
- data/sig/context_dev/resources/ai.rbs +0 -21
|
@@ -0,0 +1,1874 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module ContextDev
|
|
4
|
+
module Models
|
|
5
|
+
class WebScrapeResponse < ContextDev::Internal::Type::BaseModel
|
|
6
|
+
OrHash =
|
|
7
|
+
T.type_alias do
|
|
8
|
+
T.any(
|
|
9
|
+
ContextDev::Models::WebScrapeResponse,
|
|
10
|
+
ContextDev::Internal::AnyHash
|
|
11
|
+
)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Original HTTP response body. Waiting, actions, and content filters never change
|
|
15
|
+
# it.
|
|
16
|
+
sig { returns(ContextDev::Models::WebScrapeResponse::Bytes) }
|
|
17
|
+
attr_reader :bytes
|
|
18
|
+
|
|
19
|
+
sig do
|
|
20
|
+
params(bytes: ContextDev::Models::WebScrapeResponse::Bytes::OrHash).void
|
|
21
|
+
end
|
|
22
|
+
attr_writer :bytes
|
|
23
|
+
|
|
24
|
+
# Cache outcome for this response. Composite responses are hits only when every
|
|
25
|
+
# cache-controlled fetch contributing to the output was a hit; age_ms is the
|
|
26
|
+
# oldest contributing hit.
|
|
27
|
+
sig { returns(ContextDev::Models::WebScrapeResponse::CacheMetadata) }
|
|
28
|
+
attr_reader :cache_metadata
|
|
29
|
+
|
|
30
|
+
sig do
|
|
31
|
+
params(
|
|
32
|
+
cache_metadata:
|
|
33
|
+
ContextDev::Models::WebScrapeResponse::CacheMetadata::OrHash
|
|
34
|
+
).void
|
|
35
|
+
end
|
|
36
|
+
attr_writer :cache_metadata
|
|
37
|
+
|
|
38
|
+
# Plain-text passages relevant to highlightsParams.query, in page order, each
|
|
39
|
+
# prefixed with its section heading in square brackets. Empty when the page has no
|
|
40
|
+
# text.
|
|
41
|
+
sig { returns(ContextDev::Models::WebScrapeResponse::Highlights) }
|
|
42
|
+
attr_reader :highlights
|
|
43
|
+
|
|
44
|
+
sig do
|
|
45
|
+
params(
|
|
46
|
+
highlights: ContextDev::Models::WebScrapeResponse::Highlights::OrHash
|
|
47
|
+
).void
|
|
48
|
+
end
|
|
49
|
+
attr_writer :highlights
|
|
50
|
+
|
|
51
|
+
# Rendered HTML after content filters.
|
|
52
|
+
sig { returns(ContextDev::Models::WebScrapeResponse::HTML) }
|
|
53
|
+
attr_reader :html
|
|
54
|
+
|
|
55
|
+
sig do
|
|
56
|
+
params(html: ContextDev::Models::WebScrapeResponse::HTML::OrHash).void
|
|
57
|
+
end
|
|
58
|
+
attr_writer :html
|
|
59
|
+
|
|
60
|
+
# Images after content filters. Empty when none are found.
|
|
61
|
+
sig { returns(ContextDev::Models::WebScrapeResponse::Images) }
|
|
62
|
+
attr_reader :images
|
|
63
|
+
|
|
64
|
+
sig do
|
|
65
|
+
params(
|
|
66
|
+
images: ContextDev::Models::WebScrapeResponse::Images::OrHash
|
|
67
|
+
).void
|
|
68
|
+
end
|
|
69
|
+
attr_writer :images
|
|
70
|
+
|
|
71
|
+
# Page data extracted into jsonParams.schema, after shared content filters. Values
|
|
72
|
+
# are grounded in the page; optional fields the page does not state are omitted,
|
|
73
|
+
# or null when their type allows null. An empty object when the filters leave no
|
|
74
|
+
# text.
|
|
75
|
+
sig { returns(ContextDev::Models::WebScrapeResponse::Json) }
|
|
76
|
+
attr_reader :json
|
|
77
|
+
|
|
78
|
+
sig do
|
|
79
|
+
params(json: ContextDev::Models::WebScrapeResponse::Json::OrHash).void
|
|
80
|
+
end
|
|
81
|
+
attr_writer :json
|
|
82
|
+
|
|
83
|
+
# Markdown after content filters.
|
|
84
|
+
sig { returns(ContextDev::Models::WebScrapeResponse::Markdown) }
|
|
85
|
+
attr_reader :markdown
|
|
86
|
+
|
|
87
|
+
sig do
|
|
88
|
+
params(
|
|
89
|
+
markdown: ContextDev::Models::WebScrapeResponse::Markdown::OrHash
|
|
90
|
+
).void
|
|
91
|
+
end
|
|
92
|
+
attr_writer :markdown
|
|
93
|
+
|
|
94
|
+
# Page details, when available.
|
|
95
|
+
sig { returns(ContextDev::Models::WebScrapeResponse::Metadata) }
|
|
96
|
+
attr_reader :metadata
|
|
97
|
+
|
|
98
|
+
sig do
|
|
99
|
+
params(
|
|
100
|
+
metadata: ContextDev::Models::WebScrapeResponse::Metadata::OrHash
|
|
101
|
+
).void
|
|
102
|
+
end
|
|
103
|
+
attr_writer :metadata
|
|
104
|
+
|
|
105
|
+
# Fields produced by parseParams.rules, after shared content filters.
|
|
106
|
+
sig { returns(ContextDev::Models::WebScrapeResponse::Parsed) }
|
|
107
|
+
attr_reader :parsed
|
|
108
|
+
|
|
109
|
+
sig do
|
|
110
|
+
params(
|
|
111
|
+
parsed: ContextDev::Models::WebScrapeResponse::Parsed::OrHash
|
|
112
|
+
).void
|
|
113
|
+
end
|
|
114
|
+
attr_writer :parsed
|
|
115
|
+
|
|
116
|
+
# Product detail page classification and the extracted product.
|
|
117
|
+
sig { returns(ContextDev::Models::WebScrapeResponse::Product) }
|
|
118
|
+
attr_reader :product
|
|
119
|
+
|
|
120
|
+
sig do
|
|
121
|
+
params(
|
|
122
|
+
product: ContextDev::Models::WebScrapeResponse::Product::OrHash
|
|
123
|
+
).void
|
|
124
|
+
end
|
|
125
|
+
attr_writer :product
|
|
126
|
+
|
|
127
|
+
# Unique id of this API call, also sent in the X-Request-Id response header. Quote
|
|
128
|
+
# it when contacting support about a failed request.
|
|
129
|
+
sig { returns(String) }
|
|
130
|
+
attr_accessor :request_id
|
|
131
|
+
|
|
132
|
+
# An image data URL. Use directly as an image src.
|
|
133
|
+
sig { returns(ContextDev::Models::WebScrapeResponse::Screenshot) }
|
|
134
|
+
attr_reader :screenshot
|
|
135
|
+
|
|
136
|
+
sig do
|
|
137
|
+
params(
|
|
138
|
+
screenshot: ContextDev::Models::WebScrapeResponse::Screenshot::OrHash
|
|
139
|
+
).void
|
|
140
|
+
end
|
|
141
|
+
attr_writer :screenshot
|
|
142
|
+
|
|
143
|
+
# Final URL after redirects and browser actions.
|
|
144
|
+
sig { returns(String) }
|
|
145
|
+
attr_accessor :url
|
|
146
|
+
|
|
147
|
+
# Present when return-partial captures a page that is still loading, returns
|
|
148
|
+
# images before image processing finishes, or cuts product AI extraction short.
|
|
149
|
+
# Also present if the optional product AI fallback fails. Partial responses are
|
|
150
|
+
# not cached.
|
|
151
|
+
sig do
|
|
152
|
+
returns(
|
|
153
|
+
T.nilable(
|
|
154
|
+
ContextDev::Models::WebScrapeResponse::IsPartial::TaggedBoolean
|
|
155
|
+
)
|
|
156
|
+
)
|
|
157
|
+
end
|
|
158
|
+
attr_reader :is_partial
|
|
159
|
+
|
|
160
|
+
sig do
|
|
161
|
+
params(
|
|
162
|
+
is_partial:
|
|
163
|
+
ContextDev::Models::WebScrapeResponse::IsPartial::OrBoolean
|
|
164
|
+
).void
|
|
165
|
+
end
|
|
166
|
+
attr_writer :is_partial
|
|
167
|
+
|
|
168
|
+
# Credit usage, included whenever a valid API key is provided.
|
|
169
|
+
sig do
|
|
170
|
+
returns(T.nilable(ContextDev::Models::WebScrapeResponse::KeyMetadata))
|
|
171
|
+
end
|
|
172
|
+
attr_reader :key_metadata
|
|
173
|
+
|
|
174
|
+
sig do
|
|
175
|
+
params(
|
|
176
|
+
key_metadata:
|
|
177
|
+
ContextDev::Models::WebScrapeResponse::KeyMetadata::OrHash
|
|
178
|
+
).void
|
|
179
|
+
end
|
|
180
|
+
attr_writer :key_metadata
|
|
181
|
+
|
|
182
|
+
sig do
|
|
183
|
+
params(
|
|
184
|
+
bytes: ContextDev::Models::WebScrapeResponse::Bytes::OrHash,
|
|
185
|
+
cache_metadata:
|
|
186
|
+
ContextDev::Models::WebScrapeResponse::CacheMetadata::OrHash,
|
|
187
|
+
highlights: ContextDev::Models::WebScrapeResponse::Highlights::OrHash,
|
|
188
|
+
html: ContextDev::Models::WebScrapeResponse::HTML::OrHash,
|
|
189
|
+
images: ContextDev::Models::WebScrapeResponse::Images::OrHash,
|
|
190
|
+
json: ContextDev::Models::WebScrapeResponse::Json::OrHash,
|
|
191
|
+
markdown: ContextDev::Models::WebScrapeResponse::Markdown::OrHash,
|
|
192
|
+
metadata: ContextDev::Models::WebScrapeResponse::Metadata::OrHash,
|
|
193
|
+
parsed: ContextDev::Models::WebScrapeResponse::Parsed::OrHash,
|
|
194
|
+
product: ContextDev::Models::WebScrapeResponse::Product::OrHash,
|
|
195
|
+
request_id: String,
|
|
196
|
+
screenshot: ContextDev::Models::WebScrapeResponse::Screenshot::OrHash,
|
|
197
|
+
url: String,
|
|
198
|
+
is_partial:
|
|
199
|
+
ContextDev::Models::WebScrapeResponse::IsPartial::OrBoolean,
|
|
200
|
+
key_metadata:
|
|
201
|
+
ContextDev::Models::WebScrapeResponse::KeyMetadata::OrHash
|
|
202
|
+
).returns(T.attached_class)
|
|
203
|
+
end
|
|
204
|
+
def self.new(
|
|
205
|
+
# Original HTTP response body. Waiting, actions, and content filters never change
|
|
206
|
+
# it.
|
|
207
|
+
bytes:,
|
|
208
|
+
# Cache outcome for this response. Composite responses are hits only when every
|
|
209
|
+
# cache-controlled fetch contributing to the output was a hit; age_ms is the
|
|
210
|
+
# oldest contributing hit.
|
|
211
|
+
cache_metadata:,
|
|
212
|
+
# Plain-text passages relevant to highlightsParams.query, in page order, each
|
|
213
|
+
# prefixed with its section heading in square brackets. Empty when the page has no
|
|
214
|
+
# text.
|
|
215
|
+
highlights:,
|
|
216
|
+
# Rendered HTML after content filters.
|
|
217
|
+
html:,
|
|
218
|
+
# Images after content filters. Empty when none are found.
|
|
219
|
+
images:,
|
|
220
|
+
# Page data extracted into jsonParams.schema, after shared content filters. Values
|
|
221
|
+
# are grounded in the page; optional fields the page does not state are omitted,
|
|
222
|
+
# or null when their type allows null. An empty object when the filters leave no
|
|
223
|
+
# text.
|
|
224
|
+
json:,
|
|
225
|
+
# Markdown after content filters.
|
|
226
|
+
markdown:,
|
|
227
|
+
# Page details, when available.
|
|
228
|
+
metadata:,
|
|
229
|
+
# Fields produced by parseParams.rules, after shared content filters.
|
|
230
|
+
parsed:,
|
|
231
|
+
# Product detail page classification and the extracted product.
|
|
232
|
+
product:,
|
|
233
|
+
# Unique id of this API call, also sent in the X-Request-Id response header. Quote
|
|
234
|
+
# it when contacting support about a failed request.
|
|
235
|
+
request_id:,
|
|
236
|
+
# An image data URL. Use directly as an image src.
|
|
237
|
+
screenshot:,
|
|
238
|
+
# Final URL after redirects and browser actions.
|
|
239
|
+
url:,
|
|
240
|
+
# Present when return-partial captures a page that is still loading, returns
|
|
241
|
+
# images before image processing finishes, or cuts product AI extraction short.
|
|
242
|
+
# Also present if the optional product AI fallback fails. Partial responses are
|
|
243
|
+
# not cached.
|
|
244
|
+
is_partial: nil,
|
|
245
|
+
# Credit usage, included whenever a valid API key is provided.
|
|
246
|
+
key_metadata: nil
|
|
247
|
+
)
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
sig do
|
|
251
|
+
override.returns(
|
|
252
|
+
{
|
|
253
|
+
bytes: ContextDev::Models::WebScrapeResponse::Bytes,
|
|
254
|
+
cache_metadata:
|
|
255
|
+
ContextDev::Models::WebScrapeResponse::CacheMetadata,
|
|
256
|
+
highlights: ContextDev::Models::WebScrapeResponse::Highlights,
|
|
257
|
+
html: ContextDev::Models::WebScrapeResponse::HTML,
|
|
258
|
+
images: ContextDev::Models::WebScrapeResponse::Images,
|
|
259
|
+
json: ContextDev::Models::WebScrapeResponse::Json,
|
|
260
|
+
markdown: ContextDev::Models::WebScrapeResponse::Markdown,
|
|
261
|
+
metadata: ContextDev::Models::WebScrapeResponse::Metadata,
|
|
262
|
+
parsed: ContextDev::Models::WebScrapeResponse::Parsed,
|
|
263
|
+
product: ContextDev::Models::WebScrapeResponse::Product,
|
|
264
|
+
request_id: String,
|
|
265
|
+
screenshot: ContextDev::Models::WebScrapeResponse::Screenshot,
|
|
266
|
+
url: String,
|
|
267
|
+
is_partial:
|
|
268
|
+
ContextDev::Models::WebScrapeResponse::IsPartial::TaggedBoolean,
|
|
269
|
+
key_metadata: ContextDev::Models::WebScrapeResponse::KeyMetadata
|
|
270
|
+
}
|
|
271
|
+
)
|
|
272
|
+
end
|
|
273
|
+
def to_hash
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
class Bytes < ContextDev::Internal::Type::BaseModel
|
|
277
|
+
OrHash =
|
|
278
|
+
T.type_alias do
|
|
279
|
+
T.any(
|
|
280
|
+
ContextDev::Models::WebScrapeResponse::Bytes,
|
|
281
|
+
ContextDev::Internal::AnyHash
|
|
282
|
+
)
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
sig do
|
|
286
|
+
returns(T.nilable(ContextDev::Models::WebScrapeResponse::Bytes::Data))
|
|
287
|
+
end
|
|
288
|
+
attr_reader :data
|
|
289
|
+
|
|
290
|
+
sig do
|
|
291
|
+
params(
|
|
292
|
+
data:
|
|
293
|
+
T.nilable(
|
|
294
|
+
ContextDev::Models::WebScrapeResponse::Bytes::Data::OrHash
|
|
295
|
+
)
|
|
296
|
+
).void
|
|
297
|
+
end
|
|
298
|
+
attr_writer :data
|
|
299
|
+
|
|
300
|
+
sig { returns(T::Boolean) }
|
|
301
|
+
attr_accessor :requested
|
|
302
|
+
|
|
303
|
+
# Original HTTP response body. Waiting, actions, and content filters never change
|
|
304
|
+
# it.
|
|
305
|
+
sig do
|
|
306
|
+
params(
|
|
307
|
+
data:
|
|
308
|
+
T.nilable(
|
|
309
|
+
ContextDev::Models::WebScrapeResponse::Bytes::Data::OrHash
|
|
310
|
+
),
|
|
311
|
+
requested: T::Boolean
|
|
312
|
+
).returns(T.attached_class)
|
|
313
|
+
end
|
|
314
|
+
def self.new(data:, requested:)
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
sig do
|
|
318
|
+
override.returns(
|
|
319
|
+
{
|
|
320
|
+
data:
|
|
321
|
+
T.nilable(ContextDev::Models::WebScrapeResponse::Bytes::Data),
|
|
322
|
+
requested: T::Boolean
|
|
323
|
+
}
|
|
324
|
+
)
|
|
325
|
+
end
|
|
326
|
+
def to_hash
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
class Data < ContextDev::Internal::Type::BaseModel
|
|
330
|
+
OrHash =
|
|
331
|
+
T.type_alias do
|
|
332
|
+
T.any(
|
|
333
|
+
ContextDev::Models::WebScrapeResponse::Bytes::Data,
|
|
334
|
+
ContextDev::Internal::AnyHash
|
|
335
|
+
)
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
# Original response body as base64, after HTTP decompression. Maximum decoded
|
|
339
|
+
# size: 20 MiB.
|
|
340
|
+
sig { returns(String) }
|
|
341
|
+
attr_accessor :base64
|
|
342
|
+
|
|
343
|
+
sig { returns(String) }
|
|
344
|
+
attr_accessor :content_type
|
|
345
|
+
|
|
346
|
+
sig do
|
|
347
|
+
params(base64: String, content_type: String).returns(
|
|
348
|
+
T.attached_class
|
|
349
|
+
)
|
|
350
|
+
end
|
|
351
|
+
def self.new(
|
|
352
|
+
# Original response body as base64, after HTTP decompression. Maximum decoded
|
|
353
|
+
# size: 20 MiB.
|
|
354
|
+
base64:,
|
|
355
|
+
content_type:
|
|
356
|
+
)
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
sig { override.returns({ base64: String, content_type: String }) }
|
|
360
|
+
def to_hash
|
|
361
|
+
end
|
|
362
|
+
end
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
class CacheMetadata < ContextDev::Internal::Type::BaseModel
|
|
366
|
+
OrHash =
|
|
367
|
+
T.type_alias do
|
|
368
|
+
T.any(
|
|
369
|
+
ContextDev::Models::WebScrapeResponse::CacheMetadata,
|
|
370
|
+
ContextDev::Internal::AnyHash
|
|
371
|
+
)
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
# Age of the cached data in milliseconds. Zero for miss and zdr responses.
|
|
375
|
+
sig { returns(Integer) }
|
|
376
|
+
attr_accessor :age_ms
|
|
377
|
+
|
|
378
|
+
# Whether the response was served from cache, required fresh work, or honored
|
|
379
|
+
# zero-data-retention cache bypass.
|
|
380
|
+
sig do
|
|
381
|
+
returns(
|
|
382
|
+
ContextDev::Models::WebScrapeResponse::CacheMetadata::Status::TaggedSymbol
|
|
383
|
+
)
|
|
384
|
+
end
|
|
385
|
+
attr_accessor :status
|
|
386
|
+
|
|
387
|
+
# Cache outcome for this response. Composite responses are hits only when every
|
|
388
|
+
# cache-controlled fetch contributing to the output was a hit; age_ms is the
|
|
389
|
+
# oldest contributing hit.
|
|
390
|
+
sig do
|
|
391
|
+
params(
|
|
392
|
+
age_ms: Integer,
|
|
393
|
+
status:
|
|
394
|
+
ContextDev::Models::WebScrapeResponse::CacheMetadata::Status::OrSymbol
|
|
395
|
+
).returns(T.attached_class)
|
|
396
|
+
end
|
|
397
|
+
def self.new(
|
|
398
|
+
# Age of the cached data in milliseconds. Zero for miss and zdr responses.
|
|
399
|
+
age_ms:,
|
|
400
|
+
# Whether the response was served from cache, required fresh work, or honored
|
|
401
|
+
# zero-data-retention cache bypass.
|
|
402
|
+
status:
|
|
403
|
+
)
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
sig do
|
|
407
|
+
override.returns(
|
|
408
|
+
{
|
|
409
|
+
age_ms: Integer,
|
|
410
|
+
status:
|
|
411
|
+
ContextDev::Models::WebScrapeResponse::CacheMetadata::Status::TaggedSymbol
|
|
412
|
+
}
|
|
413
|
+
)
|
|
414
|
+
end
|
|
415
|
+
def to_hash
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
# Whether the response was served from cache, required fresh work, or honored
|
|
419
|
+
# zero-data-retention cache bypass.
|
|
420
|
+
module Status
|
|
421
|
+
extend ContextDev::Internal::Type::Enum
|
|
422
|
+
|
|
423
|
+
TaggedSymbol =
|
|
424
|
+
T.type_alias do
|
|
425
|
+
T.all(
|
|
426
|
+
Symbol,
|
|
427
|
+
ContextDev::Models::WebScrapeResponse::CacheMetadata::Status
|
|
428
|
+
)
|
|
429
|
+
end
|
|
430
|
+
OrSymbol = T.type_alias { T.any(Symbol, String) }
|
|
431
|
+
|
|
432
|
+
HIT =
|
|
433
|
+
T.let(
|
|
434
|
+
:hit,
|
|
435
|
+
ContextDev::Models::WebScrapeResponse::CacheMetadata::Status::TaggedSymbol
|
|
436
|
+
)
|
|
437
|
+
MISS =
|
|
438
|
+
T.let(
|
|
439
|
+
:miss,
|
|
440
|
+
ContextDev::Models::WebScrapeResponse::CacheMetadata::Status::TaggedSymbol
|
|
441
|
+
)
|
|
442
|
+
ZDR =
|
|
443
|
+
T.let(
|
|
444
|
+
:zdr,
|
|
445
|
+
ContextDev::Models::WebScrapeResponse::CacheMetadata::Status::TaggedSymbol
|
|
446
|
+
)
|
|
447
|
+
|
|
448
|
+
sig do
|
|
449
|
+
override.returns(
|
|
450
|
+
T::Array[
|
|
451
|
+
ContextDev::Models::WebScrapeResponse::CacheMetadata::Status::TaggedSymbol
|
|
452
|
+
]
|
|
453
|
+
)
|
|
454
|
+
end
|
|
455
|
+
def self.values
|
|
456
|
+
end
|
|
457
|
+
end
|
|
458
|
+
end
|
|
459
|
+
|
|
460
|
+
class Highlights < ContextDev::Internal::Type::BaseModel
|
|
461
|
+
OrHash =
|
|
462
|
+
T.type_alias do
|
|
463
|
+
T.any(
|
|
464
|
+
ContextDev::Models::WebScrapeResponse::Highlights,
|
|
465
|
+
ContextDev::Internal::AnyHash
|
|
466
|
+
)
|
|
467
|
+
end
|
|
468
|
+
|
|
469
|
+
sig { returns(T.nilable(T::Array[String])) }
|
|
470
|
+
attr_accessor :data
|
|
471
|
+
|
|
472
|
+
sig { returns(T::Boolean) }
|
|
473
|
+
attr_accessor :requested
|
|
474
|
+
|
|
475
|
+
# Plain-text passages relevant to highlightsParams.query, in page order, each
|
|
476
|
+
# prefixed with its section heading in square brackets. Empty when the page has no
|
|
477
|
+
# text.
|
|
478
|
+
sig do
|
|
479
|
+
params(
|
|
480
|
+
data: T.nilable(T::Array[String]),
|
|
481
|
+
requested: T::Boolean
|
|
482
|
+
).returns(T.attached_class)
|
|
483
|
+
end
|
|
484
|
+
def self.new(data:, requested:)
|
|
485
|
+
end
|
|
486
|
+
|
|
487
|
+
sig do
|
|
488
|
+
override.returns(
|
|
489
|
+
{ data: T.nilable(T::Array[String]), requested: T::Boolean }
|
|
490
|
+
)
|
|
491
|
+
end
|
|
492
|
+
def to_hash
|
|
493
|
+
end
|
|
494
|
+
end
|
|
495
|
+
|
|
496
|
+
class HTML < ContextDev::Internal::Type::BaseModel
|
|
497
|
+
OrHash =
|
|
498
|
+
T.type_alias do
|
|
499
|
+
T.any(
|
|
500
|
+
ContextDev::Models::WebScrapeResponse::HTML,
|
|
501
|
+
ContextDev::Internal::AnyHash
|
|
502
|
+
)
|
|
503
|
+
end
|
|
504
|
+
|
|
505
|
+
sig { returns(T.nilable(String)) }
|
|
506
|
+
attr_accessor :data
|
|
507
|
+
|
|
508
|
+
sig { returns(T::Boolean) }
|
|
509
|
+
attr_accessor :requested
|
|
510
|
+
|
|
511
|
+
# Rendered HTML after content filters.
|
|
512
|
+
sig do
|
|
513
|
+
params(data: T.nilable(String), requested: T::Boolean).returns(
|
|
514
|
+
T.attached_class
|
|
515
|
+
)
|
|
516
|
+
end
|
|
517
|
+
def self.new(data:, requested:)
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
sig do
|
|
521
|
+
override.returns({ data: T.nilable(String), requested: T::Boolean })
|
|
522
|
+
end
|
|
523
|
+
def to_hash
|
|
524
|
+
end
|
|
525
|
+
end
|
|
526
|
+
|
|
527
|
+
class Images < ContextDev::Internal::Type::BaseModel
|
|
528
|
+
OrHash =
|
|
529
|
+
T.type_alias do
|
|
530
|
+
T.any(
|
|
531
|
+
ContextDev::Models::WebScrapeResponse::Images,
|
|
532
|
+
ContextDev::Internal::AnyHash
|
|
533
|
+
)
|
|
534
|
+
end
|
|
535
|
+
|
|
536
|
+
sig do
|
|
537
|
+
returns(
|
|
538
|
+
T.nilable(
|
|
539
|
+
T::Array[ContextDev::Models::WebScrapeResponse::Images::Data]
|
|
540
|
+
)
|
|
541
|
+
)
|
|
542
|
+
end
|
|
543
|
+
attr_accessor :data
|
|
544
|
+
|
|
545
|
+
sig { returns(T::Boolean) }
|
|
546
|
+
attr_accessor :requested
|
|
547
|
+
|
|
548
|
+
# Images after content filters. Empty when none are found.
|
|
549
|
+
sig do
|
|
550
|
+
params(
|
|
551
|
+
data:
|
|
552
|
+
T.nilable(
|
|
553
|
+
T::Array[
|
|
554
|
+
ContextDev::Models::WebScrapeResponse::Images::Data::OrHash
|
|
555
|
+
]
|
|
556
|
+
),
|
|
557
|
+
requested: T::Boolean
|
|
558
|
+
).returns(T.attached_class)
|
|
559
|
+
end
|
|
560
|
+
def self.new(data:, requested:)
|
|
561
|
+
end
|
|
562
|
+
|
|
563
|
+
sig do
|
|
564
|
+
override.returns(
|
|
565
|
+
{
|
|
566
|
+
data:
|
|
567
|
+
T.nilable(
|
|
568
|
+
T::Array[ContextDev::Models::WebScrapeResponse::Images::Data]
|
|
569
|
+
),
|
|
570
|
+
requested: T::Boolean
|
|
571
|
+
}
|
|
572
|
+
)
|
|
573
|
+
end
|
|
574
|
+
def to_hash
|
|
575
|
+
end
|
|
576
|
+
|
|
577
|
+
class Data < ContextDev::Internal::Type::BaseModel
|
|
578
|
+
OrHash =
|
|
579
|
+
T.type_alias do
|
|
580
|
+
T.any(
|
|
581
|
+
ContextDev::Models::WebScrapeResponse::Images::Data,
|
|
582
|
+
ContextDev::Internal::AnyHash
|
|
583
|
+
)
|
|
584
|
+
end
|
|
585
|
+
|
|
586
|
+
# Alt text, if present.
|
|
587
|
+
sig { returns(T.nilable(String)) }
|
|
588
|
+
attr_accessor :alt
|
|
589
|
+
|
|
590
|
+
# Image URL, or a data URI for inline images.
|
|
591
|
+
sig { returns(String) }
|
|
592
|
+
attr_accessor :url
|
|
593
|
+
|
|
594
|
+
sig do
|
|
595
|
+
returns(
|
|
596
|
+
T.nilable(
|
|
597
|
+
ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
|
|
598
|
+
)
|
|
599
|
+
)
|
|
600
|
+
end
|
|
601
|
+
attr_reader :classification
|
|
602
|
+
|
|
603
|
+
sig do
|
|
604
|
+
params(
|
|
605
|
+
classification:
|
|
606
|
+
ContextDev::Models::WebScrapeResponse::Images::Data::Classification::OrSymbol
|
|
607
|
+
).void
|
|
608
|
+
end
|
|
609
|
+
attr_writer :classification
|
|
610
|
+
|
|
611
|
+
# Hosted copy when file enrichment is requested and zdr is disabled. Valid for 24
|
|
612
|
+
# hours from the original capture.
|
|
613
|
+
sig { returns(T.nilable(String)) }
|
|
614
|
+
attr_reader :file_url
|
|
615
|
+
|
|
616
|
+
sig { params(file_url: String).void }
|
|
617
|
+
attr_writer :file_url
|
|
618
|
+
|
|
619
|
+
sig { returns(T.nilable(Integer)) }
|
|
620
|
+
attr_reader :height
|
|
621
|
+
|
|
622
|
+
sig { params(height: Integer).void }
|
|
623
|
+
attr_writer :height
|
|
624
|
+
|
|
625
|
+
sig { returns(T.nilable(Integer)) }
|
|
626
|
+
attr_reader :width
|
|
627
|
+
|
|
628
|
+
sig { params(width: Integer).void }
|
|
629
|
+
attr_writer :width
|
|
630
|
+
|
|
631
|
+
sig do
|
|
632
|
+
params(
|
|
633
|
+
alt: T.nilable(String),
|
|
634
|
+
url: String,
|
|
635
|
+
classification:
|
|
636
|
+
ContextDev::Models::WebScrapeResponse::Images::Data::Classification::OrSymbol,
|
|
637
|
+
file_url: String,
|
|
638
|
+
height: Integer,
|
|
639
|
+
width: Integer
|
|
640
|
+
).returns(T.attached_class)
|
|
641
|
+
end
|
|
642
|
+
def self.new(
|
|
643
|
+
# Alt text, if present.
|
|
644
|
+
alt:,
|
|
645
|
+
# Image URL, or a data URI for inline images.
|
|
646
|
+
url:,
|
|
647
|
+
classification: nil,
|
|
648
|
+
# Hosted copy when file enrichment is requested and zdr is disabled. Valid for 24
|
|
649
|
+
# hours from the original capture.
|
|
650
|
+
file_url: nil,
|
|
651
|
+
height: nil,
|
|
652
|
+
width: nil
|
|
653
|
+
)
|
|
654
|
+
end
|
|
655
|
+
|
|
656
|
+
sig do
|
|
657
|
+
override.returns(
|
|
658
|
+
{
|
|
659
|
+
alt: T.nilable(String),
|
|
660
|
+
url: String,
|
|
661
|
+
classification:
|
|
662
|
+
ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol,
|
|
663
|
+
file_url: String,
|
|
664
|
+
height: Integer,
|
|
665
|
+
width: Integer
|
|
666
|
+
}
|
|
667
|
+
)
|
|
668
|
+
end
|
|
669
|
+
def to_hash
|
|
670
|
+
end
|
|
671
|
+
|
|
672
|
+
module Classification
|
|
673
|
+
extend ContextDev::Internal::Type::Enum
|
|
674
|
+
|
|
675
|
+
TaggedSymbol =
|
|
676
|
+
T.type_alias do
|
|
677
|
+
T.all(
|
|
678
|
+
Symbol,
|
|
679
|
+
ContextDev::Models::WebScrapeResponse::Images::Data::Classification
|
|
680
|
+
)
|
|
681
|
+
end
|
|
682
|
+
OrSymbol = T.type_alias { T.any(Symbol, String) }
|
|
683
|
+
|
|
684
|
+
PHOTOGRAPHY =
|
|
685
|
+
T.let(
|
|
686
|
+
:photography,
|
|
687
|
+
ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
|
|
688
|
+
)
|
|
689
|
+
ILLUSTRATION =
|
|
690
|
+
T.let(
|
|
691
|
+
:illustration,
|
|
692
|
+
ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
|
|
693
|
+
)
|
|
694
|
+
LOGO =
|
|
695
|
+
T.let(
|
|
696
|
+
:logo,
|
|
697
|
+
ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
|
|
698
|
+
)
|
|
699
|
+
WORDMARK =
|
|
700
|
+
T.let(
|
|
701
|
+
:wordmark,
|
|
702
|
+
ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
|
|
703
|
+
)
|
|
704
|
+
ICON =
|
|
705
|
+
T.let(
|
|
706
|
+
:icon,
|
|
707
|
+
ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
|
|
708
|
+
)
|
|
709
|
+
PATTERN =
|
|
710
|
+
T.let(
|
|
711
|
+
:pattern,
|
|
712
|
+
ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
|
|
713
|
+
)
|
|
714
|
+
GRAPHIC =
|
|
715
|
+
T.let(
|
|
716
|
+
:graphic,
|
|
717
|
+
ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
|
|
718
|
+
)
|
|
719
|
+
OTHER =
|
|
720
|
+
T.let(
|
|
721
|
+
:other,
|
|
722
|
+
ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
|
|
723
|
+
)
|
|
724
|
+
|
|
725
|
+
sig do
|
|
726
|
+
override.returns(
|
|
727
|
+
T::Array[
|
|
728
|
+
ContextDev::Models::WebScrapeResponse::Images::Data::Classification::TaggedSymbol
|
|
729
|
+
]
|
|
730
|
+
)
|
|
731
|
+
end
|
|
732
|
+
def self.values
|
|
733
|
+
end
|
|
734
|
+
end
|
|
735
|
+
end
|
|
736
|
+
end
|
|
737
|
+
|
|
738
|
+
class Json < ContextDev::Internal::Type::BaseModel
|
|
739
|
+
OrHash =
|
|
740
|
+
T.type_alias do
|
|
741
|
+
T.any(
|
|
742
|
+
ContextDev::Models::WebScrapeResponse::Json,
|
|
743
|
+
ContextDev::Internal::AnyHash
|
|
744
|
+
)
|
|
745
|
+
end
|
|
746
|
+
|
|
747
|
+
sig { returns(T.nilable(T::Hash[Symbol, T.anything])) }
|
|
748
|
+
attr_accessor :data
|
|
749
|
+
|
|
750
|
+
sig { returns(T::Boolean) }
|
|
751
|
+
attr_accessor :requested
|
|
752
|
+
|
|
753
|
+
# Page data extracted into jsonParams.schema, after shared content filters. Values
|
|
754
|
+
# are grounded in the page; optional fields the page does not state are omitted,
|
|
755
|
+
# or null when their type allows null. An empty object when the filters leave no
|
|
756
|
+
# text.
|
|
757
|
+
sig do
|
|
758
|
+
params(
|
|
759
|
+
data: T.nilable(T::Hash[Symbol, T.anything]),
|
|
760
|
+
requested: T::Boolean
|
|
761
|
+
).returns(T.attached_class)
|
|
762
|
+
end
|
|
763
|
+
def self.new(data:, requested:)
|
|
764
|
+
end
|
|
765
|
+
|
|
766
|
+
sig do
|
|
767
|
+
override.returns(
|
|
768
|
+
{
|
|
769
|
+
data: T.nilable(T::Hash[Symbol, T.anything]),
|
|
770
|
+
requested: T::Boolean
|
|
771
|
+
}
|
|
772
|
+
)
|
|
773
|
+
end
|
|
774
|
+
def to_hash
|
|
775
|
+
end
|
|
776
|
+
end
|
|
777
|
+
|
|
778
|
+
class Markdown < ContextDev::Internal::Type::BaseModel
|
|
779
|
+
OrHash =
|
|
780
|
+
T.type_alias do
|
|
781
|
+
T.any(
|
|
782
|
+
ContextDev::Models::WebScrapeResponse::Markdown,
|
|
783
|
+
ContextDev::Internal::AnyHash
|
|
784
|
+
)
|
|
785
|
+
end
|
|
786
|
+
|
|
787
|
+
sig { returns(T.nilable(String)) }
|
|
788
|
+
attr_accessor :data
|
|
789
|
+
|
|
790
|
+
sig { returns(T::Boolean) }
|
|
791
|
+
attr_accessor :requested
|
|
792
|
+
|
|
793
|
+
# Markdown after content filters.
|
|
794
|
+
sig do
|
|
795
|
+
params(data: T.nilable(String), requested: T::Boolean).returns(
|
|
796
|
+
T.attached_class
|
|
797
|
+
)
|
|
798
|
+
end
|
|
799
|
+
def self.new(data:, requested:)
|
|
800
|
+
end
|
|
801
|
+
|
|
802
|
+
sig do
|
|
803
|
+
override.returns({ data: T.nilable(String), requested: T::Boolean })
|
|
804
|
+
end
|
|
805
|
+
def to_hash
|
|
806
|
+
end
|
|
807
|
+
end
|
|
808
|
+
|
|
809
|
+
class Metadata < ContextDev::Internal::Type::BaseModel
|
|
810
|
+
OrHash =
|
|
811
|
+
T.type_alias do
|
|
812
|
+
T.any(
|
|
813
|
+
ContextDev::Models::WebScrapeResponse::Metadata,
|
|
814
|
+
ContextDev::Internal::AnyHash
|
|
815
|
+
)
|
|
816
|
+
end
|
|
817
|
+
|
|
818
|
+
# Additional non-social meta tags not promoted to top-level metadata fields.
|
|
819
|
+
sig do
|
|
820
|
+
returns(
|
|
821
|
+
T.nilable(
|
|
822
|
+
T::Hash[
|
|
823
|
+
Symbol,
|
|
824
|
+
ContextDev::Models::WebScrapeResponse::Metadata::AdditionalMeta::Variants
|
|
825
|
+
]
|
|
826
|
+
)
|
|
827
|
+
)
|
|
828
|
+
end
|
|
829
|
+
attr_reader :additional_meta
|
|
830
|
+
|
|
831
|
+
sig do
|
|
832
|
+
params(
|
|
833
|
+
additional_meta:
|
|
834
|
+
T::Hash[
|
|
835
|
+
Symbol,
|
|
836
|
+
ContextDev::Models::WebScrapeResponse::Metadata::AdditionalMeta::Variants
|
|
837
|
+
]
|
|
838
|
+
).void
|
|
839
|
+
end
|
|
840
|
+
attr_writer :additional_meta
|
|
841
|
+
|
|
842
|
+
# Resolved alternate links from link rel=alternate tags.
|
|
843
|
+
sig do
|
|
844
|
+
returns(
|
|
845
|
+
T.nilable(
|
|
846
|
+
T::Array[
|
|
847
|
+
ContextDev::Models::WebScrapeResponse::Metadata::Alternate
|
|
848
|
+
]
|
|
849
|
+
)
|
|
850
|
+
)
|
|
851
|
+
end
|
|
852
|
+
attr_reader :alternates
|
|
853
|
+
|
|
854
|
+
sig do
|
|
855
|
+
params(
|
|
856
|
+
alternates:
|
|
857
|
+
T::Array[
|
|
858
|
+
ContextDev::Models::WebScrapeResponse::Metadata::Alternate::OrHash
|
|
859
|
+
]
|
|
860
|
+
).void
|
|
861
|
+
end
|
|
862
|
+
attr_writer :alternates
|
|
863
|
+
|
|
864
|
+
# Author metadata, when present.
|
|
865
|
+
sig { returns(T.nilable(String)) }
|
|
866
|
+
attr_reader :author
|
|
867
|
+
|
|
868
|
+
sig { params(author: String).void }
|
|
869
|
+
attr_writer :author
|
|
870
|
+
|
|
871
|
+
# Resolved canonical URL, when present.
|
|
872
|
+
sig { returns(T.nilable(String)) }
|
|
873
|
+
attr_reader :canonical_url
|
|
874
|
+
|
|
875
|
+
sig { params(canonical_url: String).void }
|
|
876
|
+
attr_writer :canonical_url
|
|
877
|
+
|
|
878
|
+
# Best description extracted from standard, Open Graph, or Twitter metadata.
|
|
879
|
+
sig { returns(T.nilable(String)) }
|
|
880
|
+
attr_reader :description
|
|
881
|
+
|
|
882
|
+
sig { params(description: String).void }
|
|
883
|
+
attr_writer :description
|
|
884
|
+
|
|
885
|
+
# Resolved favicon URL, when present.
|
|
886
|
+
sig { returns(T.nilable(String)) }
|
|
887
|
+
attr_reader :favicon
|
|
888
|
+
|
|
889
|
+
sig { params(favicon: String).void }
|
|
890
|
+
attr_writer :favicon
|
|
891
|
+
|
|
892
|
+
# Page headings (h1–h6) in document order, extracted from the unfiltered document.
|
|
893
|
+
# Capped at the first 500 headings. Omitted when the page has none.
|
|
894
|
+
sig do
|
|
895
|
+
returns(
|
|
896
|
+
T.nilable(
|
|
897
|
+
T::Array[ContextDev::Models::WebScrapeResponse::Metadata::Heading]
|
|
898
|
+
)
|
|
899
|
+
)
|
|
900
|
+
end
|
|
901
|
+
attr_reader :headings
|
|
902
|
+
|
|
903
|
+
sig do
|
|
904
|
+
params(
|
|
905
|
+
headings:
|
|
906
|
+
T::Array[
|
|
907
|
+
ContextDev::Models::WebScrapeResponse::Metadata::Heading::OrHash
|
|
908
|
+
]
|
|
909
|
+
).void
|
|
910
|
+
end
|
|
911
|
+
attr_writer :headings
|
|
912
|
+
|
|
913
|
+
# Primary resolved preview image from Open Graph, Twitter, or image metadata.
|
|
914
|
+
sig { returns(T.nilable(String)) }
|
|
915
|
+
attr_reader :image
|
|
916
|
+
|
|
917
|
+
sig { params(image: String).void }
|
|
918
|
+
attr_writer :image
|
|
919
|
+
|
|
920
|
+
# JSON-LD structured data blocks parsed from the page.
|
|
921
|
+
sig { returns(T.nilable(T::Array[T::Hash[Symbol, T.anything]])) }
|
|
922
|
+
attr_reader :json_ld
|
|
923
|
+
|
|
924
|
+
sig { params(json_ld: T::Array[T::Hash[Symbol, T.anything]]).void }
|
|
925
|
+
attr_writer :json_ld
|
|
926
|
+
|
|
927
|
+
# Keywords extracted from the page's keywords meta tag.
|
|
928
|
+
sig { returns(T.nilable(T::Array[String])) }
|
|
929
|
+
attr_reader :keywords
|
|
930
|
+
|
|
931
|
+
sig { params(keywords: T::Array[String]).void }
|
|
932
|
+
attr_writer :keywords
|
|
933
|
+
|
|
934
|
+
# Language extracted from html lang or language meta tags.
|
|
935
|
+
sig { returns(T.nilable(String)) }
|
|
936
|
+
attr_reader :language
|
|
937
|
+
|
|
938
|
+
sig { params(language: String).void }
|
|
939
|
+
attr_writer :language
|
|
940
|
+
|
|
941
|
+
# Modified timestamp/date from page metadata, when present.
|
|
942
|
+
sig { returns(T.nilable(String)) }
|
|
943
|
+
attr_reader :modified_time
|
|
944
|
+
|
|
945
|
+
sig { params(modified_time: String).void }
|
|
946
|
+
attr_writer :modified_time
|
|
947
|
+
|
|
948
|
+
# Open Graph metadata with the og: prefix removed and keys camel-cased.
|
|
949
|
+
sig do
|
|
950
|
+
returns(
|
|
951
|
+
T.nilable(
|
|
952
|
+
T::Hash[
|
|
953
|
+
Symbol,
|
|
954
|
+
ContextDev::Models::WebScrapeResponse::Metadata::OpenGraph::Variants
|
|
955
|
+
]
|
|
956
|
+
)
|
|
957
|
+
)
|
|
958
|
+
end
|
|
959
|
+
attr_reader :open_graph
|
|
960
|
+
|
|
961
|
+
sig do
|
|
962
|
+
params(
|
|
963
|
+
open_graph:
|
|
964
|
+
T::Hash[
|
|
965
|
+
Symbol,
|
|
966
|
+
ContextDev::Models::WebScrapeResponse::Metadata::OpenGraph::Variants
|
|
967
|
+
]
|
|
968
|
+
).void
|
|
969
|
+
end
|
|
970
|
+
attr_writer :open_graph
|
|
971
|
+
|
|
972
|
+
# Published timestamp/date from page metadata, when present.
|
|
973
|
+
sig { returns(T.nilable(String)) }
|
|
974
|
+
attr_reader :published_time
|
|
975
|
+
|
|
976
|
+
sig { params(published_time: String).void }
|
|
977
|
+
attr_writer :published_time
|
|
978
|
+
|
|
979
|
+
# Robots meta directive, when present.
|
|
980
|
+
sig { returns(T.nilable(String)) }
|
|
981
|
+
attr_reader :robots
|
|
982
|
+
|
|
983
|
+
sig { params(robots: String).void }
|
|
984
|
+
attr_writer :robots
|
|
985
|
+
|
|
986
|
+
# Site or application name from page metadata.
|
|
987
|
+
sig { returns(T.nilable(String)) }
|
|
988
|
+
attr_reader :site_name
|
|
989
|
+
|
|
990
|
+
sig { params(site_name: String).void }
|
|
991
|
+
attr_writer :site_name
|
|
992
|
+
|
|
993
|
+
# Best title extracted from the page.
|
|
994
|
+
sig { returns(T.nilable(String)) }
|
|
995
|
+
attr_reader :title
|
|
996
|
+
|
|
997
|
+
sig { params(title: String).void }
|
|
998
|
+
attr_writer :title
|
|
999
|
+
|
|
1000
|
+
# Twitter card metadata with the twitter: prefix removed and keys camel-cased.
|
|
1001
|
+
sig do
|
|
1002
|
+
returns(
|
|
1003
|
+
T.nilable(
|
|
1004
|
+
T::Hash[
|
|
1005
|
+
Symbol,
|
|
1006
|
+
ContextDev::Models::WebScrapeResponse::Metadata::Twitter::Variants
|
|
1007
|
+
]
|
|
1008
|
+
)
|
|
1009
|
+
)
|
|
1010
|
+
end
|
|
1011
|
+
attr_reader :twitter
|
|
1012
|
+
|
|
1013
|
+
sig do
|
|
1014
|
+
params(
|
|
1015
|
+
twitter:
|
|
1016
|
+
T::Hash[
|
|
1017
|
+
Symbol,
|
|
1018
|
+
ContextDev::Models::WebScrapeResponse::Metadata::Twitter::Variants
|
|
1019
|
+
]
|
|
1020
|
+
).void
|
|
1021
|
+
end
|
|
1022
|
+
attr_writer :twitter
|
|
1023
|
+
|
|
1024
|
+
# Page details, when available.
|
|
1025
|
+
sig do
|
|
1026
|
+
params(
|
|
1027
|
+
additional_meta:
|
|
1028
|
+
T::Hash[
|
|
1029
|
+
Symbol,
|
|
1030
|
+
ContextDev::Models::WebScrapeResponse::Metadata::AdditionalMeta::Variants
|
|
1031
|
+
],
|
|
1032
|
+
alternates:
|
|
1033
|
+
T::Array[
|
|
1034
|
+
ContextDev::Models::WebScrapeResponse::Metadata::Alternate::OrHash
|
|
1035
|
+
],
|
|
1036
|
+
author: String,
|
|
1037
|
+
canonical_url: String,
|
|
1038
|
+
description: String,
|
|
1039
|
+
favicon: String,
|
|
1040
|
+
headings:
|
|
1041
|
+
T::Array[
|
|
1042
|
+
ContextDev::Models::WebScrapeResponse::Metadata::Heading::OrHash
|
|
1043
|
+
],
|
|
1044
|
+
image: String,
|
|
1045
|
+
json_ld: T::Array[T::Hash[Symbol, T.anything]],
|
|
1046
|
+
keywords: T::Array[String],
|
|
1047
|
+
language: String,
|
|
1048
|
+
modified_time: String,
|
|
1049
|
+
open_graph:
|
|
1050
|
+
T::Hash[
|
|
1051
|
+
Symbol,
|
|
1052
|
+
ContextDev::Models::WebScrapeResponse::Metadata::OpenGraph::Variants
|
|
1053
|
+
],
|
|
1054
|
+
published_time: String,
|
|
1055
|
+
robots: String,
|
|
1056
|
+
site_name: String,
|
|
1057
|
+
title: String,
|
|
1058
|
+
twitter:
|
|
1059
|
+
T::Hash[
|
|
1060
|
+
Symbol,
|
|
1061
|
+
ContextDev::Models::WebScrapeResponse::Metadata::Twitter::Variants
|
|
1062
|
+
]
|
|
1063
|
+
).returns(T.attached_class)
|
|
1064
|
+
end
|
|
1065
|
+
def self.new(
|
|
1066
|
+
# Additional non-social meta tags not promoted to top-level metadata fields.
|
|
1067
|
+
additional_meta: nil,
|
|
1068
|
+
# Resolved alternate links from link rel=alternate tags.
|
|
1069
|
+
alternates: nil,
|
|
1070
|
+
# Author metadata, when present.
|
|
1071
|
+
author: nil,
|
|
1072
|
+
# Resolved canonical URL, when present.
|
|
1073
|
+
canonical_url: nil,
|
|
1074
|
+
# Best description extracted from standard, Open Graph, or Twitter metadata.
|
|
1075
|
+
description: nil,
|
|
1076
|
+
# Resolved favicon URL, when present.
|
|
1077
|
+
favicon: nil,
|
|
1078
|
+
# Page headings (h1–h6) in document order, extracted from the unfiltered document.
|
|
1079
|
+
# Capped at the first 500 headings. Omitted when the page has none.
|
|
1080
|
+
headings: nil,
|
|
1081
|
+
# Primary resolved preview image from Open Graph, Twitter, or image metadata.
|
|
1082
|
+
image: nil,
|
|
1083
|
+
# JSON-LD structured data blocks parsed from the page.
|
|
1084
|
+
json_ld: nil,
|
|
1085
|
+
# Keywords extracted from the page's keywords meta tag.
|
|
1086
|
+
keywords: nil,
|
|
1087
|
+
# Language extracted from html lang or language meta tags.
|
|
1088
|
+
language: nil,
|
|
1089
|
+
# Modified timestamp/date from page metadata, when present.
|
|
1090
|
+
modified_time: nil,
|
|
1091
|
+
# Open Graph metadata with the og: prefix removed and keys camel-cased.
|
|
1092
|
+
open_graph: nil,
|
|
1093
|
+
# Published timestamp/date from page metadata, when present.
|
|
1094
|
+
published_time: nil,
|
|
1095
|
+
# Robots meta directive, when present.
|
|
1096
|
+
robots: nil,
|
|
1097
|
+
# Site or application name from page metadata.
|
|
1098
|
+
site_name: nil,
|
|
1099
|
+
# Best title extracted from the page.
|
|
1100
|
+
title: nil,
|
|
1101
|
+
# Twitter card metadata with the twitter: prefix removed and keys camel-cased.
|
|
1102
|
+
twitter: nil
|
|
1103
|
+
)
|
|
1104
|
+
end
|
|
1105
|
+
|
|
1106
|
+
sig do
|
|
1107
|
+
override.returns(
|
|
1108
|
+
{
|
|
1109
|
+
additional_meta:
|
|
1110
|
+
T::Hash[
|
|
1111
|
+
Symbol,
|
|
1112
|
+
ContextDev::Models::WebScrapeResponse::Metadata::AdditionalMeta::Variants
|
|
1113
|
+
],
|
|
1114
|
+
alternates:
|
|
1115
|
+
T::Array[
|
|
1116
|
+
ContextDev::Models::WebScrapeResponse::Metadata::Alternate
|
|
1117
|
+
],
|
|
1118
|
+
author: String,
|
|
1119
|
+
canonical_url: String,
|
|
1120
|
+
description: String,
|
|
1121
|
+
favicon: String,
|
|
1122
|
+
headings:
|
|
1123
|
+
T::Array[
|
|
1124
|
+
ContextDev::Models::WebScrapeResponse::Metadata::Heading
|
|
1125
|
+
],
|
|
1126
|
+
image: String,
|
|
1127
|
+
json_ld: T::Array[T::Hash[Symbol, T.anything]],
|
|
1128
|
+
keywords: T::Array[String],
|
|
1129
|
+
language: String,
|
|
1130
|
+
modified_time: String,
|
|
1131
|
+
open_graph:
|
|
1132
|
+
T::Hash[
|
|
1133
|
+
Symbol,
|
|
1134
|
+
ContextDev::Models::WebScrapeResponse::Metadata::OpenGraph::Variants
|
|
1135
|
+
],
|
|
1136
|
+
published_time: String,
|
|
1137
|
+
robots: String,
|
|
1138
|
+
site_name: String,
|
|
1139
|
+
title: String,
|
|
1140
|
+
twitter:
|
|
1141
|
+
T::Hash[
|
|
1142
|
+
Symbol,
|
|
1143
|
+
ContextDev::Models::WebScrapeResponse::Metadata::Twitter::Variants
|
|
1144
|
+
]
|
|
1145
|
+
}
|
|
1146
|
+
)
|
|
1147
|
+
end
|
|
1148
|
+
def to_hash
|
|
1149
|
+
end
|
|
1150
|
+
|
|
1151
|
+
module AdditionalMeta
|
|
1152
|
+
extend ContextDev::Internal::Type::Union
|
|
1153
|
+
|
|
1154
|
+
Variants = T.type_alias { T.any(String, T::Array[String]) }
|
|
1155
|
+
|
|
1156
|
+
sig do
|
|
1157
|
+
override.returns(
|
|
1158
|
+
T::Array[
|
|
1159
|
+
ContextDev::Models::WebScrapeResponse::Metadata::AdditionalMeta::Variants
|
|
1160
|
+
]
|
|
1161
|
+
)
|
|
1162
|
+
end
|
|
1163
|
+
def self.variants
|
|
1164
|
+
end
|
|
1165
|
+
|
|
1166
|
+
StringArray =
|
|
1167
|
+
T.let(
|
|
1168
|
+
ContextDev::Internal::Type::ArrayOf[String],
|
|
1169
|
+
ContextDev::Internal::Type::Converter
|
|
1170
|
+
)
|
|
1171
|
+
end
|
|
1172
|
+
|
|
1173
|
+
class Alternate < ContextDev::Internal::Type::BaseModel
|
|
1174
|
+
OrHash =
|
|
1175
|
+
T.type_alias do
|
|
1176
|
+
T.any(
|
|
1177
|
+
ContextDev::Models::WebScrapeResponse::Metadata::Alternate,
|
|
1178
|
+
ContextDev::Internal::AnyHash
|
|
1179
|
+
)
|
|
1180
|
+
end
|
|
1181
|
+
|
|
1182
|
+
# Resolved alternate URL.
|
|
1183
|
+
sig { returns(String) }
|
|
1184
|
+
attr_accessor :href
|
|
1185
|
+
|
|
1186
|
+
# Language or locale for the alternate URL, when present.
|
|
1187
|
+
sig { returns(T.nilable(String)) }
|
|
1188
|
+
attr_reader :hreflang
|
|
1189
|
+
|
|
1190
|
+
sig { params(hreflang: String).void }
|
|
1191
|
+
attr_writer :hreflang
|
|
1192
|
+
|
|
1193
|
+
# Alternate resource title, when present.
|
|
1194
|
+
sig { returns(T.nilable(String)) }
|
|
1195
|
+
attr_reader :title
|
|
1196
|
+
|
|
1197
|
+
sig { params(title: String).void }
|
|
1198
|
+
attr_writer :title
|
|
1199
|
+
|
|
1200
|
+
# Alternate resource MIME type, when present.
|
|
1201
|
+
sig { returns(T.nilable(String)) }
|
|
1202
|
+
attr_reader :type
|
|
1203
|
+
|
|
1204
|
+
sig { params(type: String).void }
|
|
1205
|
+
attr_writer :type
|
|
1206
|
+
|
|
1207
|
+
sig do
|
|
1208
|
+
params(
|
|
1209
|
+
href: String,
|
|
1210
|
+
hreflang: String,
|
|
1211
|
+
title: String,
|
|
1212
|
+
type: String
|
|
1213
|
+
).returns(T.attached_class)
|
|
1214
|
+
end
|
|
1215
|
+
def self.new(
|
|
1216
|
+
# Resolved alternate URL.
|
|
1217
|
+
href:,
|
|
1218
|
+
# Language or locale for the alternate URL, when present.
|
|
1219
|
+
hreflang: nil,
|
|
1220
|
+
# Alternate resource title, when present.
|
|
1221
|
+
title: nil,
|
|
1222
|
+
# Alternate resource MIME type, when present.
|
|
1223
|
+
type: nil
|
|
1224
|
+
)
|
|
1225
|
+
end
|
|
1226
|
+
|
|
1227
|
+
sig do
|
|
1228
|
+
override.returns(
|
|
1229
|
+
{ href: String, hreflang: String, title: String, type: String }
|
|
1230
|
+
)
|
|
1231
|
+
end
|
|
1232
|
+
def to_hash
|
|
1233
|
+
end
|
|
1234
|
+
end
|
|
1235
|
+
|
|
1236
|
+
class Heading < ContextDev::Internal::Type::BaseModel
|
|
1237
|
+
OrHash =
|
|
1238
|
+
T.type_alias do
|
|
1239
|
+
T.any(
|
|
1240
|
+
ContextDev::Models::WebScrapeResponse::Metadata::Heading,
|
|
1241
|
+
ContextDev::Internal::AnyHash
|
|
1242
|
+
)
|
|
1243
|
+
end
|
|
1244
|
+
|
|
1245
|
+
# Heading level, 1–6 (from h1–h6).
|
|
1246
|
+
sig { returns(Integer) }
|
|
1247
|
+
attr_accessor :level
|
|
1248
|
+
|
|
1249
|
+
# Heading text with whitespace collapsed, truncated to 1000 characters.
|
|
1250
|
+
sig { returns(String) }
|
|
1251
|
+
attr_accessor :text
|
|
1252
|
+
|
|
1253
|
+
sig { params(level: Integer, text: String).returns(T.attached_class) }
|
|
1254
|
+
def self.new(
|
|
1255
|
+
# Heading level, 1–6 (from h1–h6).
|
|
1256
|
+
level:,
|
|
1257
|
+
# Heading text with whitespace collapsed, truncated to 1000 characters.
|
|
1258
|
+
text:
|
|
1259
|
+
)
|
|
1260
|
+
end
|
|
1261
|
+
|
|
1262
|
+
sig { override.returns({ level: Integer, text: String }) }
|
|
1263
|
+
def to_hash
|
|
1264
|
+
end
|
|
1265
|
+
end
|
|
1266
|
+
|
|
1267
|
+
module OpenGraph
|
|
1268
|
+
extend ContextDev::Internal::Type::Union
|
|
1269
|
+
|
|
1270
|
+
Variants = T.type_alias { T.any(String, T::Array[String]) }
|
|
1271
|
+
|
|
1272
|
+
sig do
|
|
1273
|
+
override.returns(
|
|
1274
|
+
T::Array[
|
|
1275
|
+
ContextDev::Models::WebScrapeResponse::Metadata::OpenGraph::Variants
|
|
1276
|
+
]
|
|
1277
|
+
)
|
|
1278
|
+
end
|
|
1279
|
+
def self.variants
|
|
1280
|
+
end
|
|
1281
|
+
|
|
1282
|
+
StringArray =
|
|
1283
|
+
T.let(
|
|
1284
|
+
ContextDev::Internal::Type::ArrayOf[String],
|
|
1285
|
+
ContextDev::Internal::Type::Converter
|
|
1286
|
+
)
|
|
1287
|
+
end
|
|
1288
|
+
|
|
1289
|
+
module Twitter
|
|
1290
|
+
extend ContextDev::Internal::Type::Union
|
|
1291
|
+
|
|
1292
|
+
Variants = T.type_alias { T.any(String, T::Array[String]) }
|
|
1293
|
+
|
|
1294
|
+
sig do
|
|
1295
|
+
override.returns(
|
|
1296
|
+
T::Array[
|
|
1297
|
+
ContextDev::Models::WebScrapeResponse::Metadata::Twitter::Variants
|
|
1298
|
+
]
|
|
1299
|
+
)
|
|
1300
|
+
end
|
|
1301
|
+
def self.variants
|
|
1302
|
+
end
|
|
1303
|
+
|
|
1304
|
+
StringArray =
|
|
1305
|
+
T.let(
|
|
1306
|
+
ContextDev::Internal::Type::ArrayOf[String],
|
|
1307
|
+
ContextDev::Internal::Type::Converter
|
|
1308
|
+
)
|
|
1309
|
+
end
|
|
1310
|
+
end
|
|
1311
|
+
|
|
1312
|
+
class Parsed < ContextDev::Internal::Type::BaseModel
|
|
1313
|
+
OrHash =
|
|
1314
|
+
T.type_alias do
|
|
1315
|
+
T.any(
|
|
1316
|
+
ContextDev::Models::WebScrapeResponse::Parsed,
|
|
1317
|
+
ContextDev::Internal::AnyHash
|
|
1318
|
+
)
|
|
1319
|
+
end
|
|
1320
|
+
|
|
1321
|
+
sig { returns(T.nilable(T::Hash[Symbol, T.anything])) }
|
|
1322
|
+
attr_accessor :data
|
|
1323
|
+
|
|
1324
|
+
sig { returns(T::Boolean) }
|
|
1325
|
+
attr_accessor :requested
|
|
1326
|
+
|
|
1327
|
+
# Fields produced by parseParams.rules, after shared content filters.
|
|
1328
|
+
sig do
|
|
1329
|
+
params(
|
|
1330
|
+
data: T.nilable(T::Hash[Symbol, T.anything]),
|
|
1331
|
+
requested: T::Boolean
|
|
1332
|
+
).returns(T.attached_class)
|
|
1333
|
+
end
|
|
1334
|
+
def self.new(data:, requested:)
|
|
1335
|
+
end
|
|
1336
|
+
|
|
1337
|
+
sig do
|
|
1338
|
+
override.returns(
|
|
1339
|
+
{
|
|
1340
|
+
data: T.nilable(T::Hash[Symbol, T.anything]),
|
|
1341
|
+
requested: T::Boolean
|
|
1342
|
+
}
|
|
1343
|
+
)
|
|
1344
|
+
end
|
|
1345
|
+
def to_hash
|
|
1346
|
+
end
|
|
1347
|
+
end
|
|
1348
|
+
|
|
1349
|
+
class Product < ContextDev::Internal::Type::BaseModel
|
|
1350
|
+
OrHash =
|
|
1351
|
+
T.type_alias do
|
|
1352
|
+
T.any(
|
|
1353
|
+
ContextDev::Models::WebScrapeResponse::Product,
|
|
1354
|
+
ContextDev::Internal::AnyHash
|
|
1355
|
+
)
|
|
1356
|
+
end
|
|
1357
|
+
|
|
1358
|
+
sig do
|
|
1359
|
+
returns(
|
|
1360
|
+
T.nilable(ContextDev::Models::WebScrapeResponse::Product::Data)
|
|
1361
|
+
)
|
|
1362
|
+
end
|
|
1363
|
+
attr_reader :data
|
|
1364
|
+
|
|
1365
|
+
sig do
|
|
1366
|
+
params(
|
|
1367
|
+
data:
|
|
1368
|
+
T.nilable(
|
|
1369
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::OrHash
|
|
1370
|
+
)
|
|
1371
|
+
).void
|
|
1372
|
+
end
|
|
1373
|
+
attr_writer :data
|
|
1374
|
+
|
|
1375
|
+
sig { returns(T::Boolean) }
|
|
1376
|
+
attr_accessor :requested
|
|
1377
|
+
|
|
1378
|
+
# Product detail page classification and the extracted product.
|
|
1379
|
+
sig do
|
|
1380
|
+
params(
|
|
1381
|
+
data:
|
|
1382
|
+
T.nilable(
|
|
1383
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::OrHash
|
|
1384
|
+
),
|
|
1385
|
+
requested: T::Boolean
|
|
1386
|
+
).returns(T.attached_class)
|
|
1387
|
+
end
|
|
1388
|
+
def self.new(data:, requested:)
|
|
1389
|
+
end
|
|
1390
|
+
|
|
1391
|
+
sig do
|
|
1392
|
+
override.returns(
|
|
1393
|
+
{
|
|
1394
|
+
data:
|
|
1395
|
+
T.nilable(ContextDev::Models::WebScrapeResponse::Product::Data),
|
|
1396
|
+
requested: T::Boolean
|
|
1397
|
+
}
|
|
1398
|
+
)
|
|
1399
|
+
end
|
|
1400
|
+
def to_hash
|
|
1401
|
+
end
|
|
1402
|
+
|
|
1403
|
+
class Data < ContextDev::Internal::Type::BaseModel
|
|
1404
|
+
OrHash =
|
|
1405
|
+
T.type_alias do
|
|
1406
|
+
T.any(
|
|
1407
|
+
ContextDev::Models::WebScrapeResponse::Product::Data,
|
|
1408
|
+
ContextDev::Internal::AnyHash
|
|
1409
|
+
)
|
|
1410
|
+
end
|
|
1411
|
+
|
|
1412
|
+
# Whether the page is a product detail page.
|
|
1413
|
+
sig { returns(T::Boolean) }
|
|
1414
|
+
attr_accessor :is_product_page
|
|
1415
|
+
|
|
1416
|
+
# The extracted product, or null when the page is not a product detail page.
|
|
1417
|
+
sig do
|
|
1418
|
+
returns(
|
|
1419
|
+
T.nilable(
|
|
1420
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product
|
|
1421
|
+
)
|
|
1422
|
+
)
|
|
1423
|
+
end
|
|
1424
|
+
attr_reader :product
|
|
1425
|
+
|
|
1426
|
+
sig do
|
|
1427
|
+
params(
|
|
1428
|
+
product:
|
|
1429
|
+
T.nilable(
|
|
1430
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::OrHash
|
|
1431
|
+
)
|
|
1432
|
+
).void
|
|
1433
|
+
end
|
|
1434
|
+
attr_writer :product
|
|
1435
|
+
|
|
1436
|
+
sig do
|
|
1437
|
+
params(
|
|
1438
|
+
is_product_page: T::Boolean,
|
|
1439
|
+
product:
|
|
1440
|
+
T.nilable(
|
|
1441
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::OrHash
|
|
1442
|
+
)
|
|
1443
|
+
).returns(T.attached_class)
|
|
1444
|
+
end
|
|
1445
|
+
def self.new(
|
|
1446
|
+
# Whether the page is a product detail page.
|
|
1447
|
+
is_product_page:,
|
|
1448
|
+
# The extracted product, or null when the page is not a product detail page.
|
|
1449
|
+
product:
|
|
1450
|
+
)
|
|
1451
|
+
end
|
|
1452
|
+
|
|
1453
|
+
sig do
|
|
1454
|
+
override.returns(
|
|
1455
|
+
{
|
|
1456
|
+
is_product_page: T::Boolean,
|
|
1457
|
+
product:
|
|
1458
|
+
T.nilable(
|
|
1459
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product
|
|
1460
|
+
)
|
|
1461
|
+
}
|
|
1462
|
+
)
|
|
1463
|
+
end
|
|
1464
|
+
def to_hash
|
|
1465
|
+
end
|
|
1466
|
+
|
|
1467
|
+
class Product < ContextDev::Internal::Type::BaseModel
|
|
1468
|
+
OrHash =
|
|
1469
|
+
T.type_alias do
|
|
1470
|
+
T.any(
|
|
1471
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product,
|
|
1472
|
+
ContextDev::Internal::AnyHash
|
|
1473
|
+
)
|
|
1474
|
+
end
|
|
1475
|
+
|
|
1476
|
+
# Stock or ordering availability.
|
|
1477
|
+
sig do
|
|
1478
|
+
returns(
|
|
1479
|
+
T.nilable(
|
|
1480
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
|
|
1481
|
+
)
|
|
1482
|
+
)
|
|
1483
|
+
end
|
|
1484
|
+
attr_accessor :availability
|
|
1485
|
+
|
|
1486
|
+
# Brand or vendor.
|
|
1487
|
+
sig { returns(T.nilable(String)) }
|
|
1488
|
+
attr_accessor :brand
|
|
1489
|
+
|
|
1490
|
+
# Product category.
|
|
1491
|
+
sig { returns(T.nilable(String)) }
|
|
1492
|
+
attr_accessor :category
|
|
1493
|
+
|
|
1494
|
+
# ISO 4217 currency code.
|
|
1495
|
+
sig { returns(T.nilable(String)) }
|
|
1496
|
+
attr_accessor :currency
|
|
1497
|
+
|
|
1498
|
+
# Product description.
|
|
1499
|
+
sig { returns(T.nilable(String)) }
|
|
1500
|
+
attr_accessor :description
|
|
1501
|
+
|
|
1502
|
+
# Product dimensions as shown on the page.
|
|
1503
|
+
sig { returns(T::Array[String]) }
|
|
1504
|
+
attr_accessor :dimensions
|
|
1505
|
+
|
|
1506
|
+
# Key features and specifications.
|
|
1507
|
+
sig { returns(T::Array[String]) }
|
|
1508
|
+
attr_accessor :features
|
|
1509
|
+
|
|
1510
|
+
# Product image URLs, main image first.
|
|
1511
|
+
sig { returns(T::Array[String]) }
|
|
1512
|
+
attr_accessor :images
|
|
1513
|
+
|
|
1514
|
+
# Main product image URL.
|
|
1515
|
+
sig { returns(T.nilable(String)) }
|
|
1516
|
+
attr_accessor :image_url
|
|
1517
|
+
|
|
1518
|
+
# Product name.
|
|
1519
|
+
sig { returns(String) }
|
|
1520
|
+
attr_accessor :name
|
|
1521
|
+
|
|
1522
|
+
# Current price.
|
|
1523
|
+
sig { returns(T.nilable(Float)) }
|
|
1524
|
+
attr_accessor :price
|
|
1525
|
+
|
|
1526
|
+
# List price before any discount.
|
|
1527
|
+
sig { returns(T.nilable(Float)) }
|
|
1528
|
+
attr_accessor :regular_price
|
|
1529
|
+
|
|
1530
|
+
# Product identifier such as a SKU or model number.
|
|
1531
|
+
sig { returns(T.nilable(String)) }
|
|
1532
|
+
attr_accessor :sku
|
|
1533
|
+
|
|
1534
|
+
# Product tags.
|
|
1535
|
+
sig { returns(T::Array[String]) }
|
|
1536
|
+
attr_accessor :tags
|
|
1537
|
+
|
|
1538
|
+
# Intended audience.
|
|
1539
|
+
sig { returns(T::Array[String]) }
|
|
1540
|
+
attr_accessor :target_audience
|
|
1541
|
+
|
|
1542
|
+
# Product variations, such as different colors or sizes, with their attributes and
|
|
1543
|
+
# images. Empty if none are found. May not include every variation offered by the
|
|
1544
|
+
# store.
|
|
1545
|
+
sig do
|
|
1546
|
+
returns(
|
|
1547
|
+
T::Array[
|
|
1548
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::Variant
|
|
1549
|
+
]
|
|
1550
|
+
)
|
|
1551
|
+
end
|
|
1552
|
+
attr_accessor :variants
|
|
1553
|
+
|
|
1554
|
+
# The extracted product, or null when the page is not a product detail page.
|
|
1555
|
+
sig do
|
|
1556
|
+
params(
|
|
1557
|
+
availability:
|
|
1558
|
+
T.nilable(
|
|
1559
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::OrSymbol
|
|
1560
|
+
),
|
|
1561
|
+
brand: T.nilable(String),
|
|
1562
|
+
category: T.nilable(String),
|
|
1563
|
+
currency: T.nilable(String),
|
|
1564
|
+
description: T.nilable(String),
|
|
1565
|
+
dimensions: T::Array[String],
|
|
1566
|
+
features: T::Array[String],
|
|
1567
|
+
images: T::Array[String],
|
|
1568
|
+
image_url: T.nilable(String),
|
|
1569
|
+
name: String,
|
|
1570
|
+
price: T.nilable(Float),
|
|
1571
|
+
regular_price: T.nilable(Float),
|
|
1572
|
+
sku: T.nilable(String),
|
|
1573
|
+
tags: T::Array[String],
|
|
1574
|
+
target_audience: T::Array[String],
|
|
1575
|
+
variants:
|
|
1576
|
+
T::Array[
|
|
1577
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::Variant::OrHash
|
|
1578
|
+
]
|
|
1579
|
+
).returns(T.attached_class)
|
|
1580
|
+
end
|
|
1581
|
+
def self.new(
|
|
1582
|
+
# Stock or ordering availability.
|
|
1583
|
+
availability:,
|
|
1584
|
+
# Brand or vendor.
|
|
1585
|
+
brand:,
|
|
1586
|
+
# Product category.
|
|
1587
|
+
category:,
|
|
1588
|
+
# ISO 4217 currency code.
|
|
1589
|
+
currency:,
|
|
1590
|
+
# Product description.
|
|
1591
|
+
description:,
|
|
1592
|
+
# Product dimensions as shown on the page.
|
|
1593
|
+
dimensions:,
|
|
1594
|
+
# Key features and specifications.
|
|
1595
|
+
features:,
|
|
1596
|
+
# Product image URLs, main image first.
|
|
1597
|
+
images:,
|
|
1598
|
+
# Main product image URL.
|
|
1599
|
+
image_url:,
|
|
1600
|
+
# Product name.
|
|
1601
|
+
name:,
|
|
1602
|
+
# Current price.
|
|
1603
|
+
price:,
|
|
1604
|
+
# List price before any discount.
|
|
1605
|
+
regular_price:,
|
|
1606
|
+
# Product identifier such as a SKU or model number.
|
|
1607
|
+
sku:,
|
|
1608
|
+
# Product tags.
|
|
1609
|
+
tags:,
|
|
1610
|
+
# Intended audience.
|
|
1611
|
+
target_audience:,
|
|
1612
|
+
# Product variations, such as different colors or sizes, with their attributes and
|
|
1613
|
+
# images. Empty if none are found. May not include every variation offered by the
|
|
1614
|
+
# store.
|
|
1615
|
+
variants:
|
|
1616
|
+
)
|
|
1617
|
+
end
|
|
1618
|
+
|
|
1619
|
+
sig do
|
|
1620
|
+
override.returns(
|
|
1621
|
+
{
|
|
1622
|
+
availability:
|
|
1623
|
+
T.nilable(
|
|
1624
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
|
|
1625
|
+
),
|
|
1626
|
+
brand: T.nilable(String),
|
|
1627
|
+
category: T.nilable(String),
|
|
1628
|
+
currency: T.nilable(String),
|
|
1629
|
+
description: T.nilable(String),
|
|
1630
|
+
dimensions: T::Array[String],
|
|
1631
|
+
features: T::Array[String],
|
|
1632
|
+
images: T::Array[String],
|
|
1633
|
+
image_url: T.nilable(String),
|
|
1634
|
+
name: String,
|
|
1635
|
+
price: T.nilable(Float),
|
|
1636
|
+
regular_price: T.nilable(Float),
|
|
1637
|
+
sku: T.nilable(String),
|
|
1638
|
+
tags: T::Array[String],
|
|
1639
|
+
target_audience: T::Array[String],
|
|
1640
|
+
variants:
|
|
1641
|
+
T::Array[
|
|
1642
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::Variant
|
|
1643
|
+
]
|
|
1644
|
+
}
|
|
1645
|
+
)
|
|
1646
|
+
end
|
|
1647
|
+
def to_hash
|
|
1648
|
+
end
|
|
1649
|
+
|
|
1650
|
+
# Stock or ordering availability.
|
|
1651
|
+
module Availability
|
|
1652
|
+
extend ContextDev::Internal::Type::Enum
|
|
1653
|
+
|
|
1654
|
+
TaggedSymbol =
|
|
1655
|
+
T.type_alias do
|
|
1656
|
+
T.all(
|
|
1657
|
+
Symbol,
|
|
1658
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability
|
|
1659
|
+
)
|
|
1660
|
+
end
|
|
1661
|
+
OrSymbol = T.type_alias { T.any(Symbol, String) }
|
|
1662
|
+
|
|
1663
|
+
IN_STOCK =
|
|
1664
|
+
T.let(
|
|
1665
|
+
:in_stock,
|
|
1666
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
|
|
1667
|
+
)
|
|
1668
|
+
OUT_OF_STOCK =
|
|
1669
|
+
T.let(
|
|
1670
|
+
:out_of_stock,
|
|
1671
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
|
|
1672
|
+
)
|
|
1673
|
+
LIMITED_AVAILABILITY =
|
|
1674
|
+
T.let(
|
|
1675
|
+
:limited_availability,
|
|
1676
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
|
|
1677
|
+
)
|
|
1678
|
+
PREORDER =
|
|
1679
|
+
T.let(
|
|
1680
|
+
:preorder,
|
|
1681
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
|
|
1682
|
+
)
|
|
1683
|
+
BACKORDER =
|
|
1684
|
+
T.let(
|
|
1685
|
+
:backorder,
|
|
1686
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
|
|
1687
|
+
)
|
|
1688
|
+
MADE_TO_ORDER =
|
|
1689
|
+
T.let(
|
|
1690
|
+
:made_to_order,
|
|
1691
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
|
|
1692
|
+
)
|
|
1693
|
+
DISCONTINUED =
|
|
1694
|
+
T.let(
|
|
1695
|
+
:discontinued,
|
|
1696
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
|
|
1697
|
+
)
|
|
1698
|
+
|
|
1699
|
+
sig do
|
|
1700
|
+
override.returns(
|
|
1701
|
+
T::Array[
|
|
1702
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::Availability::TaggedSymbol
|
|
1703
|
+
]
|
|
1704
|
+
)
|
|
1705
|
+
end
|
|
1706
|
+
def self.values
|
|
1707
|
+
end
|
|
1708
|
+
end
|
|
1709
|
+
|
|
1710
|
+
class Variant < ContextDev::Internal::Type::BaseModel
|
|
1711
|
+
OrHash =
|
|
1712
|
+
T.type_alias do
|
|
1713
|
+
T.any(
|
|
1714
|
+
ContextDev::Models::WebScrapeResponse::Product::Data::Product::Variant,
|
|
1715
|
+
ContextDev::Internal::AnyHash
|
|
1716
|
+
)
|
|
1717
|
+
end
|
|
1718
|
+
|
|
1719
|
+
# Explicit variant attributes such as color, size, material, pattern and
|
|
1720
|
+
# properties declared by page.
|
|
1721
|
+
sig { returns(T::Hash[Symbol, String]) }
|
|
1722
|
+
attr_accessor :attributes
|
|
1723
|
+
|
|
1724
|
+
# Original source image URLs explicitly attached to this variant.
|
|
1725
|
+
sig { returns(T::Array[String]) }
|
|
1726
|
+
attr_accessor :images
|
|
1727
|
+
|
|
1728
|
+
sig { returns(T.nilable(String)) }
|
|
1729
|
+
attr_accessor :sku
|
|
1730
|
+
|
|
1731
|
+
# Variant or offer URL when provided by the source. May be shared by variants.
|
|
1732
|
+
sig { returns(T.nilable(String)) }
|
|
1733
|
+
attr_accessor :url
|
|
1734
|
+
|
|
1735
|
+
sig do
|
|
1736
|
+
params(
|
|
1737
|
+
attributes: T::Hash[Symbol, String],
|
|
1738
|
+
images: T::Array[String],
|
|
1739
|
+
sku: T.nilable(String),
|
|
1740
|
+
url: T.nilable(String)
|
|
1741
|
+
).returns(T.attached_class)
|
|
1742
|
+
end
|
|
1743
|
+
def self.new(
|
|
1744
|
+
# Explicit variant attributes such as color, size, material, pattern and
|
|
1745
|
+
# properties declared by page.
|
|
1746
|
+
attributes:,
|
|
1747
|
+
# Original source image URLs explicitly attached to this variant.
|
|
1748
|
+
images:,
|
|
1749
|
+
sku:,
|
|
1750
|
+
# Variant or offer URL when provided by the source. May be shared by variants.
|
|
1751
|
+
url:
|
|
1752
|
+
)
|
|
1753
|
+
end
|
|
1754
|
+
|
|
1755
|
+
sig do
|
|
1756
|
+
override.returns(
|
|
1757
|
+
{
|
|
1758
|
+
attributes: T::Hash[Symbol, String],
|
|
1759
|
+
images: T::Array[String],
|
|
1760
|
+
sku: T.nilable(String),
|
|
1761
|
+
url: T.nilable(String)
|
|
1762
|
+
}
|
|
1763
|
+
)
|
|
1764
|
+
end
|
|
1765
|
+
def to_hash
|
|
1766
|
+
end
|
|
1767
|
+
end
|
|
1768
|
+
end
|
|
1769
|
+
end
|
|
1770
|
+
end
|
|
1771
|
+
|
|
1772
|
+
class Screenshot < ContextDev::Internal::Type::BaseModel
|
|
1773
|
+
OrHash =
|
|
1774
|
+
T.type_alias do
|
|
1775
|
+
T.any(
|
|
1776
|
+
ContextDev::Models::WebScrapeResponse::Screenshot,
|
|
1777
|
+
ContextDev::Internal::AnyHash
|
|
1778
|
+
)
|
|
1779
|
+
end
|
|
1780
|
+
|
|
1781
|
+
sig { returns(T.nilable(String)) }
|
|
1782
|
+
attr_accessor :data
|
|
1783
|
+
|
|
1784
|
+
sig { returns(T::Boolean) }
|
|
1785
|
+
attr_accessor :requested
|
|
1786
|
+
|
|
1787
|
+
# An image data URL. Use directly as an image src.
|
|
1788
|
+
sig do
|
|
1789
|
+
params(data: T.nilable(String), requested: T::Boolean).returns(
|
|
1790
|
+
T.attached_class
|
|
1791
|
+
)
|
|
1792
|
+
end
|
|
1793
|
+
def self.new(data:, requested:)
|
|
1794
|
+
end
|
|
1795
|
+
|
|
1796
|
+
sig do
|
|
1797
|
+
override.returns({ data: T.nilable(String), requested: T::Boolean })
|
|
1798
|
+
end
|
|
1799
|
+
def to_hash
|
|
1800
|
+
end
|
|
1801
|
+
end
|
|
1802
|
+
|
|
1803
|
+
# Present when return-partial captures a page that is still loading, returns
|
|
1804
|
+
# images before image processing finishes, or cuts product AI extraction short.
|
|
1805
|
+
# Also present if the optional product AI fallback fails. Partial responses are
|
|
1806
|
+
# not cached.
|
|
1807
|
+
module IsPartial
|
|
1808
|
+
extend ContextDev::Internal::Type::Enum
|
|
1809
|
+
|
|
1810
|
+
TaggedBoolean =
|
|
1811
|
+
T.type_alias do
|
|
1812
|
+
T.all(T::Boolean, ContextDev::Models::WebScrapeResponse::IsPartial)
|
|
1813
|
+
end
|
|
1814
|
+
OrBoolean = T.type_alias { T::Boolean }
|
|
1815
|
+
|
|
1816
|
+
TRUE =
|
|
1817
|
+
T.let(
|
|
1818
|
+
true,
|
|
1819
|
+
ContextDev::Models::WebScrapeResponse::IsPartial::TaggedBoolean
|
|
1820
|
+
)
|
|
1821
|
+
|
|
1822
|
+
sig do
|
|
1823
|
+
override.returns(
|
|
1824
|
+
T::Array[
|
|
1825
|
+
ContextDev::Models::WebScrapeResponse::IsPartial::TaggedBoolean
|
|
1826
|
+
]
|
|
1827
|
+
)
|
|
1828
|
+
end
|
|
1829
|
+
def self.values
|
|
1830
|
+
end
|
|
1831
|
+
end
|
|
1832
|
+
|
|
1833
|
+
class KeyMetadata < ContextDev::Internal::Type::BaseModel
|
|
1834
|
+
OrHash =
|
|
1835
|
+
T.type_alias do
|
|
1836
|
+
T.any(
|
|
1837
|
+
ContextDev::Models::WebScrapeResponse::KeyMetadata,
|
|
1838
|
+
ContextDev::Internal::AnyHash
|
|
1839
|
+
)
|
|
1840
|
+
end
|
|
1841
|
+
|
|
1842
|
+
# Credits used by this request.
|
|
1843
|
+
sig { returns(Integer) }
|
|
1844
|
+
attr_accessor :credits_consumed
|
|
1845
|
+
|
|
1846
|
+
# Credits remaining for your organization.
|
|
1847
|
+
sig { returns(Integer) }
|
|
1848
|
+
attr_accessor :credits_remaining
|
|
1849
|
+
|
|
1850
|
+
# Credit usage, included whenever a valid API key is provided.
|
|
1851
|
+
sig do
|
|
1852
|
+
params(credits_consumed: Integer, credits_remaining: Integer).returns(
|
|
1853
|
+
T.attached_class
|
|
1854
|
+
)
|
|
1855
|
+
end
|
|
1856
|
+
def self.new(
|
|
1857
|
+
# Credits used by this request.
|
|
1858
|
+
credits_consumed:,
|
|
1859
|
+
# Credits remaining for your organization.
|
|
1860
|
+
credits_remaining:
|
|
1861
|
+
)
|
|
1862
|
+
end
|
|
1863
|
+
|
|
1864
|
+
sig do
|
|
1865
|
+
override.returns(
|
|
1866
|
+
{ credits_consumed: Integer, credits_remaining: Integer }
|
|
1867
|
+
)
|
|
1868
|
+
end
|
|
1869
|
+
def to_hash
|
|
1870
|
+
end
|
|
1871
|
+
end
|
|
1872
|
+
end
|
|
1873
|
+
end
|
|
1874
|
+
end
|