xautobrowse 0.3.3 → 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: 66c28ea97bd0679cc40822147d8ea09c6bb2acd3330f89b39802c4322141a9b5
4
- data.tar.gz: 227072f7cf0ba6bae7ec049db424063b58007c2710a2c7407837be276376ac0a
3
+ metadata.gz: a25f8dde31e35a29de9110a5e68909f39c88e5d54f9e841774103606dec66399
4
+ data.tar.gz: 4b3d2f68990ccad4ea1b2ea68ccbb95901cc9ab58ddced00e85c8268437007ea
5
5
  SHA512:
6
- metadata.gz: c3126b5a591833c1c16dee132b0518c356c6db5867f5806810fc88901fd54d3aa2176f3ca09fe94a7fa3292eef5882d2926f69af56448aec12c2da2bee2b16a3
7
- data.tar.gz: 8a88eb43738c442f8f7de66afb88a96d9cbb0f6be8e53896fd0089d19076b2407ba8a5d81eab83290408e23477ab7f48eb941a31abb1b20b9ec4d252949c46f0
6
+ metadata.gz: e84fa69febe5df40b17b3bb28451e69c97fe27ad4c630673c52d3134eacefc46ac2609f15fc77bf6b30d0ce47226434c0bf8af55ca786352f50e2100deaa9644
7
+ data.tar.gz: 0ec8887dbecf4ee21190934d7099ae49b2e2d85cab4e2105325b721919367c539303affe8ce40624190c9ca79b1278af7b94b6771f3d31a6df908831bb9aa321
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/xautobrowse.rb CHANGED
@@ -8,9 +8,8 @@
8
8
 
9
9
 
10
10
  # revision log:
11
-
12
- # 15 Oct 2018: feature: The keyword *context* can be used to specify the
13
- # parent element of the document
11
+ # 9 Jun 2022: commented out the buggy redundant XDo::XWindow statements
12
+ # 4 Sep 2019: feature: Added methods *slow_type* and *slow_tab*
14
13
  # 5 Sep 2018: feature: A new tab can now be opened if it does not exist.
15
14
  # 4 Sep 2018: feature: Tabs can now be traversed using the XTabbedWindow gem
16
15
  # 23 Jun 2018: feature: A new Window can now be created which attaches itself
@@ -36,6 +35,7 @@
36
35
  # Then paste the code to a new notepad document for inspection.
37
36
 
38
37
 
38
+
39
39
  #require 'wmctrl'
40
40
  require 'nokorexi'
41
41
  require 'clipboard'
@@ -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,172 +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, context: nil)
136
+
137
+
138
+
139
+ def initialize(browser= :firefox, new_window: true, debug: false,
140
+ sps: false, clicks: {}, scan_tabs: !new_window,
141
+ context: nil, text_fields: {})
137
142
 
138
143
  @browser, @debug, @sps, @clicks = browser.to_sym, debug, sps, clicks
139
- @new_window, @context = new_window, context
140
-
141
- @window = Window.new(browser, new_win: new_window, scan_tabs: scan_tabs)
144
+ @new_window, @context, @text_fields = new_window, context, text_fields
145
+
146
+ puts 'before Window.new' if @debug
147
+ @window = Window.new(browser, new_win: new_window, scan_tabs: scan_tabs,
148
+ debug: @debug)
142
149
 
143
150
  sleep 4 if new_window
144
-
151
+
145
152
  connect() if sps
146
-
153
+
147
154
  end
148
-
149
- # 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
150
157
  # element on the web page
151
158
  #
152
159
  def accesskey(key) send_keys(key.to_sym) end
153
-
154
- alias access_key accesskey
155
-
156
- # 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
157
164
  # started before the code can be attached. see start_broker()
158
165
  #
159
166
  def attach_console(autohide: true)
160
-
167
+
161
168
  @window.activate()
162
169
  open_web_console(); sleep 1
163
170
 
164
- clipboard = Clipboard.paste
171
+ clipboard = Clipboard.paste
165
172
  Clipboard.copy javascript(); sleep 1
166
173
  ctrl_v(); sleep 0.5; carriage_return()
167
-
174
+
168
175
  close_web_console() if autohide
169
176
  Clipboard.copy clipboard
170
-
177
+
171
178
  end
172
-
179
+
173
180
  def click(name)
