cucumber 3.1.0 → 3.1.2
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 +29 -3
- data/CONTRIBUTING.md +1 -0
- data/README.md +6 -7
- data/lib/autotest/cucumber.rb +1 -0
- data/lib/autotest/cucumber_mixin.rb +1 -0
- data/lib/autotest/cucumber_rails.rb +1 -0
- data/lib/autotest/cucumber_rails_rspec.rb +1 -0
- data/lib/autotest/cucumber_rails_rspec2.rb +1 -0
- data/lib/autotest/cucumber_rspec.rb +1 -0
- data/lib/autotest/cucumber_rspec2.rb +1 -0
- data/lib/autotest/discover.rb +1 -0
- data/lib/cucumber.rb +1 -0
- data/lib/cucumber/cli/configuration.rb +1 -0
- data/lib/cucumber/cli/main.rb +2 -2
- data/lib/cucumber/cli/options.rb +54 -52
- data/lib/cucumber/cli/profile_loader.rb +5 -7
- data/lib/cucumber/cli/rerun_file.rb +1 -0
- data/lib/cucumber/configuration.rb +8 -7
- data/lib/cucumber/constantize.rb +6 -5
- data/lib/cucumber/core_ext/string.rb +1 -0
- data/lib/cucumber/deprecate.rb +1 -1
- data/lib/cucumber/encoding.rb +2 -1
- data/lib/cucumber/errors.rb +1 -0
- data/lib/cucumber/events.rb +1 -1
- data/lib/cucumber/events/gherkin_source_parsed.rb~ +14 -0
- data/lib/cucumber/events/gherkin_source_read.rb +1 -4
- data/lib/cucumber/events/step_activated.rb +4 -5
- data/lib/cucumber/events/step_definition_registered.rb +4 -8
- data/lib/cucumber/events/test_case_finished.rb +0 -4
- data/lib/cucumber/events/test_case_started.rb +0 -4
- data/lib/cucumber/events/test_run_finished.rb +2 -3
- data/lib/cucumber/events/test_run_started.rb +2 -4
- data/lib/cucumber/events/test_step_finished.rb +0 -4
- data/lib/cucumber/events/test_step_started.rb +1 -5
- data/lib/cucumber/file_specs.rb +2 -1
- data/lib/cucumber/filters.rb +1 -0
- data/lib/cucumber/filters/activate_steps.rb +1 -1
- data/lib/cucumber/filters/apply_after_hooks.rb +1 -0
- data/lib/cucumber/filters/apply_after_step_hooks.rb +1 -0
- data/lib/cucumber/filters/apply_around_hooks.rb +1 -0
- data/lib/cucumber/filters/apply_before_hooks.rb +1 -0
- data/lib/cucumber/filters/broadcast_test_run_started_event.rb +2 -1
- data/lib/cucumber/filters/gated_receiver.rb +1 -2
- data/lib/cucumber/filters/prepare_world.rb +2 -5
- data/lib/cucumber/filters/quit.rb +2 -3
- data/lib/cucumber/filters/randomizer.rb +6 -7
- data/lib/cucumber/filters/retry.rb +2 -2
- data/lib/cucumber/filters/tag_limits.rb +2 -2
- data/lib/cucumber/filters/tag_limits/test_case_index.rb +1 -2
- data/lib/cucumber/filters/tag_limits/verifier.rb +1 -2
- data/lib/cucumber/formatter/ansicolor.rb +13 -12
- data/lib/cucumber/formatter/ast_lookup.rb~ +9 -0
- data/lib/cucumber/formatter/backtrace_filter.rb +1 -2
- data/lib/cucumber/formatter/console.rb +11 -12
- data/lib/cucumber/formatter/console_counts.rb +4 -4
- data/lib/cucumber/formatter/console_issues.rb +3 -3
- data/lib/cucumber/formatter/duration.rb +1 -0
- data/lib/cucumber/formatter/duration_extractor.rb +1 -1
- data/lib/cucumber/formatter/fail_fast.rb +9 -6
- data/lib/cucumber/formatter/fanout.rb +1 -3
- data/lib/cucumber/formatter/hook_query_visitor.rb +1 -0
- data/lib/cucumber/formatter/html.rb +27 -31
- data/lib/cucumber/formatter/html_builder.rb +2 -1
- data/lib/cucumber/formatter/ignore_missing_messages.rb +1 -2
- data/lib/cucumber/formatter/interceptor.rb +18 -5
- data/lib/cucumber/formatter/io.rb +1 -0
- data/lib/cucumber/formatter/json.rb +3 -2
- data/lib/cucumber/formatter/json_pretty.rb +1 -0
- data/lib/cucumber/formatter/junit.rb +16 -15
- data/lib/cucumber/formatter/pretty.rb +4 -3
- data/lib/cucumber/formatter/progress.rb +3 -2
- data/lib/cucumber/formatter/rerun.rb +1 -0
- data/lib/cucumber/formatter/stepdefs.rb +1 -0
- data/lib/cucumber/formatter/steps.rb +2 -2
- data/lib/cucumber/formatter/summary.rb +1 -1
- data/lib/cucumber/formatter/unicode.rb +2 -2
- data/lib/cucumber/formatter/usage.rb +22 -19
- data/lib/cucumber/gherkin/data_table_parser.rb +1 -0
- data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +86 -85
- data/lib/cucumber/gherkin/formatter/escaping.rb +13 -12
- data/lib/cucumber/gherkin/i18n.rb +1 -0
- data/lib/cucumber/gherkin/steps_parser.rb +1 -0
- data/lib/cucumber/glue/dsl.rb +1 -0
- data/lib/cucumber/glue/hook.rb +1 -0
- data/lib/cucumber/glue/invoke_in_world.rb +3 -3
- data/lib/cucumber/glue/proto_world.rb +8 -9
- data/lib/cucumber/glue/registry_and_more.rb +13 -12
- data/lib/cucumber/glue/snippet.rb +1 -5
- data/lib/cucumber/glue/step_definition.rb +9 -9
- data/lib/cucumber/glue/world_factory.rb +0 -2
- data/lib/cucumber/hooks.rb +1 -3
- data/lib/cucumber/load_path.rb +1 -0
- data/lib/cucumber/multiline_argument.rb +2 -2
- data/lib/cucumber/multiline_argument/data_table.rb +10 -10
- data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +7 -10
- data/lib/cucumber/multiline_argument/doc_string.rb +1 -0
- data/lib/cucumber/platform.rb +2 -1
- data/lib/cucumber/project_initializer.rb +1 -1
- data/lib/cucumber/rake/task.rb +8 -5
- data/lib/cucumber/rspec/disable_option_parser.rb +1 -0
- data/lib/cucumber/rspec/doubles.rb +1 -0
- data/lib/cucumber/running_test_case.rb +2 -1
- data/lib/cucumber/runtime.rb +6 -6
- data/lib/cucumber/runtime/after_hooks.rb +1 -0
- data/lib/cucumber/runtime/before_hooks.rb +1 -0
- data/lib/cucumber/runtime/for_programming_languages.rb +8 -7
- data/lib/cucumber/runtime/step_hooks.rb +2 -0
- data/lib/cucumber/runtime/support_code.rb +3 -7
- data/lib/cucumber/runtime/user_interface.rb +2 -3
- data/lib/cucumber/step_argument.rb +1 -0
- data/lib/cucumber/step_definition_light.rb +2 -1
- data/lib/cucumber/step_definitions.rb +1 -0
- data/lib/cucumber/step_match.rb +5 -7
- data/lib/cucumber/step_match_search.rb +7 -8
- data/lib/cucumber/term/ansicolor.rb +30 -30
- data/lib/cucumber/unit.rb +1 -0
- data/lib/cucumber/version +1 -1
- data/lib/simplecov_setup.rb +1 -0
- metadata +64 -118
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'builder'
|
3
4
|
require 'pathname'
|
4
5
|
|
@@ -10,7 +11,7 @@ module Cucumber
|
|
10
11
|
class InvalidEmbedTypeError < ::StandardError
|
11
12
|
MESSAGE = 'Invalid embed type. Valid types are :text and :image.'.freeze
|
12
13
|
|
13
|
-
def initialize(message=MESSAGE)
|
14
|
+
def initialize(message = MESSAGE)
|
14
15
|
super(message)
|
15
16
|
end
|
16
17
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Cucumber
|
3
4
|
module Formatter
|
4
|
-
|
5
5
|
class IgnoreMissingMessages < BasicObject
|
6
6
|
def initialize(receiver)
|
7
7
|
@receiver = receiver
|
@@ -15,6 +15,5 @@ module Cucumber
|
|
15
15
|
@receiver.respond_to?(name, include_private)
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
19
18
|
end
|
20
19
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require 'thread'
|
3
2
|
|
4
3
|
module Cucumber
|
5
4
|
module Formatter
|
@@ -8,7 +7,7 @@ module Cucumber
|
|
8
7
|
attr_reader :pipe
|
9
8
|
def initialize(pipe)
|
10
9
|
@pipe = pipe
|
11
|
-
@buffer =
|
10
|
+
@buffer = StringIO.new
|
12
11
|
@wrapped = true
|
13
12
|
end
|
14
13
|
|
@@ -19,9 +18,22 @@ module Cucumber
|
|
19
18
|
end
|
20
19
|
end
|
21
20
|
|
21
|
+
# @deprecated use #buffer_string
|
22
22
|
def buffer
|
23
|
+
require 'cucumber/deprecate.rb'
|
24
|
+
Cucumber.deprecate(
|
25
|
+
'Use Cucumber::Formatter::Interceptor::Pipe#buffer_string instead',
|
26
|
+
'Cucumber::Formatter::Interceptor::Pipe#buffer',
|
27
|
+
'3.99'
|
28
|
+
)
|
23
29
|
lock.synchronize do
|
24
|
-
return @buffer.
|
30
|
+
return @buffer.string.lines
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def buffer_string
|
35
|
+
lock.synchronize do
|
36
|
+
return @buffer.string.dup
|
25
37
|
end
|
26
38
|
end
|
27
39
|
|
@@ -34,7 +46,7 @@ module Cucumber
|
|
34
46
|
@pipe.send(method, *args, &blk)
|
35
47
|
end
|
36
48
|
|
37
|
-
def respond_to?(method, include_private=false)
|
49
|
+
def respond_to?(method, include_private = false)
|
38
50
|
super || @pipe.respond_to?(method, include_private)
|
39
51
|
end
|
40
52
|
|
@@ -72,8 +84,9 @@ module Cucumber
|
|
72
84
|
end
|
73
85
|
|
74
86
|
private
|
87
|
+
|
75
88
|
def lock
|
76
|
-
@lock||=Mutex.new
|
89
|
+
@lock ||= Mutex.new
|
77
90
|
end
|
78
91
|
end
|
79
92
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'multi_json'
|
3
4
|
require 'base64'
|
4
5
|
require 'cucumber/formatter/backtrace_filter'
|
@@ -162,7 +163,7 @@ module Cucumber
|
|
162
163
|
step_hash = {
|
163
164
|
keyword: step_source.keyword,
|
164
165
|
name: step_source.to_s,
|
165
|
-
line: step_source.
|
166
|
+
line: step_source.original_location.line
|
166
167
|
}
|
167
168
|
step_hash[:comments] = Formatter.create_comments_array(step_source.comments) unless step_source.comments.empty?
|
168
169
|
step_hash[:doc_string] = create_doc_string_hash(step_source.multiline_arg) if step_source.multiline_arg.doc_string?
|
@@ -297,7 +298,7 @@ module Cucumber
|
|
297
298
|
comments += Formatter.create_comments_array(scenario.comments) unless scenario.comments.empty?
|
298
299
|
comments += @examples_table_comments if @examples_table_comments
|
299
300
|
comments += @row_comments if @row_comments
|
300
|
-
@test_case_hash[:comments] =
|
301
|
+
@test_case_hash[:comments] = comments unless comments.empty?
|
301
302
|
end
|
302
303
|
|
303
304
|
def examples_table(examples_table)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'builder'
|
3
4
|
require 'cucumber/formatter/backtrace_filter'
|
4
5
|
require 'cucumber/formatter/io'
|
@@ -9,7 +10,6 @@ module Cucumber
|
|
9
10
|
module Formatter
|
10
11
|
# The formatter used for <tt>--format junit</tt>
|
11
12
|
class Junit
|
12
|
-
|
13
13
|
include Io
|
14
14
|
|
15
15
|
class UnNamedFeatureError < StandardError
|
@@ -25,15 +25,17 @@ module Cucumber
|
|
25
25
|
config.on_event :test_run_finished, &method(:on_test_run_finished)
|
26
26
|
@reportdir = ensure_dir(config.out_stream, 'junit')
|
27
27
|
@config = config
|
28
|
-
@features_data = Hash.new
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
28
|
+
@features_data = Hash.new do |h, k|
|
29
|
+
h[k] = {
|
30
|
+
feature: nil,
|
31
|
+
failures: 0,
|
32
|
+
errors: 0,
|
33
|
+
tests: 0,
|
34
|
+
skipped: 0,
|
35
|
+
time: 0,
|
36
|
+
builder: Builder::XmlMarkup.new(:indent => 2)
|
37
|
+
}
|
38
|
+
end
|
37
39
|
end
|
38
40
|
|
39
41
|
def on_test_case_started(event)
|
@@ -93,7 +95,8 @@ module Cucumber
|
|
93
95
|
:skipped => feature_data[:skipped],
|
94
96
|
:tests => feature_data[:tests],
|
95
97
|
:time => format('%.6f', feature_data[:time]),
|
96
|
-
:name => feature_data[:feature].name
|
98
|
+
:name => feature_data[:feature].name
|
99
|
+
) do
|
97
100
|
@testsuite << feature_data[:builder].target!
|
98
101
|
end
|
99
102
|
|
@@ -140,10 +143,10 @@ module Cucumber
|
|
140
143
|
@current_feature_data[:failures] += 1
|
141
144
|
end
|
142
145
|
@current_feature_data[:builder].tag!('system-out') do
|
143
|
-
@current_feature_data[:builder].cdata! strip_control_chars(@interceptedout.
|
146
|
+
@current_feature_data[:builder].cdata! strip_control_chars(@interceptedout.buffer_string)
|
144
147
|
end
|
145
148
|
@current_feature_data[:builder].tag!('system-err') do
|
146
|
-
@current_feature_data[:builder].cdata! strip_control_chars(@interceptederr.
|
149
|
+
@current_feature_data[:builder].cdata! strip_control_chars(@interceptederr.buffer_string)
|
147
150
|
end
|
148
151
|
end
|
149
152
|
@current_feature_data[:tests] += 1
|
@@ -179,7 +182,6 @@ module Cucumber
|
|
179
182
|
def strip_control_chars(cdata)
|
180
183
|
cdata.scan(/[[:print:]\t\n\r]/).join
|
181
184
|
end
|
182
|
-
|
183
185
|
end
|
184
186
|
|
185
187
|
class NameBuilder
|
@@ -239,6 +241,5 @@ module Cucumber
|
|
239
241
|
duration.tap { |duration| @test_case_duration = duration.nanoseconds / 10**9.0 }
|
240
242
|
end
|
241
243
|
end
|
242
|
-
|
243
244
|
end
|
244
245
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'fileutils'
|
3
4
|
require 'cucumber/formatter/console'
|
4
5
|
require 'cucumber/formatter/io'
|
@@ -163,7 +164,7 @@ module Cucumber
|
|
163
164
|
def doc_string(string)
|
164
165
|
return if @options[:no_multiline] || @hide_this_step
|
165
166
|
s = %{"""\n#{string}\n"""}.indent(@indent)
|
166
|
-
s = s.split("\n").map{|l| l =~ /^\s+$/ ? '' : l}.join("\n")
|
167
|
+
s = s.split("\n").map { |l| l =~ /^\s+$/ ? '' : l }.join("\n")
|
167
168
|
@io.puts(format_string(s, @current_step.status))
|
168
169
|
@io.flush
|
169
170
|
end
|
@@ -187,7 +188,7 @@ module Cucumber
|
|
187
188
|
def before_table_row(_table_row)
|
188
189
|
return if !@table || @hide_this_step
|
189
190
|
@col_index = 0
|
190
|
-
@io.print ' |'.indent(@indent-2)
|
191
|
+
@io.print ' |'.indent(@indent - 2)
|
191
192
|
end
|
192
193
|
|
193
194
|
def after_table_row(table_row)
|
@@ -235,7 +236,7 @@ module Cucumber
|
|
235
236
|
@io.print(format_string(line_comment, :comment))
|
236
237
|
end
|
237
238
|
@io.puts
|
238
|
-
names[1..-1].each {|s| @io.puts s.to_s}
|
239
|
+
names[1..-1].each { |s| @io.puts s.to_s }
|
239
240
|
@io.flush
|
240
241
|
end
|
241
242
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'cucumber/core/report/summary'
|
3
4
|
require 'cucumber/formatter/backtrace_filter'
|
4
5
|
require 'cucumber/formatter/console'
|
@@ -80,9 +81,9 @@ module Cucumber
|
|
80
81
|
print_elements(@pending_step_matches, :pending, 'steps')
|
81
82
|
print_elements(@failed_results, :failed, 'steps')
|
82
83
|
print_statistics(@total_duration, @config, @counts, @issues)
|
83
|
-
snippet_text_proc = lambda
|
84
|
+
snippet_text_proc = lambda do |step_keyword, step_name, multiline_arg|
|
84
85
|
snippet_text(step_keyword, step_name, multiline_arg)
|
85
|
-
|
86
|
+
end
|
86
87
|
do_print_snippets(snippet_text_proc) if config.snippets? && summary.test_steps.total(:undefined) > 0
|
87
88
|
return unless config.wip?
|
88
89
|
messages = @passed_test_cases.map do |test_case|
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Cucumber
|
3
4
|
module Formatter
|
4
5
|
# The formatter used for <tt>--format steps</tt>
|
5
6
|
class Steps
|
6
|
-
|
7
7
|
def initialize(runtime, path_or_io, options)
|
8
8
|
@io = ensure_io(path_or_io)
|
9
9
|
@options = options
|
@@ -37,7 +37,7 @@ module Cucumber
|
|
37
37
|
def collect_steps(runtime)
|
38
38
|
runtime.step_definitions.inject({}) do |step_definitions, step_definition|
|
39
39
|
step_definitions[step_definition.file] ||= []
|
40
|
-
step_definitions[step_definition.file] << [
|
40
|
+
step_definitions[step_definition.file] << [step_definition.file_colon_line, step_definition.regexp_source]
|
41
41
|
step_definitions
|
42
42
|
end
|
43
43
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'cucumber/formatter/io'
|
3
4
|
require 'cucumber/formatter/console'
|
4
5
|
require 'cucumber/formatter/console_counts'
|
@@ -7,7 +8,6 @@ require 'cucumber/core/test/result'
|
|
7
8
|
|
8
9
|
module Cucumber
|
9
10
|
module Formatter
|
10
|
-
|
11
11
|
# Summary formatter, outputting only feature / scenario titles
|
12
12
|
class Summary
|
13
13
|
include Io
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
# Require this file if you need Unicode support.
|
3
4
|
# Tips for improvement - esp. ruby 1.9: http://www.ruby-forum.com/topic/184730
|
4
5
|
require 'cucumber/platform'
|
@@ -24,10 +25,9 @@ if Cucumber::WINDOWS
|
|
24
25
|
module WindowsOutput
|
25
26
|
def self.extended(o)
|
26
27
|
o.instance_eval do
|
27
|
-
|
28
28
|
def cucumber_preprocess_output(*a)
|
29
29
|
begin
|
30
|
-
a.map{|arg| arg.to_s.encode(Encoding.default_external)}
|
30
|
+
a.map { |arg| arg.to_s.encode(Encoding.default_external) }
|
31
31
|
rescue Encoding::UndefinedConversionError => e
|
32
32
|
STDERR.cucumber_puts("WARNING: #{e.message}")
|
33
33
|
a
|
@@ -1,11 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'cucumber/formatter/progress'
|
3
4
|
require 'cucumber/step_definition_light'
|
4
5
|
|
5
6
|
module Cucumber
|
6
7
|
module Formatter
|
7
8
|
class Usage < Progress
|
8
|
-
|
9
9
|
class StepDefKey < StepDefinitionLight
|
10
10
|
attr_accessor :mean_duration, :status
|
11
11
|
end
|
@@ -38,19 +38,23 @@ module Cucumber
|
|
38
38
|
test_step = event.test_step
|
39
39
|
result = event.result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter)
|
40
40
|
step_match = @matches[test_step.source]
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
41
|
+
|
42
|
+
unless step_match.nil?
|
43
|
+
step_definition = step_match.step_definition
|
44
|
+
stepdef_key = StepDefKey.new(step_definition.expression.to_s, step_definition.location)
|
45
|
+
unless @stepdef_to_match[stepdef_key].map { |key| key[:location] }.include? test_step.location
|
46
|
+
duration = DurationExtractor.new(result).result_duration
|
47
|
+
|
48
|
+
@stepdef_to_match[stepdef_key] << {
|
49
|
+
keyword: test_step.source.last.keyword,
|
50
|
+
step_match: step_match,
|
51
|
+
status: result.to_sym,
|
52
|
+
location: test_step.location,
|
53
|
+
duration: duration
|
54
|
+
}
|
55
|
+
end
|
53
56
|
end
|
57
|
+
|
54
58
|
super
|
55
59
|
end
|
56
60
|
|
@@ -60,9 +64,9 @@ module Cucumber
|
|
60
64
|
aggregate_info
|
61
65
|
|
62
66
|
keys = if config.dry_run?
|
63
|
-
@stepdef_to_match.keys.sort {|a,b| a.regexp_source <=> b.regexp_source}
|
67
|
+
@stepdef_to_match.keys.sort { |a, b| a.regexp_source <=> b.regexp_source }
|
64
68
|
else
|
65
|
-
@stepdef_to_match.keys.sort {|a,b| a.mean_duration <=> b.mean_duration}.reverse
|
69
|
+
@stepdef_to_match.keys.sort { |a, b| a.mean_duration <=> b.mean_duration }.reverse
|
66
70
|
end
|
67
71
|
|
68
72
|
keys.each do |stepdef_key|
|
@@ -108,7 +112,7 @@ module Cucumber
|
|
108
112
|
end
|
109
113
|
|
110
114
|
def max_stepdef_length
|
111
|
-
@stepdef_to_match.keys.flatten.map{|key| key.regexp_source.unpack('U*').length}.max
|
115
|
+
@stepdef_to_match.keys.flatten.map { |key| key.regexp_source.unpack('U*').length }.max
|
112
116
|
end
|
113
117
|
|
114
118
|
def max_step_length
|
@@ -123,8 +127,8 @@ module Cucumber
|
|
123
127
|
key.status = :skipped
|
124
128
|
key.mean_duration = 0
|
125
129
|
else
|
126
|
-
key.status = worst_status(steps.map{ |step| step[:status] })
|
127
|
-
total_duration = steps.inject(0) {|sum, step| step[:duration] + sum}
|
130
|
+
key.status = worst_status(steps.map { |step| step[:status] })
|
131
|
+
total_duration = steps.inject(0) { |sum, step| step[:duration] + sum }
|
128
132
|
key.mean_duration = total_duration / steps.length
|
129
133
|
end
|
130
134
|
end
|
@@ -135,7 +139,6 @@ module Cucumber
|
|
135
139
|
statuses.include?(status)
|
136
140
|
end
|
137
141
|
end
|
138
|
-
|
139
142
|
end
|
140
143
|
end
|
141
144
|
end
|
@@ -1,100 +1,101 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Cucumber
|
3
|
-
module Gherkin
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
4
|
+
module Gherkin
|
5
|
+
module Formatter
|
6
|
+
# Defines aliases for ANSI coloured output. Default colours can be overridden by defining
|
7
|
+
# a <tt>GHERKIN_COLORS</tt> variable in your shell, very much like how you can
|
8
|
+
# tweak the familiar POSIX command <tt>ls</tt> with
|
9
|
+
# $LSCOLORS: http://linux-sxs.org/housekeeping/lscolors.html
|
10
|
+
#
|
11
|
+
# The colours that you can change are:
|
12
|
+
#
|
13
|
+
# <tt>undefined</tt>:: defaults to <tt>yellow</tt>
|
14
|
+
# <tt>pending</tt>:: defaults to <tt>yellow</tt>
|
15
|
+
# <tt>pending_arg</tt>:: defaults to <tt>yellow,bold</tt>
|
16
|
+
# <tt>executing</tt>:: defaults to <tt>grey</tt>
|
17
|
+
# <tt>executing_arg</tt>:: defaults to <tt>grey,bold</tt>
|
18
|
+
# <tt>failed</tt>:: defaults to <tt>red</tt>
|
19
|
+
# <tt>failed_arg</tt>:: defaults to <tt>red,bold</tt>
|
20
|
+
# <tt>passed</tt>:: defaults to <tt>green</tt>
|
21
|
+
# <tt>passed_arg</tt>:: defaults to <tt>green,bold</tt>
|
22
|
+
# <tt>outline</tt>:: defaults to <tt>cyan</tt>
|
23
|
+
# <tt>outline_arg</tt>:: defaults to <tt>cyan,bold</tt>
|
24
|
+
# <tt>skipped</tt>:: defaults to <tt>cyan</tt>
|
25
|
+
# <tt>skipped_arg</tt>:: defaults to <tt>cyan,bold</tt>
|
26
|
+
# <tt>comment</tt>:: defaults to <tt>grey</tt>
|
27
|
+
# <tt>tag</tt>:: defaults to <tt>cyan</tt>
|
28
|
+
#
|
29
|
+
# For instance, if your shell has a black background and a green font (like the
|
30
|
+
# "Homebrew" settings for OS X' Terminal.app), you may want to override passed
|
31
|
+
# steps to be white instead of green. Examples:
|
32
|
+
#
|
33
|
+
# export GHERKIN_COLORS="passed=white"
|
34
|
+
# export GHERKIN_COLORS="passed=white,bold:passed_arg=white,bold,underline"
|
35
|
+
#
|
36
|
+
# (If you're on Windows, use SET instead of export).
|
37
|
+
# To see what colours and effects are available, just run this in your shell:
|
38
|
+
#
|
39
|
+
# ruby -e "require 'rubygems'; require 'term/ansicolor'; puts Term::ANSIColor.attributes"
|
40
|
+
#
|
41
|
+
# Although not listed, you can also use <tt>grey</tt>
|
42
|
+
module AnsiEscapes
|
43
|
+
COLORS = {
|
44
|
+
'black' => "\e[30m",
|
45
|
+
'red' => "\e[31m",
|
46
|
+
'green' => "\e[32m",
|
47
|
+
'yellow' => "\e[33m",
|
48
|
+
'blue' => "\e[34m",
|
49
|
+
'magenta' => "\e[35m",
|
50
|
+
'cyan' => "\e[36m",
|
51
|
+
'white' => "\e[37m",
|
52
|
+
'grey' => "\e[90m",
|
53
|
+
'bold' => "\e[1m"
|
54
|
+
}
|
54
55
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
56
|
+
ALIASES = Hash.new do |h, k|
|
57
|
+
if k.to_s =~ /(.*)_arg/
|
58
|
+
h[$1] + ',bold'
|
59
|
+
end
|
60
|
+
end.merge({
|
61
|
+
'undefined' => 'yellow',
|
62
|
+
'pending' => 'yellow',
|
63
|
+
'executing' => 'grey',
|
64
|
+
'failed' => 'red',
|
65
|
+
'passed' => 'green',
|
66
|
+
'outline' => 'cyan',
|
67
|
+
'skipped' => 'cyan',
|
68
|
+
'comments' => 'grey',
|
69
|
+
'tag' => 'cyan'
|
70
|
+
})
|
70
71
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
72
|
+
if ENV['GHERKIN_COLORS'] # Example: export GHERKIN_COLORS="passed=red:failed=yellow"
|
73
|
+
ENV['GHERKIN_COLORS'].split(':').each do |pair|
|
74
|
+
a = pair.split('=')
|
75
|
+
ALIASES[a[0]] = a[1]
|
76
|
+
end
|
75
77
|
end
|
76
|
-
end
|
77
78
|
|
78
|
-
|
79
|
-
|
80
|
-
|
79
|
+
ALIASES.keys.each do |key|
|
80
|
+
define_method(key) do
|
81
|
+
ALIASES[key].split(',').map { |color| COLORS[color] }.join('')
|
82
|
+
end
|
83
|
+
|
84
|
+
define_method("#{key}_arg") do
|
85
|
+
ALIASES["#{key}_arg"].split(',').map { |color| COLORS[color] }.join('')
|
86
|
+
end
|
81
87
|
end
|
82
88
|
|
83
|
-
|
84
|
-
|
89
|
+
def reset
|
90
|
+
"\e[0m"
|
85
91
|
end
|
86
|
-
end
|
87
92
|
|
88
|
-
|
89
|
-
|
90
|
-
|
93
|
+
def up(n)
|
94
|
+
"\e[#{n}A"
|
95
|
+
end
|
91
96
|
|
92
|
-
|
93
|
-
"\e[#{n}A"
|
97
|
+
extend self
|
94
98
|
end
|
95
|
-
|
96
|
-
extend self
|
97
99
|
end
|
98
100
|
end
|
99
101
|
end
|
100
|
-
end
|