cucumber 3.1.0 → 3.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +38 -2
- 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 +42 -40
- data/lib/cucumber/cli/profile_loader.rb +5 -7
- data/lib/cucumber/cli/rerun_file.rb +1 -0
- data/lib/cucumber/configuration.rb +1 -0
- 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_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/backtrace_filter.rb +1 -2
- data/lib/cucumber/formatter/console.rb +10 -11
- 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 +2 -1
- data/lib/cucumber/formatter/json_pretty.rb +1 -0
- data/lib/cucumber/formatter/junit.rb +16 -15
- data/lib/cucumber/formatter/pretty.rb +3 -2
- 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 +21 -18
- 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 +4 -7
- 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 +7 -4
- 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 +5 -5
- 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 +1 -2
- 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 +61 -117
@@ -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'
|
@@ -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)
|
@@ -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,7 +127,7 @@ 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] })
|
130
|
+
key.status = worst_status(steps.map { |step| step[:status] })
|
127
131
|
total_duration = steps.inject(0) {|sum, step| step[:duration] + sum}
|
128
132
|
key.mean_duration = total_duration / steps.length
|
129
133
|
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
|