cucumber 2.0.0 → 2.0.1

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 (74) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +7 -9
  3. data/History.md +295 -265
  4. data/README.md +9 -7
  5. data/cucumber.gemspec +2 -2
  6. data/features/docs/cli/dry_run.feature +0 -3
  7. data/features/docs/cli/finding_steps.feature +28 -0
  8. data/features/docs/cli/run_specific_scenarios.feature +3 -1
  9. data/features/docs/cli/specifying_multiple_formatters.feature +22 -1
  10. data/features/docs/defining_steps/nested_steps.feature +0 -1
  11. data/features/docs/defining_steps/printing_messages.feature +4 -4
  12. data/features/docs/defining_steps/skip_scenario.feature +0 -2
  13. data/features/docs/exception_in_around_hook.feature +1 -3
  14. data/features/docs/formatters/html_formatter.feature +1 -0
  15. data/features/docs/formatters/json_formatter.feature +73 -62
  16. data/features/docs/formatters/junit_formatter.feature +130 -38
  17. data/features/docs/formatters/rerun_formatter.feature +60 -8
  18. data/features/docs/formatters/usage_formatter.feature +3 -7
  19. data/features/docs/getting_started.feature +1 -1
  20. data/features/docs/gherkin/background.feature +0 -11
  21. data/features/docs/gherkin/language_help.feature +5 -0
  22. data/features/docs/gherkin/outlines.feature +1 -3
  23. data/features/docs/gherkin/using_descriptions.feature +0 -1
  24. data/features/docs/raketask.feature +1 -1
  25. data/features/docs/writing_support_code/after_hooks.feature +22 -0
  26. data/features/lib/step_definitions/aruba_steps.rb +4 -0
  27. data/features/lib/step_definitions/junit_steps.rb +1 -1
  28. data/features/lib/support/normalise_output.rb +21 -4
  29. data/lib/cucumber/cli/configuration.rb +16 -13
  30. data/lib/cucumber/cli/main.rb +35 -10
  31. data/lib/cucumber/cli/options.rb +33 -9
  32. data/lib/cucumber/cli/rerun_file.rb +29 -0
  33. data/lib/cucumber/filters/prepare_world.rb +2 -3
  34. data/lib/cucumber/formatter/backtrace_filter.rb +40 -0
  35. data/lib/cucumber/formatter/console.rb +2 -3
  36. data/lib/cucumber/formatter/cucumber.css +1 -0
  37. data/lib/cucumber/formatter/duration_extractor.rb +28 -0
  38. data/lib/cucumber/formatter/hook_query_visitor.rb +40 -0
  39. data/lib/cucumber/formatter/html.rb +16 -1
  40. data/lib/cucumber/formatter/json.rb +287 -8
  41. data/lib/cucumber/formatter/junit.rb +92 -143
  42. data/lib/cucumber/formatter/legacy_api/adapter.rb +18 -54
  43. data/lib/cucumber/formatter/legacy_api/ast.rb +13 -0
  44. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +4 -0
  45. data/lib/cucumber/formatter/pretty.rb +2 -1
  46. data/lib/cucumber/formatter/progress.rb +20 -53
  47. data/lib/cucumber/formatter/rerun.rb +2 -1
  48. data/lib/cucumber/formatter/usage.rb +16 -22
  49. data/lib/cucumber/hooks.rb +18 -9
  50. data/lib/cucumber/multiline_argument/data_table.rb +40 -28
  51. data/lib/cucumber/platform.rb +1 -1
  52. data/lib/cucumber/rb_support/rb_hook.rb +4 -0
  53. data/lib/cucumber/running_test_case.rb +13 -4
  54. data/lib/cucumber/runtime/after_hooks.rb +7 -6
  55. data/lib/cucumber/runtime/before_hooks.rb +8 -4
  56. data/lib/cucumber/runtime/step_hooks.rb +5 -4
  57. data/lib/cucumber/runtime/support_code.rb +6 -15
  58. data/lib/cucumber/step_match.rb +1 -1
  59. data/spec/cucumber/cli/configuration_spec.rb +32 -5
  60. data/spec/cucumber/cli/main_spec.rb +3 -3
  61. data/spec/cucumber/cli/options_spec.rb +60 -1
  62. data/spec/cucumber/cli/rerun_spec.rb +89 -0
  63. data/spec/cucumber/formatter/html_spec.rb +84 -5
  64. data/spec/cucumber/formatter/json_spec.rb +757 -0
  65. data/spec/cucumber/formatter/junit_spec.rb +5 -5
  66. data/spec/cucumber/formatter/legacy_api/adapter_spec.rb +69 -8
  67. data/spec/cucumber/formatter/pretty_spec.rb +96 -0
  68. data/spec/cucumber/formatter/progress_spec.rb +85 -1
  69. data/spec/cucumber/formatter/rerun_spec.rb +3 -3
  70. data/spec/cucumber/multiline_argument/data_table_spec.rb +89 -0
  71. data/spec/cucumber/running_test_case_spec.rb +57 -1
  72. metadata +70 -60
  73. data/lib/cucumber/formatter/gherkin_formatter_adapter.rb +0 -204
  74. data/lib/cucumber/formatter/gpretty.rb +0 -24
