cucumber 3.1.2 → 7.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1780 -1146
  3. data/CONTRIBUTING.md +224 -61
  4. data/README.md +144 -22
  5. data/bin/cucumber +1 -1
  6. data/lib/autotest/cucumber_mixin.rb +46 -53
  7. data/lib/cucumber/cli/configuration.rb +28 -6
  8. data/lib/cucumber/cli/main.rb +12 -12
  9. data/lib/cucumber/cli/options.rb +103 -77
  10. data/lib/cucumber/cli/profile_loader.rb +49 -26
  11. data/lib/cucumber/configuration.rb +44 -29
  12. data/lib/cucumber/constantize.rb +2 -5
  13. data/lib/cucumber/deprecate.rb +31 -7
  14. data/lib/cucumber/errors.rb +5 -7
  15. data/lib/cucumber/events/envelope.rb +9 -0
  16. data/lib/cucumber/events/gherkin_source_parsed.rb +11 -0
  17. data/lib/cucumber/events/hook_test_step_created.rb +13 -0
  18. data/lib/cucumber/events/step_activated.rb +2 -1
  19. data/lib/cucumber/events/test_case_created.rb +13 -0
  20. data/lib/cucumber/events/test_case_ready.rb +12 -0
  21. data/lib/cucumber/events/test_step_created.rb +13 -0
  22. data/lib/cucumber/events/undefined_parameter_type.rb +10 -0
  23. data/lib/cucumber/events.rb +14 -7
  24. data/lib/cucumber/file_specs.rb +6 -6
  25. data/lib/cucumber/filters/activate_steps.rb +5 -3
  26. data/lib/cucumber/filters/broadcast_test_case_ready_event.rb +12 -0
  27. data/lib/cucumber/filters/prepare_world.rb +5 -9
  28. data/lib/cucumber/filters/quit.rb +1 -3
  29. data/lib/cucumber/filters/tag_limits/verifier.rb +2 -4
  30. data/lib/cucumber/filters.rb +1 -0
  31. data/lib/cucumber/formatter/ansicolor.rb +40 -52
  32. data/lib/cucumber/formatter/ast_lookup.rb +163 -0
  33. data/lib/cucumber/formatter/backtrace_filter.rb +10 -8
  34. data/lib/cucumber/formatter/console.rb +69 -69
  35. data/lib/cucumber/formatter/console_counts.rb +4 -9
  36. data/lib/cucumber/formatter/console_issues.rb +6 -3
  37. data/lib/cucumber/formatter/duration.rb +1 -1
  38. data/lib/cucumber/formatter/duration_extractor.rb +3 -1
  39. data/lib/cucumber/formatter/errors.rb +6 -0
  40. data/lib/cucumber/formatter/fanout.rb +2 -0
  41. data/lib/cucumber/formatter/html.rb +11 -598
  42. data/lib/cucumber/formatter/http_io.rb +147 -0
  43. data/lib/cucumber/formatter/ignore_missing_messages.rb +1 -1
  44. data/lib/cucumber/formatter/interceptor.rb +11 -30
  45. data/lib/cucumber/formatter/io.rb +55 -13
  46. data/lib/cucumber/formatter/json.rb +115 -122
  47. data/lib/cucumber/formatter/junit.rb +72 -55
  48. data/lib/cucumber/formatter/message.rb +23 -0
  49. data/lib/cucumber/formatter/message_builder.rb +255 -0
  50. data/lib/cucumber/formatter/pretty.rb +360 -153
  51. data/lib/cucumber/formatter/progress.rb +30 -32
  52. data/lib/cucumber/formatter/publish_banner_printer.rb +77 -0
  53. data/lib/cucumber/formatter/query/hook_by_test_step.rb +31 -0
  54. data/lib/cucumber/formatter/query/pickle_by_test.rb +26 -0
  55. data/lib/cucumber/formatter/query/pickle_step_by_test_step.rb +26 -0
  56. data/lib/cucumber/formatter/query/step_definitions_by_test_step.rb +40 -0
  57. data/lib/cucumber/formatter/query/test_case_started_by_test_case.rb +40 -0
  58. data/lib/cucumber/formatter/rerun.rb +22 -4
  59. data/lib/cucumber/formatter/stepdefs.rb +1 -2
  60. data/lib/cucumber/formatter/steps.rb +8 -6
  61. data/lib/cucumber/formatter/summary.rb +16 -8
  62. data/lib/cucumber/formatter/unicode.rb +15 -17
  63. data/lib/cucumber/formatter/url_reporter.rb +17 -0
  64. data/lib/cucumber/formatter/usage.rb +17 -14
  65. data/lib/cucumber/gherkin/data_table_parser.rb +17 -6
  66. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +13 -17
  67. data/lib/cucumber/gherkin/formatter/escaping.rb +2 -2
  68. data/lib/cucumber/gherkin/steps_parser.rb +17 -8
  69. data/lib/cucumber/glue/dsl.rb +19 -0
  70. data/lib/cucumber/glue/hook.rb +34 -11
  71. data/lib/cucumber/glue/invoke_in_world.rb +13 -18
  72. data/lib/cucumber/glue/proto_world.rb +37 -44
  73. data/lib/cucumber/glue/registry_and_more.rb +71 -12
  74. data/lib/cucumber/glue/registry_wrapper.rb +31 -0
  75. data/lib/cucumber/glue/snippet.rb +23 -22
  76. data/lib/cucumber/glue/step_definition.rb +42 -20
  77. data/lib/cucumber/glue/world_factory.rb +1 -1
  78. data/lib/cucumber/hooks.rb +11 -11
  79. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +2 -2
  80. data/lib/cucumber/multiline_argument/data_table.rb +97 -64
  81. data/lib/cucumber/multiline_argument/doc_string.rb +1 -1
  82. data/lib/cucumber/multiline_argument.rb +4 -6
  83. data/lib/cucumber/platform.rb +3 -3
  84. data/lib/cucumber/rake/task.rb +16 -18
  85. data/lib/cucumber/rspec/disable_option_parser.rb +9 -8
  86. data/lib/cucumber/rspec/doubles.rb +3 -5
  87. data/lib/cucumber/running_test_case.rb +2 -53
  88. data/lib/cucumber/runtime/after_hooks.rb +8 -4
  89. data/lib/cucumber/runtime/before_hooks.rb +8 -4
  90. data/lib/cucumber/runtime/for_programming_languages.rb +4 -2
  91. data/lib/cucumber/runtime/step_hooks.rb +6 -2
  92. data/lib/cucumber/runtime/support_code.rb +13 -15
  93. data/lib/cucumber/runtime/user_interface.rb +6 -16
  94. data/lib/cucumber/runtime.rb +77 -59
  95. data/lib/cucumber/step_definition_light.rb +4 -3
  96. data/lib/cucumber/step_definitions.rb +2 -2
  97. data/lib/cucumber/step_match.rb +12 -17
  98. data/lib/cucumber/step_match_search.rb +2 -1
  99. data/lib/cucumber/term/ansicolor.rb +9 -9
  100. data/lib/cucumber/term/banner.rb +56 -0
  101. data/lib/cucumber/version +1 -1
  102. data/lib/cucumber.rb +1 -1
  103. metadata +272 -81
  104. data/lib/cucumber/core_ext/string.rb +0 -11
  105. data/lib/cucumber/events/gherkin_source_parsed.rb~ +0 -14
  106. data/lib/cucumber/formatter/ast_lookup.rb~ +0 -9
  107. data/lib/cucumber/formatter/cucumber.css +0 -286
  108. data/lib/cucumber/formatter/cucumber.sass +0 -247
  109. data/lib/cucumber/formatter/hook_query_visitor.rb +0 -42
  110. data/lib/cucumber/formatter/html_builder.rb +0 -121
  111. data/lib/cucumber/formatter/inline-js.js +0 -30
  112. data/lib/cucumber/formatter/jquery-min.js +0 -154
  113. data/lib/cucumber/formatter/json_pretty.rb +0 -11
  114. data/lib/cucumber/formatter/legacy_api/adapter.rb +0 -1028
  115. data/lib/cucumber/formatter/legacy_api/ast.rb +0 -394
  116. data/lib/cucumber/formatter/legacy_api/results.rb +0 -50
  117. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +0 -32
  118. data/lib/cucumber/step_argument.rb +0 -25
