cucumber 3.1.2 → 4.0.0.rc.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +68 -13
  3. data/CONTRIBUTING.md +1 -0
  4. data/bin/cucumber +1 -1
  5. data/lib/autotest/cucumber_mixin.rb +42 -39
  6. data/lib/cucumber/cli/configuration.rb +4 -4
  7. data/lib/cucumber/cli/main.rb +11 -12
  8. data/lib/cucumber/cli/options.rb +53 -62
  9. data/lib/cucumber/cli/profile_loader.rb +32 -20
  10. data/lib/cucumber/configuration.rb +20 -21
  11. data/lib/cucumber/constantize.rb +2 -5
  12. data/lib/cucumber/deprecate.rb +5 -5
  13. data/lib/cucumber/errors.rb +4 -6
  14. data/lib/cucumber/events.rb +1 -0
  15. data/lib/cucumber/events/gherkin_source_parsed.rb +11 -0
  16. data/lib/cucumber/events/step_activated.rb +2 -1
  17. data/lib/cucumber/file_specs.rb +6 -6
  18. data/lib/cucumber/filters/activate_steps.rb +5 -3
  19. data/lib/cucumber/filters/prepare_world.rb +5 -9
  20. data/lib/cucumber/filters/quit.rb +1 -3
  21. data/lib/cucumber/filters/tag_limits/verifier.rb +2 -4
  22. data/lib/cucumber/formatter/ansicolor.rb +40 -45
  23. data/lib/cucumber/formatter/ast_lookup.rb +160 -0
  24. data/lib/cucumber/formatter/backtrace_filter.rb +5 -7
  25. data/lib/cucumber/formatter/console.rb +28 -59
  26. data/lib/cucumber/formatter/console_counts.rb +4 -9
  27. data/lib/cucumber/formatter/console_issues.rb +6 -3
  28. data/lib/cucumber/formatter/duration_extractor.rb +1 -1
  29. data/lib/cucumber/formatter/fanout.rb +2 -0
  30. data/lib/cucumber/formatter/ignore_missing_messages.rb +1 -1
  31. data/lib/cucumber/formatter/interceptor.rb +5 -7
  32. data/lib/cucumber/formatter/io.rb +3 -3
  33. data/lib/cucumber/formatter/json.rb +92 -110
  34. data/lib/cucumber/formatter/junit.rb +55 -57
  35. data/lib/cucumber/formatter/pretty.rb +346 -152
  36. data/lib/cucumber/formatter/progress.rb +28 -32
  37. data/lib/cucumber/formatter/rerun.rb +22 -4
  38. data/lib/cucumber/formatter/stepdefs.rb +1 -2
  39. data/lib/cucumber/formatter/steps.rb +2 -3
  40. data/lib/cucumber/formatter/summary.rb +16 -8
  41. data/lib/cucumber/formatter/unicode.rb +15 -17
  42. data/lib/cucumber/formatter/usage.rb +9 -8
  43. data/lib/cucumber/gherkin/data_table_parser.rb +8 -6
  44. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +13 -17
  45. data/lib/cucumber/gherkin/formatter/escaping.rb +2 -2
  46. data/lib/cucumber/gherkin/steps_parser.rb +7 -8
  47. data/lib/cucumber/glue/dsl.rb +1 -1
  48. data/lib/cucumber/glue/hook.rb +16 -9
  49. data/lib/cucumber/glue/invoke_in_world.rb +13 -18
  50. data/lib/cucumber/glue/proto_world.rb +14 -16
  51. data/lib/cucumber/glue/registry_and_more.rb +7 -9
  52. data/lib/cucumber/glue/snippet.rb +21 -20
  53. data/lib/cucumber/glue/step_definition.rb +14 -15
  54. data/lib/cucumber/glue/world_factory.rb +1 -1
  55. data/lib/cucumber/hooks.rb +11 -11
  56. data/lib/cucumber/multiline_argument.rb +4 -6
  57. data/lib/cucumber/multiline_argument/data_table.rb +88 -59
  58. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +1 -1
  59. data/lib/cucumber/multiline_argument/doc_string.rb +1 -1
  60. data/lib/cucumber/platform.rb +3 -3
  61. data/lib/cucumber/rake/task.rb +13 -16
  62. data/lib/cucumber/rspec/disable_option_parser.rb +9 -8
  63. data/lib/cucumber/running_test_case.rb +2 -53
  64. data/lib/cucumber/runtime.rb +27 -57
  65. data/lib/cucumber/runtime/after_hooks.rb +3 -3
  66. data/lib/cucumber/runtime/before_hooks.rb +3 -3
  67. data/lib/cucumber/runtime/for_programming_languages.rb +3 -2
  68. data/lib/cucumber/runtime/step_hooks.rb +1 -1
  69. data/lib/cucumber/runtime/support_code.rb +10 -12
  70. data/lib/cucumber/runtime/user_interface.rb +4 -6
  71. data/lib/cucumber/step_definition_light.rb +4 -3
  72. data/lib/cucumber/step_match.rb +12 -11
  73. data/lib/cucumber/step_match_search.rb +2 -1
  74. data/lib/cucumber/term/ansicolor.rb +9 -9
  75. data/lib/cucumber/version +1 -1
  76. metadata +36 -29
  77. data/lib/cucumber/events/gherkin_source_parsed.rb~ +0 -14
  78. data/lib/cucumber/formatter/ast_lookup.rb~ +0 -9
  79. data/lib/cucumber/formatter/cucumber.css +0 -286
  80. data/lib/cucumber/formatter/cucumber.sass +0 -247
  81. data/lib/cucumber/formatter/hook_query_visitor.rb +0 -42
  82. data/lib/cucumber/formatter/html.rb +0 -611
  83. data/lib/cucumber/formatter/html_builder.rb +0 -121
  84. data/lib/cucumber/formatter/inline-js.js +0 -30
  85. data/lib/cucumber/formatter/jquery-min.js +0 -154
  86. data/lib/cucumber/formatter/json_pretty.rb +0 -11
  87. data/lib/cucumber/formatter/legacy_api/adapter.rb +0 -1028
  88. data/lib/cucumber/formatter/legacy_api/ast.rb +0 -394
  89. data/lib/cucumber/formatter/legacy_api/results.rb +0 -50
  90. data/lib/cucumber/formatter/legacy_api/runtime_facade.rb +0 -32
  91. data/lib/cucumber/step_argument.rb +0 -25
