cucumber 11.0.0 → 11.1.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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +15 -6
  3. data/VERSION +1 -1
  4. data/lib/cucumber/cli/main.rb +22 -0
  5. data/lib/cucumber/configuration.rb +4 -0
  6. data/lib/cucumber/events/base.rb +25 -0
  7. data/lib/cucumber/events/envelope.rb +11 -2
  8. data/lib/cucumber/events/gherkin_source_parsed.rb +12 -3
  9. data/lib/cucumber/events/gherkin_source_read.rb +11 -3
  10. data/lib/cucumber/events/hook_test_step_created.rb +12 -2
  11. data/lib/cucumber/events/step_activated.rb +13 -7
  12. data/lib/cucumber/events/step_definition_registered.rb +12 -4
  13. data/lib/cucumber/events/test_case_created.rb +11 -3
  14. data/lib/cucumber/events/test_case_finished.rb +12 -4
  15. data/lib/cucumber/events/test_case_ready.rb +10 -4
  16. data/lib/cucumber/events/test_case_started.rb +11 -2
  17. data/lib/cucumber/events/test_run_finished.rb +10 -3
  18. data/lib/cucumber/events/test_run_hook_finished.rb +11 -3
  19. data/lib/cucumber/events/test_run_hook_started.rb +10 -1
  20. data/lib/cucumber/events/test_run_started.rb +11 -2
  21. data/lib/cucumber/events/test_step_created.rb +12 -2
  22. data/lib/cucumber/events/test_step_finished.rb +12 -2
  23. data/lib/cucumber/events/test_step_started.rb +11 -2
  24. data/lib/cucumber/events/undefined_parameter_type.rb +11 -3
  25. data/lib/cucumber/filters/fire_before_all_hooks.rb +36 -0
  26. data/lib/cucumber/formatter/console.rb +15 -7
  27. data/lib/cucumber/formatter/console_issues.rb +5 -5
  28. data/lib/cucumber/formatter/fail_fast.rb +3 -4
  29. data/lib/cucumber/formatter/global_hooks_summary.rb +36 -0
  30. data/lib/cucumber/formatter/json.rb +5 -3
  31. data/lib/cucumber/formatter/junit.rb +4 -6
  32. data/lib/cucumber/formatter/message.rb +7 -4
  33. data/lib/cucumber/formatter/message_builder.rb +207 -205
  34. data/lib/cucumber/formatter/pretty.rb +2 -5
  35. data/lib/cucumber/formatter/progress.rb +0 -2
  36. data/lib/cucumber/formatter/rerun.rb +10 -4
  37. data/lib/cucumber/formatter/usage.rb +1 -2
  38. data/lib/cucumber/glue/proto_world.rb +6 -4
  39. data/lib/cucumber/glue/registry_and_more.rb +98 -9
  40. data/lib/cucumber/runtime/user_interface.rb +2 -2
  41. data/lib/cucumber/runtime.rb +28 -9
  42. metadata +9 -14
  43. data/lib/cucumber/formatter/errors.rb +0 -9
  44. data/lib/cucumber/formatter/query/hook_by_test_step.rb +0 -34
  45. data/lib/cucumber/formatter/query/pickle_by_test.rb +0 -28
  46. data/lib/cucumber/formatter/query/step_definitions_by_test_step.rb +0 -42
  47. data/lib/cucumber/formatter/query/test_case_started_by_test_case.rb +0 -45
@@ -116,11 +116,11 @@ module Cucumber
116
116
  def collect_snippet_data(test_step, ast_lookup)
117
117
  # collect snippet data for undefined steps
118
118
  keyword = ast_lookup.snippet_step_keyword(test_step)
119
- @snippets_input << Console::SnippetData.new(keyword, test_step)
119
+ snippets_input << Console::SnippetData.new(keyword, test_step)
120
120
  end
121
121
 
122
122
  def collect_undefined_parameter_type_names(undefined_parameter_type)
123
- @undefined_parameter_types << undefined_parameter_type.type_name
123
+ undefined_parameter_types << undefined_parameter_type.type_name
124
124
  end
125
125
 
126
126
  def print_snippets(options)