@@ -3,6 +3,7 @@
3
3
  require 'cucumber/constantize'
4
4
  require 'cucumber/cli/rerun_file'
5
5
  require 'cucumber/events'
6
+ require 'cucumber/messages'
6
7
  require 'cucumber/core/event_bus'
7
8
  require 'cucumber/core/test/result'
8
9
  require 'forwardable'
@@ -54,13 +55,21 @@ module Cucumber
54
55
  end
55
56
 
56
57
  def seed
57
- Integer(@options[:seed] || rand(0xFFFF))
58
+ @options[:seed]
58
59
  end
59
60
 
60
61
  def dry_run?
61
62
  @options[:dry_run]
62
63
  end
63
64
 
65
+ def publish_enabled?
66
+ @options[:publish_enabled]
67
+ end
68
+
69
+ def publish_quiet?
70
+ @options[:publish_quiet]
71
+ end
72
+
64
73
  def fail_fast?
65
74
  @options[:fail_fast]
66
75
  end
@@ -168,19 +177,23 @@ module Cucumber
168
177
 
169
178
  def support_to_load
170
179
  support_files = all_files_to_load.select { |f| f =~ %r{/support/} }
180
+
181
+ # env_files are separated from other_files so we can ensure env files
182
+ # load first.
183
+ #
171
184
  env_files = support_files.select { |f| f =~ %r{/support/env\..*} }