@@ -16,26 +16,19 @@ Could not find profile: '#{profile}'
16
16
 
17
17
  Defined profiles in cucumber.yml:
18
18
  * #{cucumber_yml.keys.sort.join("\n * ")}
19
- END_OF_ERROR
19
+ END_OF_ERROR
20
20
  end
21
21
 
22
22
  args_from_yml = cucumber_yml[profile] || ''
23
23
 
24
- require 'shellwords'
25
-
26
24
  case args_from_yml
27
25
  when String
28
- raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was blank. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml =~ /^\s*$/
29
- if Cucumber::WINDOWS
30
- # Shellwords treats backslash as an escape character so we have to mask it out temporarily
31
-
32
- placeholder = 'pseudo_unique_backslash_placeholder'
33
- sanitized_line = args_from_yml.gsub('\\', placeholder)
34
-
35
- args_from_yml = Shellwords.shellwords(sanitized_line).collect { |argument| argument.gsub(placeholder, '\\') }
36
- else
37
- args_from_yml = Shellwords.shellwords(args_from_yml)
26
+ if args_from_yml =~ /^\s*$/
27
+ raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was blank." \
28
+ " Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n"
38
29
  end
30
+
31
+ args_from_yml = processed_shellwords(args_from_yml)
39
32
  when Array
40
33
  raise YmlLoadError, "The '#{profile}' profile in cucumber.yml was empty. Please define the command line arguments for the '#{profile}' profile in cucumber.yml.\n" if args_from_yml.empty?
41
34
  else
@@ -45,7 +38,7 @@ Defined profiles in cucumber.yml:
45
38
  args_from_yml
46
39
  end
47
40
 
48
- def has_profile?(profile)
41
+ def profile?(profile)
49
42
  cucumber_yml.key?(profile)
50
43
  end
51
44
 
@@ -59,28 +52,35 @@ Defined profiles in cucumber.yml:
59
52
  def cucumber_yml
60
53
  return @cucumber_yml if @cucumber_yml
61
54
  unless cucumber_yml_defined?
62
- raise(ProfilesNotDefinedError, "cucumber.yml was not found. Current directory is #{Dir.pwd}. Please refer to cucumber's documentation on defining profiles in cucumber.yml. You must define a 'default' profile to use the cucumber command without any arguments.\nType 'cucumber --help' for usage.\n")
55
+ raise(ProfilesNotDefinedError, "cucumber.yml was not found. Current directory is #{Dir.pwd}." \
56
+ "Please refer to cucumber's documentation on defining profiles in cucumber.yml. You must define" \
57
+ "a 'default' profile to use the cucumber command without any arguments.\nType 'cucumber --help' for usage.\n")
63
58
  end
64
59
 
65
60
  require 'erb'
66
61
  require 'yaml'
67
62
  begin
68
- @cucumber_erb = ERB.new(IO.read(cucumber_file), nil, '%').result(binding)
63
+ @cucumber_erb = if RUBY_VERSION >= '2.6'
64
+ ERB.new(IO.read(cucumber_file), trim_mode: '%').result(binding)
65
+ else
66
+ ERB.new(IO.read(cucumber_file), nil, '%').result(binding)
67
+ end
69
68
  rescue StandardError