@@ -8,10 +8,6 @@ module Cucumber
8
8
  # The formatter used for <tt>--format junit</tt>
9
9
  class Junit
10
10
 
11
- # TODO: remove coupling to types
12
- AST_SCENARIO_OUTLINE = Core::Ast::ScenarioOutline
13
- AST_EXAMPLE_ROW = LegacyApi::Ast::ExampleTableRow
14
-
15
11
  include Io
16
12
 
17
13
  class UnNamedFeatureError < StandardError
@@ -20,168 +16,129 @@ module Cucumber
20
16
  end
21
17
  end
22
18
 
23
- def initialize(runtime, io, options)
19
+ def initialize(_runtime, io, options)
24
20
  @reportdir = ensure_dir(io, "junit")
25
21
  @options = options
26
22
  end
27
23
 
28
- def before_feature(feature)
29
- @current_feature = feature
30
- @failures = @errors = @tests = @skipped = 0
31
- @builder = Builder::XmlMarkup.new( :indent => 2 )
32
- @time = 0
24
+ def before_test_case(test_case)
25
+ unless same_feature_as_previous_test_case?(test_case.feature)
26
+ end_feature if @current_feature
27
+ start_feature(test_case.feature)
28
+ end
29
+ @failing_step_source = nil
33
30
  # In order to fill out <system-err/> and <system-out/>, we need to
34
31
  # intercept the $stderr and $stdout
35
32
  @interceptedout = Interceptor::Pipe.wrap(:stdout)
36
33
  @interceptederr = Interceptor::Pipe.wrap(:stderr)
37
34
  end
38
35
 
39
- def before_feature_element(feature_element)
40
- @in_examples = AST_SCENARIO_OUTLINE === feature_element
41
- @steps_start = Time.now
42
- end
36
+ def after_test_step(test_step, result)
37
+ return if @failing_step_source
43
38
 
44
- def after_feature(feature)
45
- @testsuite = Builder::XmlMarkup.new( :indent => 2 )
46
- @testsuite.instruct!
47
- @testsuite.testsuite(
48
- :failures => @failures,
49
- :errors => @errors,
50
- :skipped => @skipped,
51
- :tests => @tests,
52
- :time => "%.6f" % @time,
53
- :name => @feature_name ) do
54
- @testsuite << @builder.target!
55
- @testsuite.tag!('system-out') do
56
- @testsuite.cdata! strip_control_chars(@interceptedout.buffer.join)
57
- end
58
- @testsuite.tag!('system-err') do
59
- @testsuite.cdata! strip_control_chars(@interceptederr.buffer.join)
60
- end
61
- end
39
+ @failing_step_source = test_step.source.last unless result.ok?(@options[:strict])
40
+ end
62
41
 
63
- write_file(feature_result_filename(feature.file), @testsuite.target!)
42
+ def after_test_case(test_case, result)
43
+ test_case_name = NameBuilder.new(test_case)
44
+ scenario = test_case_name.scenario_name
45
+ scenario_designation = "#{scenario}#{test_case_name.name_suffix}"
46
+ output = create_output_string(test_case, scenario, result, test_case_name.row_name)
47
+ build_testcase(result, scenario_designation, output)
64
48
 
65
49
  Interceptor::Pipe.unwrap! :stdout
66
50
  Interceptor::Pipe.unwrap! :stderr
67
51
  end
68
52
 
69
- def before_background(*args)
70
- @in_background = true
53
+ def done
54
+ end_feature if @current_feature
71
55
  end
