xautobrowse 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 934b17bd6829bbaaacf46da1ce1444a4b1d8b7355efc713a06487b4b9d8b95b5
4
- data.tar.gz: '04158b63de03ada2a43e4b387df7f17e7d4502afdabdc259356f5bce3a3bdc1a'
3
+ metadata.gz: a25f8dde31e35a29de9110a5e68909f39c88e5d54f9e841774103606dec66399
4
+ data.tar.gz: 4b3d2f68990ccad4ea1b2ea68ccbb95901cc9ab58ddced00e85c8268437007ea
5
5
  SHA512:
6
- metadata.gz: 0cad07687d933a1d62d1d8ca0263c733a418a9082ae4bd677a13619659418f2a670457d04d208f0f47de34ee8ec87703d07098d80e1569698f3937503691bb63
7
- data.tar.gz: 37b763e5bd4b668004870cd77261ceab2dc392f762c1d6e2ceeec4f67a5be11c90be60557740ed985b2fe7c572041941ace873e08f643ea746028fedc5b63c85
6
+ metadata.gz: e84fa69febe5df40b17b3bb28451e69c97fe27ad4c630673c52d3134eacefc46ac2609f15fc77bf6b30d0ce47226434c0bf8af55ca786352f50e2100deaa9644
7
+ data.tar.gz: 0ec8887dbecf4ee21190934d7099ae49b2e2d85cab4e2105325b721919367c539303affe8ce40624190c9ca79b1278af7b94b6771f3d31a6df908831bb9aa321
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/xautobrowse.rb CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
 
10
10
  # revision log:
11
-
11
+ # 9 Jun 2022: commented out the buggy redundant XDo::XWindow statements
12
12
  # 4 Sep 2019: feature: Added methods *slow_type* and *slow_tab*
13
13
  # 5 Sep 2018: feature: A new tab can now be opened if it does not exist.
14
14
  # 4 Sep 2018: feature: Tabs can now be traversed using the XTabbedWindow gem
@@ -49,36 +49,40 @@ require 'universal_dom_remote'
49
49
 
50
50
 
51
51
  class XAutoBrowse
52
-
52
+
53
53
  at_exit() do
54
-
54
+
55
55
  if @sps then
56
56
  puts 'shutting down ...'
57
57
  EventMachine.stop
58
58
  SPSPub.notice('shutdown', host: '127.0.0.1', port: '55000'); sleep 0.5
59
59
  end
60
-
60
+
61
61
  end
62
-
62
+
63
63
  class Window < XTabbedWindow
64
-
65
- def initialize(browser=nil, new_win: true, scan_tabs: false)
66
-
67
- @wm = WMCtrl.instance
68
-
64
+
65
+ def initialize(browser=nil, new_win: true, scan_tabs: false, debug: false)
66
+
67
+ @wm, @debug = WMCtrl.display, debug
68
+
69
69
  if browser then
70
-
70
+
71
71
  if new_win then
72
- spawn(browser.to_s); sleep 3
73
-
74
- id = XDo::XWindow.wait_for_window(browser.to_s)
75
72
 
76
- xwin = XDo::XWindow.new(id)
77
- title = xwin.title
78
- puts 'title: ' + title.inspect if @debug
73
+ puts 'ready to spawn' if @debug
74
+ spawn(browser.to_s);
75
+ sleep 3
76
+
77
+ #jr2022-06-09 puts 'waiting for window: ' + browser.to_s.inspect if @debug
78
+ #jr2022-06-09 id = XDo::XWindow.wait_for_window(browser.to_s)
79
+
80
+ #jr2022-06-09 xwin = XDo::XWindow.new(id)
81
+ #jr2022-06-09 title = xwin.title
82
+ #jr2022-06-09 puts 'title: ' + title.inspect if @debug
79
83
 
80
84
  # WMCtrl is used because XDo is problematic at trying to activate a window
81
-
85
+
82
86
  a = @wm.list_windows true
83
87
  puts 'a: ' + a.inspect if @debug