174
-
175
- web_console do |x|
181
+
182
+ web_console do |x|
176
183
  x.enter [@context, @clicks[name]].compact.join('.') + '.click();'
177
184
  end
178
-
179
- end
180
-
185
+
186
+ end
187
+
181
188
  def close()
182
189
  ctrl_w()
183
190
  end
184
-
191
+
185
192
  alias exit close
186
-
193
+
187
194
  def close_web_console()
188
195
  @window.activate()
189
196
  ctrl_shift_i()
190
197
  end
191
-
198
+
192
199
  alias hide_web_console close_web_console
193
-
200
+
194
201
  def connect()
195
202
 
196
203
  start_broker(); sleep 4; connect_controller()
197
-
204
+
198
205
  end
199
-
206
+
200
207
  # Connects to the SPS broker to communicate with the web browser
201
208
  #
202
209
  def connect_controller()
203
-
210
+
204
211
  @udr = UniversalDomRemote.new debug: @debug
205
-
212
+
206
213
  end
207
-
214
+
208
215
  def copy_screen()
209
216
  select_all(); sleep 2; ctrl_c(); sleep 2; unselect_all()
210
- Clipboard.paste
217
+ Clipboard.paste
211
218
  end
212
-
219
+
213
220
  alias scrape_screen copy_screen
214
-
221
+
215
222
  def copy_source()
216
-
223
+
217
224
  view_source(); sleep 3
218
225
  select_all(); sleep 1
219
226
  ctrl_c() # copy the source code to the clipboard
220
227
  sleep 1
221
228
  ctrl_w() # close the viewsource window
222
-
229
+
223
230
  end
224
-
231
+
225
232
  # select all
226
233
  #
227
234
  def ctrl_a() send_keys(:ctrl_a) end
228
-
235
+
229
236
  # unselect all
230
237
  #
231
238
  def ctrl_shift_a()
232
239
 
233
240
  XDo::Keyboard.key_down('shift')
234
241
  send_keys(:ctrl_a)
235
- XDo::Keyboard.key_up('shift')
242
+ XDo::Keyboard.key_up('shift')
243
+
244
+ end
236
245
 
237
- end
238
-
239
246
  # copy
240
247
  #
241
248
  def ctrl_c() send_keys(:ctrl_c) end
242
-
249
+
243
250
  # jump to the location bar
244
251
  #
245
- def ctrl_l() send_keys(:ctrl_l) end
246
-
252
+ def ctrl_l() send_keys(:ctrl_l) end
253
+
247
254
  # view source code
248
255
  #
249
- def ctrl_u() send_keys(:ctrl_u) end
250
-
256
+ def ctrl_u() send_keys(:ctrl_u) end
257
+
251
258
  # paste
252
259
  #
253
260
  def ctrl_v() send_keys(:ctrl_v) end
254
-
261
+
255
262
  # close the current window
256
263
  #
257
- def ctrl_w() send_keys(:ctrl_w) end
264
+ def ctrl_w() send_keys(:ctrl_w) end
258
265
 
259
266
  # Chromium developer tools
260
267
  #
@@ -263,21 +270,21 @@ class XAutoBrowse
263
270
  # Firefox developer tools
264
271
  #
265
272
  def ctrl_shift_k() send_keys(:ctrl_shift_k) end
266
-
273
+
267
274
  # submit a form by pressing return
268
275
  #
269
276
  def go()
270
-
277
+
271
278
  if block_given? then
272
-
279
+
273
280
  @window.activate(); sleep 1; yield(self); carriage_return()
274
-
281
+
275
282
  end
276
-
283
+
277
284
  end
278
-
285
+
279
286
  def goto(url, attachconsole: true, new_tab: !@new_window)
280
-
287
+
281
288
  new_tab() if new_tab
282
289
  sleep 1; ctrl_l()
283
290
  sleep 2 if @new_window
@@ -288,182 +295,205 @@ class XAutoBrowse
288
295
  end
289
296
 
290
297
  def goto_tab(s, url=nil)
291
-
292
- if url then
298
+
299
+ if url then
293
300
  @window.goto_tab(s) { enter url}
294
301
  else
295
302
  @window.goto_tab(s)
296
303
  end
297
-
304
+
298
305
  end
299
-
306
+
300
307
  def carriage_return()