72
56
 
73
- def after_background(*args)
74
- @in_background = false
75
- end
76
-
77
- def feature_name(keyword, name)
78
- raise UnNamedFeatureError.new(@current_feature.file) if name.empty?
79
- lines = name.split(/\r?\n/)
80
- @feature_name = lines[0]
81
- end
82
-
83
- def scenario_name(keyword, name, file_colon_line, source_indent)
84
- @scenario = (name.nil? || name == "") ? "Unnamed scenario" : name.split("\n")[0]
85
- @output = "#{keyword}: #{@scenario}\n\n"
86
- end
87
-
88
- def before_steps(steps)
89
- end
90
-
91
- def after_steps(steps)
92
- return if @in_background || @in_examples
93
-
94
- duration = Time.now - @steps_start
95
- if steps.failed?
96
- steps.each { |step| @output += "#{step.keyword}#{step.name}\n" }
97
- @output += "\nMessage:\n"
98
- end
99
- build_testcase(duration, steps.status, steps.exception)
100
- end
101
-
102
- def before_examples(*args)
103
- @header_row = true
104
- @in_examples = true
105
- end
57
+ private
106
58
 
107
- def after_examples(*args)
108
- @in_examples = false
59
+ def same_feature_as_previous_test_case?(feature)
60
+ @current_feature && @current_feature.file == feature.file && @current_feature.location == feature.location
109
61
  end
110
62
 
111
- def before_table_row(table_row)
112
- return unless @in_examples
113
-
114
- @table_start = Time.now
63
+ def start_feature(feature)
64
+ raise UnNamedFeatureError.new(feature.file) if feature.name.empty?
65
+ @current_feature = feature
66
+ @failures = @errors = @tests = @skipped = 0
67
+ @builder = Builder::XmlMarkup.new(:indent => 2)
68
+ @time = 0
115
69
  end
116
70
 
117
- def after_table_row(table_row)
118
- return unless @in_examples and AST_EXAMPLE_ROW === table_row
119
- duration = Time.now - @table_start
120
- unless @header_row
121
- name_suffix = " (outline example : #{table_row.name})"
122
- if table_row.failed?
123
- @output += "Example row: #{table_row.name}\n"
124
- @output += "\nMessage:\n"
125
- end
126
- build_testcase(duration, table_row.status, table_row.exception, name_suffix)
71
+ def end_feature
72
+ @testsuite = Builder::XmlMarkup.new(:indent => 2)
73
+ @testsuite.instruct!
74
+ @testsuite.testsuite(
75
+ :failures => @failures,
76
+ :errors => @errors,
77
+ :skipped => @skipped,
78
+ :tests => @tests,
79
+ :time => "%.6f" % @time,
80
+ :name => @current_feature.name ) do
81
+ @testsuite << @builder.target!
127
82
  end
128
83
 
129
- @header_row = false if @header_row
130
- end
131
-
132
- def before_test_case(test_case)
133
- if @options[:expand] and test_case.keyword == "Scenario Outline"
134
- @exception = nil
135
- end
84
+ write_file(feature_result_filename(@current_feature.file), @testsuite.target!)
136
85
  end
137
86
 
138
- def after_step_result(keyword, step_match, multiline_arg, status, exception, source_indent, background, file_colon_line)
139
- if @options[:expand] and @in_examples
140
- if not @exception and exception
141
- @exception = exception
142
- end
87
+ def create_output_string(test_case, scenario, result, row_name)
88
+ output = "#{test_case.keyword}: #{scenario}\n\n"
89
+ return output if result.ok?(@options[:strict])
90
+ if test_case.keyword == "Scenario"
91
+ output += "#{@failing_step_source.keyword}" unless hook?(@failing_step_source)
92
+ output += "#{@failing_step_source.name}\n"
93
+ else
94
+ output += "Example row: #{row_name}\n"
143
95
  end
96
+ output + "\nMessage:\n"
144
97
  end
145
98
 
146
- def after_test_case(test_case, result)
147
- if @options[:expand] and test_case.keyword == "Scenario Outline"
148
- test_case_name = NameBuilder.new(test_case)
149
- @scenario = test_case_name.outline_name
150
- @output = "#{test_case.keyword}: #{@scenario}\n\n"
151
- if result.failed?
152
- @output += "Example row: #{test_case_name.row_name}\n"
153
- @output += "\nMessage:\n"
154
- end
155
- test_case_result = ResultBuilder.new(result)
156
- build_testcase(test_case_result.test_case_duration, test_case_result.status, @exception, test_case_name.name_suffix)
157
- end
99
+ def hook?(step)
100
+ ["Before hook", "After hook", "AfterStep hook"].include? step.name
158
101
  end
