puppeteer-ruby 0.0.16 → 0.0.17

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 38a6ae4190bd04cbacb863d04f9862ebc8a37c6811fbfd690426ba051d5ea5d4
4
- data.tar.gz: 60b61e143e63ed5e42b0bb6f3d9e5c27262fd2f51064c185e491056a5081707d
3
+ metadata.gz: 2277fda99720c2566927af9a2acfc56da2b8e87ee10521871c368fd4a05649b2
4
+ data.tar.gz: 59636e168935b0fb6c964cd62355ae3becf8199ed2ee1af58cb512ccacc9d7cb
5
5
  SHA512:
6
- metadata.gz: fc3ab652476ee319fab2d691173a0175d4b03d72346329f2fb855a142c3090693f1fb5cfa52abb4badbfbadc7d4eec5028a295f63fb7ddd3e362321564a96b7c
7
- data.tar.gz: 6de2484b1b939c3cab1bfa48bb2225c54686f13e7901f3df086d8e5c7b18aa9fc62afb5fd9a785a3fbbf12d2aef50cde1d085f3564ce9afab996f80a39c64936
6
+ metadata.gz: b45495a2ae160e740e242bc04bb81bfa493c1101583393f78e8e7ff3d065c00594fe0196b8225ac73e281a17428127597d11c8f8323ba6b58d64b437e2979d97
7
+ data.tar.gz: 72c9bd1ca17f37927ceb51a79904583c638066e29cdb08cc2534e77bcc7b3ee348e53e69546ecd579917bd6d8db9c4413d4a63cf617ffa33b8c69c756603439e
@@ -13,10 +13,10 @@ jobs:
13
13
  - run:
14
14
  name: rspec
15
15
  command: |
16
- bundle exec rspec --profile 10 \
16
+ DEBUG=1 bundle exec rspec --profile 10 \
17
17
  --format RspecJunitFormatter \
18
18
  --out test_results/rspec.xml \
19
- --format progress
19
+ --format documentation
20
20
 
21
21
  deploy:
22
22
  docker:
@@ -2,6 +2,8 @@ require 'concurrent'
2
2
 
3
3
  class Puppeteer; end
4
4
 
5
+ require 'puppeteer/env'
6
+
5
7
  # Custom data types.
6
8
  require 'puppeteer/device'
7
9
  require 'puppeteer/errors'
@@ -168,7 +170,11 @@ class Puppeteer
168
170
  }.compact
169
171
  browser = launcher.connect(options)
170
172
  if block_given?
171
- yield(browser)
173
+ begin
174
+ yield(browser)
175
+ ensure
176
+ browser.disconnect
177
+ end
172
178
  else
173
179
  browser
174
180
  end
@@ -43,7 +43,7 @@ class Puppeteer::Browser
43
43
  @default_context = Puppeteer::BrowserContext.new(@connection, self, nil)
44
44
  @contexts = {}
45
45
  context_ids.each do |context_id|
46
- @contexts[context_id] = Puppeteer::BrowserContext.new(@connection, self. context_id)
46
+ @contexts[context_id] = Puppeteer::BrowserContext.new(@connection, self, context_id)
47
47
  end
48
48
  @targets = {}
49
49
  @connection.on_event 'Events.Connection.Disconnected' do
@@ -70,6 +70,15 @@ class Puppeteer::Browser
70
70
  add_event_listener(EVENT_MAPPINGS[event_name.to_sym], &block)
71
71
  end
72
72
 
73
+ # @param event_name [Symbol]
74
+ def once(event_name, &block)
75
+ unless EVENT_MAPPINGS.has_key?(event_name.to_sym)
76
+ raise ArgumentError.new("Unknown event name: #{event_name}. Known events are #{EVENT_MAPPINGS.keys.join(", ")}")
77
+ end
78
+
79
+ observe_first(EVENT_MAPPINGS[event_name.to_sym], &block)
80
+ end
81
+
73
82
  # @return [Puppeteer::BrowserRunner::BrowserProcess]
74
83
  def process
75
84
  @process
@@ -94,7 +103,7 @@ class Puppeteer::Browser
94
103
  # @param context_id [String]
95
104
  def dispose_context(context_id)
96
105
  @connection.send_message('Target.disposeBrowserContext', browserContextId: context_id)
