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.
@@ -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,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ScreenshotScout
4
+ VERSION = "0.1.0.rc1"
5
+ 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: []