cucumber 6.0.0 → 8.0.0.rc.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +371 -168
- data/CONTRIBUTING.md +216 -55
- data/README.md +139 -21
- data/lib/autotest/cucumber_mixin.rb +5 -2
- data/lib/autotest/discover.rb +3 -2
- data/lib/cucumber/cli/configuration.rb +4 -1
- data/lib/cucumber/cli/main.rb +4 -3
- data/lib/cucumber/cli/options.rb +14 -4
- data/lib/cucumber/cli/profile_loader.rb +1 -5
- data/lib/cucumber/cli/rerun_file.rb +1 -1
- data/lib/cucumber/configuration.rb +5 -4
- data/lib/cucumber/constantize.rb +1 -1
- data/lib/cucumber/deprecate.rb +2 -1
- data/lib/cucumber/errors.rb +1 -1
- data/lib/cucumber/events/hook_test_step_created.rb +1 -2
- data/lib/cucumber/events/step_activated.rb +0 -6
- data/lib/cucumber/events/step_definition_registered.rb +0 -5
- data/lib/cucumber/events/test_case_created.rb +1 -2
- data/lib/cucumber/events/test_run_finished.rb +2 -1
- data/lib/cucumber/events/test_step_created.rb +1 -2
- data/lib/cucumber/events/undefined_parameter_type.rb +1 -2
- data/lib/cucumber/events.rb +2 -2
- data/lib/cucumber/file_specs.rb +2 -1
- data/lib/cucumber/filters/activate_steps.rb +1 -0
- data/lib/cucumber/filters/tag_limits/verifier.rb +1 -3
- data/lib/cucumber/filters/tag_limits.rb +1 -3
- data/lib/cucumber/formatter/ansicolor.rb +63 -70
- data/lib/cucumber/formatter/ast_lookup.rb +2 -2
- data/lib/cucumber/formatter/backtrace_filter.rb +1 -1
- data/lib/cucumber/formatter/console.rb +20 -4
- data/lib/cucumber/formatter/console_issues.rb +6 -1
- data/lib/cucumber/formatter/duration_extractor.rb +1 -0
- data/lib/cucumber/formatter/errors.rb +1 -0
- data/lib/cucumber/formatter/fanout.rb +1 -1
- data/lib/cucumber/formatter/http_io.rb +6 -1
- data/lib/cucumber/formatter/ignore_missing_messages.rb +1 -1
- data/lib/cucumber/formatter/io.rb +3 -1
- data/lib/cucumber/formatter/json.rb +32 -26
- data/lib/cucumber/formatter/junit.rb +6 -3
- data/lib/cucumber/formatter/message.rb +2 -1
- data/lib/cucumber/formatter/message_builder.rb +11 -10
- data/lib/cucumber/formatter/pretty.rb +34 -23
- data/lib/cucumber/formatter/progress.rb +1 -0
- data/lib/cucumber/formatter/publish_banner_printer.rb +1 -1
- data/lib/cucumber/formatter/query/hook_by_test_step.rb +1 -0
- data/lib/cucumber/formatter/query/test_case_started_by_test_case.rb +2 -0
- data/lib/cucumber/formatter/rerun.rb +2 -0
- data/lib/cucumber/formatter/steps.rb +5 -2
- data/lib/cucumber/formatter/summary.rb +1 -0
- data/lib/cucumber/formatter/unicode.rb +4 -4
- data/lib/cucumber/formatter/usage.rb +9 -7
- data/lib/cucumber/gherkin/data_table_parser.rb +2 -1
- data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +2 -2
- data/lib/cucumber/gherkin/steps_parser.rb +1 -1
- data/lib/cucumber/glue/dsl.rb +19 -5
- data/lib/cucumber/glue/hook.rb +2 -1
- data/lib/cucumber/glue/invoke_in_world.rb +4 -4
- data/lib/cucumber/glue/proto_world.rb +12 -9
- data/lib/cucumber/glue/registry_and_more.rb +20 -5
- data/lib/cucumber/glue/registry_wrapper.rb +31 -0
- data/lib/cucumber/glue/step_definition.rb +9 -7
- data/lib/cucumber/hooks.rb +1 -0
- data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +2 -1
- data/lib/cucumber/multiline_argument/data_table.rb +58 -71
- data/lib/cucumber/platform.rb +2 -2
- data/lib/cucumber/rake/task.rb +10 -7
- data/lib/cucumber/rspec/disable_option_parser.rb +6 -3
- data/lib/cucumber/running_test_case.rb +1 -0
- data/lib/cucumber/runtime/meta_message_builder.rb +106 -0
- data/lib/cucumber/runtime/support_code.rb +3 -0
- data/lib/cucumber/runtime/user_interface.rb +5 -4
- data/lib/cucumber/runtime.rb +42 -23
- data/lib/cucumber/step_match.rb +6 -10
- data/lib/cucumber/step_match_search.rb +3 -2
- data/lib/cucumber/term/ansicolor.rb +74 -50
- data/lib/cucumber/term/banner.rb +1 -0
- data/lib/cucumber/version +1 -1
- data/lib/cucumber.rb +2 -1
- data/lib/simplecov_setup.rb +1 -1
- metadata +90 -89
- data/lib/cucumber/core_ext/string.rb +0 -11
data/lib/cucumber/cli/options.rb
CHANGED
@@ -24,8 +24,12 @@ module Cucumber
|
|
24
24
|
"#{INDENT}the usage formatter, except that steps are not printed."],
|
25
25
|
'junit' => ['Cucumber::Formatter::Junit', "Generates a report similar to Ant+JUnit. Use\n" \
|
26
26
|
"#{INDENT}junit,fileattribute=true to include a file attribute."],
|
27
|
-
'json' => ['Cucumber::Formatter::Json',
|
28
|
-
|
27
|
+
'json' => ['Cucumber::Formatter::Json', "Prints the feature as JSON.\n" \
|
28
|
+
"#{INDENT}The JSON format is in maintenance mode.\n" \
|
29
|
+
"#{INDENT}Please consider using the message formatter\n"\
|
30
|
+
"#{INDENT}with the standalone json-formatter\n" \
|
31
|
+
"#{INDENT}(https://github.com/cucumber/cucumber/tree/master/json-formatter)."],
|
32
|
+
'message' => ['Cucumber::Formatter::Message', 'Prints each message in NDJSON form, which can then be consumed by other tools.'],
|
29
33
|
'html' => ['Cucumber::Formatter::HTML', 'Outputs HTML report'],
|
30
34
|
'summary' => ['Cucumber::Formatter::Summary', 'Summary output of feature and scenarios']
|
31
35
|
}.freeze
|
@@ -59,13 +63,13 @@ module Cucumber
|
|
59
63
|
'--lines', '--port', '-I', '--snippet-type'
|
60
64
|
].freeze
|
61
65
|
ORDER_TYPES = %w[defined random].freeze
|
62
|
-
TAG_LIMIT_MATCHER = /(?<tag_name
|
66
|
+
TAG_LIMIT_MATCHER = /(?<tag_name>@\w+):(?<limit>\d+)/x
|
63
67
|
|
64
68
|
def self.parse(args, out_stream, error_stream, options = {})
|
65
69
|
new(out_stream, error_stream, options).parse!(args)
|
66
70
|
end
|
67
71
|
|
68
|
-
def initialize(out_stream =
|
72
|
+
def initialize(out_stream = $stdout, error_stream = $stderr, options = {})
|
69
73
|
@out_stream = out_stream
|
70
74
|
@error_stream = error_stream
|
71
75
|
|
@@ -176,6 +180,7 @@ Specify SEED to reproduce the shuffling from a previous run.
|
|
176
180
|
def check_formatter_stream_conflicts
|
177
181
|
streams = @options[:formats].uniq.map { |(_, _, stream)| stream }
|
178
182
|
return if streams == streams.uniq
|
183
|
+
|
179
184
|
raise 'All but one formatter must use --out, only one can print to each stream (or STDOUT)'
|
180
185
|
end
|
181
186
|
|
@@ -199,6 +204,7 @@ Specify SEED to reproduce the shuffling from a previous run.
|
|
199
204
|
|
200
205
|
def truthy_string?(str)
|
201
206
|
return false if str.nil?
|
207
|
+
|
202
208
|
str !~ /^(false|no|0)$/i
|
203
209
|
end
|
204
210
|
|
@@ -363,6 +369,7 @@ Specify SEED to reproduce the shuffling from a previous run.
|
|
363
369
|
def require_files(v)
|
364
370
|
@options[:require] << v
|
365
371
|
return unless Cucumber::JRUBY && File.directory?(v)
|
372
|
+
|
366
373
|
require 'java'
|
367
374
|
$CLASSPATH << v
|
368
375
|
end
|
@@ -381,6 +388,7 @@ Specify SEED to reproduce the shuffling from a previous run.
|
|
381
388
|
require 'gherkin/dialect'
|
382
389
|
|
383
390
|
return indicate_invalid_language_and_exit(lang) unless ::Gherkin::DIALECTS.key?(lang)
|
391
|
+
|
384
392
|
list_keywords_and_exit(lang)
|
385
393
|
end
|
386
394
|
|
@@ -399,6 +407,7 @@ Specify SEED to reproduce the shuffling from a previous run.
|
|
399
407
|
def add_tag(value)
|
400
408
|
raise("Found tags option '#{value}'. '~@tag' is no longer supported, use 'not @tag' instead.") if value.include?('~')
|
401
409
|
raise("Found tags option '#{value}'. '@tag1,@tag2' is no longer supported, use '@tag or @tag2' instead.") if value.include?(',')
|
410
|
+
|
402
411
|
@options[:tag_expressions] << value.gsub(/(@\w+)(:\d+)?/, '\1')
|
403
412
|
add_tag_limits(value)
|
404
413
|
end
|
@@ -411,6 +420,7 @@ Specify SEED to reproduce the shuffling from a previous run.
|
|
411
420
|
|
412
421
|
def add_tag_limit(tag_limits, tag_name, limit)
|
413
422
|
raise "Inconsistent tag limits for #{tag_name}: #{tag_limits[tag_name]} and #{limit}" if tag_limits[tag_name] && tag_limits[tag_name] != limit
|
423
|
+
|
414
424
|
tag_limits[tag_name] = limit
|
415
425
|
end
|
416
426
|
|
@@ -75,11 +75,7 @@ Defined profiles in cucumber.yml:
|
|
75
75
|
def process_configuration_file_with_erb
|
76
76
|
require 'erb'
|
77
77
|
begin
|
78
|
-
@cucumber_erb =
|
79
|
-
ERB.new(IO.read(cucumber_file), trim_mode: '%').result(binding)
|
80
|
-
else
|
81
|
-
ERB.new(IO.read(cucumber_file), nil, '%').result(binding)
|
82
|
-
end
|
78
|
+
@cucumber_erb = ERB.new(IO.read(cucumber_file), trim_mode: '%').result(binding)
|
83
79
|
rescue StandardError
|
84
80
|
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}")
|
85
81
|
end
|
@@ -176,12 +176,12 @@ module Cucumber
|
|
176
176
|
end
|
177
177
|
|
178
178
|
def support_to_load
|
179
|
-
support_files = all_files_to_load.select { |f| f =~
|
179
|
+
support_files = all_files_to_load.select { |f| f =~ /\/support\// }
|
180
180
|
|
181
181
|
# env_files are separated from other_files so we can ensure env files
|
182
182
|
# load first.
|
183
183
|
#
|
184
|
-
env_files = support_files.select { |f| f =~
|
184
|
+
env_files = support_files.select { |f| f =~ /\/support\/env\..*/ }
|
185
185
|
other_files = support_files - env_files
|
186
186
|
env_files.reverse + other_files.reverse
|
187
187
|
end
|
@@ -189,7 +189,7 @@ module Cucumber
|
|
189
189
|
def all_files_to_load
|
190
190
|
files = require_dirs.map do |path|
|
191
191
|
path = path.tr('\\', '/') # In case we're on windows. Globs don't work with backslashes.
|
192
|
-
path = path.gsub(/\/$/, '') # Strip trailing slash.
|
192
|
+
path = path.gsub(/\/$/, '') # Strip trailing slash.
|
193
193
|
File.directory?(path) ? Dir["#{path}/**/*"] : path
|
194
194
|
end.flatten.uniq
|
195
195
|
remove_excluded_files_from(files)
|
@@ -200,7 +200,7 @@ module Cucumber
|
|
200
200
|
end
|
201
201
|
|
202
202
|
def step_defs_to_load
|
203
|
-
all_files_to_load.reject { |f| f =~
|
203
|
+
all_files_to_load.reject { |f| f =~ /\/support\// }
|
204
204
|
end
|
205
205
|
|
206
206
|
def formatter_factories
|
@@ -283,6 +283,7 @@ module Cucumber
|
|
283
283
|
|
284
284
|
def with_default_features_path(paths)
|
285
285
|
return default_features_paths if paths.empty?
|
286
|
+
|
286
287
|
paths
|
287
288
|
end
|
288
289
|
|
data/lib/cucumber/constantize.rb
CHANGED
data/lib/cucumber/deprecate.rb
CHANGED
@@ -20,6 +20,7 @@ module Cucumber
|
|
20
20
|
class CliOption
|
21
21
|
def self.deprecate(stream, option, message, remove_after_version)
|
22
22
|
return if stream.nil?
|
23
|
+
|
23
24
|
stream.puts(
|
24
25
|
AnsiString.failure_message(
|
25
26
|
"\nWARNING: #{option} is deprecated" \
|
@@ -31,7 +32,7 @@ module Cucumber
|
|
31
32
|
|
32
33
|
module ForUsers
|
33
34
|
def self.call(message, method, remove_after_version)
|
34
|
-
|
35
|
+
$stderr.puts AnsiString.failure_message(
|
35
36
|
"\nWARNING: ##{method} is deprecated" \
|
36
37
|
" and will be removed after version #{remove_after_version}. #{message}.\n" \
|
37
38
|
"(Called from #{caller(3..3).first})"
|
data/lib/cucumber/errors.rb
CHANGED
@@ -6,8 +6,7 @@ module Cucumber
|
|
6
6
|
module Events
|
7
7
|
# Event fired when a TestStep is created from a PickleStep
|
8
8
|
class TestStepCreated < Core::Event.new(:test_step, :pickle_step)
|
9
|
-
attr_reader :test_step
|
10
|
-
attr_reader :pickle_step
|
9
|
+
attr_reader :test_step, :pickle_step
|
11
10
|
end
|
12
11
|
end
|
13
12
|
end
|
data/lib/cucumber/events.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
Dir[File.dirname(__FILE__)
|
3
|
+
Dir["#{File.dirname(__FILE__)}/events/*.rb"].map(&method(:require))
|
4
4
|
|
5
5
|
module Cucumber
|
6
6
|
# Events tell you what's happening while Cucumber runs your features.
|
@@ -11,7 +11,7 @@ module Cucumber
|
|
11
11
|
# To subscribe to an event, use {Cucumber::Configuration#on_event}
|
12
12
|
#
|
13
13
|
# @example
|
14
|
-
#
|
14
|
+
# InstallPlugin do |config|
|
15
15
|
# config.on_event :test_case_finished do |event|
|
16
16
|
# puts event.result
|
17
17
|
# end
|
data/lib/cucumber/file_specs.rb
CHANGED
@@ -5,7 +5,7 @@ require 'cucumber/core/test/location'
|
|
5
5
|
|
6
6
|
module Cucumber
|
7
7
|
class FileSpecs
|
8
|
-
FILE_COLON_LINE_PATTERN = /^([\w\W]*?)(?::([\d:]+))?$/
|
8
|
+
FILE_COLON_LINE_PATTERN = /^([\w\W]*?)(?::([\d:]+))?$/ # :nodoc:
|
9
9
|
|
10
10
|
def initialize(file_specs)
|
11
11
|
Cucumber.logger.debug("Features:\n")
|
@@ -32,6 +32,7 @@ module Cucumber
|
|
32
32
|
|
33
33
|
def locations
|
34
34
|
return [Core::Test::Location.new(@file)] if @lines.empty?
|
35
|
+
|
35
36
|
@lines.map { |line| Core::Test::Location.new(@file, line) }
|
36
37
|
end
|
37
38
|
end
|
@@ -3,28 +3,48 @@
|
|
3
3
|
require 'cucumber/platform'
|
4
4
|
require 'cucumber/term/ansicolor'
|
5
5
|
|
6
|
-
if
|
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
|
-
Cucumber::Term::ANSIColor.coloring = false if !STDOUT.tty? && !ENV.key?('AUTOTEST')
|
6
|
+
Cucumber::Term::ANSIColor.coloring = false if !$stdout.tty? && !ENV.key?('AUTOTEST')
|
14
7
|
|
15
8
|
module Cucumber
|
16
9
|
module Formatter
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
10
|
+
# This module allows to format cucumber related outputs using ANSI escape sequences.
|
11
|
+
#
|
12
|
+
# For example, it provides a `passed` method which returns the string with
|
13
|
+
# the ANSI escape sequence to format it green per default.
|
14
|
+
#
|
15
|
+
# To use this, include or extend it in your class.
|
16
|
+
#
|
17
|
+
# Example:
|
18
|
+
#
|
19
|
+
# require 'cucumber/formatter/ansicolor'
|
20
|
+
#
|
21
|
+
# class MyFormatter
|
22
|
+
# extend Cucumber::Term::ANSIColor
|
23
|
+
#
|
24
|
+
# def on_test_step_finished(event)
|
25
|
+
# $stdout.puts undefined(event.test_step) if event.result.undefined?
|
26
|
+
# $stdout.puts passed(event.test_step) if event.result.passed?
|
27
|
+
# end
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# This module also allows the user to customize the format of cucumber outputs
|
31
|
+
# using environment variables.
|
32
|
+
#
|
33
|
+
# For instance, if your shell has a black background and a green font (like the
|
34
|
+
# "Homebrew" settings for OS X' Terminal.app), you may want to override passed
|
35
|
+
# steps to be white instead of green.
|
36
|
+
#
|
37
|
+
# Example:
|
38
|
+
#
|
39
|
+
# export CUCUMBER_COLORS="passed=white,bold:passed_param=white,bold,underline"
|
22
40
|
#
|
23
41
|
# The colours that you can change are:
|
24
42
|
#
|
25
43
|
# * <tt>undefined</tt> - defaults to <tt>yellow</tt>
|
26
44
|
# * <tt>pending</tt> - defaults to <tt>yellow</tt>
|
27
45
|
# * <tt>pending_param</tt> - defaults to <tt>yellow,bold</tt>
|
46
|
+
# * <tt>flaky</tt> - defaults to <tt>yellow</tt>
|
47
|
+
# * <tt>flaky_param</tt> - defaults to <tt>yellow,bold</tt>
|
28
48
|
# * <tt>failed</tt> - defaults to <tt>red</tt>
|
29
49
|
# * <tt>failed_param</tt> - defaults to <tt>red,bold</tt>
|
30
50
|
# * <tt>passed</tt> - defaults to <tt>green</tt>
|
@@ -36,26 +56,18 @@ module Cucumber
|
|
36
56
|
# * <tt>comment</tt> - defaults to <tt>grey</tt>
|
37
57
|
# * <tt>tag</tt> - defaults to <tt>cyan</tt>
|
38
58
|
#
|
39
|
-
# For instance, if your shell has a black background and a green font (like the
|
40
|
-
# "Homebrew" settings for OS X' Terminal.app), you may want to override passed
|
41
|
-
# steps to be white instead of green.
|
42
|
-
#
|
43
|
-
# Although not listed, you can also use <tt>grey</tt>.
|
44
|
-
#
|
45
|
-
# Examples: (On Windows, use SET instead of export.)
|
46
|
-
#
|
47
|
-
# export CUCUMBER_COLORS="passed=white"
|
48
|
-
# export CUCUMBER_COLORS="passed=white,bold:passed_param=white,bold,underline"
|
49
|
-
#
|
50
59
|
# To see what colours and effects are available, just run this in your shell:
|
51
60
|
#
|
52
|
-
# ruby -e "require 'rubygems'; require 'term/ansicolor'; puts Cucumber::Term::ANSIColor.attributes"
|
61
|
+
# ruby -e "require 'rubygems'; require 'cucumber/term/ansicolor'; puts Cucumber::Term::ANSIColor.attributes"
|
53
62
|
#
|
54
63
|
module ANSIColor
|
55
64
|
include Cucumber::Term::ANSIColor
|
56
65
|
|
66
|
+
# :stopdoc:
|
57
67
|
ALIASES = Hash.new do |h, k|
|
58
|
-
|
68
|
+
next unless k.to_s =~ /(.*)_param/
|
69
|
+
|
70
|
+
"#{h[Regexp.last_match(1)]},bold"
|
59
71
|
end.merge(
|
60
72
|
'undefined' => 'yellow',
|
61
73
|
'pending' => 'yellow',
|
@@ -67,15 +79,22 @@ module Cucumber
|
|
67
79
|
'comment' => 'grey',
|
68
80
|
'tag' => 'cyan'
|
69
81
|
)
|
82
|
+
# :startdoc:
|
70
83
|
|
71
|
-
|
72
|
-
|
84
|
+
# Apply the custom color scheme
|
85
|
+
#
|
86
|
+
# example:
|
87
|
+
#
|
88
|
+
# apply_custom_colors('passed=white')
|
89
|
+
def apply_custom_colors(colors)
|
90
|
+
colors.split(':').each do |pair|
|
73
91
|
a = pair.split('=')
|
74
92
|
ALIASES[a[0]] = a[1]
|
75
93
|
end
|
76
94
|
end
|
95
|
+
apply_custom_colors(ENV['CUCUMBER_COLORS']) if ENV['CUCUMBER_COLORS']
|
77
96
|
|
78
|
-
#
|
97
|
+
# Define the color-named methods required by Term::ANSIColor.
|
79
98
|
#
|
80
99
|
# Examples:
|
81
100
|
#
|
@@ -87,53 +106,18 @@ module Cucumber
|
|
87
106
|
# red(bold(string, &proc)) + red
|
88
107
|
# end
|
89
108
|
ALIASES.each_key do |method_name|
|
90
|
-
next if method_name
|
91
|
-
code = <<-COLOR
|
92
|
-
def #{method_name}(string=nil, &proc)
|
93
|
-
#{ALIASES[method_name].split(',').join('(') + '(string, &proc' + ')' * ALIASES[method_name].split(',').length}
|
94
|
-
end
|
95
|
-
# This resets the colour to the non-param colour
|
96
|
-
def #{method_name}_param(string=nil, &proc)
|
97
|
-
#{ALIASES[method_name + '_param'].split(',').join('(') + '(string, &proc' + ')' * ALIASES[method_name + '_param'].split(',').length} + #{ALIASES[method_name].split(',').join(' + ')}
|
98
|
-
end
|
99
|
-
COLOR
|
100
|
-
eval(code) # rubocop:disable Security/Eval
|
101
|
-
end
|
109
|
+
next if method_name.end_with?('_param')
|
102
110
|
|
103
|
-
|
104
|
-
|
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
|
111
|
+
define_method(method_name) do |text = nil, &proc|
|
112
|
+
apply_styles(ALIASES[method_name], text, &proc)
|
126
113
|
end
|
127
|
-
end
|
128
114
|
|
129
|
-
|
130
|
-
|
131
|
-
::Cucumber::Term::ANSIColor.coloring? ? "\e[90m#{string}\e[0m" : string
|
115
|
+
define_method("#{method_name}_param") do |text = nil, &proc|
|
116
|
+
apply_styles(ALIASES["#{method_name}_param"], text, &proc) + apply_styles(ALIASES[method_name])
|
132
117
|
end
|
133
118
|
end
|
134
119
|
|
135
|
-
|
136
|
-
|
120
|
+
# :stopdoc:
|
137
121
|
def cukes(n)
|
138
122
|
('(::) ' * n).strip
|
139
123
|
end
|
@@ -149,6 +133,15 @@ module Cucumber
|
|
149
133
|
def yellow_cukes(n)
|
150
134
|
blink(yellow(cukes(n)))
|
151
135
|
end
|
136
|
+
# :startdoc:
|
137
|
+
|
138
|
+
private
|
139
|
+
|
140
|
+
def apply_styles(styles, text = nil, &proc)
|
141
|
+
styles.split(',').reverse.reduce(text) do |result, method_name|
|
142
|
+
send(method_name, result, &proc)
|
143
|
+
end
|
144
|
+
end
|
152
145
|
end
|
153
146
|
end
|
154
147
|
end
|
@@ -45,11 +45,11 @@ module Cucumber
|
|
45
45
|
break
|
46
46
|
end
|
47
47
|
break if node.previous_node.nil?
|
48
|
+
|
48
49
|
node = node.previous_node
|
49
50
|
end
|
50
51
|
keyword = dialect.given_keywords.reject { |kw| kw == '* ' }[0] if keyword.nil?
|
51
|
-
|
52
|
-
keyword
|
52
|
+
Cucumber::Gherkin::I18n.code_keyword_for(keyword)
|
53
53
|
end
|
54
54
|
|
55
55
|
ScenarioSource = Struct.new(:type, :scenario)
|
@@ -33,7 +33,7 @@ module Cucumber
|
|
33
33
|
def exception
|
34
34
|
return @exception if ::Cucumber.use_full_backtrace
|
35
35
|
|
36
|
-
pwd_pattern = /#{::Regexp.escape(::Dir.pwd)}\//m
|
36
|
+
pwd_pattern = /#{::Regexp.escape(::Dir.pwd)}\//m
|
37
37
|
backtrace = @exception.backtrace.map { |line| line.gsub(pwd_pattern, './') }
|
38
38
|
|
39
39
|
filtered = (backtrace || []).reject do |line|
|
@@ -34,7 +34,7 @@ module Cucumber
|
|
34
34
|
|
35
35
|
def format_step(keyword, step_match, status, source_indent)
|
36
36
|
comment = if source_indent
|
37
|
-
c = (
|
37
|
+
c = indent("# #{step_match.location}", source_indent)
|
38
38
|
format_string(c, :comment)
|
39
39
|
else
|
40
40
|
''
|
@@ -99,17 +99,20 @@ module Cucumber
|
|
99
99
|
@io.puts(format_string(string, status))
|
100
100
|
end
|
101
101
|
|
102
|
-
def exception_message_string(e,
|
102
|
+
def exception_message_string(e, indent_amount)
|
103
103
|
message = "#{e.message} (#{e.class})".dup.force_encoding('UTF-8')
|
104
104
|
message = linebreaks(message, ENV['CUCUMBER_TRUNCATE_OUTPUT'].to_i)
|
105
105
|
|
106
|
-
"#{message}\n#{e.backtrace.join("\n")}"
|
106
|
+
indent("#{message}\n#{e.backtrace.join("\n")}", indent_amount)
|
107
107
|
end
|
108
108
|
|
109
109
|
# http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/10655
|
110
110
|
def linebreaks(msg, max)
|
111
111
|
return msg unless max && max > 0
|
112
|
-
|
112
|
+
|
113
|
+
msg.gsub(/.{1,#{max}}(?:\s|\Z)/) do
|
114
|
+
(Regexp.last_match(0) + 5.chr).gsub(/\n\005/, "\n").gsub(/\005/, "\n")
|
115
|
+
end.rstrip
|
113
116
|
end
|
114
117
|
|
115
118
|
def collect_snippet_data(test_step, ast_lookup)
|
@@ -150,6 +153,7 @@ module Cucumber
|
|
150
153
|
|
151
154
|
def print_passing_wip(config, passed_test_cases, ast_lookup)
|
152
155
|
return unless config.wip?
|
156
|
+
|
153
157
|
messages = passed_test_cases.map do |test_case|
|
154
158
|
scenario_source = ast_lookup.scenario_source(test_case)
|
155
159
|
keyword = scenario_source.type == :Scenario ? scenario_source.scenario.keyword : scenario_source.scenario_outline.keyword
|
@@ -170,6 +174,7 @@ module Cucumber
|
|
170
174
|
def attach(src, media_type)
|
171
175
|
return unless media_type == 'text/x.cucumber.log+plain'
|
172
176
|
return unless @io
|
177
|
+
|
173
178
|
@io.puts
|
174
179
|
@io.puts(format_string(src, :tag))
|
175
180
|
@io.flush
|
@@ -177,6 +182,7 @@ module Cucumber
|
|
177
182
|
|
178
183
|
def print_profile_information
|
179
184
|
return if @options[:skip_profile_information] || @options[:profiles].nil? || @options[:profiles].empty?
|
185
|
+
|
180
186
|
do_print_profile_information(@options[:profiles])
|
181
187
|
end
|
182
188
|
|
@@ -208,6 +214,14 @@ module Cucumber
|
|
208
214
|
].join("\n")
|
209
215
|
end
|
210
216
|
|
217
|
+
def indent(string, padding)
|
218
|
+
if padding >= 0
|
219
|
+
string.gsub(/^/, ' ' * padding)
|
220
|
+
else
|
221
|
+
string.gsub(/^ {0,#{-padding}}/, '')
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
211
225
|
private
|
212
226
|
|
213
227
|
FORMATS = Hash.new { |hash, format| hash[format] = method(format).to_proc }
|
@@ -216,6 +230,7 @@ module Cucumber
|
|
216
230
|
key = keys.join('_').to_sym
|
217
231
|
fmt = FORMATS[key]
|
218
232
|
raise "No format for #{key.inspect}: #{FORMATS.inspect}" if fmt.nil?
|
233
|
+
|
219
234
|
fmt
|
220
235
|
end
|
221
236
|
|
@@ -238,6 +253,7 @@ module Cucumber
|
|
238
253
|
|
239
254
|
class SnippetData
|
240
255
|
attr_reader :actual_keyword, :step
|
256
|
+
|
241
257
|
def initialize(actual_keyword, step)
|
242
258
|
@actual_keyword = actual_keyword
|
243
259
|
@step = step
|
@@ -23,6 +23,7 @@ module Cucumber
|
|
23
23
|
|
24
24
|
def to_s
|
25
25
|
return if @issues.empty?
|
26
|
+
|
26
27
|
result = Core::Test::Result::TYPES.map { |type| scenario_listing(type, @issues[type]) }
|
27
28
|
result.flatten.join("\n")
|
28
29
|
end
|
@@ -35,6 +36,7 @@ module Cucumber
|
|
35
36
|
|
36
37
|
def scenario_listing(type, test_cases)
|
37
38
|
return [] if test_cases.empty?
|
39
|
+
|
38
40
|
[format_string("#{type_heading(type)} Scenarios:", type)] + test_cases.map do |test_case|
|
39
41
|
scenario_source = @ast_lookup.scenario_source(test_case)
|
40
42
|
keyword = scenario_source.type == :Scenario ? scenario_source.scenario.keyword : scenario_source.scenario_outline.keyword
|
@@ -54,7 +56,10 @@ module Cucumber
|
|
54
56
|
|
55
57
|
def profiles_string
|
56
58
|
return if @config.custom_profiles.empty?
|
57
|
-
|
59
|
+
|
60
|
+
profiles = @config.custom_profiles.map { |profile| "-p #{profile}" }.join(' ')
|
61
|
+
|
62
|
+
"#{profiles} "
|
58
63
|
end
|
59
64
|
end
|
60
65
|
end
|