97
- @contexts.remove(context_id)
106
+ @contexts.delete(context_id)
98
107
  end
99
108
 
100
109
  class TargetAlreadyExistError < StandardError
@@ -166,7 +175,7 @@ class Puppeteer::Browser
166
175
  end
167
176
 
168
177
  # @return [String]
169
- def websocket_endpoint
178
+ def ws_endpoint
170
179
  @connection.url
171
180
  end
172
181
 
@@ -196,7 +205,7 @@ class Puppeteer::Browser
196
205
 
197
206
  # @return {!Target}
198
207
  def target
199
- targets.first { |target| target.type == 'browser' }
208
+ targets.find { |target| target.type == 'browser' }
200
209
  end
201
210
 
202
211
  # used only in Target#opener
@@ -204,12 +213,11 @@ class Puppeteer::Browser
204
213
  @targets[target_id]
205
214
  end
206
215
 
207
- # @param {function(!Target):boolean} predicate
208
- # @param {{timeout?: number}=} options
209
- # @return {!Promise<!Target>}
216
+ # @param predicate [Proc(Puppeteer::Target -> Boolean)]
217
+ # @return [Puppeteer::Target]
210
218
  def wait_for_target(predicate:, timeout: nil)
211
219
  timeout_in_sec = (timeout || 30000).to_i / 1000.0
212
- existing_target = targets.first { |target| predicate.call(target) }
220
+ existing_target = targets.find { |target| predicate.call(target) }
213
221
  return existing_target if existing_target
214
222
 
215
223
  event_listening_ids = []
@@ -233,11 +241,18 @@ class Puppeteer::Browser
233
241
  else
234
242
  target_promise.value!
235
243
  end
244
+ rescue Timeout::Error
245
+ raise Puppeteer::TimeoutError.new("waiting for target failed: timeout #{timeout}ms exceeded")
236
246
  ensure
237
247
  remove_event_listener(*event_listening_ids)
238
248
  end
239
249
  end
240
250
 
251
+ # @!method async_wait_for_target(predicate:, timeout: nil)
252
+ #
253
+ # @param predicate [Proc(Puppeteer::Target -> Boolean)]
254
+ define_async_method :async_wait_for_target
255
+
241
256
  # @return {!Promise<!Array<!Puppeteer.Page>>}
242
257
  def pages
243
258
  browser_contexts.flat_map(&:pages)
@@ -266,7 +281,19 @@ class Puppeteer::Browser
266
281
  !@connection.closed?
267
282
  end
268
283
 
284
+ class Version
285
+ def initialize(hash)
286
+ @protocol_version = hash['protocolVersion']
287
+ @product = hash['product']
288
+ @revision = hash['revision']
289
+ @user_agent = hash['userAgent']
290
+ @js_version = hash['jsVersion']
291
+ end
292
+
293
+ attr_reader :protocol_version, :product, :revision, :user_agent, :js_version
294
+ end
295
+
269
296
  private def get_version
270
- @connection.send_message('Browser.getVersion')
297
+ Version.new(@connection.send_message('Browser.getVersion'))
271
298
  end
272
299
  end
@@ -1,5 +1,6 @@
1
1
  class Puppeteer::BrowserContext
2
2
  include Puppeteer::EventCallbackable
3
+ using Puppeteer::DefineAsyncMethod
3
4
 
4
5
  # @param {!Puppeteer.Connection} connection
5
6
  # @param {!Browser} browser
@@ -10,14 +11,38 @@ class Puppeteer::BrowserContext
10
11
  @id = context_id
11
12
  end
12
13
 