301
308
  @window.activate(); sleep 1; XDo::Keyboard.return
302
309
  end
303
-
310
+
304
311
  alias cr carriage_return
305
-
312
+
306
313
  def method_missing(method_name, *args)
307
314
  if method_name.to_s =~ /^alt/ then
308
315
  send_keys method_name
309
316
  end
310
- end
311
-
317
+ end
318
+
312
319
  def open_web_console()
313
-
320
+
314
321
  console = @browser == :firefox ? :ctrl_shift_k : :ctrl_shift_i
315
322
  method(console).call # web console
316
-
323
+
317
324
  sleep 2
318
-
325
+
319
326
  if block_given? then
320
327
  yield(self)
321
328
  close_web_console()
322
329
  end
323
-
330
+
324
331
  end
325
-
332
+
326
333
  alias web_console open_web_console
327
-
334
+
328
335
  def new_window()
329
336
  @window = Window.new
330
337
  end
331
-
338
+
332
339
  def new_tab()
333
340
  @window.new_tab
334
341
  end
335
-
342
+
336
343
  # Takes a screenshot of the web page. Images are stored in ~/Pictures
337
344
  #
338
345
  def screenshot(filename=Time.now\
339
346
  .strftime("Screenshot from %Y-%m-%d %d-%m-%y"))
340
-
341
- XDo::Keyboard.simulate('{print}');
342
- sleep 4;
347
+
348
+ XDo::Keyboard.simulate('{print}');
349
+ sleep 4;
343
350
  XDo::Keyboard.simulate("{down}")
344
- sleep 4;
345
- XDo::Keyboard.alt_s
351
+ sleep 4;
352
+ XDo::Keyboard.alt_s
346
353
  sleep 5;
347
354
  XDo::Keyboard.type filename
348
355
  sleep 3
349
356
  XDo::Keyboard.alt_s
350
357
  sleep 1
351
-
358
+
352
359
  end
353
-
360
+
354
361
  alias screen_capture screenshot
355
-
362
+
356
363
  def send(s)
357
364
  @udr.send s
358
365
  end
359
-
366
+
360
367
  def select_all()
361
368
  ctrl_a()
362
369
  end
363
-
370
+
364
371
  def unselect_all()
365
-
372
+
366
373
  @browser == :firefox ? (tab(); shift_tab()) : ctrl_shift_a()
367
-
374
+
375
+ end
376
+
377
+ def slow_tab(n=1, seconds: 0.5)
378
+ n.times {XDo::Keyboard.simulate("{TAB}"); sleep seconds}
368
379
  end
