cucumber 7.1.0 → 8.0.0.rc.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +79 -1
  3. data/CONTRIBUTING.md +2 -6
  4. data/README.md +4 -7
  5. data/lib/autotest/cucumber_mixin.rb +5 -2
  6. data/lib/autotest/discover.rb +3 -2
  7. data/lib/cucumber/cli/configuration.rb +4 -1
  8. data/lib/cucumber/cli/main.rb +4 -3
  9. data/lib/cucumber/cli/options.rb +8 -2
  10. data/lib/cucumber/cli/profile_loader.rb +1 -5
  11. data/lib/cucumber/cli/rerun_file.rb +1 -1
  12. data/lib/cucumber/configuration.rb +5 -4
  13. data/lib/cucumber/constantize.rb +1 -1
  14. data/lib/cucumber/deprecate.rb +2 -1
  15. data/lib/cucumber/errors.rb +1 -1
  16. data/lib/cucumber/events/hook_test_step_created.rb +1 -2
  17. data/lib/cucumber/events/step_activated.rb +0 -6
  18. data/lib/cucumber/events/step_definition_registered.rb +0 -5
  19. data/lib/cucumber/events/test_case_created.rb +1 -2
  20. data/lib/cucumber/events/test_run_finished.rb +2 -1
  21. data/lib/cucumber/events/test_step_created.rb +1 -2
  22. data/lib/cucumber/events/undefined_parameter_type.rb +1 -2
  23. data/lib/cucumber/events.rb +1 -1
  24. data/lib/cucumber/file_specs.rb +2 -1
  25. data/lib/cucumber/filters/activate_steps.rb +1 -0
  26. data/lib/cucumber/filters/tag_limits/verifier.rb +1 -3
  27. data/lib/cucumber/filters/tag_limits.rb +1 -3
  28. data/lib/cucumber/formatter/ansicolor.rb +63 -63
  29. data/lib/cucumber/formatter/ast_lookup.rb +2 -2
  30. data/lib/cucumber/formatter/backtrace_filter.rb +1 -1
  31. data/lib/cucumber/formatter/console.rb +10 -2
  32. data/lib/cucumber/formatter/console_issues.rb +6 -1
  33. data/lib/cucumber/formatter/duration_extractor.rb +1 -0
  34. data/lib/cucumber/formatter/errors.rb +1 -0
  35. data/lib/cucumber/formatter/fanout.rb +1 -1
  36. data/lib/cucumber/formatter/http_io.rb +6 -1
  37. data/lib/cucumber/formatter/ignore_missing_messages.rb +1 -1
  38. data/lib/cucumber/formatter/io.rb +3 -1
  39. data/lib/cucumber/formatter/json.rb +8 -6
  40. data/lib/cucumber/formatter/junit.rb +6 -3
  41. data/lib/cucumber/formatter/message_builder.rb +3 -2
  42. data/lib/cucumber/formatter/pretty.rb +15 -5
  43. data/lib/cucumber/formatter/progress.rb +1 -0
  44. data/lib/cucumber/formatter/query/hook_by_test_step.rb +1 -0
  45. data/lib/cucumber/formatter/query/test_case_started_by_test_case.rb +2 -0
  46. data/lib/cucumber/formatter/rerun.rb +2 -0
  47. data/lib/cucumber/formatter/summary.rb +1 -0
  48. data/lib/cucumber/formatter/unicode.rb +4 -4
  49. data/lib/cucumber/formatter/usage.rb +3 -3
  50. data/lib/cucumber/gherkin/data_table_parser.rb +1 -0
  51. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +2 -2
  52. data/lib/cucumber/glue/dsl.rb +4 -9
  53. data/lib/cucumber/glue/hook.rb +2 -1
  54. data/lib/cucumber/glue/invoke_in_world.rb +4 -4
  55. data/lib/cucumber/glue/proto_world.rb +10 -9
  56. data/lib/cucumber/glue/registry_and_more.rb +4 -18
  57. data/lib/cucumber/glue/step_definition.rb +6 -3
  58. data/lib/cucumber/hooks.rb +1 -0
  59. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +2 -1
  60. data/lib/cucumber/multiline_argument/data_table.rb +58 -71
  61. data/lib/cucumber/platform.rb +2 -2
  62. data/lib/cucumber/rake/task.rb +10 -7
  63. data/lib/cucumber/rspec/disable_option_parser.rb +6 -3
  64. data/lib/cucumber/running_test_case.rb +1 -0
  65. data/lib/cucumber/runtime/meta_message_builder.rb +106 -0
  66. data/lib/cucumber/runtime/support_code.rb +3 -0
  67. data/lib/cucumber/runtime/user_interface.rb +5 -4
  68. data/lib/cucumber/runtime.rb +21 -37
  69. data/lib/cucumber/step_match.rb +5 -3
  70. data/lib/cucumber/step_match_search.rb +3 -2
  71. data/lib/cucumber/term/ansicolor.rb +74 -50
  72. data/lib/cucumber/term/banner.rb +1 -0
  73. data/lib/cucumber/version +1 -1
  74. data/lib/cucumber.rb +2 -1
  75. data/lib/simplecov_setup.rb +1 -1
  76. metadata +74 -73