14
+ EVENT_MAPPINGS = {
15
+ disconnected: 'Events.BrowserContext.Disconnected',
16
+ targetcreated: 'Events.BrowserContext.TargetCreated',
17
+ targetchanged: 'Events.BrowserContext.TargetChanged',
18
+ targetdestroyed: 'Events.BrowserContext.TargetDestroyed',
19
+ }
20
+
21
+ # @param event_name [Symbol] either of :disconnected, :targetcreated, :targetchanged, :targetdestroyed
22
+ def on(event_name, &block)
23
+ unless EVENT_MAPPINGS.has_key?(event_name.to_sym)
24
+ raise ArgumentError.new("Unknown event name: #{event_name}. Known events are #{EVENT_MAPPINGS.keys.join(", ")}")
25
+ end
26
+
27
+ add_event_listener(EVENT_MAPPINGS[event_name.to_sym], &block)
28
+ end
29
+
30
+ # @param event_name [Symbol]
31
+ def once(event_name, &block)
32
+ unless EVENT_MAPPINGS.has_key?(event_name.to_sym)
33
+ raise ArgumentError.new("Unknown event name: #{event_name}. Known events are #{EVENT_MAPPINGS.keys.join(", ")}")
34
+ end
35
+
36
+ observe_first(EVENT_MAPPINGS[event_name.to_sym], &block)
37
+ end
38
+
13
39
  # @return {!Array<!Target>} target
14
40
  def targets
15
41
  @browser.targets.select { |target| target.browser_context == self }
16
42
  end
17
43
 
18
- # @param {function(!Target):boolean} predicate
19
- # @param {{timeout?: number}=} options
20
- # @return {!Promise<!Target>}
44
+ # @param predicate [Proc(Puppeteer::Target -> Boolean)]
45
+ # @return [Puppeteer::Target]
21
46
  def wait_for_target(predicate:, timeout: nil)
22
47
  @browser.wait_for_target(
23
48
  predicate: ->(target) { target.browser_context == self && predicate.call(target) },
@@ -25,13 +50,18 @@ class Puppeteer::BrowserContext
25
50
  )
26
51
  end
27
52
 
53
+ # @!method async_wait_for_target(predicate:, timeout: nil)
54
+ #
55
+ # @param predicate [Proc(Puppeteer::Target -> Boolean)]
56
+ define_async_method :async_wait_for_target
57
+
28
58
  # @return {!Promise<!Array<!Puppeteer.Page>>}
29
59
  def pages
30
60
  targets.select { |target| target.type == 'page' }.map(&:page).reject { |page| !page }
31
61
  end
32
62
 
33
63
  def incognito?
34
- !@id
64
+ !!@id
35
65
  end
36
66
 
37
67
  # /**
@@ -82,7 +112,7 @@ class Puppeteer::BrowserContext
82
112
  end
83
113
 
84
114
  def close
85
- if !@id
115
+ unless @id
86
116
  raise 'Non-incognito profiles cannot be closed!'
87
117
  end
88
118
  @browser.dispose_context(@id)
@@ -49,13 +49,18 @@ class Puppeteer::Connection
49
49
  async_handle_message(message)
50
50
  end
51
51
  @transport.on_close do |reason, code|
52
- handle_close(reason, code)
52
+ handle_close
53
53
  end
54
54
 
55
55
  @sessions = {}
56
56
  @closed = false
57
57
  end
58
58
 
59
+ # used only in Browser#connected?
60
+ def closed?
61
+ @closed
62
+ end
63
+
59
64
  private def sleep_before_handling_message(message)
60
65
  # Puppeteer doesn't handle any Network monitoring responses.
61
66
  # So we don't have to sleep.
@@ -1,7 +1,7 @@
1
1
  require 'logger'
2
2
 
3
3
  module Puppeteer::DebugPrint
4
- if ['1', 'true'].include?(ENV['DEBUG'])
4
+ if Puppeteer.env.debug?
5
5
  def debug_puts(*args, **kwargs)
6
6
  @__debug_logger ||= Logger.new(STDOUT)
7
7
  @__debug_logger.debug(*args, **kwargs)
@@ -314,25 +314,28 @@ class Puppeteer::DOMWorld
314
314
  # }
315
315
  # }
316
316
 
317
+ class ElementNotFoundError < StandardError
318
+ def initialize(selector)
319
+ super("No node found for selector: #{selector}")
320
+ end
321
+ end
322
+
317
323
  # @param selector [String]
318
324
  # @param delay [Number]
319
325
  # @param button [String] "left"|"right"|"middle"
320
326
  # @param click_count [Number]
321
327
  def click(selector, delay: nil, button: nil, click_count: nil)
322
- handle = S(selector)
328
+ handle = S(selector) or raise ElementNotFoundError.new(selector)
323
329
  handle.click(delay: delay, button: button, click_count: click_count)
324
330
  handle.dispose
325
331
  end
326
332
 
