closer 0.5.5 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 439029d320f2147fe56417564038605a412282a5
4
- data.tar.gz: 2d1bed9cfeeaacae1c8b755f6bc4319723899149
2
+ SHA256:
3
+ metadata.gz: 74f23eec764f2465f266ac3ccbd0c31c128d849de9775b9fac70cebe407e0f39
4
+ data.tar.gz: aee97eff5fec4ca6422878f3d67ed722d46e17feaaf649d549f5776dced70c03
5
5
  SHA512:
6
- metadata.gz: 3c6a64c42e18642e1d788e04dc3c7fc6faa9f18a297b9266e5778e5267fa54ef6584d8444141d998aa2e5a0828f399ce3161a3fb53588ff47192683d2b0fe35a
7
- data.tar.gz: c78f299acf404cd485fe0023a4c42a28dae237c3dd9e59705a00dc6daeec5486fb34893d52bd83f99eefcf0673378bb7eca806946a2fede1fd37c33133f8ce8a
6
+ metadata.gz: 12a70b65bd851a1860ac84639e56a9f31c6c8f6ae18ccb74591c25b633f25615249d53d975d0dc1787bac78f1bce73fcaeca5fa4b71de2ea74f7b7aa604bd040
7
+ data.tar.gz: 5c28933a567304c82f8a99d90a9f97f163ba8681908e0fa9c81f26e63e004204015f50b78ad3e4de2c79359eb22092047c29a948c8caaa4d959645d715c730f7
data/HISTORY.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Master
2
2
 
3
+ # Version 0.6.0
4
+ Release Date: 2017-12-15
5
+
6
+ ### Changed
7
+ * drop support for cucumber-2.x
8
+ * drop support for ruby-2.1
9
+
3
10
  # Version 0.5.5
4
11
  Release Date: 2017-10-20
5
12
 
@@ -17,13 +17,13 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features|user_stories)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.required_ruby_version = '~> 2.1'
20
+ spec.required_ruby_version = '~> 2.2'
21
21
 
22
- spec.add_runtime_dependency 'cucumber', '>= 2.4', '<= 4.0'
22
+ spec.add_runtime_dependency 'cucumber', '>= 3.0', '<= 4.0'
23
23
  spec.add_runtime_dependency 'poltergeist', '>= 1.16'
24
24
  spec.add_runtime_dependency 'selenium-webdriver', '~> 3.0'
25
25
 
26
- spec.add_development_dependency 'bundler', '~> 1.15'
26
+ spec.add_development_dependency 'bundler', '~> 1.16'
27
27
  spec.add_development_dependency 'minitest', '~> 5.10'
28
28
  spec.add_development_dependency 'rake', '~> 12.0'
29
29
  end
@@ -12,7 +12,7 @@ module Closer
12
12
  end
13
13
 
14
14
  def gem_dir
15
- File.join(Gem.dir, 'gems')
15
+ ::File.join(Gem.dir, 'gems')
16
16
  end
17
17
 
18
18
  def feature_id
@@ -38,10 +38,6 @@ module Closer
38
38
  ret
39
39
  end
40
40
 
41
- def should_expand
42
- ['t', 'true'].include?(ENV['EXPAND'].to_s.downcase)
43
- end
44
-
45
41
  def magic_comment?(comment_line)
46
42
  comment = comment_line.to_s
47
43
 
@@ -53,7 +49,7 @@ module Closer
53
49
  end
54
50
 
55
51
  def current_time_string
56
- Time.now.instance_eval{ '%s%03d' % [strftime('%Y%m%d%H%M%S'), (usec / 1000.0).round] }
52
+ ::Time.now.instance_eval{ '%s%03d' % [strftime('%Y%m%d%H%M%S'), (usec / 1000.0).round] }
57
53
  end
58
54
 
59
55
  def display_keyword(keyword)
@@ -1,163 +1,149 @@
1
1
  require 'erb'
2
- require 'builder'
3
2
  require 'cucumber/formatter/duration'
4
3
  require 'cucumber/formatter/io'
4
+ require 'cucumber/core/report/summary'
5
+ require 'cucumber/core/test/result'
5
6
  require 'pathname'
7
+ require_relative 'html_builder'
6
8
  require_relative 'closer_html'
7
9
 
8
10
  module Closer
9
11
  module Formatter