@@ -2,7 +2,6 @@
2
2
 
3
3
  require 'fileutils'
4
4
  require 'cucumber/configuration'
5
- require 'cucumber/create_meta'
6
5
  require 'cucumber/deprecate'
7
6
  require 'cucumber/load_path'
8
7
  require 'cucumber/formatter/duration'
@@ -13,6 +12,7 @@ require 'cucumber/gherkin/i18n'
13
12
  require 'cucumber/glue/registry_wrapper'
14
13
  require 'cucumber/step_match_search'
15
14
  require 'cucumber/messages'
15
+ require 'cucumber/runtime/meta_message_builder'
16
16
  require 'sys/uname'
17
17
 
18
18
  module Cucumber
@@ -26,8 +26,8 @@ module Cucumber
26
26
  attr_reader :path
27
27
 
28
28
  def initialize(original_exception, path)
29
- super(original_exception)
30
29
  @path = path
30
+ super(original_exception)
31
31
  end
32
32
  end
33
33
 
@@ -37,6 +37,7 @@ module Cucumber
37
37
  class FeatureFolderNotFoundException < RuntimeError
38
38
  def initialize(path)
39
39
  @path = path
40
+ super
40
41
  end
41
42
 
42
43
  def message
@@ -65,23 +66,20 @@ module Cucumber
65
66
  @support_code.configure(@configuration)
66
67
  end
67
68
 
68
- require 'cucumber/wire/plugin'
69
69
  def run!
70
70
  @configuration.notify :envelope, Cucumber::Messages::Envelope.new(
71
- meta: Cucumber::CreateMeta.create_meta('cucumber-ruby', Cucumber::VERSION)
71
+ meta: MetaMessageBuilder.build_meta_message
72
72
  )
73
73
 
74
74
  load_step_definitions
75
- fire_after_configuration_hook
76
75
  fire_install_plugin_hook
77
- install_wire_plugin
78
76
  fire_before_all_hook unless dry_run?
79
77
  # TODO: can we remove this state?
80
78
  self.visitor = report
81
79
 
82
80
  receiver = Test::Runner.new(@configuration.event_bus)
83
81
  compile features, receiver, filters, @configuration.event_bus
84
- @configuration.notify :test_run_finished
82
+ @configuration.notify :test_run_finished, !failure?
85
83
 
86
84
  fire_after_all_hook unless dry_run?
87
85
  end
@@ -112,21 +110,25 @@ module Cucumber
112
110
  Core::Test::DocString.new(string_without_triple_quotes, content_type)
113
111
  end
114
112
 
115
- private
116
-
117
- def fire_after_configuration_hook #:nodoc:
118
- @support_code.fire_hook(:after_configuration, @configuration)
113
+ def failure?
114
+ if @configuration.wip?
115
+ summary_report.test_cases.total_passed > 0
116
+ else
117
+ !summary_report.ok?(@configuration.strict)
118
+ end
119
119
  end
120
120
 
121
- def fire_install_plugin_hook #:nodoc:
121
+ private
122
+
123
+ def fire_install_plugin_hook # :nodoc:
122
124
  @support_code.fire_hook(:install_plugin, @configuration, registry_wrapper)
123
125
  end
124
126
 
125
- def fire_before_all_hook #:nodoc:
127
+ def fire_before_all_hook # :nodoc:
126
128
  @support_code.fire_hook(:before_all)
127
129
  end
128
130
 