327
- # /**
328
- # * @param {string} selector
329
- # */
330
- # async focus(selector) {
331
- # const handle = await this.$(selector);
332
- # assert(handle, 'No node found for selector: ' + selector);
333
- # await handle.focus();
334
- # await handle.dispose();
335
- # }
333
+ # @param selector [String]
334
+ def focus(selector)
335
+ handle = S(selector) or raise ElementNotFoundError.new(selector)
336
+ handle.focus
337
+ handle.dispose
338
+ end
336
339
 
337
340
  # /**
338
341
  # * @param {string} selector
@@ -347,7 +350,7 @@ class Puppeteer::DOMWorld
347
350
  # @param selector [String]
348
351
  # @return [Array<String>]
349
352
  def select(selector, *values)
350
- handle = S(selector)
353
+ handle = S(selector) or raise ElementNotFoundError.new(selector)
351
354
  result = handle.select(*values)
352
355
  handle.dispose
353
356
 
@@ -356,7 +359,7 @@ class Puppeteer::DOMWorld
356
359
 
357
360
  # @param selector [String]
358
361
  def tap(selector)
359
- handle = S(selector)
362
+ handle = S(selector) or raise ElementNotFoundError.new(selector)
360
363
  handle.tap
361
364
  handle.dispose
362
365
  end
@@ -365,7 +368,7 @@ class Puppeteer::DOMWorld
365
368
  # @param text [String]
366
369
  # @param delay [Number]
367
370
  def type_text(selector, text, delay: nil)
368
- handle = S(selector)
371
+ handle = S(selector) or raise ElementNotFoundError.new(selector)
369
372
  handle.type_text(text, delay: delay)
370
373
  handle.dispose
371
374
  end
@@ -23,7 +23,7 @@ class Puppeteer::ElementHandle < Puppeteer::JSHandle
23
23
  end
24
24
 
25
25
  def content_frame
26
- node_info = @remote_object.node_info
26
+ node_info = @remote_object.node_info(@client)
27
27
  frame_id = node_info['node']['frameId']
28
28
  if frame_id.is_a?(String)
29
29
  @frame_manager.frame(frame_id)
@@ -208,10 +208,11 @@ class Puppeteer::ElementHandle < Puppeteer::JSHandle
208
208
  define_async_method :async_type_text
209
209
 
210
210
  # @param key [String]
211
+ # @param text [String]
211
212
  # @param delay [number|nil]
212
- def press(key, delay: nil)
213
+ def press(key, delay: nil, text: nil)
213
214
  focus
214
- @page.keyboard.press(key, delay: delay)
215
+ @page.keyboard.press(key, delay: delay, text: text)
215
216
  end
216
217
 
217
218
  define_async_method :async_press
@@ -0,0 +1,18 @@
1
+ class Puppeteer::Env
2
+ # indicates whether DEBUG=1 is specified.
3
+ #
4
+ # @return [Boolean]
5
+ def debug?
6
+ ['1', 'true'].include?(ENV['DEBUG'].to_s)
7
+ end
8
+
9
+ def ci?
10
+ ['1', 'true'].include?(ENV['CI'].to_s)
11
+ end
12
+ end
13
+
14
+ class Puppeteer
15
+ def self.env
16
+ Puppeteer::Env.new
17
+ end
18
+ end
@@ -149,9 +149,10 @@ class Puppeteer::Keyboard
149
149
  define_async_method :async_type_text
150
150
 
151
151
  # @param key [String]
152
+ # @param text [String]
152
153
  # @return [Future]
153
- def press(key, delay: nil)
154
- down(key)
154
+ def press(key, delay: nil, text: nil)
155
+ down(key, text: text)
155
156
  if delay
156
157
  sleep(delay.to_i / 1000.0)
157
158
  end
@@ -94,5 +94,21 @@ class Puppeteer::Mouse
94
94
  )
95
95
  end
96
96
 
97
+ # Dispatches a `mousewheel` event.
98
+ #
99
+ # @param delta_x [Integer]
100
+ # @param delta_y [Integer]
101
+ def wheel(delta_x: 0, delta_y: 0)
102
+ @client.send_message('Input.dispatchMouseEvent',
103
+ type: 'mouseWheel',
104
+ x: @x,
105
+ y: @y,
106
+ deltaX: delta_x,
107
+ deltaY: delta_y,
108
+ modifiers: @keyboard.modifiers,
109
+ pointerType: 'mouse',
110
+ )
111
+ end
112
+
97
113
  define_async_method :async_up