369
-
380
+
381
+ def slow_type(s, seconds: 0.6)
382
+
383
+ #@window.activate();
384
+ sleep 0.3
385
+
386
+ s.split(//).each do |c|
387
+ XDo::Keyboard.type(c)
388
+ sleep seconds
389
+ end
390
+ end
391
+
392
+
370
393
  # Starts the simplepubsub broker
371
-
394
+
372
395
  def start_broker()
373
-
374
- Thread.new do
396
+
397
+ Thread.new do
375
398
  `ruby -r 'simplepubsub' -e "SimplePubSub::Broker.start port: '55000'"`
376
399
  end
377
-
400
+
378
401
  end
379
-
402
+
380
403
  def stop_broker()
381
404
  SPSPub.notice 'shutdown', host: '127.0.0.1', port: '55000'
382
405
  end
383
-
406
+
384
407
  def shift_tab(n=1)
385
-
408
+
386
409
  @window.activate()
387
410
  XDo::Keyboard.key_down('shift')
388
411
  XDo::Keyboard.simulate("{TAB}" * n)
389
412
  XDo::Keyboard.key_up('shift')
390
-
413
+
391
414
  end
392
-
415
+
393
416
  def tab(n=1)
394
417
  @window.activate(); XDo::Keyboard.simulate("{TAB}" * n)
395
418
  end
396
-
397
- # determines if the given tabbed window title exists
419
+
420
+ # determines if the given tabbed window title exists
398
421
  # for the given tabbed windows
399
422
  #
400
423
  def tab?(s)
401
424
  @window.tab?(s)
402
425
  end
403
-
404
- def text_field(klass: nil, id: nil, name: nil, value: '')
405
-
426
+
427
+ def text_field(id2, klass: nil, id: nil, name: nil, value: '')
428
+
406
429
  open_web_console() do |console|
407
-
430
+
408
431
  cmd = if klass then
409
432
  "querySelector('#{klass}')"
410
433
  elsif id then
411
434
  "getElementById(\"#{id}\")"
435
+ elsif name then
436
+ @text_fields[id2]
412
437
  end
413
438
 
414
439
  a = [
415
- 'r = ' + [@context, 'document'].compact.join('.') + '.' + cmd,
416
- "r.value = \"\"",
440
+ 'r = ' + [@context, 'document'].compact.join('.') + '.' + cmd,
441
+ "r.value = \"\"",
417
442
  "r.focus()"
418
443
  ]
419
-
444
+
420
445
  a.each {|x| console.enter x }
421
-
446
+
422
447
  end
423
-
448
+
424
449
  sleep 2; type(value); sleep 1
425
450
 
426
451
  end
427
-
452
+
428
453
  def title()
429
454
  @window.title
430
455
  end
431
-
456
+
432
457
  def to_doc()
433
458
  copy_source(); sleep 0.5
434
459
  Nokorexi.new(Clipboard.paste).to_doc
435
460
  end
436
-
461
+
437
462
  # type some text
438
463
  #
439
- def type(s) @window.activate(); XDo::Keyboard.type(s) end
440
-
464
+ def type(s)
465
+
466
+ @window.activate();
467
+ s.chars.each {|char| XDo::Keyboard.type(char) ; sleep 0.008 }
468
+
469
+ end
470
+
441
471
  def view_source()
442
-
472
+
443
473
  @window.activate(); sleep 0.5
444
474
  ctrl_l() # jump to the location bar
445
475
  sleep 0.6; tab(2); sleep 0.5; ctrl_u() # View source code
446
-
447
- end
448
-
449
-
476
+
477
+ end
478
+
479
+
450
480
  # input some text
451
481
  #
452
482
  def enter(s=nil)
453
-
483
+
454
484
  if s then
455
485
  type(s)
456
486
  sleep 0.8
457
487
  end
458
-
488
+
459
489
  carriage_return()
460
490
  sleep 1
461
-
491
+
462
492
  end
463
493
 
464
-
494
+
465
495
  private
466
-
496
+
467
497
  # A helpful method to generate the javascript code necessary for the
468
498
  # web browser to communicate with the universal DOM remote
469
499
  #
@@ -495,11 +525,11 @@ ws.onmessage = function(event) {
495
525
  };
496
526
  "
497
527
 
498
- end
499
-
528
+ end
529
+
500
530
  def send_keys(keys)
501
-
502
- @window.activate(); XDo::Keyboard.send keys.to_sym
503
-
531
+
532
+ @window.activate(); XDo::Keyboard.send keys.to_sym
533
+
504
534
  end
505
535
  end
data.tar.gz.sig CHANGED
@@ -1,2 +1 @@
1
- ��C/ �s�w̸��4zg��ɲ-w9��@�P���EjGgOat``����!#��F �?��K��}W
2
- �����Ŕm?�1W��L�����$c:�.�4�k���lo�B{eeV�6]w��Jf�;���`�*‘Q
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.3
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -10,27 +10,33 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDXjCCAkagAwIBAgIBATANBgkqhkiG9w0BAQUFADAsMSowKAYDVQQDDCFnZW1t
14
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMTgwMTI4MjAyNDU4WhcN
15
- MTkwMTI4MjAyNDU4WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDe2taT
17
- /dJPt5XfCyUrKbJipb/qV5mwjvQtVCT0ZhT/90ElNIgi48fPrGmUSzkkXyAp5l1W
18
- Np9hNhWSLiaDPuhRy5j5UeS6gSCbc+sFtje6Xz/znQ9uFteGhlDyxBmSowVTQA84
19
- wLlXm91aeaIvdlu+QA05IpXLjj3Bz6N3pIU3+mr0oASHEBSIA0iioA7L/ipyfaay
20
- USkC2ftpSegshul4gw9jzzu/S//UzN7LUFMGzPO7MuHnkz1EJHNHpS+X28zXSr6r
21
- i1E3L16JDLNeK7QGOszLHJEj+yp5AkX/RPZOsn7cHxXO62htwOdajJLoJn+8kClS
22
- qSFVL+GsQ9LP2KqjAgMBAAGjgYowgYcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
23
- HQYDVR0OBBYEFFNxeKas0hLc+Eexllb0wF8oyAswMCYGA1UdEQQfMB2BG2dlbW1h
24
- c3RlckBqYW1lc3JvYmVydHNvbi5ldTAmBgNVHRIEHzAdgRtnZW1tYXN0ZXJAamFt
25
- ZXNyb2JlcnRzb24uZXUwDQYJKoZIhvcNAQEFBQADggEBADUp7oImwi9elESr391y
26
- GXwgycXUXBelPyx746D+xhREysTzHEM8dCLed1S82AbIq+LibQFrKCjvZ0zwVPvy
27
- mexSOTSYqv+RYWmIgfn0Zys0u8A/LCpaBUc2QxZuk8ErvdJ44nPBm8UTuHQqDs0Z
28
- +Y3XTLjWjAgK8AKAsJ4eY1itn/Ei8sFSlXj2dhw8deSWI26ZXt2cr0H8ThY0bQN3
29
- 0yTrmlrZvG19r0IG46cF1B1iRcUx1MQ1roQHrt1B02oNmKC1ZTF4ggUdesby+Fwg
30
- UkT65Cjj3pGfXSA+uRiXo7EXRM2Xft7NA1wuE91g2PYjRb8GvdqjxrgF1gp+LHtf
31
- Gwk=
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=
32
38
  -----END CERTIFICATE-----
33
- date: 2018-10-15 00:00:00.000000000 Z
39
+ date: 2022-06-09 00:00:00.000000000 Z
34
40
  dependencies:
35
41
  - !ruby/object:Gem::Dependency
36
42
  name: xtabbedwindow
@@ -58,40 +64,40 @@ dependencies:
58
64
  requirements:
59
65
  - - "~>"
60
66
  - !ruby/object:Gem::Version
61
- version: '0.3'
67
+ version: '0.7'
62
68
  - - ">="
63
69
  - !ruby/object:Gem::Version
64
- version: 0.3.2
70
+ version: 0.7.0
65
71
  type: :runtime
66
72
  prerelease: false
67
73
  version_requirements: !ruby/object:Gem::Requirement
68
74
  requirements:
69
75
  - - "~>"
70
76
  - !ruby/object:Gem::Version
71
- version: '0.3'
77
+ version: '0.7'
72
78
  - - ">="
73
79
  - !ruby/object:Gem::Version
74
- version: 0.3.2
80
+ version: 0.7.0
75
81
  - !ruby/object:Gem::Dependency
76
82
  name: clipboard
77
83
  requirement: !ruby/object:Gem::Requirement
78
84
  requirements:
79
85
  - - "~>"
80
86
  - !ruby/object:Gem::Version
81
- version: '1.1'
87
+ version: '1.3'
82
88
  - - ">="
83
89
  - !ruby/object:Gem::Version
84
- version: 1.1.2
90
+ version: 1.3.6
85
91
  type: :runtime
86
92
  prerelease: false
87
93
  version_requirements: !ruby/object:Gem::Requirement
88
94
  requirements:
89
95
  - - "~>"
90
96
  - !ruby/object:Gem::Version
91
- version: '1.1'
97
+ version: '1.3'
92
98
  - - ">="
93
99
  - !ruby/object:Gem::Version
94
- version: 1.1.2
100
+ version: 1.3.6
95
101
  - !ruby/object:Gem::Dependency
96
102
  name: simplepubsub
97
103
  requirement: !ruby/object:Gem::Requirement
@@ -133,7 +139,7 @@ dependencies:
133
139
  - !ruby/object:Gem::Version
134
140
  version: 0.1.1
135
141
  description:
136
- email: james@jamesrobertson.eu
142
+ email: digital.robertson@gmail.com
137
143
  executables: []
138
144
  extensions: []
139
145
  extra_rdoc_files: []
@@ -158,8 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
164
  - !ruby/object:Gem::Version
159
165
  version: '0'
160
166
  requirements: []
161
- rubyforge_project:
162
- rubygems_version: 2.7.6
167
+ rubygems_version: 3.3.7
163
168
  signing_key:
164
169
  specification_version: 4
165
170
  summary: A poor man's web automation tool primarily for Firefox in an X windows system.
metadata.gz.sig CHANGED
Binary file