129
- def fire_after_all_hook #:nodoc:
131
+ def fire_after_all_hook # :nodoc:
130
132
  @support_code.fire_hook(:after_all)
131
133
  end
132
134
 
@@ -148,8 +150,8 @@ module Cucumber
148
150
  end
149
151
 
150
152
  class NormalisedEncodingFile
151
- COMMENT_OR_EMPTY_LINE_PATTERN = /^\s*#|^\s*$/ #:nodoc:
152
- ENCODING_PATTERN = /^\s*#\s*encoding\s*:\s*([^\s]+)/ #:nodoc:
153
+ COMMENT_OR_EMPTY_LINE_PATTERN = /^\s*#|^\s*$/ # :nodoc:
154
+ ENCODING_PATTERN = /^\s*#\s*encoding\s*:\s*([^\s]+)/ # :nodoc:
153
155
 
154
156
  def self.read(path)
155
157
  new(path).read
@@ -189,6 +191,7 @@ module Cucumber
189
191
 
190
192
  def report
191
193
  return @report if @report
194
+
192
195
  reports = [summary_report] + formatters
193
196
  reports << fail_fast_report if @configuration.fail_fast?
194
197
  reports << publish_banner_printer unless @configuration.publish_quiet?
@@ -217,10 +220,12 @@ module Cucumber
217
220
  def create_formatter(factory, formatter_options, path_or_io)
218
221
  if accept_options?(factory)
219
222
  return factory.new(@configuration, formatter_options) if path_or_io.nil?
223
+
220
224
  factory.new(@configuration.with_options(out_stream: path_or_io),
221
225
  formatter_options)
222
226
  else
223
227
  return factory.new(@configuration) if path_or_io.nil?
228
+
224
229
  factory.new(@configuration.with_options(out_stream: path_or_io))
225
230
  end
226
231
  end
@@ -229,15 +234,6 @@ module Cucumber
229
234
  factory.instance_method(:initialize).arity > 1
230
235
  end
231
236
 
232
- def failure?
233
- if @configuration.wip?
234
- summary_report.test_cases.total_passed > 0
235
- else
236
- !summary_report.ok?(@configuration.strict)
237
- end
238
- end
239
- public :failure?
240
-
241
237
  require 'cucumber/core/test/filters'
242
238
  def filters # rubocop:disable Metrics/AbcSize
243
239
  tag_expressions = @configuration.tag_expressions
@@ -278,18 +274,6 @@ module Cucumber
278
274
  @support_code.load_files!(files)
279
275
  end
280
276
 
281
- def install_wire_plugin
282
- return if Cucumber::Wire::Plugin.installed?
283
- return unless @configuration.all_files_to_load.any? { |f| f =~ /\.wire$/ }
284
-
285
- Cucumber::Wire::Plugin.new(@configuration, registry_wrapper).install
286
- Cucumber.deprecate(
287
- 'See https://github.com/cucumber/cucumber-ruby/blob/main/UPGRADING.md#upgrading-to-710 for more info',
288
- ' built-in usage of the wire protocol',
289
- '8.0.0'
290
- )
291
- end
292
-
293
277
  def registry_wrapper
294
278
  Cucumber::Glue::RegistryWrapper.new(@support_code.registry)
295
279
  end
@@ -4,11 +4,12 @@ require 'cucumber/multiline_argument'
4
4
 
5
5
  module Cucumber
6
6
  # Represents the match found between a Test Step and its activation
7
- class StepMatch #:nodoc:
7
+ class StepMatch # :nodoc:
8
8
  attr_reader :step_definition, :step_arguments
9
9
 
10
10
  def initialize(step_definition, step_name, step_arguments)
11
11
  raise "step_arguments can't be nil (but it can be an empty array)" if step_arguments.nil?
12
+
12
13
  @step_definition = step_definition
13
14
  @name_to_match = step_name
14
15
  @step_arguments = step_arguments
@@ -90,7 +91,7 @@ module Cucumber
90
91
  s
91
92
  end
92
93
 
93
- def inspect #:nodoc:
94
+ def inspect # :nodoc:
94
95
  "#<#{self.class}: #{location}>"
95
96
  end
96
97
  end
@@ -101,7 +102,7 @@ module Cucumber
101
102
  end
102
103
  end
103
104
 
104
- class NoStepMatch #:nodoc:
105
+ class NoStepMatch # :nodoc:
105
106
  attr_reader :step_definition, :name
