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.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -3
  3. data/CONTRIBUTING.md +1 -0
  4. data/README.md +6 -7
  5. data/lib/autotest/cucumber.rb +1 -0
  6. data/lib/autotest/cucumber_mixin.rb +1 -0
  7. data/lib/autotest/cucumber_rails.rb +1 -0
  8. data/lib/autotest/cucumber_rails_rspec.rb +1 -0
  9. data/lib/autotest/cucumber_rails_rspec2.rb +1 -0
  10. data/lib/autotest/cucumber_rspec.rb +1 -0
  11. data/lib/autotest/cucumber_rspec2.rb +1 -0
  12. data/lib/autotest/discover.rb +1 -0
  13. data/lib/cucumber.rb +1 -0
  14. data/lib/cucumber/cli/configuration.rb +1 -0
  15. data/lib/cucumber/cli/main.rb +2 -2
  16. data/lib/cucumber/cli/options.rb +54 -52
  17. data/lib/cucumber/cli/profile_loader.rb +5 -7
  18. data/lib/cucumber/cli/rerun_file.rb +1 -0
  19. data/lib/cucumber/configuration.rb +8 -7
  20. data/lib/cucumber/constantize.rb +6 -5
  21. data/lib/cucumber/core_ext/string.rb +1 -0
  22. data/lib/cucumber/deprecate.rb +1 -1
  23. data/lib/cucumber/encoding.rb +2 -1
  24. data/lib/cucumber/errors.rb +1 -0
  25. data/lib/cucumber/events.rb +1 -1
  26. data/lib/cucumber/events/gherkin_source_parsed.rb~ +14 -0
  27. data/lib/cucumber/events/gherkin_source_read.rb +1 -4
  28. data/lib/cucumber/events/step_activated.rb +4 -5
  29. data/lib/cucumber/events/step_definition_registered.rb +4 -8
  30. data/lib/cucumber/events/test_case_finished.rb +0 -4
  31. data/lib/cucumber/events/test_case_started.rb +0 -4
  32. data/lib/cucumber/events/test_run_finished.rb +2 -3
  33. data/lib/cucumber/events/test_run_started.rb +2 -4
  34. data/lib/cucumber/events/test_step_finished.rb +0 -4
  35. data/lib/cucumber/events/test_step_started.rb +1 -5
  36. data/lib/cucumber/file_specs.rb +2 -1
  37. data/lib/cucumber/filters.rb +1 -0
  38. data/lib/cucumber/filters/activate_steps.rb +1 -1
  39. data/lib/cucumber/filters/apply_after_hooks.rb +1 -0
  40. data/lib/cucumber/filters/apply_after_step_hooks.rb +1 -0
  41. data/lib/cucumber/filters/apply_around_hooks.rb +1 -0
  42. data/lib/cucumber/filters/apply_before_hooks.rb +1 -0
  43. data/lib/cucumber/filters/broadcast_test_run_started_event.rb +2 -1
  44. data/lib/cucumber/filters/gated_receiver.rb +1 -2
  45. data/lib/cucumber/filters/prepare_world.rb +2 -5
  46. data/lib/cucumber/filters/quit.rb +2 -3
  47. data/lib/cucumber/filters/randomizer.rb +6 -7
  48. data/lib/cucumber/filters/retry.rb +2 -2
  49. data/lib/cucumber/filters/tag_limits.rb +2 -2
  50. data/lib/cucumber/filters/tag_limits/test_case_index.rb +1 -2
  51. data/lib/cucumber/filters/tag_limits/verifier.rb +1 -2
  52. data/lib/cucumber/formatter/ansicolor.rb +13 -12
  53. data/lib/cucumber/formatter/ast_lookup.rb~ +9 -0
  54. data/lib/cucumber/formatter/backtrace_filter.rb +1 -2
  55. data/lib/cucumber/formatter/console.rb +11 -12
  56. data/lib/cucumber/formatter/console_counts.rb +4 -4
  57. data/lib/cucumber/formatter/console_issues.rb +3 -3
  58. data/lib/cucumber/formatter/duration.rb +1 -0
  59. data/lib/cucumber/formatter/duration_extractor.rb +1 -1
  60. data/lib/cucumber/formatter/fail_fast.rb +9 -6
  61. data/lib/cucumber/formatter/fanout.rb +1 -3
  62. data/lib/cucumber/formatter/hook_query_visitor.rb +1 -0
  63. data/lib/cucumber/formatter/html.rb +27 -31
  64. data/lib/cucumber/formatter/html_builder.rb +2 -1
  65. data/lib/cucumber/formatter/ignore_missing_messages.rb +1 -2
  66. data/lib/cucumber/formatter/interceptor.rb +18 -5
  67. data/lib/cucumber/formatter/io.rb +1 -0
  68. data/lib/cucumber/formatter/json.rb +3 -2
  69. data/lib/cucumber/formatter/json_pretty.rb +1 -0
  70. data/lib/cucumber/formatter/junit.rb +16 -15
  71. data/lib/cucumber/formatter/pretty.rb +4 -3
  72. data/lib/cucumber/formatter/progress.rb +3 -2
  73. data/lib/cucumber/formatter/rerun.rb +1 -0
  74. data/lib/cucumber/formatter/stepdefs.rb +1 -0
  75. data/lib/cucumber/formatter/steps.rb +2 -2
  76. data/lib/cucumber/formatter/summary.rb +1 -1
  77. data/lib/cucumber/formatter/unicode.rb +2 -2
  78. data/lib/cucumber/formatter/usage.rb +22 -19
  79. data/lib/cucumber/gherkin/data_table_parser.rb +1 -0
  80. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +86 -85
  81. data/lib/cucumber/gherkin/formatter/escaping.rb +13 -12
  82. data/lib/cucumber/gherkin/i18n.rb +1 -0
  83. data/lib/cucumber/gherkin/steps_parser.rb +1 -0
  84. data/lib/cucumber/glue/dsl.rb +1 -0
  85. data/lib/cucumber/glue/hook.rb +1 -0
  86. data/lib/cucumber/glue/invoke_in_world.rb +3 -3
  87. data/lib/cucumber/glue/proto_world.rb +8 -9
  88. data/lib/cucumber/glue/registry_and_more.rb +13 -12
  89. data/lib/cucumber/glue/snippet.rb +1 -5
  90. data/lib/cucumber/glue/step_definition.rb +9 -9
  91. data/lib/cucumber/glue/world_factory.rb +0 -2
  92. data/lib/cucumber/hooks.rb +1 -3
  93. data/lib/cucumber/load_path.rb +1 -0
  94. data/lib/cucumber/multiline_argument.rb +2 -2
  95. data/lib/cucumber/multiline_argument/data_table.rb +10 -10
  96. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +7 -10
  97. data/lib/cucumber/multiline_argument/doc_string.rb +1 -0
  98. data/lib/cucumber/platform.rb +2 -1
  99. data/lib/cucumber/project_initializer.rb +1 -1
  100. data/lib/cucumber/rake/task.rb +8 -5
  101. data/lib/cucumber/rspec/disable_option_parser.rb +1 -0
  102. data/lib/cucumber/rspec/doubles.rb +1 -0
  103. data/lib/cucumber/running_test_case.rb +2 -1
  104. data/lib/cucumber/runtime.rb +6 -6
  105. data/lib/cucumber/runtime/after_hooks.rb +1 -0
  106. data/lib/cucumber/runtime/before_hooks.rb +1 -0
  107. data/lib/cucumber/runtime/for_programming_languages.rb +8 -7
  108. data/lib/cucumber/runtime/step_hooks.rb +2 -0
  109. data/lib/cucumber/runtime/support_code.rb +3 -7
  110. data/lib/cucumber/runtime/user_interface.rb +2 -3
  111. data/lib/cucumber/step_argument.rb +1 -0
  112. data/lib/cucumber/step_definition_light.rb +2 -1
  113. data/lib/cucumber/step_definitions.rb +1 -0
  114. data/lib/cucumber/step_match.rb +5 -7
  115. data/lib/cucumber/step_match_search.rb +7 -8
  116. data/lib/cucumber/term/ansicolor.rb +30 -30
  117. data/lib/cucumber/unit.rb +1 -0
  118. data/lib/cucumber/version +1 -1
  119. data/lib/simplecov_setup.rb +1 -0
  120. 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.dup
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
  module Cucumber