70
- raise(YmlLoadError, "cucumber.yml was found, but could not be parsed with ERB. Please refer to cucumber's documentation on correct profile usage.\n#{$!.inspect}")
69
+ raise(YmlLoadError, "cucumber.yml was found, but could not be parsed with ERB. Please refer to cucumber's documentation on correct profile usage.\n#{$ERROR_INFO.inspect}")
71
70
  end
72
71
 
73
72
  begin
74
- @cucumber_yml = YAML.load(@cucumber_erb)
73
+ @cucumber_yml = YAML.load(@cucumber_erb) # rubocop:disable Security/YAMLLoad
75
74
  rescue StandardError
76
75
  raise(YmlLoadError, "cucumber.yml was found, but could not be parsed. Please refer to cucumber's documentation on correct profile usage.\n")
77
76
  end
78
77
 
79
78
  if @cucumber_yml.nil? || !@cucumber_yml.is_a?(Hash)
80
- raise(YmlLoadError, "cucumber.yml was found, but was blank or malformed. Please refer to cucumber's documentation on correct profile usage.\n")
79
+ raise(YmlLoadError, 'cucumber.yml was found, but was blank or malformed. ' \
80
+ "Please refer to cucumber's documentation on correct profile usage.\n")
81
81
  end
82
82
 
83
- return @cucumber_yml
83
+ @cucumber_yml
84
84
  end
85
85
 
86
86
  # Locates cucumber.yml file. The file can end in .yml or .yaml,
@@ -89,6 +89,18 @@ Defined profiles in cucumber.yml:
89
89
  def cucumber_file
90
90
  @cucumber_file ||= Dir.glob('{,.config/,config/}cucumber{.yml,.yaml}').first
91
91
  end
92
+
93
+ def processed_shellwords(args_from_yml)
94
+ require 'shellwords'
95
+
96
+ return Shellwords.shellwords(args_from_yml) unless Cucumber::WINDOWS
97
+
98
+ # Shellwords treats backslash as an escape character so we have to mask it out temporarily
99
+ placeholder = 'pseudo_unique_backslash_placeholder'
100
+ sanitized_line = args_from_yml.gsub('\\', placeholder)
101
+
102
+ Shellwords.shellwords(sanitized_line).collect { |argument| argument.gsub(placeholder, '\\') }
103
+ end
92
104
  end
93
105
  end
94
106
  end
@@ -176,11 +176,11 @@ module Cucumber
176
176
  def all_files_to_load
177
177
  files = require_dirs.map do |path|
178
178
  path = path.tr('\\', '/') # In case we're on windows. Globs don't work with backslashes.
179
- path = path.gsub(/\/$/, '') # Strip trailing slash.
179
+ path = path.gsub(/\/$/, '') # Strip trailing slash. # rubocop:disable Style/RegexpLiteral
180
180
  File.directory?(path) ? Dir["#{path}/**/*"] : path
181
181
  end.flatten.uniq
182
182
  remove_excluded_files_from(files)
183
- files.reject! { |f| !File.file?(f) }
183
+ files.select! { |f| File.file?(f) }
184
184
  files.reject! { |f| File.extname(f) == '.feature' }
185
185
  files.reject! { |f| f =~ /^http/ }
186
186
  files.sort
@@ -196,9 +196,8 @@ module Cucumber
196
196
  factory = formatter_class(format)
197
197
  yield factory,
198
198
  formatter_options,
199
- path_or_io,
200
- Cli::Options.new(STDOUT, STDERR, @options)
201
- rescue Exception => e
199
+ path_or_io
200
+ rescue Exception => e # rubocop:disable Lint/RescueException
202
201
  raise e, "#{e.message}\nError creating formatter: #{format}", e.backtrace
203
202
  end
204
203
  end
@@ -243,22 +242,22 @@ module Cucumber
243
242
 
244
243
  def default_options
245
244
  {
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
245
+ autoload_code_paths: ['features/support', 'features/step_definitions'],
246
+ filters: [],
247
+ strict: Cucumber::Core::Test::Result::StrictConfiguration.new,
248
+ require: [],
249
+ dry_run: false,
250
+ fail_fast: false,
251
+ formats: [],
252
+ excludes: [],
253
+ tag_expressions: [],
254
+ name_regexps: [],
255
+ env_vars: {},
256
+ diff_enabled: true,
257
+ snippets: true,
258
+ source: true,
259
+ duration: true,
260
+ event_bus: Cucumber::Events.make_event_bus
262
261
  }
263
262
  end
264
263
 
@@ -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
 