10
12
  class Html
13
+ include CloserHtml
11
14
 
12
- # TODO: remove coupling to types
15
+ # TODO: remove coupling to types
13
16
  AST_CLASSES = {
14
17
  Cucumber::Core::Ast::Scenario => 'scenario',
15
18
  Cucumber::Core::Ast::ScenarioOutline => 'scenario outline'
16
19
  }
20
+
17
21
  AST_DATA_TABLE = ::Cucumber::Formatter::LegacyApi::Ast::MultilineArg::DataTable
18
22
 
19
23
  include ERB::Util # for the #h method
20
24
  include ::Cucumber::Formatter::Duration
21
25
  include ::Cucumber::Formatter::Io
22
- include CloserHtml
26
+
27
+ attr_reader :builder
28
+ private :builder
23
29
 
24
30
  def initialize(runtime, path_or_io, options)
25
31
  @io = ensure_io(path_or_io)
26
32
  @runtime = runtime
27
33
  @options = options
28
34
  @buffer = {}
29
- @builder = create_builder(@io)
35
+ @builder = HtmlBuilder.new(target: @io, indent: 0)
30
36
  @feature_number = 0
31
37
  @scenario_number = 0
32
38
  @step_number = 0
33
39
  @header_red = nil
34
40
  @delayed_messages = []
35
- @img_id = 0
36
- @text_id = 0
37
- @inside_outline = false
41
+ @inside_outline = false
38
42
  @previous_step_keyword = nil
43
+ @summary = ::Cucumber::Core::Report::Summary.new(runtime.configuration.event_bus)
39
44
  end
40
45
 
41
46
  def before_features(features)
42
47
  @step_count = features && features.step_count || 0 #TODO: Make this work with core!
43
48
 
44
- @builder.declare!(:DOCTYPE, :html)
45
-
46
- @builder << '<html>'
47
- @builder.head do
48
- @builder.meta('http-equiv' => 'Content-Type', :content => 'text/html;charset=utf-8')
49
- @builder.title 'Cucumber'
50
- inline_css
51
- inline_js
52
- end
53
- @builder << '<body>'
54
- @builder << "<!-- Step count #{@step_count}-->"
55
- @builder << '<div class="cucumber">'
56
- @builder.div(:id => 'cucumber-header') do
57
- @builder.div(:id => 'label') do
58
- @builder.h1('Cucumber Features')
59
- end
60
- @builder.div(:id => 'summary') do
61
- @builder.p('',:id => 'totals')
62
- @builder.p('',:id => 'duration')
63
- @builder.div(:id => 'expand-collapse') do
64
- @builder.p('Expand All', :id => 'expander')
65
- @builder.p('Collapse All', :id => 'collapser')
66
- end
67
- end
68
- end
49
+ builder.build_document!
50
+ builder.format_features! features
69
51
  end
70
52
 
71
53
  def after_features(features)
72
54
  print_stats(features)
73
- @builder << '</div>'
74
- @builder << '</body>'
75
- @builder << '</html>'
55
+ builder << '</div>'
56
+ builder << '</body>'
57
+ builder << '</html>'
76
58
  end
77
59
 
78
- def before_feature(feature)
79
- dir = feature_dir(feature)
60
+ def before_feature(_feature)
61
+ dir = feature_dir(_feature)
80
62
  unless dir.empty?
81
63
  if @feature_dir != dir
82
- @builder << '<div class="feature_dir"><span class="val" onclick="toggle_feature_dir(this);">'
83
- @builder << dir
84
- @builder << '</span></div>'
64
+ builder << '<div class="feature_dir"><span class="val" onclick="toggle_feature_dir(this);">'
65
+ builder << dir
66
+ builder << '</span></div>'
85
67
  end
86
68
 
87
69
  @feature_dir = dir
88
70
  end
89
71
 
90
- @feature = feature
72
+ @feature = _feature
91
73
  @exceptions = []
92
- @builder << "<div id=\"#{feature_id}\" class=\"feature\">"
74
+ builder << "<div id=\"#{feature_id}\" class=\"feature\">"
93
75
  end
94
76
 
95
- def after_feature(feature)
96
- @builder << '</div>'
77
+ def after_feature(_feature)
78
+ builder << '</div>'
97
79
  end
98
80
 