84
88
  r = a.reverse.find {|x| x[:title] =~ /#{browser}$/i}
@@ -89,173 +93,175 @@ class XAutoBrowse
89
93
  else
90
94
  a = @wm.list_windows true
91
95
  r = a.last
92
- end
93
-
96
+ end
97
+
94
98
  @id = r[:id]
95
99
 
96
- @x, @y, @width, @height = *r[:geometry]
100
+ @x, @y, @width, @height = *r[:geometry]
97
101
  sleep 4 unless browser
98
-
102
+
99
103
  end
100
-
104
+
101
105
  def activate()
102
106
  @wm.action_window(@id, :activate)
103
107
  end
104
-
108
+
105
109
  def height=(val)
106
110
  @height = val
107
111
  @wm.action_window(@id, :move_resize, 0, @x, @y, @width, @height)
108
- end
109
-
112
+ end
113
+
110
114
  def move(x,y)
111
115
  @x, @y = x, y
112
116
  @wm.action_window(@id, :move_resize, 0, @x, @y, @width, @height)
113
- end
114
-
117
+ end
118
+
115
119
  def resize_to(width, height)
116
120
  @width, @height = width, height
117
121
  @wm.action_window(@id, :move_resize, 0, @x, @y, @width, @height)
118
122
  end
119
-
123
+
120
124
  alias resize resize_to
121
125
 
122
126
  def width=(val)
123
127
  @width = val
124
128
  @wm.action_window(@id, :move_resize, 0, @x, @y, @width, @height)
125
- end
129
+ end
126
130
  end
127
-
131
+
128
132
  attr_reader :window
129
133
  attr_accessor :actions, :context
130
-
134
+
131
135
  # note: context is the parent of the document element e.g. frames[0]
132
-
133
-
134
-
135
- def initialize(browser= :firefox, new_window: true, debug: false,
136
- sps: false, clicks: {}, scan_tabs: !new_window,
136
+
137
+
138
+
139
+ def initialize(browser= :firefox, new_window: true, debug: false,
140
+ sps: false, clicks: {}, scan_tabs: !new_window,
137
141
  context: nil, text_fields: {})
138
142
 
139
143
  @browser, @debug, @sps, @clicks = browser.to_sym, debug, sps, clicks
140
144
  @new_window, @context, @text_fields = new_window, context, text_fields
141
-
142
- @window = Window.new(browser, new_win: new_window, scan_tabs: scan_tabs)
145
+
146
+ puts 'before Window.new' if @debug
147
+ @window = Window.new(browser, new_win: new_window, scan_tabs: scan_tabs,
148
+ debug: @debug)
143
149
 
144
150
  sleep 4 if new_window
145
-
151
+
146
152
  connect() if sps
147
-
153
+
148
154
  end
149
-
150
- # custom accesskey (e.g. CTRL+SHIFT+S) typically used to reference an
155
+
156
+ # custom accesskey (e.g. CTRL+SHIFT+S) typically used to reference an
151
157
  # element on the web page
152
158
  #
153
159
  def accesskey(key) send_keys(key.to_sym) end
154
-
155
- alias access_key accesskey
156
-
157
- # Attaches the SPS client to the web browser. The SPS broker must be
160
+
161
+ alias access_key accesskey
162
+
163
+ # Attaches the SPS client to the web browser. The SPS broker must be
158
164
  # started before the code can be attached. see start_broker()
159
165
  #
160
166
  def attach_console(autohide: true)
161
-
167
+
162
168
  @window.activate()
163
169
  open_web_console(); sleep 1
164
170
 
165
- clipboard = Clipboard.paste
171
+ clipboard = Clipboard.paste
166
172
  Clipboard.copy javascript(); sleep 1
167
173
  ctrl_v(); sleep 0.5; carriage_return()
168
-
174
+
169
175
  close_web_console() if autohide
170
176
  Clipboard.copy clipboard
171
-
177
+
172
178
  end
173
-
179
+
174
180
  def click(name)
175
-
176
- web_console do |x|
181
+
182
+ web_console do |x|
177
183
  x.enter [@context, @clicks[name]].compact.join('.') + '.click();'
178
184
  end
179
-
180
- end
181
-
185
+
186
+ end
187
+
182
188
  def close()
183
189
  ctrl_w()
184
190
  end
185
-
191
+
186
192
  alias exit close
187
-
193
+
188
194
  def close_web_console()
189
195
  @window.activate()
190
196
  ctrl_shift_i()
191
197
  end
192
-
198
+
193
199
  alias hide_web_console close_web_console
194
-
200
+
195
201
  def connect()
196
202
 
197
203
  start_broker(); sleep 4; connect_controller()
198
-
204
+
199
205
  end
200
-
206
+
201
207
  # Connects to the SPS broker to communicate with the web browser
202
208
  #
203
209
  def connect_controller()
204
-
210
+
205
211
  @udr = UniversalDomRemote.new debug: @debug
206
-
212
+
207
213
  end
208
-
214
+
209
215
  def copy_screen()
210
216
  select_all(); sleep 2; ctrl_c(); sleep 2; unselect_all()
211
- Clipboard.paste
217
+ Clipboard.paste
212
218
  end
213
-
219
+
214
220
  alias scrape_screen copy_screen
215
-
221
+
216
222
  def copy_source()
217
-
223
+
218
224
  view_source(); sleep 3
219
225
  select_all(); sleep 1
220
226
  ctrl_c() # copy the source code to the clipboard
221
227
  sleep 1
222
228
  ctrl_w() # close the viewsource window
223
-
229
+
224
230
  end
225
-
231
+
226
232
  # select all
227
233
  #
228
234
  def ctrl_a() send_keys(:ctrl_a) end
229
-
235
+
230
236
  # unselect all
231
237
  #
232
238
  def ctrl_shift_a()
233
239
 
234
240
  XDo::Keyboard.key_down('shift')
235
241
  send_keys(:ctrl_a)
236
- XDo::Keyboard.key_up('shift')
242
+ XDo::Keyboard.key_up('shift')
243
+
244
+ end
237
245
 
238
- end
239
-
240
246
  # copy
241
247
  #
242
248
  def ctrl_c() send_keys(:ctrl_c) end
243
-
249
+
244
250
  # jump to the location bar
245
251
  #
246
- def ctrl_l() send_keys(:ctrl_l) end
247
-
252
+ def ctrl_l() send_keys(:ctrl_l) end
253
+
248
254
  # view source code
249
255
  #
250
- def ctrl_u() send_keys(:ctrl_u) end
251
-
256
+ def ctrl_u() send_keys(:ctrl_u) end
257
+
252
258
  # paste
253
259
  #
254
260
  def ctrl_v() send_keys(:ctrl_v) end
255
-
261
+
256
262
  # close the current window
257
263
  #
258
- def ctrl_w() send_keys(:ctrl_w) end
264
+ def ctrl_w() send_keys(:ctrl_w) end
259
265
 
260
266
  # Chromium developer tools
261
267
  #
@@ -264,21 +270,21 @@ class XAutoBrowse
264
270
  # Firefox developer tools
265
271
  #
266
272
  def ctrl_shift_k() send_keys(:ctrl_shift_k) end
267
-
273
+
268
274
  # submit a form by pressing return
269
275
  #
270
276
  def go()
271
-
277
+
272
278
  if block_given? then
273
-
279
+
274
280
  @window.activate(); sleep 1; yield(self); carriage_return()
275
-
281
+
276
282
  end
277
-
283
+
278
284
  end
279
-
285
+
280
286
  def goto(url, attachconsole: true, new_tab: !@new_window)
281
-
287
+
282
288
  new_tab() if new_tab
283
289
  sleep 1; ctrl_l()
284
290
  sleep 2 if @new_window
@@ -289,139 +295,139 @@ class XAutoBrowse
289
295
  end
290
296
 
291
297
  def goto_tab(s, url=nil)
292
-
293
- if url then
298
+
299
+ if url then
294
300
  @window.goto_tab(s) { enter url}
295
301
  else
296
302
  @window.goto_tab(s)
297
303
  end
298
-
304
+
299
305
  end
300
-
306
+
301
307
  def carriage_return()
302
308
  @window.activate(); sleep 1; XDo::Keyboard.return
303
309
  end
304
-
310
+
305
311
  alias cr carriage_return
306
-
312
+
307
313
  def method_missing(method_name, *args)
308
314
  if method_name.to_s =~ /^alt/ then
309
315
  send_keys method_name
310
316
  end
311
- end
312
-
317
+ end
318
+
313
319
  def open_web_console()
314
-
320
+
315
321
  console = @browser == :firefox ? :ctrl_shift_k : :ctrl_shift_i
316
322
  method(console).call # web console
317
-
323
+
318
324
  sleep 2
319
-
325
+
320
326
  if block_given? then
321
327
  yield(self)
322
328
  close_web_console()
323
329
  end
324
-
330
+
325
331
  end
326
-
332
+
327
333
  alias web_console open_web_console
328
-
334
+
329
335
  def new_window()
330
336
  @window = Window.new
331
337
  end
332
-
338
+
333
339
  def new_tab()
334
340
  @window.new_tab
335
341
  end
336
-
342
+
337
343
  # Takes a screenshot of the web page. Images are stored in ~/Pictures
338
344
  #
339
345
  def screenshot(filename=Time.now\
340
346
  .strftime("Screenshot from %Y-%m-%d %d-%m-%y"))
341
-
342
- XDo::Keyboard.simulate('{print}');
343
- sleep 4;
347
+
348
+ XDo::Keyboard.simulate('{print}');
349
+ sleep 4;
344
350
  XDo::Keyboard.simulate("{down}")
345
- sleep 4;
346
- XDo::Keyboard.alt_s
351
+ sleep 4;
352
+ XDo::Keyboard.alt_s
347
353
  sleep 5;
348
354
  XDo::Keyboard.type filename
349
355
  sleep 3
350
356
  XDo::Keyboard.alt_s
351
357
  sleep 1
352
-
358
+
353
359
  end
354
-
360
+
355
361
  alias screen_capture screenshot
356
-
362
+
357
363
  def send(s)
358
364
  @udr.send s
359
365
  end
360
-
366
+
361
367
  def select_all()
362
368
  ctrl_a()
363
369
  end
364
-
370
+
365
371
  def unselect_all()
366
-
372
+
367
373
  @browser == :firefox ? (tab(); shift_tab()) : ctrl_shift_a()
368
-
374
+
369
375
  end
370
-
376
+
371
377
  def slow_tab(n=1, seconds: 0.5)
372
378
  n.times {XDo::Keyboard.simulate("{TAB}"); sleep seconds}
373
379
  end
374
-
380
+
375
381
  def slow_type(s, seconds: 0.6)
376
-
377
- #@window.activate();
382
+
383
+ #@window.activate();
378
384
  sleep 0.3
379
-
385
+
380
386
  s.split(//).each do |c|
381
387
  XDo::Keyboard.type(c)
382
388
  sleep seconds
383
389
  end
384
390
  end
385
391
 
386
-
392
+
387
393
  # Starts the simplepubsub broker
388
-
394
+
389
395
  def start_broker()
390
-
391
- Thread.new do
396
+
397
+ Thread.new do
392
398
  `ruby -r 'simplepubsub' -e "SimplePubSub::Broker.start port: '55000'"`
393
399
  end
394
-
400
+
395
401
  end
396
-
402
+
397
403
  def stop_broker()
398
404
  SPSPub.notice 'shutdown', host: '127.0.0.1', port: '55000'
399
405
  end
400
-
406
+
401
407
  def shift_tab(n=1)
402
-
408
+
403
409
  @window.activate()
404
410
  XDo::Keyboard.key_down('shift')
405
411
  XDo::Keyboard.simulate("{TAB}" * n)
406
412
  XDo::Keyboard.key_up('shift')
407
-
413
+
408
414
  end
409
-
415
+
410
416
  def tab(n=1)
411
417
  @window.activate(); XDo::Keyboard.simulate("{TAB}" * n)
412
418
  end
413
-
414
- # determines if the given tabbed window title exists
419
+
420
+ # determines if the given tabbed window title exists
415
421
  # for the given tabbed windows
416
422
  #
417
423
  def tab?(s)
418
424
  @window.tab?(s)
419
425
  end
420
-
426
+
421
427
  def text_field(id2, klass: nil, id: nil, name: nil, value: '')
422
-
428
+
423
429
  open_web_console() do |console|
424
-
430
+
425
431
  cmd = if klass then
426
432
  "querySelector('#{klass}')"
427
433
  elsif id then
@@ -431,58 +437,63 @@ class XAutoBrowse
431
437
  end
432
438
 
433
439
  a = [
434
- 'r = ' + [@context, 'document'].compact.join('.') + '.' + cmd,
435
- "r.value = \"\"",
440
+ 'r = ' + [@context, 'document'].compact.join('.') + '.' + cmd,
441
+ "r.value = \"\"",
436
442
  "r.focus()"
437
443
  ]
438
-
444
+
439
445
  a.each {|x| console.enter x }
440
-
446
+
441
447
  end
442
-
448
+
443
449
  sleep 2; type(value); sleep 1
444
450
 
445
451
  end
446
-
452
+
447
453
  def title()
448
454
  @window.title
449
455
  end
450
-
456
+
451
457
  def to_doc()
452
458
  copy_source(); sleep 0.5
453
459
  Nokorexi.new(Clipboard.paste).to_doc
454
460
  end
455
-
461
+
456
462
  # type some text
457
463
  #
458
- def type(s) @window.activate(); XDo::Keyboard.type(s) end
459
-
464
+ def type(s)
465
+
466
+ @window.activate();
467
+ s.chars.each {|char| XDo::Keyboard.type(char) ; sleep 0.008 }
468
+
469
+ end
470
+
460
471
  def view_source()
461
-
472
+
462
473
  @window.activate(); sleep 0.5
463
474
  ctrl_l() # jump to the location bar
464
475
  sleep 0.6; tab(2); sleep 0.5; ctrl_u() # View source code
465
-
466
- end
467
-
468
-
476
+
477
+ end
478
+
479
+
469
480
  # input some text
470
481
  #
471
482
  def enter(s=nil)
472
-
483
+
473
484
  if s then
474
485
  type(s)
475
486
  sleep 0.8
476
487
  end
477
-
488
+
478
489
  carriage_return()
479
490
  sleep 1
480
-
491
+
481
492
  end
482
493
 
483
-
494
+
484
495
  private
485
-
496
+
486
497
  # A helpful method to generate the javascript code necessary for the
487
498
  # web browser to communicate with the universal DOM remote
488
499
  #
@@ -514,11 +525,11 @@ ws.onmessage = function(event) {
514
525
  };
515
526
  "
516
527
 
517
- end
518
-
528
+ end
529
+
519
530
  def send_keys(keys)
520
-
521
- @window.activate(); XDo::Keyboard.send keys.to_sym
522
-
531
+
532
+ @window.activate(); XDo::Keyboard.send keys.to_sym
533
+
523
534
  end
524
535
  end
data.tar.gz.sig CHANGED
@@ -1,2 +1 @@
1
- b|߈��������2CLϼ���s�9Ll��[r9��M�퐭2˙���WEh(Q���C$�
2
- ي@��������o�G3|2=�����s%pzq T�H�Ja��1�Ԡ��?I�vj�5�q �A)��z�2�_�G�<����Ex �~�H��tԌ��z� WˍF�+��J5�_y��U$H. �H-9� ���5�"�)�j% �ϫ"
1
+ ��#X&�x���-a�=�@S�����o����QғÕy鵧D����L-�9$ �O�7���*1���8N�Q��快��`Q�a����l��O$ �c�����>����ˑ*'ݐ@Fh\/�i��*΁�Uf�;�rg}��7#Z�sfOGEB�[�Nб�yW!PG��/B�%4>��0�x&�Hwq/��A�mt@��X���/< �B\U!����;P�������-<�ݪ�
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xautobrowse
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -10,32 +10,33 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMTkwOTA0MTU1NzIyWhcN
15
- MjAwOTAzMTU1NzIyWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCzrqAy
17
- Ha38nTEv/dMJDgppQMNzq2ie1QLpUYtZPC7U/f5wBj3h6tXiaAH/LKRQaDKlAxhW
18
- UFcu5JBeORw3hAo1HDuQILejOwuYyV/V892mJbP8yj0VmZZWK5MoBkhK525hGTfT
19
- BIo3IiI+AsaV9i4bUpVO9HM8Q3Mu6F//2o/lfPdGQ8Ee6ivlFfl7fI0RESo9qFCl
20
- 0PkZsHVG6YTEFLvx55MLGyk/6fKFn5CDfx3RkAYrL5Gi7SfU+6ucTY+S9+tdcErj
21
- JQ2cCl+ghkrzwxRKwV0GSP24WfPUG6zA4l+WhPbsXRumOYlO+1LLtvOOAhFYW1GS
22
- y9dYP/Rwaagb3H3l3L70Ek5OzmTlRNxV8ecYftn+7Cd2y/D+POHDhSY4mHnczMXZ
23
- aMH07eeuI8cZ2gweKDuh6xZVWR5mKGCHLYQkHHlHQbxG4l65xqPZPDqgNbJ5KFs7
24
- stvrp5xW0iPaOkUYyHB1cLw94ezKZ9+sLE7b+/DTV+CAuTFREsOJxKPENbUCAwEA
25
- AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU8B9sPFAr
26
- 2sQh3380OdCVa3ZFleAwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
- c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
- BgkqhkiG9w0BAQsFAAOCAYEAWjqAB+H6HGt/5ockEvB+fRjF0+VXcrZ4WGoBXoOD
29
- bVW4t//ijfmMMokltrwMWkbjeWmKzxY9SVNTJ/FgeCoWNlZz7VGVV7jfDQrtVUFx
30
- 9gZ1ZbXBB4jFpLtrDx9PGxqiBYf3Vlm2N2HQSXcxeKrl6smdKK3LT9ur6in/BVC3
31
- J5VC3xZN1pLayxzUkCGZXMz8yvZek1/WberhQ1XhiP3DbY9RINoMVbG5C5OZEkrh
32
- roP5Tg23Axl4SdqPKrqsRMyxCwlupsFfyAUpUlYLD7m13VvgKKRSyHHF6kpZBet/
33
- yDqrsmTE0kxUx6aLzp96kV847zXtcoeBCPZueV4j0GMSh5HxaeGnYg1hBa9BKDx/
34
- JEm6dQbxE0sCYXcDYTHysagWQli56Al417OGFFWl6D/jtltItWSmBlC0AEz36Tji
35
- Yrzn2OMywmfA4uFTxlBkZKxoyytmvkVcpL+gcfVgy1dR1XvQOjh6VHimWhu2KmpR
36
- VgFNTN3mpHHUt3Qqmbg8BgeL
13
+ MIIEljCCAv6gAwIBAgIBATANBgkqhkiG9w0BAQsFADBIMRIwEAYDVQQDDAlnZW1t
14
+ YXN0ZXIxHjAcBgoJkiaJk/IsZAEZFg5qYW1lc3JvYmVydHNvbjESMBAGCgmSJomT
15
+ 8ixkARkWAmV1MB4XDTIyMDYwOTEzNTcyMloXDTIzMDYwOTEzNTcyMlowSDESMBAG
16
+ A1UEAwwJZ2VtbWFzdGVyMR4wHAYKCZImiZPyLGQBGRYOamFtZXNyb2JlcnRzb24x
17
+ EjAQBgoJkiaJk/IsZAEZFgJldTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoC
18
+ ggGBAL85QJIQPZFZzzENljNuTvIR0+ZxIbgGip1iGeuxOrNxN95WrAdyFBClWDIl
19
+ iyDyV2wCOGAzn++T02bWRlGFCrAOhoW9MEtpKejTFHvMFaCVhvMtg0HILu54B13M
20
+ wrlKVo40wQBUJmxDw7ZFIfNy3ZDSzT14McxIY/CrJLpIpFoUDene6JjFTJpW7Dx+
21
+ MuFyuoRUV0b5fL73Elrrqzoxh2/i1BdeFoivd7gIAgTEveQE/lWnhGpxj6Gxxbur
22
+ mgCyYtTYa5/j3Y1iqL2mrZZwA+KzwQnJZZa1kufYz9KBxDUP9KiTnJW10OaP66Se
23
+ xU/QwQPAugPe9EdPTxbfFbWxuS7D2Pm1HrQxpE1nhBsr1pmI43mIamxbj8bsjFov
24
+ 7Or7FPcAr2IL1ptr6kWSJenwQi/MCmokQ7x1O8cwE9isbzRoDEaU7P7ssVKFkBAo
25
+ ZGQryIcfgjNYphavMVd/K7x7weab46fJagFqiNi739qlqXkgvGfSib4ObNZ2xjNV
26
+ mYFDYwIDAQABo4GKMIGHMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
27
+ BBRBdJenDuxk23LDtBgiMvTcYTuKezAmBgNVHREEHzAdgRtnZW1tYXN0ZXJAamFt
28
+ ZXNyb2JlcnRzb24uZXUwJgYDVR0SBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
29
+ c29uLmV1MA0GCSqGSIb3DQEBCwUAA4IBgQBl4gTamCrvW7lQC+prevAyQr8tTl3j
30
+ zLIJA8WIoIIPj5rI44KQ7B5tJIkgaiSOb6n5Q0eyfpTus96bVLC0L28DvH93S33e
31
+ OU7d09lMG1Jmo0nhJYAsRN+wGx0U/qpLw7yy9h9+RtHEptemu6FP52PJ+lJ6Wnq8
32
+ 5GJ/lyR7EXb3dfE6E2Nx0GW9wjDHXwUoirC7QNWDlo9HeJ6xkZnkzq6nyX181eBJ
33
+ kQ6N6MNe7jcBKwiWfc8T6RLUnO68vR9KWDQaPM49+ad1d6ziTTIF2FWk9GHi9dZC
34
+ zpFzFBnYkBt1QgNzPEjPWkXGsmV8dmSHPaBLgJUIMdXuYtPvJasPj13nBjdehLgw
35
+ ab4GEwmDGKmofs3jhDErkvjkAe8DuhtXWYJTdRzoPWCJYczPPh/46xd/3nbp9pFu
36
+ /yd/2nP/38PioQ+41JdAFyb42dDQx+Pe9cLS5RW1f5z8bANhHWYam/4YiCq3tqIb
37
+ O4E/MTUmSDAZpUWRzAyC6ty6tQXjvrj1yD8=
37
38
  -----END CERTIFICATE-----
38
- date: 2019-09-04 00:00:00.000000000 Z
39
+ date: 2022-06-09 00:00:00.000000000 Z
39
40
  dependencies:
40
41
  - !ruby/object:Gem::Dependency
41
42
  name: xtabbedwindow
@@ -63,40 +64,40 @@ dependencies:
63
64
  requirements:
64
65
  - - "~>"
65
66
  - !ruby/object:Gem::Version
66
- version: '0.3'
67
+ version: '0.7'
67
68
  - - ">="
68
69
  - !ruby/object:Gem::Version
69
- version: 0.3.2
70
+ version: 0.7.0
70
71
  type: :runtime
71
72
  prerelease: false
72
73
  version_requirements: !ruby/object:Gem::Requirement
73
74
  requirements:
74
75
  - - "~>"
75
76
  - !ruby/object:Gem::Version
76
- version: '0.3'
77
+ version: '0.7'
77
78
  - - ">="
78
79
  - !ruby/object:Gem::Version
79
- version: 0.3.2
80
+ version: 0.7.0
80
81
  - !ruby/object:Gem::Dependency
81
82
  name: clipboard
82
83
  requirement: !ruby/object:Gem::Requirement
83
84
  requirements:
84
85
  - - "~>"
85
86
  - !ruby/object:Gem::Version
86
- version: '1.1'
87
+ version: '1.3'
87
88
  - - ">="
88
89
  - !ruby/object:Gem::Version
89
- version: 1.1.2
90
+ version: 1.3.6
90
91
  type: :runtime
91
92
  prerelease: false
92
93
  version_requirements: !ruby/object:Gem::Requirement
93
94
  requirements:
94
95
  - - "~>"
95
96
  - !ruby/object:Gem::Version
96
- version: '1.1'
97
+ version: '1.3'
97
98
  - - ">="
98
99
  - !ruby/object:Gem::Version
99
- version: 1.1.2
100
+ version: 1.3.6
100
101
  - !ruby/object:Gem::Dependency
101
102
  name: simplepubsub
102
103
  requirement: !ruby/object:Gem::Requirement
@@ -138,7 +139,7 @@ dependencies:
138
139
  - !ruby/object:Gem::Version
139
140
  version: 0.1.1
140
141
  description:
141
- email: james@jamesrobertson.eu
142
+ email: digital.robertson@gmail.com
142
143
  executables: []
143
144
  extensions: []
144
145
  extra_rdoc_files: []
@@ -163,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
163
164
  - !ruby/object:Gem::Version
164
165
  version: '0'
165
166
  requirements: []
166
- rubygems_version: 3.0.1
167
+ rubygems_version: 3.3.7
167
168
  signing_key:
168
169
  specification_version: 4
169
170
  summary: A poor man's web automation tool primarily for Firefox in an X windows system.
metadata.gz.sig CHANGED
Binary file