@@ -9,19 +9,19 @@ module Cucumber
9
9
  AnsiEscapes = Cucumber::Gherkin::Formatter::AnsiEscapes
10
10
 
11
11
  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
12
+ STDERR.puts AnsiEscapes.failed + "\nWARNING: ##{method} is deprecated" \
13
+ " and will be removed after version #{remove_after_version}. #{message}.\n" \
14
+ "(Called from #{caller(3..3).first})" + AnsiEscapes.reset
13
15
  end
14
16
  end
15
17
 
16
18
  module ForDevelopers
17
19
  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
20
+ raise "This method is due for removal after version #{remove_after_version}" if Cucumber::VERSION > remove_after_version
21
21
  end
22
22
  end
23
23
 
24
- STRATEGY = $0.match(/rspec$/) ? ForDevelopers : ForUsers
24
+ STRATEGY = $PROGRAM_NAME =~ /rspec$/ ? ForDevelopers : ForUsers
25
25
  end
26
26
 
27
27
  def self.deprecate(*args)
@@ -6,13 +6,11 @@ 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
12
+ raise new(with_prefix(step_name)) # rubocop:disable Style/RaiseArgs
13
+ rescue StandardError => exception
16
14
  return exception
17
15
  end
18
16
  end
@@ -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"
@@ -32,6 +32,7 @@ module Cucumber
32
32
  StepActivated,
33
33
  TestRunFinished,
34
34
  GherkinSourceRead,
35
+ GherkinSourceParsed,
35
36
  TestRunStarted
36
37
  )
37
38
  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
@@ -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
@@ -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
@@ -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
@@ -55,20 +55,18 @@ module Cucumber
55
55
  include Cucumber::Term::ANSIColor
56
56
 
57
57
  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
- })
58
+ h[Regexp.last_match(1)] + ',bold' if k.to_s =~ /(.*)_param/
59
+ end.merge(
60
+ 'undefined' => 'yellow',
61
+ 'pending' => 'yellow',
62
+ 'flaky' => 'yellow',
63
+ 'failed' => 'red',
64
+ 'passed' => 'green',
65
+ 'outline' => 'cyan',
66
+ 'skipped' => 'cyan',
67
+ 'comment' => 'grey',
68
+ 'tag' => 'cyan'
69
+ )
72
70
 
73
71
  if ENV['CUCUMBER_COLORS'] # Example: export CUCUMBER_COLORS="passed=red:failed=yellow"
74
72
  ENV['CUCUMBER_COLORS'].split(':').each do |pair|
@@ -89,45 +87,42 @@ module Cucumber
89
87
  # red(bold(string, &proc)) + red
90
88
  # end
91
89
  ALIASES.each_key do |method_name|
92
- unless method_name =~ /.*_param/
93
- code = <<-EOF
90
+ next if method_name =~ /.*_param/
91
+ code = <<-COLOR
94
92
  def #{method_name}(string=nil, &proc)
95
- #{ALIASES[method_name].split(",").join("(") + "(string, &proc" + ")" * ALIASES[method_name].split(",").length}
93
+ #{ALIASES[method_name].split(',').join('(') + '(string, &proc' + ')' * ALIASES[method_name].split(',').length}
96
94
  end
97
95
  # This resets the colour to the non-param colour
98
96
  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(' + ')}
97
+ #{ALIASES[method_name + '_param'].split(',').join('(') + '(string, &proc' + ')' * ALIASES[method_name + '_param'].split(',').length} + #{ALIASES[method_name].split(',').join(' + ')}
100
98
  end
101
- EOF
102
- eval(code)
103
- end
99
+ COLOR
100
+ eval(code) # rubocop:disable Security/Eval
104
101
  end
105
102
 
106
103
  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
104
+ gem 'genki-ruby-terminfo'
105
+ require 'terminfo'
106
+ case TermInfo.default_object.tigetnum('colors')
107
+ when 0
108
+ raise "Your terminal doesn't support colours."
109
+ when 1
110
+ ::Cucumber::Term::ANSIColor.coloring = false
111
+ alias_method :grey, :white
112
+ when 2..8
113
+ alias_method :grey, :white # rubocop:disable Lint/DuplicateMethods
114
+ else
115
+ define_real_grey
116
+ end
117
+ rescue Exception => e # rubocop:disable Lint/RescueException
118
+ if e.class.name == 'TermInfo::TermInfoError'
119
+ STDERR.puts '*** WARNING ***'
120
+ STDERR.puts "You have the genki-ruby-terminfo gem installed, but you haven't set your TERM variable."
121
+ STDERR.puts 'Try setting it to TERM=xterm-256color to get grey colour in output.'
122
+ STDERR.puts "\n"
123
+ alias_method :grey, :white
124
+ else
125
+ define_real_grey
131
126
  end
132
127
  end
133
128