99
- def before_comment(comment)
100
- @builder << '<pre class="comment">' unless magic_comment?(comment)
81
+ def before_comment(_comment)
82
+ return if magic_comment?(_comment)
83
+
84
+ builder << '<pre class="comment">'
101
85
  end
102
86
 
103
- def after_comment(comment)
104
- @builder << '</pre>' unless magic_comment?(comment)
87
+ def after_comment(_comment)
88
+ return if magic_comment?(_comment)
89
+
90
+ builder << '</pre>'
105
91
  end
106
92
 
107
93
  def comment_line(comment_line)
108
- unless magic_comment?(comment_line)
109
- @builder.text!(comment_line)
110
- @builder.br
111
- end
94
+ return if magic_comment?(comment_line)
95
+
96
+ builder.text!(comment_line)
97
+ builder.br
112
98
  end
113
99
 
114
- def after_tags(tags)
100
+ def after_tags(_tags)
115
101
  @tag_spacer = nil
116
102
  end
117
103
 
118
104
  def tag_name(tag_name)
119
- @builder.text!(@tag_spacer) if @tag_spacer
105
+ builder.text!(@tag_spacer) if @tag_spacer
120
106
  @tag_spacer = ' '
121
- @builder.span(tag_name, :class => 'tag')
107
+ builder.span(tag_name, :class => 'tag')
122
108
  end
123
109
 
124
110
  def feature_name(keyword, name)
125
111
  title = feature_dir(@feature, true) + @feature.file.split('/').last.gsub(/\.feature/, '')
126
112
  lines = name.split(/\r?\n/)
127
113
  return if lines.empty?
128
- @builder.h2 do |h2|
129
- @builder.span(:class => 'val') do
130
- @builder << title
114
+ builder.h2 do |h2|
115
+ builder.span(:class => 'val') do
116
+ builder << title
131
117
  end
132
118
  end
133
119
 
134
120
  if lines.size > 1
135
- @builder.div(:class => 'narrative') do
136
- @builder << lines[1..-1].join("\n")
121
+ builder.div(:class => 'narrative') do
122
+ builder << lines[1..-1].join("\n")
137
123
  end
138
124
  end
139
125
  end
140
126
 
141
- def before_test_case(test_case)
127
+ def before_test_case(_test_case)
142
128
  @previous_step_keyword = nil
143
129
  end
144
130
 
145
- def before_background(background)
131
+ def before_background(_background)
146
132
  @in_background = true
147
- @builder << '<div class="background">'
133
+ builder << '<div class="background">'
148
134
  end
149
135
 
150
- def after_background(background)
136
+ def after_background(_background)
151
137
  @in_background = nil
152
- @builder << '</div>'
138
+ builder << '</div>'
153
139
  end
154
140
 
155
- def background_name(keyword, name, file_colon_line, source_indent)
141
+ def background_name(keyword, name, _file_colon_line, _source_indent)
156
142
  @listing_background = true
157
- @builder.h3(:id => "background_#{@scenario_number}") do |h3|
158
- @builder.span(keyword, :class => 'keyword')
159
- @builder.text!(' ')
160
- @builder.span(name, :class => 'val')
143
+ builder.h3(:id => "background_#{@scenario_number}") do |h3|
144
+ builder.span(keyword, :class => 'keyword')
145
+ builder.text!(' ')
146
+ builder.span(name, :class => 'val')
161
147
  end
162
148
  end
163
149
 
@@ -165,22 +151,22 @@ module Closer
165
151
  @scenario_number+=1
166
152
  @scenario_red = false
167
153
  css_class = AST_CLASSES[feature_element.class]
168
- @builder << "<div class='#{css_class}'>"
154
+ builder << "<div class='#{css_class}'>"
169
155
  @in_scenario_outline = feature_element.class == Cucumber::Core::Ast::ScenarioOutline
170
156
  end
171
157
 
172
- def after_feature_element(feature_element)
158
+ def after_feature_element(_feature_element)
173
159
  unless @in_scenario_outline
174
160
  print_messages
175
- @builder << '</ol>'
161
+ builder << '</ol>'
176
162
  end
177
- @builder << '</div>'
163
+ builder << '</div>'
178
164
  @in_scenario_outline = nil
179
165
  end
180
166
 