159
102
 
160
- private
161
-
162
- def build_testcase(duration, status, exception = nil, suffix = "")
103
+ def build_testcase(result, scenario_designation, output)
104
+ duration = ResultBuilder.new(result).test_case_duration
163
105
  @time += duration
164
- classname = @feature_name
165
- name = "#{@scenario}#{suffix}"
166
- pending = [:pending, :undefined].include?(status) && (!@options[:strict])
106
+ classname = @current_feature.name
107
+ name = scenario_designation
167
108
 
168
109
  @builder.testcase(:classname => classname, :name => name, :time => "%.6f" % duration) do
169
- if status == :skipped || pending
110
+ if !result.passed? && result.ok?(@options[:strict])
170
111
  @builder.skipped
171
112
  @skipped += 1
172
- elsif status != :passed
173
- @builder.failure(:message => "#{status.to_s} #{name}", :type => status.to_s) do
174
- @builder.cdata! @output
113
+ elsif !result.passed?
114
+ status = result.to_sym
115
+ exception = get_backtrace_object(result)
116
+ @builder.failure(:message => "#{status} #{name}", :type => status) do
117
+ @builder.cdata! output
175
118
  @builder.cdata!(format_exception(exception)) if exception
176
119
  end
177
120
  @failures += 1
178
121
  end
179
- @builder.tag!('system-out')
180
- @builder.tag!('system-err')
122
+ @builder.tag!('system-out') do
123
+ @builder.cdata! strip_control_chars(@interceptedout.buffer.join)
124
+ end
125
+ @builder.tag!('system-err') do
126
+ @builder.cdata! strip_control_chars(@interceptederr.buffer.join)
127
+ end
181
128
  end
182
129
  @tests += 1
183
130
  end
184
131
 
132
+ def get_backtrace_object(result)
133
+ if result.failed?
134
+ return result.exception
135
+ elsif result.backtrace
136
+ return result
137
+ else
138
+ return nil
139
+ end
140
+ end
141
+
185
142
  def format_exception(exception)
186
143
  (["#{exception.message} (#{exception.class})"] + exception.backtrace).join("\n")
187
144
  end
@@ -202,13 +159,15 @@ module Cucumber
202
159
  def strip_control_chars(cdata)
203
160
  cdata.scan(/[[:print:]\t\n\r]/).join
204
161
  end
205
-
162
+
206
163
  end
207
164
 
208
165
  class NameBuilder
209
- attr_reader :outline_name, :name_suffix, :row_name
166
+ attr_reader :scenario_name, :name_suffix, :row_name
210
167
 
211
168
  def initialize(test_case)
169
+ @name_suffix = ""
170
+ @row_name = ""
212
171
  test_case.describe_source_to self
213
172
  end
214
173
 
@@ -216,12 +175,13 @@ module Cucumber
216
175
  self
217
176
  end
218
177
 
219
- def scenario(*)
178
+ def scenario(scenario)
179
+ @scenario_name = (scenario.name.nil? || scenario.name == "") ? "Unnamed scenario" : scenario.name
220
180
  self
221
181
  end
222
182
 
223
183
  def scenario_outline(outline)
224
- @outline_name = outline.name
184
+ @scenario_name = (outline.name.nil? || outline.name == "") ? "Unnamed scenario outline" : outline.name
225
185
  self
226
186
  end
227
187
 
@@ -237,37 +197,26 @@ module Cucumber
237
197
  end
238
198
 
239
199
  class ResultBuilder
240
- attr_reader :status, :test_case_duration
200
+ attr_reader :test_case_duration
241
201
  def initialize(result)
242
202
  @test_case_duration = 0
243
203
  result.describe_to(self)
244
204
  end
245
205
 
246
- def passed
247
- @status = :passed
248
- end
206
+ def passed(*) end
249
207
 
250
- def failed
251
- @status = :failed
252
- end
208
+ def failed(*) end
253
209
 
254
- def undefined
255
- @status = :undefined
256
- end
210
+ def undefined(*) end
257
211
 
