sra2019 0.5.2 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/sra2019.rb +128 -22
  5. metadata +22 -2
  6. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f6d80258051ebf745f12d63277fa418945b747e4143cddfdb9ae14fd59d8a7cf
4
- data.tar.gz: 62d9f9565ac94cff85a4c4177c3ffac2e166c7c945754aa1570382a45f221002
3
+ metadata.gz: 2ddc547d97ba77fd821c80247707774db29fa20b38d8a9f4183e793e04516ca8
4
+ data.tar.gz: 93fde335b26f1cda3befbab1c5db96e346e877a16d42907dd55c9f64e3671355
5
5
  SHA512:
6
- metadata.gz: 8da13a1cf115f3c94899df1372100300f17434997abeaeeecf59abda9775b96a2bb06f065c73789f4d1998dfaa143ee29a53ae3abd67853600713ab713f05a93
7
- data.tar.gz: 568778997ef54ccbb817f56700c388d8ab491cadf6d34c88aaef017d4c0624feb166a141a87cc2a7e77ffb56687ca71447e2a532c529c50bc7b96941abec2d78
6
+ metadata.gz: '017894f86f375912322529f8d9c66b61c4b35c9a9960684bd93abd3f2ca415862daf0cf3265353581679bea0623f695dfd08560ced77197fbc0e20d1e5fdc0fb'
7
+ data.tar.gz: af6db46c959d7b5beedff8b15be615a0d8c7733886d5abb78e830bf9e991d5b49bc0fec5d012f1b0d50c9d07d9e7fb9b8d43db814b11d07a3acd0b225ae54637
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -8,7 +8,10 @@
8
8
  require 'hlt'
9
9
  require 'rexle'
10
10
  require 'base64'
11
+ require 'ostruct'
12
+ require 'subunit'
11
13
  require 'zip/zip'
14
+ require 'dynarex'
12
15
  require 'rxfhelper'
13
16
  require 'wicked_pdf'
14
17
  require 'mini_magick'
@@ -16,11 +19,21 @@ require 'archive/zip'
16
19
  require 'rexle-builder'
17
20
 
18
21
 
22
+ module TimeHelper
23
+
24
+ refine String do
25
+ def to_time()
26
+ Time.strptime(self, "%H:%M:%S")
27
+ end
28
+ end
29
+
30
+ end
19
31
 
20
32
  class StepsRecorderAnalyser
21
33
  using ColouredText
34
+ using TimeHelper
22
35
 
23
- attr_reader :steps
36
+ attr_reader :steps, :start_time, :stop_time
24
37
 
25
38
 
26
39
  def initialize(s, debug: false, savepath: '/tmp', title: 'Untitled')
@@ -37,12 +50,39 @@ class StepsRecorderAnalyser
37
50
 
38
51
  puts ('content: ' + content.inspect).debug if @debug
39
52
 
40
- all_steps = parse_steps content
41
- @doc = build all_steps
42
- @steps = all_steps.select {|x| x[:user_comment]}
53
+ @actions = parse_report content
54
+ @all_steps = parse_steps content
55
+ @doc = build @all_steps
56
+ steps = @all_steps.select {|x| x[:user_comment]}
57
+ @steps = steps.any? ? steps : @all_steps
43
58
 
44
59
  end
45
60
 
61
+ def import(s)
62
+
63
+ @dx = Dynarex.new
64
+ @dx.import s
65
+
66
+ end
67
+
68
+ # Returns a Dynarex object
69
+ #
70
+ def to_dx()
71
+
72
+ @dx = Dynarex.new 'instructions/instruction(step, imgsrc, description)'
73
+ @dx.summary[:rawdoc_type] = 'rowx'
74
+
75
+ @steps.each.with_index do |h, i|
76
+
77
+ @dx.create step: i+1, imgsrc: "screenshot#{i+1}.jpg",
78
+ description: h[:user_comment] || h[:desc]
79
+
80
+ end
81
+
82
+ @dx
83
+
84
+ end
85
+
46
86
  def to_kbml(options={})