181
- def scenario_name(keyword, name, file_colon_line, source_indent)
182
- @builder.span(:class => 'scenario_file hidden') do
183
- @builder << file_colon_line
167
+ def scenario_name(keyword, name, file_colon_line, _source_indent)
168
+ builder.span(:class => 'scenario_file hidden') do
169
+ builder << file_colon_line
184
170
  end
185
171
  @listing_background = false
186
172
  scenario_id = "scenario_#{@scenario_number}"
@@ -192,53 +178,53 @@ module Closer
192
178
 
193
179
  lines = name.split("\n")
194
180
  title = lines.shift
195
- @builder.h3(:id => scenario_id) do
196
- @builder.span(title, :class => 'val pointer')
181
+ builder.h3(:id => scenario_id) do
182
+ builder.span(title, :class => 'val pointer')
197
183
  end
198
184
 
199
185
  if lines.size > 0
200
- @builder.pre(:class => 'narrative hidden') do
186
+ builder.pre(:class => 'narrative hidden') do
201
187
  trim_size = indent_size(lines.first)
202
- @builder << lines.map{|line| line[trim_size..-1] }.join("\n")
188
+ builder << lines.map{|line| line[trim_size..-1] }.join("\n")
203
189
  end
204
190
  end
205
191
  end
206
192
 
207
- def before_outline_table(outline_table)
193
+ def before_outline_table(_outline_table)
208
194
  @inside_outline = true
209
195
  @outline_row = 0
210
- @builder << '<table>'
196
+ builder << '<table>'
211
197
  end
212
198
 
213
- def after_outline_table(outline_table)
214
- @builder << '</table>'
199
+ def after_outline_table(_outline_table)
200
+ builder << '</table>'
215
201
  @outline_row = nil
216
202
  @inside_outline = false
217
203
  end
218
204
 
219
- def before_examples(examples)
220
- @builder << '<div class="examples">'
205
+ def before_examples(_examples)
206
+ builder << '<div class="examples">'
221
207
  end
222
208
 
223
- def after_examples(examples)
224
- @builder << '</div>'
209
+ def after_examples(_examples)
210
+ builder << '</div>'
225
211
  end
226
212
 
227
213
  def examples_name(keyword, name)
228
- @builder.h4 do
229
- @builder.span(keyword, :class => 'keyword')
230
- @builder.text!(' ')
231
- @builder.span(name, :class => 'val')
214
+ builder.h4 do
215
+ builder.span(keyword, :class => 'keyword')
216
+ builder.text!(' ')
217
+ builder.span(name, :class => 'val')
232
218
  end
233
219
  end
234
220
 
235
- def before_steps(steps)
236
- @builder << '<ol class="hidden">'
221
+ def before_steps(_steps)
222
+ builder << '<ol class="hidden">'
237
223
  end
238
224
 
239
- def after_steps(steps)
225
+ def after_steps(_steps)
240
226
  print_messages
241
- @builder << '</ol>' if @in_background or @in_scenario_outline
227
+ builder << '</ol>' if @in_background || @in_scenario_outline
242
228
  end
243
229
 
244
230
  def before_step(step)
@@ -248,10 +234,10 @@ module Closer
248
234
  @step = step
249
235
  end
250
236
 
251
- def after_step(step)
237
+ def after_step(_step)
252
238
  end
253
239
 
254
- def before_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line)
240
+ def before_step_result(_keyword, step_match, _multiline_arg, status, exception, _source_indent, background, _file_colon_line)
255
241
  @step_match = step_match
256
242
  @hide_this_step = false
257
243
  if exception
@@ -270,13 +256,13 @@ module Closer
270
256
  set_scenario_color(status)
271
257
 
272
258
  if ! @delayed_messages.empty? and status == :passed
273
- @builder << "<li id='#{@step_id}' class='step #{status} expand'>"
259
+ builder << "<li id='#{@step_id}' class='step #{status} expand'>"
274
260
  else
275
- @builder << "<li id='#{@step_id}' class='step #{status}'>"
261
+ builder << "<li id='#{@step_id}' class='step #{status}'>"
276
262
  end
277
263
  end
278
264
 
279
- def after_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line)
265
+ def after_step_result(keyword, step_match, _multiline_arg, status, _exception, _source_indent, _background, _file_colon_line)
280
266
  return if @hide_this_step
281
267
  # print snippet for undefined steps
282
268
  unless outline_step?(@step)