258
- def skipped
259
- @status = :skipped
260
- end
212
+ def skipped(*) end
261
213
 
262
- def pending(*)
263
- @status = :pending
264
- end
214
+ def pending(*) end
265
215
 
266
- def exception(*)
267
- end
216
+ def exception(*) end
268
217
 
269
218
  def duration(duration, *)
270
- duration.tap { |duration| @test_case_duration = duration.nanoseconds / 10 ** 9.0 }
219
+ duration.tap { |duration| @test_case_duration = duration.nanoseconds / 10**9.0 }
271
220
  end
272
221
  end
273
222
 
@@ -2,6 +2,7 @@ require 'forwardable'
2
2
  require 'delegate'
3
3
  require 'cucumber/errors'
4
4
  require 'cucumber/multiline_argument'
5
+ require 'cucumber/formatter/backtrace_filter'
5
6
  require 'cucumber/formatter/legacy_api/ast'
6
7
 
7
8
  module Cucumber
@@ -29,13 +30,13 @@ module Cucumber
29
30
 
30
31
  def after_test_step(test_step, result)
31
32
  printer.after_test_step(test_step, result)
32
- formatter.after_test_step(test_step, result)
33
+ formatter.after_test_step(test_step, result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter))
33
34
  end
34
35
 
35
36
  def after_test_case(test_case, result)
36
37
  record_test_case_result(test_case, result)
37
38
  printer.after_test_case(test_case, result)
38
- formatter.after_test_case(test_case, result)
39
+ formatter.after_test_case(test_case, result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter))
39
40
  end
40
41
 
41
42
  def puts(*messages)
@@ -271,7 +272,7 @@ module Cucumber
271
272
 
272
273
  def after_step_hook(hook, result)
273
274
  p current_test_step_source if current_test_step_source.step.nil?
274
- line = StepBacktraceLine.new(current_test_step_source.step)
275
+ line = current_test_step_source.step.backtrace_line
275
276
  @child.after_step_hook Ast::HookResult.new(LegacyResultBuilder.new(result).
276
277
  append_to_exception_backtrace(line), @delayed_messages, @delayed_embeddings)
277
278
  @delayed_messages = []
@@ -321,7 +322,7 @@ module Cucumber
321
322
  if same_background_as_previous_test_case?(source)
322
323
  HiddenBackgroundPrinter.new(formatter, source.background)
323
324
  else
324
- BackgroundPrinter.new(formatter, source.background, before_hook_results)
325
+ BackgroundPrinter.new(formatter, node, source.background, before_hook_results)
325
326
  end
326
327
  elsif source.scenario
327
328
  ScenarioPrinter.new(formatter, source.scenario, before_hook_results)
@@ -448,7 +449,7 @@ module Cucumber
448
449
  end
449
450
  end
450
451
 
451
- BackgroundPrinter = Struct.new(:formatter, :node, :before_hook_results) do
452
+ BackgroundPrinter = Struct.new(:formatter, :feature, :node, :before_hook_results) do
452
453
 
453
454
  def after_test_case(*)
454
455
  end
@@ -457,7 +458,8 @@ module Cucumber
457
458
  end
458
459
 
459
460
  def before
460
- formatter.before_background node
461
+ formatter.before_background Ast::Background.new(feature, node)
462
+ Ast::Comments.new(node.comments).accept(formatter)
461
463
  formatter.background_name node.keyword, node.legacy_conflated_name_and_description, node.location.to_s, indent.of(node)
462
464
  before_hook_results.accept(formatter)
463
465
  self
@@ -477,7 +479,7 @@ module Cucumber
477
479
 
478
480
  def after
479
481
  @child.after if @child
480
- formatter.after_background(node)
482
+ formatter.after_background(Ast::Background.new(feature, node))
481
483
  self
482
484
  end
483
485
 
@@ -519,6 +521,7 @@ module Cucumber
519
521
 
520
522
  def before
521
523
  formatter.before_feature_element(node)
524
+ Ast::Comments.new(node.comments).accept(formatter)
522
525
  Ast::Tags.new(node.tags).accept(formatter)
523
526
  formatter.scenario_name node.keyword, node.legacy_conflated_name_and_description, node.location.to_s, indent.of(node)
524
527
  before_hook_results.accept(formatter)
@@ -593,6 +596,7 @@ module Cucumber
593
596
 
