sra2019 0.5.2 → 0.6.0

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