@@ -284,13 +270,13 @@ module Closer
284
270
  @previous_step_keyword = keyword
285
271
  end
286
272
  if status == :undefined
287
- @builder.pre do |pre|
288
- # TODO: snippet text should be an event sent to the formatter so we don't
273
+ builder.pre do |pre|
274
+ # TODO: snippet text should be an event sent to the formatter so we don't
289
275
  # have this couping to the runtime.
290
- pre << @runtime.snippet_text(keyword,step_match.instance_variable_get("@name") || '', @step.multiline_arg)
276
+ pre << @runtime.snippet_text(keyword,step_match.instance_variable_get('@name') || '', @step.multiline_arg)
291
277
  end
292
278
  end
293
- @builder << '</li>'
279
+ builder << '</li>'
294
280
 
295
281
  unless status == :undefined
296
282
  step_file = step_match.file_colon_line
@@ -306,13 +292,13 @@ module Closer
306
292
  end
307
293
  end
308
294
  step_contents << "</pre></div>"
309
- @builder << step_contents
295
+ builder << step_contents
310
296
  end
311
297
 
312
298
  print_messages
313
299
  end
314
300
 
315
- def step_name(keyword, step_match, status, source_indent, background, file_colon_line)
301
+ def step_name(keyword, step_match, status, _source_indent, background, _file_colon_line)
316
302
  background_in_scenario = background && !@listing_background
317
303
  @skip_step = background_in_scenario
318
304
 
@@ -321,7 +307,7 @@ module Closer
321
307
  end
322
308
  end
323
309
 
324
- def exception(exception, status)
310
+ def exception(exception, _status)
325
311
  return if @hide_this_step
326
312
  print_messages
327
313
  build_exception_detail(exception)
@@ -335,21 +321,21 @@ module Closer
335
321
  def before_multiline_arg(multiline_arg)
336
322
  return if @hide_this_step || @skip_step
337
323
  if AST_DATA_TABLE === multiline_arg
338
- @builder << '<table>'
324
+ builder << '<table>'
339
325
  end
340
326
  end
341
327
 
342
328
  def after_multiline_arg(multiline_arg)
343
329
  return if @hide_this_step || @skip_step
344
330
  if AST_DATA_TABLE === multiline_arg
345
- @builder << '</table>'
331
+ builder << '</table>'
346
332
  end
347
333
  end
348
334
 
349
335
  def doc_string(string)
350
336
  return if @hide_this_step
351
- @builder.pre(:class => 'val') do |pre|
352
- @builder << h(string).gsub("\n", '&#x000A;')
337
+ builder.pre(:class => 'val') do |pre|
338
+ builder << h(string).gsub("\n", '&#x000A;')
353
339
  end
354
340
  end
355
341
 
@@ -357,17 +343,17 @@ module Closer
357
343
  @row_id = table_row.dom_id
358
344
  @col_index = 0
359
345
  return if @hide_this_step
360
- @builder << "<tr class='step' id='#{@row_id}'>"
346
+ builder << "<tr class='step' id='#{@row_id}'>"
361
347
  end
362
348
 
363
349
  def after_table_row(table_row)
364
350
  return if @hide_this_step
365
351
  print_table_row_messages
366
- @builder << '</tr>'
352
+ builder << '</tr>'
367
353
  if table_row.exception
368
- @builder.tr do
369
- @builder.td(:colspan => @col_index.to_s, :class => 'failed') do
370
- @builder.pre do |pre|
354
+ builder.tr do
355
+ builder.td(:colspan => @col_index.to_s, :class => 'failed') do
356
+ builder.pre do |pre|
371
357
  pre << h(format_exception(table_row.exception))
372
358
  end
373
359
  end
@@ -397,16 +383,16 @@ module Closer
397
383
 
398
384
  def puts(message)
399
385
  @delayed_messages << message
400
- #@builder.pre(message, :class => 'message')
386
+ #builder.pre(message, :class => 'message')
401
387
  end
402
388
 
403
389
  def print_messages
404
390
  return if @delayed_messages.empty?
405
391
 
406
- #@builder.ol do
392
+ #builder.ol do
407
393
  @delayed_messages.each do |ann|
408
- @builder.li(:class => 'message hidden') do
409
- @builder << ann
394
+ builder.li(:class => 'message hidden') do
395
+ builder << ann
410
396
  end