594
597
  def before
595
598
  formatter.before_feature_element(node)
599
+ Ast::Comments.new(node.comments).accept(formatter)
596
600
  Ast::Tags.new(node.tags).accept(formatter)
597
601
  formatter.scenario_name node.keyword, node.legacy_conflated_name_and_description, node.location.to_s, indent.of(node)
598
602
  OutlineStepsPrinter.new(formatter, configuration, indent).print(node)
@@ -693,6 +697,8 @@ module Cucumber
693
697
 
694
698
  def before
695
699
  formatter.before_examples(node)
700
+ Ast::Comments.new(node.comments).accept(formatter)
701
+ Ast::Tags.new(node.tags).accept(formatter)
696
702
  formatter.examples_name(node.keyword, node.legacy_conflated_name_and_description)
697
703
  formatter.before_outline_table(legacy_table)
698
704
  if !configuration.expand?
@@ -803,6 +809,7 @@ module Cucumber
803
809
  end
804
810
 
805
811
  def before
812
+ Ast::Comments.new(node.comments).accept(formatter)
806
813
  formatter.before_table_row(node)
807
814
  self
808
815
  end
@@ -822,6 +829,7 @@ module Cucumber
822
829
  class TableRowPrinter < TableRowPrinterBase
823
830
  def before
824
831
  before_hook_results.accept(formatter)
832
+ Ast::Comments.new(node.comments).accept(formatter)
825
833
  formatter.before_table_row(node)
826
834
  self
827
835
  end
@@ -995,66 +1003,22 @@ module Cucumber
995
1003
  return filtered_step_exception(step) if @exception
996
1004
  return nil unless @status == :undefined && configuration.strict?
997
1005
  @exception = Cucumber::Undefined.from(@result, step.name)
1006
+ @exception.backtrace << step.backtrace_line
998
1007
  filtered_step_exception(step)
999
1008
  end
1000
1009
 
1001
1010
  def filtered_exception
1002
- BacktraceFilter.new(@exception.dup).exception
1011
+ Cucumber::Formatter::BacktraceFilter.new(@exception.dup).exception
1003
1012
  end
1004
1013
 
1005
1014
  def filtered_step_exception(step)
1006
1015
  exception = filtered_exception
1007
- exception.backtrace << StepBacktraceLine.new(step).to_s
1008
- return BacktraceFilter.new(exception).exception
1016
+ return Cucumber::Formatter::BacktraceFilter.new(exception).exception
1009
1017
  end
1010
1018
  end
1011
1019
 
1012
1020
  end
1013
1021
 
1014
- class StepBacktraceLine < Struct.new(:step)
1015
- def initialize(step)
1016
- raise ArgumentError if step.nil?
1017
- super
1018
- end
1019
-
1020
- def to_s
1021
- step.backtrace_line
1022
- end
1023
- end
1024
-
1025
- require 'cucumber/platform'
1026
- class BacktraceFilter
1027
- BACKTRACE_FILTER_PATTERNS = \
1028
- [/vendor\/rails|lib\/cucumber|bin\/cucumber:|lib\/rspec|gems\/|minitest|test\/unit|.gem\/ruby|lib\/ruby/]
1029
- if(::Cucumber::JRUBY)
1030
- BACKTRACE_FILTER_PATTERNS << /org\/jruby/
1031
- end
1032
- PWD_PATTERN = /#{::Regexp.escape(::Dir.pwd)}\//m
1033
-
1034
- def initialize(exception)
1035
- @exception = exception
1036
- end
1037
-
1038
- def exception
1039
- return @exception if ::Cucumber.use_full_backtrace
1040
- @exception.backtrace.each{|line| line.gsub!(PWD_PATTERN, "./")}
1041
-
1042
- filtered = (@exception.backtrace || []).reject do |line|
1043
- BACKTRACE_FILTER_PATTERNS.detect { |p| line =~ p }
1044
- end
1045
-
1046
- if ::ENV['CUCUMBER_TRUNCATE_OUTPUT']
1047
- # Strip off file locations
1048
- filtered = filtered.map do |line|
1049
- line =~ /(.*):in `/ ? $1 : line
1050
- end
1051
- end
1052
-
1053
- @exception.set_backtrace(filtered)
1054
- @exception
1055
- end
1056
- end
1057
-
1058
1022
  end
1059
1023
  end
1060
1024
  end