xautobrowse 0.3.5 → 0.3.6

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: 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