47
87
 
48
88
 
@@ -50,6 +90,9 @@ class StepsRecorderAnalyser
50
90
 
51
91
  end
52
92
 
93
+
94
+ # Writes the steps to an HTML file
95
+ #
53
96
  def to_html(filepath=File.join(@savepath, 'sra' + Time.now.to_i.to_s))
54
97
 
55
98
  # save the image files to a file directory.
@@ -95,7 +138,9 @@ html
95
138
  EOF
96
139
 
97
140
  html = Rexle.new(Hlt.new(@sliml).to_html)\
98
- .root.element('html').xml pretty: true
141
+ .root.element('html').xml pretrequire 'requestor'
142
+ eval Requestor.read('http://a0.jamesrobertson.eu/rorb/r/ruby'){|x| x.require 'sra2019' }
143
+ ty: true
99
144
  File.write File.join(filepath, 'index.html'), html
100
145
 
101
146
  %w(layout style print).each \
@@ -109,6 +154,43 @@ EOF
109
154
  @sliml
110
155
  end
111
156
 
157
+ def to_srt()
158
+
159
+ lines = to_subtitles.strip.lines.map.with_index do |x, i|
160
+
161
+ raw_times, subtitle = x.split(/ /,2)
162
+
163
+ start_time, end_time = raw_times.split('-',2)
164
+ times = [("%02d:%02d:%02d" % ([0, 0 ] + start_time.split(/\D/)\
165
+ .map(&:to_i)).reverse.take(3).reverse), \
166
+ '-->', \
167
+ ("%02d:%02d:%02d" % ([0, 0 ] + end_time.split(/\D/).map(&:to_i))\
168
+ .reverse.take(3).reverse)].join(' ')
169
+
170
+ [i+1, times, subtitle].join("\n")
171
+
172
+ end
173
+
174
+ lines.join("\n")
175
+
176
+ end
177
+
178
+ def to_subtitles()
179
+
180
+ times = @all_steps.map(&:time).each_cons(2).map do |x|
181
+
182
+ x.map do |sec|
183
+ a = Subunit.new(units={minutes:60, hours:60}, seconds: sec).to_h.to_a
184
+ a.map {|x|"%d%s" % [x[1], x[0][0]] }.join('')
185
+ end.join('-')
186
+
187
+ end
188
+ times.zip(@all_steps.map(&:desc)).map {|x| x.join(' ')}.join("\n")
189
+
190
+ end
191
+
192
+ # Writes the steps to a PDF file
193
+ #
112
194
  def to_pdf(pdf_file=File.join(@savepath, 'sra' + Time.now.to_i.to_s,
113
195
  @title.gsub(/ /,'-') + '.pdf'))
114
196
 
@@ -121,18 +203,20 @@ EOF
121
203
 
122
204
  end
123
205
 
124
-
206
+ # Compresses the HTML file directory to a ZIP file
207
+ #
125
208
  def to_zip()
126
209
 
127
210
  project = 'sra' + Time.now.to_i.to_s
128
211
  newdir = File.join(@savepath, project)
129
212
  zipfile = newdir + '.zip'
130
213
 
131
- to_pdf(File.join(newdir, @title.gsub(/ /,'-') + '.pdf'))
214
+ to_html(File.join(newdir))
215
+ #to_pdf(File.join(newdir, @title.gsub(/ /,'-') + '.pdf'))
132
216
 
133
217
  Archive::Zip.archive(zipfile, newdir)
134
218
 
135
- 'saved to ' + zipfile
219
+ zipfile
136
220
 
137
221
  end
138
222
 
@@ -184,15 +268,16 @@ EOF
184
268
 
185
269
 
186
270
  def extract_image(s, n)
187
-
188
- report = Rexle.new s[/<Report>.*<\/Report>/m]
189
-
190
- e = report.root.element('UserActionData/RecordSession/EachAction' +
191
- "[@ActionNumber='#{n}']/HighlightXYWH")
192
-
271
+
272
+ action = @actions[n-1]
273
+ puts 'action: ' + action.inspect if @debug
274
+ e = action.element('HighlightXYWH')
275
+ return unless e
193
276
  y, x, w, h = e.text.split(',').map(&:to_i)
