screenshotscout 0.1.0.rc1
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 +7 -0
- data/LICENSE +21 -0
- data/README.md +286 -0
- data/examples/README.md +43 -0
- data/examples/binary.rb +12 -0
- data/examples/capture_url.rb +10 -0
- data/examples/json.rb +13 -0
- data/lib/screenshotscout/capture_options.rb +37 -0
- data/lib/screenshotscout/capture_values.rb +73 -0
- data/lib/screenshotscout/client.rb +230 -0
- data/lib/screenshotscout/errors.rb +59 -0
- data/lib/screenshotscout/internal/ecma_script_number_formatter.rb +52 -0
- data/lib/screenshotscout/internal/json_codec.rb +43 -0
- data/lib/screenshotscout/internal/serializer.rb +227 -0
- data/lib/screenshotscout/responses.rb +83 -0
- data/lib/screenshotscout/transport.rb +58 -0
- data/lib/screenshotscout/version.rb +5 -0
- data/lib/screenshotscout.rb +12 -0
- data/sig/screenshotscout.rbs +350 -0
- metadata +116 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "net/http"
|
|
4
|
+
require "uri"
|
|
5
|
+
|
|
6
|
+
module ScreenshotScout
|
|
7
|
+
# The request object passed to an injected transport's #call method.
|
|
8
|
+
class TransportRequest
|
|
9
|
+
attr_reader :method, :url, :headers, :body
|
|
10
|
+
|
|
11
|
+
def initialize(method:, url:, headers:, body: nil)
|
|
12
|
+
@method = method.dup.freeze
|
|
13
|
+
@url = url.dup.freeze
|
|
14
|
+
@headers = headers.to_h do |name, value|
|
|
15
|
+
[name.to_s.dup.freeze, value.to_s.dup.freeze]
|
|
16
|
+
end.freeze
|
|
17
|
+
@body = body&.dup&.freeze
|
|
18
|
+
freeze
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Small default adapter. It owns each Net::HTTP session that it opens.
|
|
23
|
+
class NetHttpTransport
|
|
24
|
+
def call(request)
|
|
25
|
+
uri = URI.parse(request.url)
|
|
26
|
+
net_request = build_request(uri, request)
|
|
27
|
+
http = Net::HTTP.new(uri.host, uri.port, nil)
|
|
28
|
+
http.use_ssl = uri.scheme == "https"
|
|
29
|
+
http.max_retries = 0
|
|
30
|
+
response = http.start { |session| session.request(net_request) }
|
|
31
|
+
|
|
32
|
+
RawResponse.new(
|
|
33
|
+
status: response.code.to_i,
|
|
34
|
+
reason_phrase: response.message.to_s,
|
|
35
|
+
headers: response.to_hash,
|
|
36
|
+
content_type: response["content-type"],
|
|
37
|
+
body: response.body || String.new(encoding: Encoding::BINARY)
|
|
38
|
+
)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
def build_request(uri, request)
|
|
44
|
+
net_request = case request.method
|
|
45
|
+
when CaptureHttpMethod::GET
|
|
46
|
+
Net::HTTP::Get.new(uri)
|
|
47
|
+
when CaptureHttpMethod::POST
|
|
48
|
+
Net::HTTP::Post.new(uri)
|
|
49
|
+
else
|
|
50
|
+
raise ArgumentError, "Unsupported HTTP method #{request.method.inspect}."
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
request.headers.each { |name, value| net_request[name] = value }
|
|
54
|
+
net_request.body = request.body unless request.body.nil?
|
|
55
|
+
net_request
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "screenshotscout/version"
|
|
4
|
+
require_relative "screenshotscout/capture_values"
|
|
5
|
+
require_relative "screenshotscout/errors"
|
|
6
|
+
require_relative "screenshotscout/capture_options"
|
|
7
|
+
require_relative "screenshotscout/responses"
|
|
8
|
+
require_relative "screenshotscout/transport"
|
|
9
|
+
require_relative "screenshotscout/internal/ecma_script_number_formatter"
|
|
10
|
+
require_relative "screenshotscout/internal/json_codec"
|
|
11
|
+
require_relative "screenshotscout/internal/serializer"
|
|
12
|
+
require_relative "screenshotscout/client"
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
module ScreenshotScout
|
|
2
|
+
VERSION: String
|
|
3
|
+
|
|
4
|
+
type capture_http_method = "GET" | "POST"
|
|
5
|
+
type number = Integer | Float
|
|
6
|
+
type json_value = nil | bool | Integer | Float | String | Array[json_value] | Hash[String, json_value]
|
|
7
|
+
|
|
8
|
+
module CaptureHttpMethod
|
|
9
|
+
GET: "GET"
|
|
10
|
+
POST: "POST"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
module CaptureFormat
|
|
14
|
+
GIF: String
|
|
15
|
+
JPEG: String
|
|
16
|
+
JPG: String
|
|
17
|
+
PDF: String
|
|
18
|
+
PNG: String
|
|
19
|
+
TIFF: String
|
|
20
|
+
WEBP: String
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
module CaptureResponseType
|
|
24
|
+
BINARY: String
|
|
25
|
+
JSON: String
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
module CaptureWaitUntil
|
|
29
|
+
DOM_CONTENT_LOADED: String
|
|
30
|
+
LOAD: String
|
|
31
|
+
NETWORK_IDLE_0: String
|
|
32
|
+
NETWORK_IDLE_2: String
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
module CaptureMediaType
|
|
36
|
+
PRINT: String
|
|
37
|
+
SCREEN: String
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
module CaptureColorScheme
|
|
41
|
+
AUTO: String
|
|
42
|
+
DARK: String
|
|
43
|
+
LIGHT: String
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
module CaptureImageMode
|
|
47
|
+
FILL: String
|
|
48
|
+
FIT: String
|
|
49
|
+
STRETCH: String
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
module CaptureImageAnchor
|
|
53
|
+
BOTTOM: String
|
|
54
|
+
BOTTOM_LEFT: String
|
|
55
|
+
BOTTOM_RIGHT: String
|
|
56
|
+
CENTER: String
|
|
57
|
+
LEFT: String
|
|
58
|
+
RIGHT: String
|
|
59
|
+
TOP: String
|
|
60
|
+
TOP_LEFT: String
|
|
61
|
+
TOP_RIGHT: String
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
module CapturePdfPaperFormat
|
|
65
|
+
A3: String
|
|
66
|
+
A4: String
|
|
67
|
+
CONTENT: String
|
|
68
|
+
LEGAL: String
|
|
69
|
+
LETTER: String
|
|
70
|
+
TABLOID: String
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
module CaptureStorageMode
|
|
74
|
+
EXTERNAL: String
|
|
75
|
+
MANAGED: String
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
class CaptureOptions
|
|
79
|
+
attr_reader format: String?
|
|
80
|
+
attr_reader response_type: String?
|
|
81
|
+
attr_reader country: String?
|
|
82
|
+
attr_reader proxy: String?
|
|
83
|
+
attr_reader geolocation_latitude: number?
|
|
84
|
+
attr_reader geolocation_longitude: number?
|
|
85
|
+
attr_reader geolocation_accuracy: number?
|
|
86
|
+
attr_reader cookies: Array[String]?
|
|
87
|
+
attr_reader headers: Array[String]?
|
|
88
|
+
attr_reader timeout: Integer?
|
|
89
|
+
attr_reader wait_until: String?
|
|
90
|
+
attr_reader navigation_timeout: Integer?
|
|
91
|
+
attr_reader delay: Integer?
|
|
92
|
+
attr_reader device: String?
|
|
93
|
+
attr_reader device_viewport_width: Integer?
|
|
94
|
+
attr_reader device_viewport_height: Integer?
|
|
95
|
+
attr_reader device_scale_factor: number?
|
|
96
|
+
attr_reader device_is_mobile: bool?
|
|
97
|
+
attr_reader device_has_touch: bool?
|
|
98
|
+
attr_reader device_user_agent: String?
|
|
99
|
+
attr_reader timezone: String?
|
|
100
|
+
attr_reader media_type: String?
|
|
101
|
+
attr_reader color_scheme: String?
|
|
102
|
+
attr_reader reduced_motion: bool?
|
|
103
|
+
attr_reader full_page: bool?
|
|
104
|
+
attr_reader full_page_pre_scroll: bool?
|
|
105
|
+
attr_reader full_page_pre_scroll_step: Integer?
|
|
106
|
+
attr_reader full_page_pre_scroll_step_delay: Integer?
|
|
107
|
+
attr_reader full_page_max_height: Integer?
|
|
108
|
+
attr_reader block_cookie_banners: bool?
|
|
109
|
+
attr_reader block_ads: bool?
|
|
110
|
+
attr_reader block_chat_widgets: bool?
|
|
111
|
+
attr_reader hide_selectors: Array[String]?
|
|
112
|
+
attr_reader click_selectors: Array[String]?
|
|
113
|
+
attr_reader click_all_selectors: Array[String]?
|
|
114
|
+
attr_reader inject_css: Array[String]?
|
|
115
|
+
attr_reader inject_js: Array[String]?
|
|
116
|
+
attr_reader bypass_csp: bool?
|
|
117
|
+
attr_reader selector: String?
|
|
118
|
+
attr_reader clip_x: Integer?
|
|
119
|
+
attr_reader clip_y: Integer?
|
|
120
|
+
attr_reader clip_width: Integer?
|
|
121
|
+
attr_reader clip_height: Integer?
|
|
122
|
+
attr_reader image_width: Integer?
|
|
123
|
+
attr_reader image_height: Integer?
|
|
124
|
+
attr_reader image_mode: String?
|
|
125
|
+
attr_reader image_anchor: String?
|
|
126
|
+
attr_reader image_allow_upscale: bool?
|
|
127
|
+
attr_reader image_background: String?
|
|
128
|
+
attr_reader image_quality: Integer?
|
|
129
|
+
attr_reader pdf_paper_format: String?
|
|
130
|
+
attr_reader pdf_landscape: bool?
|
|
131
|
+
attr_reader pdf_print_background: bool?
|
|
132
|
+
attr_reader pdf_margin: String?
|
|
133
|
+
attr_reader pdf_margin_top: String?
|
|
134
|
+
attr_reader pdf_margin_right: String?
|
|
135
|
+
attr_reader pdf_margin_bottom: String?
|
|
136
|
+
attr_reader pdf_margin_left: String?
|
|
137
|
+
attr_reader pdf_scale: number?
|
|
138
|
+
attr_reader cache: bool?
|
|
139
|
+
attr_reader cache_ttl: Integer?
|
|
140
|
+
attr_reader cache_key: String?
|
|
141
|
+
attr_reader storage_mode: String?
|
|
142
|
+
attr_reader storage_endpoint: String?
|
|
143
|
+
attr_reader storage_bucket: String?
|
|
144
|
+
attr_reader storage_region: String?
|
|
145
|
+
attr_reader storage_object_key: String?
|
|
146
|
+
|
|
147
|
+
def initialize: (
|
|
148
|
+
?format: String?,
|
|
149
|
+
?response_type: String?,
|
|
150
|
+
?country: String?,
|
|
151
|
+
?proxy: String?,
|
|
152
|
+
?geolocation_latitude: number?,
|
|
153
|
+
?geolocation_longitude: number?,
|
|
154
|
+
?geolocation_accuracy: number?,
|
|
155
|
+
?cookies: Array[String]?,
|
|
156
|
+
?headers: Array[String]?,
|
|
157
|
+
?timeout: Integer?,
|
|
158
|
+
?wait_until: String?,
|
|
159
|
+
?navigation_timeout: Integer?,
|
|
160
|
+
?delay: Integer?,
|
|
161
|
+
?device: String?,
|
|
162
|
+
?device_viewport_width: Integer?,
|
|
163
|
+
?device_viewport_height: Integer?,
|
|
164
|
+
?device_scale_factor: number?,
|
|
165
|
+
?device_is_mobile: bool?,
|
|
166
|
+
?device_has_touch: bool?,
|
|
167
|
+
?device_user_agent: String?,
|
|
168
|
+
?timezone: String?,
|
|
169
|
+
?media_type: String?,
|
|
170
|
+
?color_scheme: String?,
|
|
171
|
+
?reduced_motion: bool?,
|
|
172
|
+
?full_page: bool?,
|
|
173
|
+
?full_page_pre_scroll: bool?,
|
|
174
|
+
?full_page_pre_scroll_step: Integer?,
|
|
175
|
+
?full_page_pre_scroll_step_delay: Integer?,
|
|
176
|
+
?full_page_max_height: Integer?,
|
|
177
|
+
?block_cookie_banners: bool?,
|
|
178
|
+
?block_ads: bool?,
|
|
179
|
+
?block_chat_widgets: bool?,
|
|
180
|
+
?hide_selectors: Array[String]?,
|
|
181
|
+
?click_selectors: Array[String]?,
|
|
182
|
+
?click_all_selectors: Array[String]?,
|
|
183
|
+
?inject_css: Array[String]?,
|
|
184
|
+
?inject_js: Array[String]?,
|
|
185
|
+
?bypass_csp: bool?,
|
|
186
|
+
?selector: String?,
|
|
187
|
+
?clip_x: Integer?,
|
|
188
|
+
?clip_y: Integer?,
|
|
189
|
+
?clip_width: Integer?,
|
|
190
|
+
?clip_height: Integer?,
|
|
191
|
+
?image_width: Integer?,
|
|
192
|
+
?image_height: Integer?,
|
|
193
|
+
?image_mode: String?,
|
|
194
|
+
?image_anchor: String?,
|
|
195
|
+
?image_allow_upscale: bool?,
|
|
196
|
+
?image_background: String?,
|
|
197
|
+
?image_quality: Integer?,
|
|
198
|
+
?pdf_paper_format: String?,
|
|
199
|
+
?pdf_landscape: bool?,
|
|
200
|
+
?pdf_print_background: bool?,
|
|
201
|
+
?pdf_margin: String?,
|
|
202
|
+
?pdf_margin_top: String?,
|
|
203
|
+
?pdf_margin_right: String?,
|
|
204
|
+
?pdf_margin_bottom: String?,
|
|
205
|
+
?pdf_margin_left: String?,
|
|
206
|
+
?pdf_scale: number?,
|
|
207
|
+
?cache: bool?,
|
|
208
|
+
?cache_ttl: Integer?,
|
|
209
|
+
?cache_key: String?,
|
|
210
|
+
?storage_mode: String?,
|
|
211
|
+
?storage_endpoint: String?,
|
|
212
|
+
?storage_bucket: String?,
|
|
213
|
+
?storage_region: String?,
|
|
214
|
+
?storage_object_key: String?
|
|
215
|
+
) -> void
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
class RawResponse
|
|
219
|
+
attr_reader status: Integer
|
|
220
|
+
attr_reader reason_phrase: String
|
|
221
|
+
attr_reader headers: Hash[String, Array[String]]
|
|
222
|
+
attr_reader content_type: String?
|
|
223
|
+
attr_reader body: String
|
|
224
|
+
|
|
225
|
+
def initialize: (
|
|
226
|
+
status: Integer,
|
|
227
|
+
reason_phrase: String,
|
|
228
|
+
headers: Hash[String, Array[String]],
|
|
229
|
+
content_type: String?,
|
|
230
|
+
body: String
|
|
231
|
+
) -> void
|
|
232
|
+
|
|
233
|
+
def header: (String name) -> Array[String]
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
class CaptureResponse
|
|
237
|
+
attr_reader raw_response: RawResponse
|
|
238
|
+
def initialize: (raw_response: RawResponse) -> void
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
class BinaryCaptureResponse < CaptureResponse
|
|
242
|
+
attr_reader bytes: String
|
|
243
|
+
attr_reader screenshot_url: String?
|
|
244
|
+
attr_reader screenshot_url_expires_at: String?
|
|
245
|
+
attr_reader cache_status: String?
|
|
246
|
+
|
|
247
|
+
def initialize: (
|
|
248
|
+
raw_response: RawResponse,
|
|
249
|
+
screenshot_url: String?,
|
|
250
|
+
screenshot_url_expires_at: String?,
|
|
251
|
+
cache_status: String?
|
|
252
|
+
) -> void
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
class CaptureResult
|
|
256
|
+
attr_reader screenshot_url: String?
|
|
257
|
+
attr_reader screenshot_url_expires_at: String?
|
|
258
|
+
attr_reader cache_status: String?
|
|
259
|
+
attr_reader additional_fields: Hash[String, json_value]
|
|
260
|
+
|
|
261
|
+
def initialize: (
|
|
262
|
+
screenshot_url: String?,
|
|
263
|
+
screenshot_url_expires_at: String?,
|
|
264
|
+
cache_status: String?,
|
|
265
|
+
additional_fields: Hash[String, json_value]
|
|
266
|
+
) -> void
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
class JsonCaptureResponse < CaptureResponse
|
|
270
|
+
attr_reader result: CaptureResult
|
|
271
|
+
def initialize: (result: CaptureResult, raw_response: RawResponse) -> void
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
class TransportRequest
|
|
275
|
+
attr_reader method: capture_http_method
|
|
276
|
+
attr_reader url: String
|
|
277
|
+
attr_reader headers: Hash[String, String]
|
|
278
|
+
attr_reader body: String?
|
|
279
|
+
|
|
280
|
+
def initialize: (
|
|
281
|
+
method: capture_http_method,
|
|
282
|
+
url: String,
|
|
283
|
+
headers: Hash[String, String],
|
|
284
|
+
?body: String?
|
|
285
|
+
) -> void
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
interface _Transport
|
|
289
|
+
def call: (TransportRequest request) -> RawResponse
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
class NetHttpTransport
|
|
293
|
+
include _Transport
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
class Client
|
|
297
|
+
def initialize: (
|
|
298
|
+
access_key: String,
|
|
299
|
+
?secret_key: String?,
|
|
300
|
+
?transport: _Transport?
|
|
301
|
+
) -> void
|
|
302
|
+
|
|
303
|
+
def capture: (
|
|
304
|
+
String url,
|
|
305
|
+
?CaptureOptions? options,
|
|
306
|
+
?method: capture_http_method?
|
|
307
|
+
) -> CaptureResponse
|
|
308
|
+
|
|
309
|
+
def build_capture_url: (String url, ?CaptureOptions? options) -> String
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
class Error < StandardError
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
class ConfigurationError < Error
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
class SerializationError < Error
|
|
319
|
+
attr_reader option: (String | Symbol)?
|
|
320
|
+
def initialize: (String message, ?option: (String | Symbol)?) -> void
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
class TransportError < Error
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
class APIError < Error
|
|
327
|
+
attr_reader status: Integer
|
|
328
|
+
attr_reader error_code: String?
|
|
329
|
+
attr_reader error_message: String?
|
|
330
|
+
attr_reader errors: Array[json_value]?
|
|
331
|
+
attr_reader response_body: json_value
|
|
332
|
+
attr_reader raw_response: RawResponse
|
|
333
|
+
|
|
334
|
+
def initialize: (
|
|
335
|
+
raw_response: RawResponse,
|
|
336
|
+
response_body_available: bool,
|
|
337
|
+
?response_body: json_value,
|
|
338
|
+
?error_code: String?,
|
|
339
|
+
?error_message: String?,
|
|
340
|
+
?errors: Array[json_value]?
|
|
341
|
+
) -> void
|
|
342
|
+
|
|
343
|
+
def response_body?: () -> bool
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
class ResponseDecodingError < Error
|
|
347
|
+
attr_reader raw_response: RawResponse
|
|
348
|
+
def initialize: (String message, RawResponse raw_response) -> void
|
|
349
|
+
end
|
|
350
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: screenshotscout
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0.rc1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Oleksii Velykyi
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: minitest
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - "~>"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '6.0'
|
|
19
|
+
type: :development
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - "~>"
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '6.0'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: rake
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - "~>"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '13.4'
|
|
33
|
+
type: :development
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '13.4'
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: rbs
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - "~>"
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '4.0'
|
|
47
|
+
type: :development
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - "~>"
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '4.0'
|
|
54
|
+
- !ruby/object:Gem::Dependency
|
|
55
|
+
name: rubocop
|
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - "~>"
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '1.88'
|
|
61
|
+
type: :development
|
|
62
|
+
prerelease: false
|
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - "~>"
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '1.88'
|
|
68
|
+
description: A small, manually written Ruby client for Screenshot Scout.
|
|
69
|
+
executables: []
|
|
70
|
+
extensions: []
|
|
71
|
+
extra_rdoc_files: []
|
|
72
|
+
files:
|
|
73
|
+
- LICENSE
|
|
74
|
+
- README.md
|
|
75
|
+
- examples/README.md
|
|
76
|
+
- examples/binary.rb
|
|
77
|
+
- examples/capture_url.rb
|
|
78
|
+
- examples/json.rb
|
|
79
|
+
- lib/screenshotscout.rb
|
|
80
|
+
- lib/screenshotscout/capture_options.rb
|
|
81
|
+
- lib/screenshotscout/capture_values.rb
|
|
82
|
+
- lib/screenshotscout/client.rb
|
|
83
|
+
- lib/screenshotscout/errors.rb
|
|
84
|
+
- lib/screenshotscout/internal/ecma_script_number_formatter.rb
|
|
85
|
+
- lib/screenshotscout/internal/json_codec.rb
|
|
86
|
+
- lib/screenshotscout/internal/serializer.rb
|
|
87
|
+
- lib/screenshotscout/responses.rb
|
|
88
|
+
- lib/screenshotscout/transport.rb
|
|
89
|
+
- lib/screenshotscout/version.rb
|
|
90
|
+
- sig/screenshotscout.rbs
|
|
91
|
+
homepage: https://screenshotscout.com
|
|
92
|
+
licenses:
|
|
93
|
+
- MIT
|
|
94
|
+
metadata:
|
|
95
|
+
bug_tracker_uri: https://github.com/screenshotscout/screenshotscout-ruby/issues
|
|
96
|
+
homepage_uri: https://screenshotscout.com
|
|
97
|
+
rubygems_mfa_required: 'true'
|
|
98
|
+
source_code_uri: https://github.com/screenshotscout/screenshotscout-ruby
|
|
99
|
+
rdoc_options: []
|
|
100
|
+
require_paths:
|
|
101
|
+
- lib
|
|
102
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
103
|
+
requirements:
|
|
104
|
+
- - ">="
|
|
105
|
+
- !ruby/object:Gem::Version
|
|
106
|
+
version: '3.4'
|
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
|
+
requirements:
|
|
109
|
+
- - ">="
|
|
110
|
+
- !ruby/object:Gem::Version
|
|
111
|
+
version: '0'
|
|
112
|
+
requirements: []
|
|
113
|
+
rubygems_version: 4.0.16
|
|
114
|
+
specification_version: 4
|
|
115
|
+
summary: Official Ruby SDK for the Screenshot Scout screenshot API.
|
|
116
|
+
test_files: []
|