172
185
  other_files = support_files - env_files
173
- @options[:dry_run] ? other_files : env_files + other_files
186
+ env_files.reverse + other_files.reverse
174
187
  end
175
188
 
176
189
  def all_files_to_load
177
190
  files = require_dirs.map do |path|
178
191
  path = path.tr('\\', '/') # In case we're on windows. Globs don't work with backslashes.
179
- path = path.gsub(/\/$/, '') # Strip trailing slash.
192
+ path = path.gsub(/\/$/, '') # Strip trailing slash. # rubocop:disable Style/RegexpLiteral
180
193
  File.directory?(path) ? Dir["#{path}/**/*"] : path
181
194
  end.flatten.uniq
182
195
  remove_excluded_files_from(files)
183
- files.reject! { |f| !File.file?(f) }
196
+ files.select! { |f| File.file?(f) }
184
197
  files.reject! { |f| File.extname(f) == '.feature' }
185
198
  files.reject! { |f| f =~ /^http/ }
186
199
  files.sort
@@ -192,15 +205,12 @@ module Cucumber
192
205
 
193
206
  def formatter_factories
194
207
  formats.map do |format, formatter_options, path_or_io|
195
- begin
196
- factory = formatter_class(format)
197
- yield factory,
198
- formatter_options,
199
- path_or_io,
200
- Cli::Options.new(STDOUT, STDERR, @options)
201
- rescue Exception => e
202
- raise e, "#{e.message}\nError creating formatter: #{format}", e.backtrace
203
- end
208
+ factory = formatter_class(format)
209
+ yield factory,
210
+ formatter_options,
211
+ path_or_io
212
+ rescue Exception => e # rubocop:disable Lint/RescueException
213
+ raise e, "#{e.message}\nError creating formatter: #{format}", e.backtrace
204
214
  end
205
215
  end
206
216
 
@@ -239,26 +249,31 @@ module Cucumber
239
249
  @options[:event_bus]
240
250
  end
241
251
 
252
+ def id_generator
253
+ @id_generator ||= Cucumber::Messages::IdGenerator::UUID.new
254
+ end
255
+
242
256
  private
243
257
 
244
258
  def default_options