@@ -129,9 +129,9 @@ module Cucumber
129
129
  snippet_text_proc = lambda do |step_keyword, step_name, multiline_arg|
130
130
  snippet_text(step_keyword, step_name, multiline_arg)
131
131
  end
132
- do_print_snippets(snippet_text_proc) unless @snippets_input.empty?
132
+ do_print_snippets(snippet_text_proc) unless snippets_input.empty?
133
133
 
134
- @undefined_parameter_types.map do |type_name|
134
+ undefined_parameter_types.map do |type_name|
135
135
  do_print_undefined_parameter_type_snippet(type_name)
136
136
  end
137
137
  end
@@ -169,7 +169,7 @@ module Cucumber
169
169
  end
170
170
  end
171
171
 
172
- def attach(src, media_type, filename)
172
+ def attach(src, media_type, filename, _streamed_file)
173
173
  return unless media_type == 'text/x.cucumber.log+plain'
174
174
  return unless @io
175
175
 
@@ -249,11 +249,19 @@ module Cucumber
249
249
 
250
250
  def snippet_text(step_keyword, step_name, multiline_arg)
251
251
  keyword = Cucumber::Gherkin::I18n.code_keyword_for(step_keyword).strip
252
- config.snippet_generators.map do |generator|
253
- generator.call(keyword, step_name, multiline_arg, config.snippet_type)
252
+ @config.snippet_generators.map do |generator|
253
+ generator.call(keyword, step_name, multiline_arg, @config.snippet_type)
254
254
  end.join("\n")
255
255
  end
256
256
 
257
+ def snippets_input
258
+ @snippets_input ||= []
259
+ end
260
+
261
+ def undefined_parameter_types
262
+ @undefined_parameter_types ||= []
263
+ end
264
+
257
265
  class SnippetData
258
266
  attr_reader :actual_keyword, :step
259
267
 
@@ -10,6 +10,7 @@ module Cucumber
10
10
  def initialize(config, ast_lookup = AstLookup.new(config))
11
11
  @previous_test_case = nil
12
12
  @issues = Hash.new { |h, k| h[k] = [] }
13
+ @global_hooks_summary = GlobalHooksSummary.new(config)
13
14
  @config = config
14
15
  @config.on_event(:test_case_finished) do |event|
15
16
  if event.test_case != @previous_test_case
@@ -24,14 +25,13 @@ module Cucumber
24
25
  end
25
26
 
26
27
  def to_s
27
- return if @issues.empty?
28
-
29
- result = Core::Test::Result::TYPES.map { |type| scenario_listing(type, @issues[type]) }
30
- result.flatten.join("\n")
28
+ test_case_result = @issues.empty? ? [] : Core::Test::Result::TYPES.map { |type| scenario_listing(type, @issues[type]) }
29
+ global_hooks_result = @global_hooks_summary.ok? ? [] : @global_hooks_summary.exception_listing
30
+ [test_case_result + global_hooks_result].flatten.join("\n")
31
31
  end
32
32
 
33
33
  def any?
34
- @issues.any?
34
+ @issues.any? || !@global_hooks_summary.ok?
35
35
  end
36
36
 
37
37
  private
@@ -9,11 +9,10 @@ module Cucumber
9
9
  def initialize(configuration)
10
10
  @previous_test_case = nil
11
11
  configuration.on_event :test_case_finished do |event|
12
- test_case, result = *event.attributes
13
- if test_case != @previous_test_case
12
+ if event.test_case != @previous_test_case
14
13
  @previous_test_case = event.test_case
15
- Cucumber.wants_to_quit = true unless result.ok?(strict: configuration.strict)
16
- elsif result.passed?
14
+ Cucumber.wants_to_quit = true unless event.result.ok?(strict: configuration.strict)
15
+ elsif event.result.passed?
17
16
  Cucumber.wants_to_quit = false
18
17
  end