411
397
  end
412
398
  #end
@@ -416,8 +402,8 @@ module Closer
416
402
  def print_table_row_messages
417
403
  return if @delayed_messages.empty?
418
404
 
419
- @builder.td(:class => 'message') do
420
- @builder << @delayed_messages.join(", ")
405
+ builder.td(:class => 'message') do
406
+ builder << @delayed_messages.join(', ')
421
407
  end
422
408
  empty_messages
423
409
  end
@@ -426,8 +412,8 @@ module Closer
426
412
  @delayed_messages = []
427
413
  end
428
414
 
429
- def after_test_case(test_case, result)
430
- if result.failed? and not @scenario_red
415
+ def after_test_case(_test_case, result)
416
+ if result.failed? && !@scenario_red
431
417
  set_scenario_color_failed
432
418
  end
433
419
  end
@@ -436,36 +422,40 @@ module Closer
436
422
 
437
423
  def build_exception_detail(exception)
438
424
  backtrace = Array.new
439
- @builder.div(:class => 'message') do
425
+
426
+ builder.div(:class => 'message') do
440
427
  message = exception.message
428
+
441
429
  if defined?(RAILS_ROOT) && message.include?('Exception caught')
442
430
  matches = message.match(/Showing <i>(.+)<\/i>(?:.+) #(\d+)/)
443
431
  backtrace += ["#{RAILS_ROOT}/#{matches[1]}:#{matches[2]}"] if matches
444
432
  matches = message.match(/<code>([^(\/)]+)<\//m)
445
- message = matches ? matches[1] : ""
433
+ message = matches ? matches[1] : ''
446
434
  end
447
435
 
448
436
  unless exception.instance_of?(RuntimeError)
449
437
  message = "#{message} (#{exception.class})"
450
438
  end
451
439
 
452
- @builder.pre do
453
- @builder.text!(message)
440
+ builder.pre do
441
+ builder.text!(message)
454
442
  end
455
443
  end
456
- @builder.div(:class => 'backtrace') do
457
- @builder.pre do
444
+
445
+ builder.div(:class => 'backtrace') do
446
+ builder.pre do
458
447
  backtrace = exception.backtrace
459
448
  backtrace.delete_if { |x| x =~ /\/gems\/(cucumber|rspec)/ }
460
- @builder << backtrace_line(backtrace.join("\n"))
449
+ builder << backtrace_line(backtrace.join("\n"))
461
450
  end
462
451
  end
452
+
463
453
  extra = extra_failure_content(backtrace)
464
- @builder << extra unless extra == ""
454
+ builder << extra unless extra == ''
465
455
  end
466
456
 
467
457
  def set_scenario_color(status)
468
- if status.nil? or status == :undefined or status == :pending
458
+ if status.nil? || status == :undefined || status == :pending
469
459
  set_scenario_color_pending
470
460
  end
471
461
  if status == :failed
@@ -474,32 +464,32 @@ module Closer
474
464
  end
475
465
 
476
466
  def set_scenario_color_failed
477
- @builder.script do
478
- @builder.text!("makeRed('cucumber-header');") unless @header_red
467
+ builder.script do
468
+ builder.text!("makeRed('cucumber-header');") unless @header_red
479
469
  @header_red = true
480
- scenario_or_background = @in_background ? "background" : "scenario"
481
- @builder.text!("makeRed('#{scenario_or_background}_#{@scenario_number}');") unless @scenario_red
470
+ scenario_or_background = @in_background ? 'background' : 'scenario'
471
+ builder.text!("makeRed('#{scenario_or_background}_#{@scenario_number}');") unless @scenario_red
482
472
  @scenario_red = true
483
- if @options[:expand] and @inside_outline
484
- @builder.text!("makeRed('#{scenario_or_background}_#{@scenario_number}_#{@outline_row}');")
473
+ if @options[:expand] && @inside_outline
474
+ builder.text!("makeRed('#{scenario_or_background}_#{@scenario_number}_#{@outline_row}');")
485
475
  end
486
476
  end
487
477
  end
488
478
 
489
479
  def set_scenario_color_pending
490
- @builder.script do
491
- @builder.text!("makeYellow('cucumber-header');") unless @header_red
492
- scenario_or_background = @in_background ? "background" : "scenario"
493
- @builder.text!("makeYellow('#{scenario_or_background}_#{@scenario_number}');") unless @scenario_red
480
+ builder.script do
481
+ builder.text!("makeYellow('cucumber-header');") unless @header_red
482
+ scenario_or_background = @in_background ? 'background' : 'scenario'
483
+ builder.text!("makeYellow('#{scenario_or_background}_#{@scenario_number}');") unless @scenario_red
494
484
  end
495
485
  end
496
486
 
497
- def build_step(keyword, step_match, status)
487
+ def build_step(keyword, step_match, _status)
498
488
  keyword = display_keyword(keyword)
499
489
  step_name = step_match.format_args(lambda{|param| %{<span class="param">#{param}</span>}})
500
- @builder.div(:class => 'step_name') do |div|
501
- @builder.span(keyword, :class => 'keyword')
502
- @builder.span(:class => 'step val') do |name|
490
+ builder.div(:class => 'step_name') do |div|
491
+ builder.span(keyword, :class => 'keyword')
492
+ builder.span(:class => 'step val') do |name|
503
493
  name << h(step_name).gsub(/&lt;span class=&quot;(.*?)&quot;&gt;/, '<span class="\1">').gsub(/&lt;\/span&gt;/, '</span>')
504
494
  end
505
495
  end
@@ -508,97 +498,24 @@ module Closer
508
498
  step_file.gsub(/^([^:]*\.rb):(\d*)/) do
509
499
  step_file = "<span class=\"pointer\" onclick=\"toggle_step_file(this); return false;\">#{step_file}</span>"
510
500
 
511
- @builder.div(:class => 'step_file') do |div|
512
- @builder.span do
513
- @builder << step_file
501
+ builder.div(:class => 'step_file') do |div|
502
+ builder.span do
503
+ builder << step_file
514
504
  end
515
505
  end
516
506
  end
517
507
  end
518
508
 
519
509
  def build_cell(cell_type, value, attributes)
520
- @builder.__send__(cell_type, attributes) do
521
- @builder.div do
522
- @builder.span(value, :class => 'step param')
510
+ builder.__send__(cell_type, attributes) do
511
+ builder.div do
512
+ builder.span(value,:class => 'step param')
523
513
  end
524
514
  end
525
515
  end
526
516
 
527
- def inline_css
528
- @builder.style do
529
- @builder << File.read(File.dirname(__FILE__) + '/cucumber.css')
530
- @builder << File.read(File.dirname(__FILE__) + '/closer.css')
531
- end
532
- end
533
-
534
- def inline_js
535
- @builder.script do
536
- @builder << inline_jquery
537
- @builder << inline_js_content
538
- @builder << inline_closer
539
- end
540
- end
541
-
542
- def inline_jquery
543
- File.read(File.dirname(__FILE__) + '/jquery-min.js')
544
- end
545
-
546
- def inline_closer
547
- ret = ''
548
- ret << File.read(File.join(File.dirname(__FILE__), 'closer.js'))
549
- ret << File.read(File.join(File.dirname(__FILE__), 'screenshot.js'))
550
-
551
- if should_expand
552
- ret << %w{
553
- $(document).ready(function() {
554
- $('#expander').click();
555
- });
556
- }.join(' ')
557
- end
558
-
559
- ret
560
- end
561
-
562
- def inline_js_content
563
- <<-EOF
564
-
565
- SCENARIOS = "h3[id^='scenario_'],h3[id^=background_]";
566
-
567
- $(document).ready(function() {
568
- $(SCENARIOS).delegate('.val', 'click', function() {
569
- $(this).parent().siblings().toggle(100);
570
- });
571
-
572
- $("#collapser").css('cursor', 'pointer');
573
- $("#collapser").click(function() {
574
- $(SCENARIOS).siblings().addClass('hidden');
575
- $('li.message').addClass('hidden');
576
- });
577
-
578
- $("#expander").css('cursor', 'pointer');
579
- $("#expander").click(function() {
580
- $(SCENARIOS).siblings().removeClass('hidden');
581
- $('li.message').removeClass('hidden');
582
- });
583
- })
584
-
585
- function moveProgressBar(percentDone) {
586
- $("cucumber-header").css('width', percentDone +"%");
587
- }
588
- function makeRed(element_id) {
589
- $('#'+element_id).css('background', '#C40D0D');
590
- $('#'+element_id).css('color', '#FFFFFF');
591
- }
592
- function makeYellow(element_id) {
593
- $('#'+element_id).css('background', '#FAF834');
594
- $('#'+element_id).css('color', '#000000');
595
- }
596
-
597
- EOF
598
- end
599
-
600
517
  def format_exception(exception)
601
- (["#{exception.message}"] + exception.backtrace).join("\n")
518
+ ([exception.message.to_s] + exception.backtrace).join("\n")
602
519
  end
603
520
 
604
521
  def backtrace_line(line)
@@ -608,44 +525,50 @@ module Closer
608
525
  end
609
526
 
610
527
  def print_stats(features)
611
- @builder << "<script>document.getElementById('duration').innerHTML = \"Finished in <strong>#{format_duration(features.duration)} seconds</strong>\";</script>"
612
- @builder << "<script>document.getElementById('totals').innerHTML = \"#{print_stat_string(features)}\";</script>"
528
+ builder << "<script>document.getElementById('duration').innerHTML = \"Finished in <strong>#{format_duration(features.duration)} seconds</strong>\";</script>"
529
+ builder << "<script>document.getElementById('totals').innerHTML = \"#{print_stat_string(features)}\";</script>"
613
530
  end
614
531
 
615
- def print_stat_string(features)
532
+ def print_stat_string(_features)
616
533
  string = String.new
617
- string << dump_count(@runtime.scenarios.length, "scenario")
618
- scenario_count = print_status_counts{|status| @runtime.scenarios(status)}
534
+ string << dump_count(@summary.test_cases.total, 'scenario')
535
+ scenario_count = status_counts(@summary.test_cases)
619
536
  string << scenario_count if scenario_count
620
- string << "<br />"
621
- string << dump_count(@runtime.steps.length, "step")
622
- step_count = print_status_counts{|status| @runtime.steps(status)}
537
+ string << '<br />'
538
+ string << dump_count(@summary.test_steps.total, 'step')
539
+ step_count = status_counts(@summary.test_steps)
623
540
  string << step_count if step_count
624
541
  end
625
542
 
626
- def print_status_counts
627
- counts = [:failed, :skipped, :undefined, :pending, :passed].map do |status|
628
- elements = yield status
629
- elements.any? ? "#{elements.length} #{status.to_s}" : nil
630
- end.compact
631
- return " (#{counts.join(', ')})" if counts.any?
543
+ def status_counts(summary)
544
+ counts = ::Cucumber::Core::Test::Result::TYPES.map { |status|
545
+ count = summary.total(status)
546
+ [status, count]
547
+ }.select { |status, count|
548
+ count > 0
549
+ }.map { |status, count|
550
+ "#{count} #{status}"
551
+ }
552
+ "(#{counts.join(", ")})" if counts.any?
632
553
  end
633
554
 
634
555
  def dump_count(count, what, state=nil)
635
- [count, state, "#{what}#{count == 1 ? '' : 's'}"].compact.join(" ")
636
- end
637
-
638
- def create_builder(io)
639
- Builder::XmlMarkup.new(:target => io, :indent => 0)
556
+ [count, state, "#{what}#{count == 1 ? '' : 's'}"].compact.join(' ')
640
557
  end
641
558
 
642
- def outline_step?(step)
559
+ def outline_step?(_step)
643
560
  not @step.step.respond_to?(:actual_keyword)
644
561
  end
645
562
 
646
563
  class SnippetExtractor #:nodoc:
647
- class NullConverter; def convert(code, pre); code; end; end #:nodoc:
648
- begin; require 'syntax/convertors/html'; @@converter = Syntax::Convertors::HTML.for_syntax "ruby"; rescue LoadError => e; @@converter = NullConverter.new; end
564
+ class NullConverter; def convert(code, _pre); code; end; end #:nodoc:
565
+
566
+ begin
567
+ require 'syntax/convertors/html'
568
+ @@converter = Syntax::Convertors::HTML.for_syntax 'ruby'
569
+ rescue LoadError
570
+ @@converter = NullConverter.new
571
+ end
649
572
 
650
573
  def snippet(error)
651
574
  raw_code, line = snippet_for(error[0])
@@ -694,4 +617,4 @@ module Closer
694
617
  end
695
618
  end
696
619
  end
697
- end
620
+ end