245
259
  {
246
- :autoload_code_paths => ['features/support', 'features/step_definitions'],
247
- :filters => [],
248
- :strict => Cucumber::Core::Test::Result::StrictConfiguration.new,
249
- :require => [],
250
- :dry_run => false,
251
- :fail_fast => false,
252
- :formats => [],
253
- :excludes => [],
254
- :tag_expressions => [],
255
- :name_regexps => [],
256
- :env_vars => {},
257
- :diff_enabled => true,
258
- :snippets => true,
259
- :source => true,
260
- :duration => true,
261
- :event_bus => Cucumber::Events.make_event_bus
260
+ autoload_code_paths: ['features/support', 'features/step_definitions'],
261
+ filters: [],
262
+ strict: Cucumber::Core::Test::Result::StrictConfiguration.new,
263
+ require: [],
264
+ dry_run: false,
265
+ publish_quiet: false,
266
+ fail_fast: false,
267
+ formats: [],
268
+ excludes: [],
269
+ tag_expressions: [],
270
+ name_regexps: [],
271
+ env_vars: {},
272
+ diff_enabled: true,
273
+ snippets: true,
274
+ source: true,
275
+ duration: true,
276
+ event_bus: Cucumber::Events.make_event_bus
262
277
  }
263
278
  end
264
279
 
@@ -17,11 +17,8 @@ module Cucumber
17
17
  constant
18
18
  rescue NameError => e
19
19
  require underscore(camel_cased_word)
20
- if try < 2
21
- retry
22
- else
23
- raise e
24
- end
20
+ retry if try < 2
21
+ raise e
25
22
  end
26
23
  end
27
24
 
@@ -5,23 +5,47 @@ require 'cucumber/gherkin/formatter/ansi_escapes'
5
5
 
6
6
  module Cucumber
7
7
  module Deprecate
8
- module ForUsers
9
- AnsiEscapes = Cucumber::Gherkin::Formatter::AnsiEscapes
8
+ class AnsiString
9
+ include Cucumber::Gherkin::Formatter::AnsiEscapes
10
+
11
+ def self.failure_message(message)
12
+ AnsiString.new.failure_message(message)
13
+ end
14
+
15
+ def failure_message(message)
16
+ failed + message + reset
17
+ end
18
+ end
10
19
 
20
+ class CliOption
21
+ def self.deprecate(stream, option, message, remove_after_version)
22
+ return if stream.nil?
23
+ stream.puts(
24
+ AnsiString.failure_message(
25
+ "\nWARNING: #{option} is deprecated" \
26
+ " and will be removed after version #{remove_after_version}.\n#{message}.\n"
27
+ )
28
+ )
29
+ end
30
+ end
31
+
32
+ module ForUsers
11
33
  def self.call(message, method, remove_after_version)
12
- STDERR.puts AnsiEscapes.failed + "\nWARNING: ##{method} is deprecated and will be removed after version #{remove_after_version}. #{message}.\n(Called from #{caller[2]})" + AnsiEscapes.reset
34
+ STDERR.puts AnsiString.failure_message(
35
+ "\nWARNING: ##{method} is deprecated" \
36
+ " and will be removed after version #{remove_after_version}. #{message}.\n" \
37
+ "(Called from #{caller(3..3).first})"
38
+ )
13
39
  end
14
40
  end
15
41
 
16
42
  module ForDevelopers
17
43
  def self.call(_message, _method, remove_after_version)
18
- if Cucumber::VERSION > remove_after_version
19
- raise "This method is due for removal after version #{remove_after_version}"
20
- end
44
+ raise "This method is due for removal after version #{remove_after_version}" if Cucumber::VERSION >= remove_after_version
21
45
  end
22
46
  end
23
47
 
24
- STRATEGY = $0.match(/rspec$/) ? ForDevelopers : ForUsers
48
+ STRATEGY = $PROGRAM_NAME =~ /rspec$/ ? ForDevelopers : ForUsers
25
49
  end
26
50
 
27
51
  def self.deprecate(*args)
@@ -6,14 +6,12 @@ module Cucumber
6
6
  # Raised when there is no matching StepDefinition for a step.
7
7
  class Undefined < Core::Test::Result::Undefined
8
8
  def self.from(result, step_name)