98
114
  end
@@ -681,12 +681,14 @@ class Puppeteer::Page
681
681
  ).first
682
682
  end
683
683
 
684
- # @param timeout [number|nil]
685
- # @param wait_until [string|nil] 'load' | 'domcontentloaded' | 'networkidle0' | 'networkidle2'
686
684
  private def wait_for_navigation(timeout: nil, wait_until: nil)
687
685
  main_frame.send(:wait_for_navigation, timeout: timeout, wait_until: wait_until)
688
686
  end
689
687
 
688
+ # @!method async_wait_for_navigation(timeout: nil, wait_until: nil)
689
+ #
690
+ # @param timeout [number|nil]
691
+ # @param wait_until [string|nil] 'load' | 'domcontentloaded' | 'networkidle0' | 'networkidle2'
690
692
  define_async_method :async_wait_for_navigation
691
693
 
692
694
  private def wait_for_network_manager_event(event_name, predicate:, timeout:)
@@ -725,13 +727,6 @@ class Puppeteer::Page
725
727
  end
726
728
  end
727
729
 
728
- # - Waits until request URL matches
729
- # `wait_for_request(url: 'https://example.com/awesome')`
730
- # - Waits until request matches the given predicate
731
- # `wait_for_request(predicate: -> (req){ req.url.start_with?('https://example.com/search') })`
732
- #
733
- # @param url [String]
734
- # @param predicate [Proc(Puppeteer::Request -> Boolean)]
735
730
  private def wait_for_request(url: nil, predicate: nil, timeout: nil)
736
731
  if !url && !predicate
737
732
  raise ArgumentError.new('url or predicate must be specified')
@@ -752,10 +747,20 @@ class Puppeteer::Page
752
747
  )
753
748
  end
754
749
 
755
- define_async_method :async_wait_for_request
756
-
750
+ # @!method async_wait_for_request(url: nil, predicate: nil, timeout: nil)
751
+ #
752
+ # Waits until request URL matches or request matches the given predicate.
753
+ #
754
+ # Waits until request URL matches
755
+ # wait_for_request(url: 'https://example.com/awesome')
756
+ #
757
+ # Waits until request matches the given predicate
758
+ # wait_for_request(predicate: -> (req){ req.url.start_with?('https://example.com/search') })
759
+ #
757
760
  # @param url [String]
758
761
  # @param predicate [Proc(Puppeteer::Request -> Boolean)]
762
+ define_async_method :async_wait_for_request
763
+
759
764
  private def wait_for_response(url: nil, predicate: nil, timeout: nil)
760
765
  if !url && !predicate
761
766
  raise ArgumentError.new('url or predicate must be specified')
@@ -776,6 +781,10 @@ class Puppeteer::Page
776
781
  )
777
782
  end
778
783
 
784
+ # @!method async_wait_for_response(url: nil, predicate: nil, timeout: nil)
785
+ #
786
+ # @param url [String]
787
+ # @param predicate [Proc(Puppeteer::Request -> Boolean)]
779
788
  define_async_method :async_wait_for_response
780
789
 
781
790
  # @param timeout [number|nil]
@@ -1071,8 +1080,19 @@ class Puppeteer::Page
1071
1080
  define_async_method :async_select
1072
1081
 
1073
1082
  # @param selector [String]
1074
- def tap(selector)
1075
- main_frame.tap(selector)
1083
+ def tap(selector: nil, &block)
1084
+ # resolves double meaning of tap.
1085
+ if selector.nil? && block
1086
+ # Original usage of Object#tap.
1087
+ #
1088
+ # browser.new_page.tap do |page|
1089
+ # ...
1090
+ # end
1091
+ super(&block)
1092
+ else
1093
+ # Puppeteer's Page#tap.
1094
+ main_frame.tap(selector)
1095
+ end
1076
1096
  end
1077
1097
 
1078
1098
  define_async_method :async_tap
@@ -106,17 +106,15 @@ class Puppeteer::Request
106
106
  #
107
107
  # Example:
108
108
  #