194
277
 
195
- jpg_file = e.parent.element('ScreenshotFileName/text()')
278
+ jpg_file = action.element('ScreenshotFileName/text()')
279
+ return unless jpg_file
280
+
196
281
  img_data = s[/(?<=Content-Location: #{jpg_file}\r\n\r\n)[^--]+/m]
197
282
  puts ('img_data: ' + img_data.inspect).debug if @debug
198
283
 
@@ -203,6 +288,23 @@ EOF
203
288
  image.to_blob
204
289
 
205
290
  end
291
+
292
+ def parse_report(s)
293
+
294
+ report = Rexle.new s[/<Report>.*<\/Report>/m]
295
+ session = report.root.element('UserActionData/RecordSession')
296
+ puts 'session: ' + session.inspect if @debug
297
+ puts 'attributes: ' + session.attributes.inspect if @debug
298
+
299
+ @start_time, @stop_time = %w(Start Stop).map do |x|
300
+ v = session.attributes[(x + 'Time').to_sym]
301
+ puts 'v: ' + v.inspect if @debug
302
+ v.to_time
303
+ end
304
+
305
+ session.xpath('EachAction')
306
+
307
+ end
206
308
 
207
309
  def parse_steps(s)
208
310
 
@@ -220,27 +322,31 @@ EOF
220
322
 
221
323
  raw_comment = a[0][/User Comment: (.*)/,1]
222
324
 
223
- n = a[0][/(?<=Step )\d+/]
325
+ n = a[0][/(?<=Step )\d+/].to_i
224
326
  puts ('n: ' + n.inspect).debug if @debug
327
+
328
+ time = (@actions[n-1].attributes[:Time].to_time - @start_time).to_i
225
329
 
226
- if raw_comment then
330
+
331
+ h = if raw_comment then
227
332
 
228
333
  {
229
- step: n,
230
- user_comment: raw_comment.gsub("&quot;",''),
231
- screenshot: extract_image(s, n)
334
+ user_comment: raw_comment.gsub("&quot;",'')
232
335
  }
233
336
 
234
337
  else
235
338
 
236
339
  {
237
- step: n,
238
- desc: a[0][/(?:Step \d+: )(.*)/,1].gsub("&quot;",'"'),
340
+ desc: a[0][/(?:Step \d+: )(.*)/,1].gsub('&amp;','&')\
341
+ .gsub("&quot;",'"').sub(/\s+\[[^\[]+\]$/,''),
239
342
  keys: keys ,
240
343
  program: a[1][/(?<=Program: ).*/],
241
344
  ui_elements: a[2][/(?<=UI Elements: ).*/].split(/,\s+/)
242
345
  }
243
346
  end
347
+
348
+ steps = {step: n, time: time, screenshot: extract_image(s, n)}.merge(h)
349
+ OpenStruct.new(steps)
244
350
 
245
351
  end
246
352
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sra2019
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -35,7 +35,7 @@ cert_chain:
35
35
  YgXo0DU1HUhuKAAuA0aZdb6DV5BqgZx9e27CLIKqRk5P7TikW49mFaelQfSRi675
36
36
  ugi0V/wkIOHFlKLS87IPnc09
37
37
  -----END CERTIFICATE-----
38
- date: 2019-04-23 00:00:00.000000000 Z
38
+ date: 2019-04-28 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: hlt
@@ -57,6 +57,26 @@ dependencies:
57
57
  - - ">="
58
58
  - !ruby/object:Gem::Version
59
59
  version: 0.6.3
60
+ - !ruby/object:Gem::Dependency
61
+ name: subunit
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 0.3.0
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '0.3'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: 0.3.0
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '0.3'
60
80
  - !ruby/object:Gem::Dependency
61
81
  name: archive-zip
62
82
  requirement: !ruby/object:Gem::Requirement
metadata.gz.sig CHANGED
Binary file