9
- if result.is_a?(self)
10
- return result.with_message(with_prefix(result.message))
11
- end
9
+ return result.with_message(with_prefix(result.message)) if result.is_a?(self)
12
10
 
13
11
  begin
14
- raise self.new(with_prefix(step_name))
15
- rescue => exception
16
- return exception
12
+ raise new(with_prefix(step_name)) # rubocop:disable Style/RaiseArgs
13
+ rescue StandardError => e
14
+ e
17
15
  end
18
16
  end
19
17
 
@@ -37,7 +35,7 @@ module Cucumber
37
35
  # Raised when a step matches 2 or more StepDefinitions
38
36
  class Ambiguous < StandardError
39
37
  def initialize(step_name, step_definitions, used_guess)
40
- message = String.new
38
+ message = String.new # rubocop:disable Style/EmptyLiteral
41
39
  message << "Ambiguous match of \"#{step_name}\":\n\n"
42
40
  message << step_definitions.map(&:backtrace_line).join("\n")
43
41
  message << "\n\n"
@@ -0,0 +1,9 @@
1
+ require 'cucumber/core/events'
2
+
3
+ module Cucumber
4
+ module Events
5
+ class Envelope < Core::Event.new(:envelope)
6
+ attr_reader :envelope
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ require 'cucumber/core/events'
2
+
3
+ module Cucumber
4
+ module Events
5
+ # Fired after we've parsed the contents of a feature file
6
+ class GherkinSourceParsed < Core::Event.new(:gherkin_document)
7
+ # The Gherkin Ast
8
+ attr_reader :gherkin_document
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cucumber/core/events'
4
+
5
+ module Cucumber
6
+ module Events
7
+ # Event fired when a step is created from a hook
8
+ class HookTestStepCreated < Core::Event.new(:test_step, :hook)
9
+ attr_reader :test_step
10
+ attr_reader :hook
11
+ end
12
+ end
13
+ end
@@ -18,7 +18,8 @@ module Cucumber
18
18
 
19
19
  # @private
20
20
  def initialize(test_step, step_match)
21
- @test_step, @step_match = test_step, step_match
21
+ @test_step = test_step
22
+ @step_match = step_match
22
23
  end
23
24
  end
24
25
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cucumber/core/events'
4
+
5
+ module Cucumber
6
+ module Events
7
+ # Event fired when a Test::Case is created from a Pickle
8
+ class TestCaseCreated < Core::Event.new(:test_case, :pickle)
9
+ attr_reader :test_case
10
+ attr_reader :pickle
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cucumber/core/events'
4
+
5
+ module Cucumber
6
+ module Events
7
+ # Event fired when a Test::Case is ready to be ran (matching has been done, hooks added etc)
8
+ class TestCaseReady < Core::Event.new(:test_case)
9
+ attr_reader :test_case
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cucumber/core/events'
4
+
5
+ module Cucumber
6
+ module Events
7
+ # Event fired when a TestStep is created from a PickleStep
8
+ class TestStepCreated < Core::Event.new(:test_step, :pickle_step)
9
+ attr_reader :test_step
10
+ attr_reader :pickle_step
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ require 'cucumber/core/events'
2
+
3
+ module Cucumber
4
+ module Events
5
+ class UndefinedParameterType < Core::Event.new(:type_name, :expression)
6
+ attr_reader :type_name
7
+ attr_reader :expression
8
+ end
9
+ end
10
+ end
@@ -11,7 +11,7 @@ module Cucumber
11
11
  # To subscribe to an event, use {Cucumber::Configuration#on_event}
12
12
  #
13
13
  # @example
14
- # AfterConfiguration do |config|
14
+ # InstallPlugin do |config|
15
15
  # config.on_event :test_case_finished do |event|
16
16
  # puts event.result
17
17
  # end
@@ -24,15 +24,22 @@ module Cucumber
24
24
 
25
25
  def self.registry