109
- # ````
110
- # page.on 'request' do |req|
111
- # # Override headers
112
- # headers = req.headers.merge(
113
- # foo: 'bar', # set "foo" header
114
- # origin: nil, # remove "origin" header
115
- # )
116
- # req.continue(headers: headers)
117
- # end
118
- # ```
119
- #`
109
+ # page.on 'request' do |req|
110
+ # # Override headers
111
+ # headers = req.headers.merge(
112
+ # foo: 'bar', # set "foo" header
113
+ # origin: nil, # remove "origin" header
114
+ # )
115
+ # req.continue(headers: headers)
116
+ # end
117
+ #
120
118
  # @param error_code [String|Symbol]
121
119
  def continue(url: nil, method: nil, post_data: nil, headers: nil)
122
120
  # Request interception is not supported for data: urls.
@@ -152,15 +150,13 @@ class Puppeteer::Request
152
150
  #
153
151
  # Example:
154
152
  #
155
- # ```
156
- # page.on 'request' do |req|
157
- # req.respond(
158
- # status: 404,
159
- # content_type: 'text/plain',
160
- # body: 'Not Found!'
161
- # )
162
- # end
163
- # ````
153
+ # page.on 'request' do |req|
154
+ # req.respond(
155
+ # status: 404,
156
+ # content_type: 'text/plain',
157
+ # body: 'Not Found!'
158
+ # )
159
+ # end
164
160
  #
165
161
  # @param status [Integer]
166
162
  # @param headers [Hash<String, String>]
@@ -211,16 +207,14 @@ class Puppeteer::Request
211
207
  #
212
208
  # Example:
213
209
  #
214
- # ````
215
- # page.on 'request' do |req|
216
- # if req.url.include?("porn")
217
- # req.abort
218
- # else
219
- # req.continue
210
+ # page.on 'request' do |req|
211
+ # if req.url.include?("porn")
212
+ # req.abort
213
+ # else
214
+ # req.continue
215
+ # end
220
216
  # end
221
- # end
222
- # ```
223
- #`
217
+ #
224
218
  # @param error_code [String|Symbol]
225
219
  def abort(error_code: :failed)
226
220
  # Request interception is not supported for data: urls.
@@ -1,3 +1,3 @@
1
1
  class Puppeteer
2
- VERSION = '0.0.16'
2
+ VERSION = '0.0.17'
3
3
  end
@@ -16,10 +16,14 @@ class Puppeteer::WebSocket
16
16
 
17
17
  def write(data)
18
18
  @socket.write(data)
19
+ rescue Errno::EPIPE
20
+ raise EOFError.new('already closed')
19
21
  end
20
22
 
21
23
  def readpartial(maxlen = 1024)
22
24
  @socket.readpartial(maxlen)
25
+ rescue Errno::ECONNRESET
26
+ raise EOFError.new('closed by remote')
23
27
  end
24
28
  end
25
29
 
@@ -40,6 +44,9 @@ class Puppeteer::WebSocket
40
44
  rescue EOFError
41
45
  # Google Chrome was gone.
42
46
  # We have nothing todo. Just finish polling.
47
+ if @ready_state < STATE_CLOSING
48
+ handle_on_close(reason: 'Going Away', code: 1001)
49
+ end
43
50
  end
44
51
  end
45
52
 
@@ -28,5 +28,6 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency 'rspec_junit_formatter' # for CircleCI.
29
29
  spec.add_development_dependency 'rubocop', '~> 0.86.0'
30
30
  spec.add_development_dependency 'rubocop-rspec'
31
+ spec.add_development_dependency 'sinatra'
31
32
  spec.add_development_dependency 'yard'
32
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppeteer-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.16
4
+ version: 0.0.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - YusukeIwaki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-12 00:00:00.000000000 Z
11
+ date: 2020-07-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: sinatra
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: yard
155
169
  requirement: !ruby/object:Gem::Requirement
@@ -203,6 +217,7 @@ files:
203
217
  - lib/puppeteer/element_handle/box_model.rb
204
218
  - lib/puppeteer/element_handle/point.rb
205
219
  - lib/puppeteer/emulation_manager.rb
220
+ - lib/puppeteer/env.rb
206
221
  - lib/puppeteer/errors.rb
207
222
  - lib/puppeteer/event_callbackable.rb
208
223
  - lib/puppeteer/execution_context.rb