3
4
  module Formatter
4
5
  module Io
@@ -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.location.line
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] = comments unless comments.empty?
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 'cucumber/formatter/json'
3
4
 
4
5
  module Cucumber
@@ -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 { |h,k| h[k] = {
29
- feature: nil,
30
- failures: 0,
31
- errors: 0,
32
- tests: 0,
33
- skipped: 0,
34
- time: 0,
35
- builder: Builder::XmlMarkup.new(:indent => 2)
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 ) do
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.buffer.join)
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.buffer.join)
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 { |step_keyword, step_name, multiline_arg|
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,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cucumber/formatter/io'
3
4
 
4
5
  module Cucumber
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'cucumber/formatter/usage'
3
4
 
4
5
  module Cucumber
@@ -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] << [ step_definition.file_colon_line, step_definition.regexp_source ]
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
- step_definition = step_match.step_definition
42
- stepdef_key = StepDefKey.new(step_definition.expression.to_s, step_definition.location)
43
- unless @stepdef_to_match[stepdef_key].map { |key| key[:location] }.include? test_step.location
44
- duration = DurationExtractor.new(result).result_duration
45
-
46
- @stepdef_to_match[stepdef_key] << {
47
- keyword: test_step.source.last.keyword,
48
- step_match: step_match,
49
- status: result.to_sym,
50
- location: test_step.location,
51
- duration: duration
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,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'gherkin/token_scanner'
3
4
  require 'gherkin/parser'
4
5
  require 'gherkin/dialect'
@@ -1,100 +1,101 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Cucumber
3
- module Gherkin
4
- module Formatter
5
- # Defines aliases for ANSI coloured output. Default colours can be overridden by defining
6
- # a <tt>GHERKIN_COLORS</tt> variable in your shell, very much like how you can
7
- # tweak the familiar POSIX command <tt>ls</tt> with
8
- # $LSCOLORS: http://linux-sxs.org/housekeeping/lscolors.html
9
- #
10
- # The colours that you can change are:
11
- #
12
- # <tt>undefined</tt>:: defaults to <tt>yellow</tt>
13
- # <tt>pending</tt>:: defaults to <tt>yellow</tt>
14
- # <tt>pending_arg</tt>:: defaults to <tt>yellow,bold</tt>
15
- # <tt>executing</tt>:: defaults to <tt>grey</tt>
16
- # <tt>executing_arg</tt>:: defaults to <tt>grey,bold</tt>
17
- # <tt>failed</tt>:: defaults to <tt>red</tt>
18
- # <tt>failed_arg</tt>:: defaults to <tt>red,bold</tt>
19
- # <tt>passed</tt>:: defaults to <tt>green</tt>
20
- # <tt>passed_arg</tt>:: defaults to <tt>green,bold</tt>
21
- # <tt>outline</tt>:: defaults to <tt>cyan</tt>
22
- # <tt>outline_arg</tt>:: defaults to <tt>cyan,bold</tt>
23
- # <tt>skipped</tt>:: defaults to <tt>cyan</tt>
24
- # <tt>skipped_arg</tt>:: defaults to <tt>cyan,bold</tt>
25
- # <tt>comment</tt>:: defaults to <tt>grey</tt>
26
- # <tt>tag</tt>:: defaults to <tt>cyan</tt>
27
- #
28
- # For instance, if your shell has a black background and a green font (like the
29
- # "Homebrew" settings for OS X' Terminal.app), you may want to override passed
30
- # steps to be white instead of green. Examples:
31
- #
32
- # export GHERKIN_COLORS="passed=white"
33
- # export GHERKIN_COLORS="passed=white,bold:passed_arg=white,bold,underline"
34
- #
35
- # (If you're on Windows, use SET instead of export).
36
- # To see what colours and effects are available, just run this in your shell:
37
- #
38
- # ruby -e "require 'rubygems'; require 'term/ansicolor'; puts Term::ANSIColor.attributes"
39
- #
40
- # Although not listed, you can also use <tt>grey</tt>
41
- module AnsiEscapes
42
- COLORS = {
43
- 'black' => "\e[30m",
44
- 'red' => "\e[31m",
45
- 'green' => "\e[32m",
46
- 'yellow' => "\e[33m",
47
- 'blue' => "\e[34m",
48
- 'magenta' => "\e[35m",
49
- 'cyan' => "\e[36m",
50
- 'white' => "\e[37m",
51
- 'grey' => "\e[90m",
52
- 'bold' => "\e[1m"
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
- ALIASES = Hash.new do |h,k|
56
- if k.to_s =~ /(.*)_arg/
57
- h[$1] + ',bold'
58
- end
59
- end.merge({
60
- 'undefined' => 'yellow',
61
- 'pending' => 'yellow',
62
- 'executing' => 'grey',
63
- 'failed' => 'red',
64
- 'passed' => 'green',
65
- 'outline' => 'cyan',
66
- 'skipped' => 'cyan',
67
- 'comments' => 'grey',
68
- 'tag' => 'cyan'
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
- if ENV['GHERKIN_COLORS'] # Example: export GHERKIN_COLORS="passed=red:failed=yellow"
72
- ENV['GHERKIN_COLORS'].split(':').each do |pair|
73
- a = pair.split('=')
74
- ALIASES[a[0]] = a[1]
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
- ALIASES.keys.each do |key|
79
- define_method(key) do
80
- ALIASES[key].split(',').map{|color| COLORS[color]}.join('')
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
- define_method("#{key}_arg") do
84
- ALIASES["#{key}_arg"].split(',').map{|color| COLORS[color]}.join('')
89
+ def reset
90
+ "\e[0m"
85
91
  end
86
- end
87
92
 
88
- def reset
89
- "\e[0m"
90
- end
93
+ def up(n)
94
+ "\e[#{n}A"
95
+ end
91
96
 
92
- def up(n)
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