26
26
  Core::Events.build_registry(
27
- TestCaseStarted,
27
+ GherkinSourceParsed,
28
+ GherkinSourceRead,
29
+ HookTestStepCreated,
30
+ StepActivated,
31
+ StepDefinitionRegistered,
32
+ TestCaseCreated,
28
33
  TestCaseFinished,
34
+ TestCaseStarted,
35
+ TestCaseReady,
36
+ TestRunFinished,
37
+ TestRunStarted,
38
+ TestStepCreated,
29
39
  TestStepFinished,
30
40
  TestStepStarted,
31
- StepDefinitionRegistered,
32
- StepActivated,
33
- TestRunFinished,
34
- GherkinSourceRead,
35
- TestRunStarted
41
+ Envelope,
42
+ UndefinedParameterType
36
43
  )
37
44
  end
38
45
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'cucumber'
4
- require 'cucumber/core/ast/location'
4
+ require 'cucumber/core/test/location'
5
5
 
6
6
  module Cucumber
7
7
  class FileSpecs
@@ -9,7 +9,7 @@ module Cucumber
9
9
 
10
10
  def initialize(file_specs)
11
11
  Cucumber.logger.debug("Features:\n")
12
- @file_specs = file_specs.map { |s| FileSpec.new(s) }
12
+ @file_specs = file_specs.map { |spec| FileSpec.new(spec) }
13
13
  Cucumber.logger.debug("\n")
14
14
  end
15
15
 
@@ -22,8 +22,8 @@ module Cucumber
22
22
  end
23
23
 
24
24
  class FileSpec
25
- def initialize(s)
26
- @file, @lines = *FILE_COLON_LINE_PATTERN.match(s).captures
25
+ def initialize(spec)
26
+ @file, @lines = *FILE_COLON_LINE_PATTERN.match(spec).captures
27
27
  Cucumber.logger.debug(" * #{@file}\n")
28
28
  @lines = String(@lines).split(':').map { |line| Integer(line) }
29
29
  end
@@ -31,8 +31,8 @@ module Cucumber
31
31
  attr_reader :file
32
32
 
33
33
  def locations
34
- return [Core::Ast::Location.new(@file)] if @lines.empty?
35
- @lines.map { |line| Core::Ast::Location.new(@file, line) }
34
+ return [Core::Test::Location.new(@file)] if @lines.empty?
35
+ @lines.map { |line| Core::Test::Location.new(@file, line) }
36
36
  end
37
37
  end
38
38
  end
@@ -26,7 +26,7 @@ module Cucumber
26
26
  private
27
27
 
28
28
  def new_test_steps
29
- @original_test_case.test_steps.map(&self.method(:attempt_to_activate))
29
+ @original_test_case.test_steps.map(&method(:attempt_to_activate))
30
30
  end
31
31
 
32
32
  def attempt_to_activate(test_step)
@@ -39,12 +39,14 @@ module Cucumber
39
39
 
40
40
  class FindMatch
41
41
  def initialize(step_match_search, configuration, test_step)
42
- @step_match_search, @configuration, @test_step = step_match_search, configuration, test_step
42
+ @step_match_search = step_match_search
43
+ @configuration = configuration
44
+ @test_step = test_step
43
45
  end
44
46
 
45
47
  def result
46
48
  begin
47
- return NoStepMatch.new(test_step.source.last, test_step.text) unless matches.any?
49
+ return NoStepMatch.new(test_step, test_step.text) unless matches.any?
48
50
  rescue Cucumber::Ambiguous => e
49
51
  return AmbiguousStepMatch.new(e)
50
52
  end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cucumber
4
+ module Filters
5
+ class BroadcastTestCaseReadyEvent < Core::Filter.new(:config)
6
+ def test_case(test_case)
7
+ config.notify :test_case_ready, test_case
8
+ test_case.describe_to(receiver)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'cucumber/core/filter'
4
- require 'cucumber/core/ast/location'
4
+ require 'cucumber/core/test/location'
5
5
  require 'cucumber/running_test_case'
6
6
 
7
7
  module Cucumber
@@ -13,23 +13,19 @@ module Cucumber
13
13
 
14
14
  class CaseFilter
15
15
  def initialize(runtime, original_test_case)
16
- @runtime, @original_test_case = runtime, original_test_case
16
+ @runtime = runtime
17
+ @original_test_case = original_test_case
17
18
  end