19
18
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cucumber/formatter/io'
4
+ require 'cucumber/formatter/console'
5
+ require 'cucumber/formatter/console_counts'
6
+ require 'cucumber/formatter/console_issues'
7
+ require 'cucumber/core/test/result'
8
+ require 'cucumber/formatter/ast_lookup'
9
+
10
+ module Cucumber
11
+ module Formatter
12
+ # AllHookSummary formatter, keep track of failures in Before/AfterAll hooks
13
+ class GlobalHooksSummary
14
+ include Console
15
+
16
+ def initialize(config)
17
+ @config = config
18
+ @all_hook_failures = []
19
+
20
+ @config.on_event :test_run_hook_finished do |event|
21
+ @all_hook_failures << event unless event.test_result.ok?
22
+ end
23
+ end
24
+
25
+ def ok?
26
+ @all_hook_failures.empty?
27
+ end
28
+
29
+ def exception_listing
30
+ [format_string('Global hook failures:', :failed)] + @all_hook_failures.map do |event|
31
+ format_string("#{event.hook.location} # #{event.test_result.exception} (#{event.test_result.exception.class})", :failed)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -65,7 +65,8 @@ module Cucumber
65
65
  end
66
66
 
67
67
  def on_test_step_finished(event)
68
- test_step, result = *event.attributes
68
+ test_step = event.test_step
69
+ result = event.result
69
70
  result = result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter)
70
71
  return if internal_hook?(test_step)
71
72
 
@@ -76,7 +77,8 @@ module Cucumber
76
77
  def on_test_case_finished(event)
77
78
  feature_elements << @test_case_hash if @in_background
78
79
 
79
- _test_case, result = *event.attributes
80
+ _test_case = event.test_case
81
+ result = event.result
80
82
  result = result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter)
81
83
  add_failed_around_hook(result) if result.failed? && !@any_step_failed
82
84
  end
@@ -85,7 +87,7 @@ module Cucumber
85
87
  @io.write(JSON.pretty_generate(@feature_hashes))
86
88
  end
87
89
 
88
- def attach(src, mime_type, _filename)
90
+ def attach(src, mime_type, _filename, _streamed_file)
89
91
  if mime_type == 'text/x.cucumber.log+plain'
90
92
  test_step_output << src
91
93
  return
@@ -51,19 +51,17 @@ module Cucumber
51
51
  end
52
52
 
53
53
  def on_test_step_finished(event)
54
- test_step, result = *event.attributes
55
54
  return if @failing_test_step
56
55
 
57
- @failing_test_step = test_step unless result.ok?(strict: @config.strict)
56
+ @failing_test_step = event.test_step unless event.result.ok?(strict: @config.strict)
58
57
  end
59
58
 
60
59
  def on_test_case_finished(event)
61
- test_case, result = *event.attributes
62
- result = result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter)
63
- test_case_name = NameBuilder.new(test_case, @ast_lookup)
60
+ result = event.result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter)
61
+ test_case_name = NameBuilder.new(event.test_case, @ast_lookup)
64
62
  scenario = test_case_name.scenario_name
65
63
  scenario_designation = "#{scenario}#{test_case_name.name_suffix}"
66
- output = create_output_string(test_case, scenario, result, test_case_name.row_name)
64
+ output = create_output_string(event.test_case, scenario, result, test_case_name.row_name)
67
65
  build_testcase(result, scenario_designation, output)
68
66
 
69
67
  Interceptor::Pipe.unwrap! :stdout
@@ -1,20 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'cucumber/formatter/io'
4
- require 'cucumber/formatter/message_builder'
4
+ require 'cucumber/query'
5
5
 
6
6
  module Cucumber
7
7
  module Formatter
8
8
  # The formatter used for <tt>--format message</tt>
9
- class Message < MessageBuilder
9
+ class Message
10
10
  include Io
11
11
 
12
12
  def initialize(config)
13
13
  @io = ensure_io(config.out_stream, config.error_stream)
14
- super(config)
14
+ @repository = Cucumber::Repository.new
15
+ @query = Cucumber::Query.new(@repository)
16
+ config.on_event :envelope, &method(:output_envelope)
15
17
  end
16
18
 
17
- def output_envelope(envelope)
19
+ def output_envelope(event)
20
+ envelope = event.envelope
18
21
  @repository.update(envelope)
19
22
  @io.write(envelope.to_json)
20
23
  @io.write("\n")