106
107
 
107
108
  def initialize(step, name)
@@ -115,6 +116,7 @@ module Cucumber
115
116
 
116
117
  def location
117
118
  raise "No location for #{@step}" unless @step.location
119
+
118
120
  @step.location
119
121
  end
120
122
 
@@ -20,6 +20,7 @@ module Cucumber
20
20
  def call(step_name)
21
21
  result = @search.call(step_name)
22
22
  raise Cucumber::Ambiguous.new(step_name, result, @configuration.guess?) if result.length > 1
23
+
23
24
  result
24
25
  end
25
26
  end
@@ -35,7 +36,7 @@ module Cucumber
35
36
 
36
37
  private
37
38
 
38
- def best_matches(_step_name, step_matches) #:nodoc:
39
+ def best_matches(_step_name, step_matches) # :nodoc:
39
40
  no_groups = step_matches.select { |step_match| step_match.args.empty? }
40
41
  max_arg_length = step_matches.map { |step_match| step_match.args.length }.max
41
42
  top_groups = step_matches.select { |step_match| step_match.args.length == max_arg_length }
@@ -54,7 +55,7 @@ module Cucumber
54
55
 
55
56
  require 'delegate'
56
57
  class CachesStepMatch < SimpleDelegator
57
- def call(step_name) #:nodoc:
58
+ def call(step_name) # :nodoc:
58
59
  @match_cache ||= {}
59
60
 
60
61
  matches = @match_cache[step_name]
@@ -2,8 +2,28 @@
2
2
 
3
3
  module Cucumber
4
4
  module Term
5
- # The ANSIColor module can be used for namespacing and mixed into your own
6
- # classes.
5
+ # This module allows to colorize text using ANSI escape sequences.
6
+ #
7
+ # Include the module in your class and use its methods to colorize text.
8
+ #
9
+ # Example:
10
+ #
11
+ # require 'cucumber/term/ansicolor'
12
+ #
13
+ # class MyFormatter
14
+ # include Cucumber::Term::ANSIColor
15
+ #
16
+ # def initialize(config)
17
+ # $stdout.puts yellow("Initializing formatter")
18
+ # $stdout.puts green("Coloring is active \o/") if Cucumber::Term::ANSIColor.coloring?
19
+ # $stdout.puts grey("Feature path:") + blue(bold(config.feature_dirs))
20
+ # end
21
+ # end
22
+ #
23
+ # To see what colours and effects are available, just run this in your shell:
24
+ #
25
+ # ruby -e "require 'rubygems'; require 'cucumber/term/ansicolor'; puts Cucumber::Term::ANSIColor.attributes"
26
+ #
7
27
  module ANSIColor
8
28
  # :stopdoc:
9
29
  ATTRIBUTES = [
@@ -27,6 +47,7 @@ module Cucumber
27
47
  [:magenta, 35],
28
48
  [:cyan, 36],
29
49
  [:white, 37],
50
+ [:grey, 90],
30
51
  [:on_black, 40],
31
52
  [:on_red, 41],
32
53
  [:on_green, 42],
@@ -40,72 +61,75 @@ module Cucumber
40
61
  ATTRIBUTE_NAMES = ATTRIBUTES.transpose.first
41
62
  # :startdoc:
42
63
 
43
- # Returns true, if the coloring function of this module
44
- # is switched on, false otherwise.
45
- def self.coloring?
46
- @coloring
47
- end
48
-
49
- # Turns the coloring on or off globally, so you can easily do
50
- # this for example:
51
- # Cucumber::Term::ANSIColor::coloring = STDOUT.isatty
52
- def self.coloring=(val)
53
- @coloring = val
54
- end
55
- self.coloring = true
56
-
57
- # rubocop:disable Security/Eval
58
- ATTRIBUTES.each do |c, v|
59
- eval <<-END_EVAL, binding, __FILE__, __LINE__ + 1
60
- def #{c}(string = nil)
61
- result = String.new
62
- result << "\e[#{v}m" if Cucumber::Term::ANSIColor.coloring?
63
- if block_given?
64
- result << yield
65
- elsif string
66
- result << string
67
- elsif respond_to?(:to_str)
68
- result << to_str
69
- else
70
- return result #only switch on
71
- end
72
- result << "\e[0m" if Cucumber::Term::ANSIColor.coloring?
73
- result
74
- end
75
- END_EVAL
76
- end
77
- # rubocop:enable Security/Eval
78
-
79
64
  # Regular expression that is used to scan for ANSI-sequences while
80
65
  # uncoloring strings.
81
66
  COLORED_REGEXP = /\e\[(?:[34][0-7]|[0-9])?m/
82
67
 
83
- def self.included(klass)
84
- return unless klass == String
85
- ATTRIBUTES.delete(:clear)
86
- ATTRIBUTE_NAMES.delete(:clear)
68
+ @coloring = true
69
+
70
+ class << self
71
+ # Turns the coloring on or off globally, so you can easily do
72
+ # this for example:
73
+ # Cucumber::Term::ANSIColor::coloring = $stdout.isatty
74
+ attr_accessor :coloring
75
+
76
+ # Returns true, if the coloring function of this module
77
+ # is switched on, false otherwise.
78
+ alias coloring? :coloring
79
+
80
+ def included(klass)
81
+ return unless klass == String
82
+
83
+ ATTRIBUTES.delete(:clear)
84
+ ATTRIBUTE_NAMES.delete(:clear)
85
+ end
87
86
  end
88
87
 
89
- # Returns an uncolored version of the string, that is all
88
+ ATTRIBUTES.each do |color_name, color_code|
89
+ define_method(color_name) do |text = nil, &block|
90
+ if block
91
+ colorize(block.call, color_code)
92
+ elsif text
93
+ colorize(text, color_code)
94
+ elsif respond_to?(:to_str)
95
+ colorize(to_str, color_code)
96
+ else
97
+ colorize(nil, color_code) # switch coloration on
98
+ end
99
+ end
100
+ end
101
+
102
+ # Returns an uncolored version of the string
90
103
  # ANSI-sequences are stripped from the string.
91
- def uncolored(string = nil)
104
+ def uncolored(text = nil)
92
105
  if block_given?
93
- yield.gsub(COLORED_REGEXP, '')
94
- elsif string
95
- string.gsub(COLORED_REGEXP, '')
106
+ uncolorize(yield)
107
+ elsif text
108
+ uncolorize(text)
96
109
  elsif respond_to?(:to_str)
97
- to_str.gsub(COLORED_REGEXP, '')
110
+ uncolorize(to_str)
98
111
  else
99
112
  ''
100
113
  end
101
114
  end
102
115
 
103
- module_function
104
-
105
116
  # Returns an array of all Cucumber::Term::ANSIColor attributes as symbols.
106
117
  def attributes
107
118
  ATTRIBUTE_NAMES
108
119
  end
120
+
121
+ private
122
+
123
+ def colorize(text, color_code)
124
+ return String.new(text || '') unless Cucumber::Term::ANSIColor.coloring?
125
+ return "\e[#{color_code}m" unless text
126
+
127
+ "\e[#{color_code}m#{text}\e[0m"
128
+ end
129
+
130
+ def uncolorize(string)
131
+ string.gsub(COLORED_REGEXP, '')
132
+ end
109
133
  end
110
134
  end
111
135
  end
@@ -30,6 +30,7 @@ module Cucumber
30
30
 
31
31
  def display_span(span)
32
32
  return apply_modifiers(span.shift, span) if span.is_a?(Array)
33
+
33
34
  span
34
35
  end
35
36
 
data/lib/cucumber/version CHANGED
@@ -1 +1 @@
1
- 7.1.0
1
+ 8.0.0.rc.1
data/lib/cucumber.rb CHANGED
@@ -14,7 +14,8 @@ module Cucumber
14
14
 
15
15
  def logger
16
16
  return @log if @log
17
- @log = Logger.new(STDOUT)
17
+
18
+ @log = Logger.new($stdout)
18
19
  @log.level = Logger::INFO
19
20
  @log
20
21
  end
@@ -7,7 +7,7 @@ if ENV['SIMPLECOV']
7
7
 
8
8
  require 'simplecov'
9
9
 
10
- SimpleCov.root(File.expand_path(File.dirname(__FILE__) + '/..'))
10
+ SimpleCov.root(File.expand_path("#{File.dirname(__FILE__)}/.."))
11
11
  SimpleCov.start do
12
12
  add_filter 'iso-8859-1_steps.rb'
13
13
  add_filter '.-ruby-core/'