18
19
 
19
20
  def test_case
20
- init_scenario = Cucumber::Hooks.around_hook(@original_test_case.source) do |continue|
21
+ init_scenario = Cucumber::Hooks.around_hook do |continue|
21
22
  @runtime.begin_scenario(scenario)
22
23
  continue.call
23
24
  @runtime.end_scenario(scenario)
24
25
  end
25
26
  around_hooks = [init_scenario] + @original_test_case.around_hooks
26
27
 
27
- empty_hook = proc {} # no op - legacy format adapter expects a before hooks
28
- empty_hook_location = Cucumber::Core::Ast::Location.from_source_location(*empty_hook.source_location)
29
- default_hook = Cucumber::Hooks.before_hook(@original_test_case.source, empty_hook_location, &empty_hook)
30
- steps = [default_hook] + @original_test_case.test_steps
31
-
32
- @original_test_case.with_around_hooks(around_hooks).with_steps(steps)
28
+ @original_test_case.with_around_hooks(around_hooks).with_steps(@original_test_case.test_steps)
33
29
  end
34
30
 
35
31
  private
@@ -8,9 +8,7 @@ module Cucumber
8
8
  end
9
9
 
10
10
  def test_case(test_case)
11
- unless Cucumber.wants_to_quit
12
- test_case.describe_to @receiver
13
- end
11
+ test_case.describe_to @receiver unless Cucumber.wants_to_quit
14
12
  self
15
13
  end
16
14
 
@@ -17,10 +17,8 @@ module Cucumber
17
17
 
18
18
  def collect_breaches(test_case_index)
19
19
  tag_limits.reduce([]) do |breaches, (tag_name, limit)|
20
- breaches.tap do |breaches|
21
- if test_case_index.count_by_tag_name(tag_name) > limit
22
- breaches << Breach.new(tag_name, limit, test_case_index.locations_of_tag_name(tag_name))
23
- end
20
+ breaches.tap do |breach|
21
+ breach << Breach.new(tag_name, limit, test_case_index.locations_of_tag_name(tag_name)) if test_case_index.count_by_tag_name(tag_name) > limit
24
22
  end
25
23
  end
26
24
  end
@@ -11,3 +11,4 @@ require 'cucumber/filters/quit'
11
11
  require 'cucumber/filters/randomizer'
12
12
  require 'cucumber/filters/retry'
13
13
  require 'cucumber/filters/tag_limits'
14
+ require 'cucumber/filters/broadcast_test_case_ready_event'
@@ -3,13 +3,6 @@
3
3
  require 'cucumber/platform'
4
4
  require 'cucumber/term/ansicolor'
5
5
 
6
- if Cucumber::WINDOWS_MRI
7
- unless ENV['ANSICON']
8
- STDERR.puts %{*** WARNING: You must use ANSICON 1.31 or higher (https://github.com/adoxa/ansicon/) to get coloured output on Windows}
9
- Cucumber::Term::ANSIColor.coloring = false
10
- end
11
- end
12
-
13
6
  Cucumber::Term::ANSIColor.coloring = false if !STDOUT.tty? && !ENV.key?('AUTOTEST')
14
7
 
15
8
  module Cucumber
@@ -55,20 +48,18 @@ module Cucumber
55
48
  include Cucumber::Term::ANSIColor
56
49
 
57
50
  ALIASES = Hash.new do |h, k|
58
- if k.to_s =~ /(.*)_param/
59
- h[$1] + ',bold'
60
- end
61
- end.merge({
62
- 'undefined' => 'yellow',
63
- 'pending' => 'yellow',
64
- 'flaky' => 'yellow',
65
- 'failed' => 'red',
66
- 'passed' => 'green',
67
- 'outline' => 'cyan',
68
- 'skipped' => 'cyan',
69
- 'comment' => 'grey',
70
- 'tag' => 'cyan'
71
- })
51
+ h[Regexp.last_match(1)] + ',bold' if k.to_s =~ /(.*)_param/
52
+ end.merge(
53
+ 'undefined' => 'yellow',
54
+ 'pending' => 'yellow',
55
+ 'flaky' => 'yellow',
56
+ 'failed' => 'red',
57
+ 'passed' => 'green',
58
+ 'outline' => 'cyan',
59
+ 'skipped' => 'cyan',
60
+ 'comment' => 'grey',
61
+ 'tag' => 'cyan'
62
+ )
72
63
 
73
64
  if ENV['CUCUMBER_COLORS'] # Example: export CUCUMBER_COLORS="passed=red:failed=yellow"
74
65
  ENV['CUCUMBER_COLORS'].split(':').each do |pair|
@@ -89,45 +80,42 @@ module Cucumber
89
80
  # red(bold(string, &proc)) + red
90
81
  # end
91
82
  ALIASES.each_key do |method_name|
92
- unless method_name =~ /.*_param/
93
- code = <<-EOF
83
+ next if method_name =~ /.*_param/
84
+ code = <<-COLOR
94
85
  def #{method_name}(string=nil, &proc)
95
- #{ALIASES[method_name].split(",").join("(") + "(string, &proc" + ")" * ALIASES[method_name].split(",").length}
86
+ #{ALIASES[method_name].split(',').join('(') + '(string, &proc' + ')' * ALIASES[method_name].split(',').length}
96
87
  end
97
88
  # This resets the colour to the non-param colour
98
89
  def #{method_name}_param(string=nil, &proc)
99
- #{ALIASES[method_name + '_param'].split(",").join("(") + "(string, &proc" + ")" * ALIASES[method_name + '_param'].split(",").length} + #{ALIASES[method_name].split(",").join(' + ')}
90
+ #{ALIASES[method_name + '_param'].split(',').join('(') + '(string, &proc' + ')' * ALIASES[method_name + '_param'].split(',').length} + #{ALIASES[method_name].split(',').join(' + ')}
100
91
  end
101
- EOF
102
- eval(code)
103
- end
92
+ COLOR
93
+ eval(code) # rubocop:disable Security/Eval
104
94
  end
105
95
 
106
96
  def self.define_grey #:nodoc:
107
- begin
108
- gem 'genki-ruby-terminfo'
109
- require 'terminfo'
110
- case TermInfo.default_object.tigetnum('colors')
111
- when 0
112
- raise "Your terminal doesn't support colours."
113
- when 1
114
- ::Cucumber::Term::ANSIColor.coloring = false
115
- alias grey white
116
- when 2..8
117
- alias grey white
118
- else
119
- define_real_grey
120
- end
121
- rescue Exception => e
122
- if e.class.name == 'TermInfo::TermInfoError'
123
- STDERR.puts '*** WARNING ***'
124
- STDERR.puts "You have the genki-ruby-terminfo gem installed, but you haven't set your TERM variable."
125
- STDERR.puts 'Try setting it to TERM=xterm-256color to get grey colour in output.'
126
- STDERR.puts "\n"
127
- alias grey white
128
- else
129
- define_real_grey
130
- end
97
+ gem 'genki-ruby-terminfo'
98
+ require 'terminfo'
99
+ case TermInfo.default_object.tigetnum('colors')
100
+ when 0
101
+ raise "Your terminal doesn't support colours."
102
+ when 1
103
+ ::Cucumber::Term::ANSIColor.coloring = false
104
+ alias_method :grey, :white
105
+ when 2..8
106
+ alias_method :grey, :white # rubocop:disable Lint/DuplicateMethods
107
+ else
108
+ define_real_grey
109
+ end
110
+ rescue Exception => e # rubocop:disable Lint/RescueException
111
+ if e.class.name == 'TermInfo::TermInfoError'
112
+ STDERR.puts '*** WARNING ***'
113
+ STDERR.puts "You have the genki-ruby-terminfo gem installed, but you haven't set your TERM variable."
114
+ STDERR.puts 'Try setting it to TERM=xterm-256color to get grey colour in output.'
115
+ STDERR.puts "\n"
116
+ alias_method :grey, :white
117
+ else
118
+ define_real_grey
131
119
  end
132
120
  end
133
121