cucumber 8.0.0 → 9.2.0

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 (73) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -23
  3. data/VERSION +1 -0
  4. data/lib/cucumber/cli/main.rb +1 -1
  5. data/lib/cucumber/cli/options.rb +66 -66
  6. data/lib/cucumber/cli/profile_loader.rb +5 -5
  7. data/lib/cucumber/configuration.rb +7 -2
  8. data/lib/cucumber/deprecate.rb +6 -47
  9. data/lib/cucumber/errors.rb +2 -1
  10. data/lib/cucumber/events/envelope.rb +2 -0
  11. data/lib/cucumber/events/gherkin_source_parsed.rb +2 -0
  12. data/lib/cucumber/events/gherkin_source_read.rb +2 -0
  13. data/lib/cucumber/events/test_case_finished.rb +2 -0
  14. data/lib/cucumber/events/test_case_started.rb +2 -0
  15. data/lib/cucumber/events/test_step_finished.rb +2 -0
  16. data/lib/cucumber/events/test_step_started.rb +2 -0
  17. data/lib/cucumber/events/undefined_parameter_type.rb +2 -0
  18. data/lib/cucumber/file_specs.rb +1 -1
  19. data/lib/cucumber/filters/retry.rb +20 -1
  20. data/lib/cucumber/formatter/ansicolor.rb +19 -27
  21. data/lib/cucumber/formatter/ast_lookup.rb +14 -6
  22. data/lib/cucumber/formatter/console.rb +16 -14
  23. data/lib/cucumber/formatter/console_counts.rb +3 -1
  24. data/lib/cucumber/formatter/console_issues.rb +4 -2
  25. data/lib/cucumber/formatter/curl_option_parser.rb +49 -0
  26. data/lib/cucumber/formatter/errors.rb +2 -0
  27. data/lib/cucumber/formatter/fail_fast.rb +1 -1
  28. data/lib/cucumber/formatter/html.rb +2 -0
  29. data/lib/cucumber/formatter/http_io.rb +10 -142
  30. data/lib/cucumber/formatter/io_http_buffer.rb +88 -0
  31. data/lib/cucumber/formatter/json.rb +2 -6
  32. data/lib/cucumber/formatter/junit.rb +4 -4
  33. data/lib/cucumber/formatter/message_builder.rb +21 -6
  34. data/lib/cucumber/formatter/pretty.rb +9 -5
  35. data/lib/cucumber/formatter/publish_banner_printer.rb +0 -2
  36. data/lib/cucumber/formatter/query/hook_by_test_step.rb +2 -0
  37. data/lib/cucumber/formatter/query/pickle_by_test.rb +2 -0
  38. data/lib/cucumber/formatter/query/pickle_step_by_test_step.rb +2 -0
  39. data/lib/cucumber/formatter/query/step_definitions_by_test_step.rb +2 -0
  40. data/lib/cucumber/formatter/query/test_case_started_by_test_case.rb +2 -0
  41. data/lib/cucumber/formatter/rerun.rb +3 -3
  42. data/lib/cucumber/formatter/unicode.rb +3 -3
  43. data/lib/cucumber/formatter/url_reporter.rb +3 -1
  44. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +23 -25
  45. data/lib/cucumber/glue/invoke_in_world.rb +2 -2
  46. data/lib/cucumber/glue/proto_world.rb +20 -25
  47. data/lib/cucumber/glue/registry_and_more.rb +9 -5
  48. data/lib/cucumber/glue/snippet.rb +4 -2
  49. data/lib/cucumber/glue/world_factory.rb +2 -0
  50. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +2 -0
  51. data/lib/cucumber/multiline_argument/data_table.rb +34 -35
  52. data/lib/cucumber/platform.rb +11 -16
  53. data/lib/cucumber/rake/task.rb +2 -6
  54. data/lib/cucumber/running_test_case.rb +1 -1
  55. data/lib/cucumber/runtime/for_programming_languages.rb +1 -2
  56. data/lib/cucumber/runtime/meta_message_builder.rb +4 -2
  57. data/lib/cucumber/runtime/user_interface.rb +2 -2
  58. data/lib/cucumber/runtime.rb +5 -5
  59. data/lib/cucumber/step_match.rb +1 -1
  60. data/lib/cucumber/term/ansicolor.rb +1 -1
  61. data/lib/cucumber/term/banner.rb +2 -0
  62. metadata +83 -239
  63. data/CHANGELOG.md +0 -3231
  64. data/CONTRIBUTING.md +0 -246
  65. data/lib/autotest/cucumber.rb +0 -8
  66. data/lib/autotest/cucumber_mixin.rb +0 -133
  67. data/lib/autotest/cucumber_rails.rb +0 -8
  68. data/lib/autotest/cucumber_rails_rspec.rb +0 -8
  69. data/lib/autotest/cucumber_rails_rspec2.rb +0 -8
  70. data/lib/autotest/cucumber_rspec.rb +0 -8
  71. data/lib/autotest/cucumber_rspec2.rb +0 -8
  72. data/lib/autotest/discover.rb +0 -14
  73. data/lib/cucumber/version +0 -1
@@ -19,7 +19,7 @@ module Cucumber
19
19
  #
20
20
  # If the output is STDOUT (and not a file), there are bright colours to watch too.
21
21
  #
22
- class Pretty # rubocop:disable Metrics/ClassLength
22
+ class Pretty
23
23
  include FileUtils
24
24
  include Console
25
25
  include Io
@@ -140,16 +140,20 @@ module Cucumber
140
140
  print_summary
141
141
  end
142
142
 
143
- def attach(src, media_type)
143
+ def attach(src, media_type, filename)
144
144
  return unless media_type == 'text/x.cucumber.log+plain'
145
145
 
146
- @test_step_output.push src
146
+ if filename
147
+ @test_step_output.push("#{filename}: #{src}")
148
+ else
149
+ @test_step_output.push(src)
150
+ end
147
151
  end
148
152
 
149
153
  private
150
154
 
151
155
  def find_exception_to_be_printed(result)
152
- return nil if result.ok?(options[:strict])
156
+ return nil if result.ok?(strict: options[:strict])
153
157
 
154
158
  result = result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter)
155
159
  exception = result.failed? ? result.exception : result
@@ -391,7 +395,7 @@ module Cucumber
391
395
  end
392
396
  end
393
397
 
394
- def print_outline_data(scenario_outline) # rubocop:disable Metrics/AbcSize
398
+ def print_outline_data(scenario_outline)
395
399
  print_comments(scenario_outline.location.line, 2)
396
400
  print_tags(scenario_outline.tags, 2)
397
401
  @source_indent = calculate_source_indent_for_ast_node(scenario_outline) if options[:source]
@@ -15,7 +15,6 @@ module Cucumber
15
15
  end
16
16
  end
17
17
 
18
- # rubocop:disable Metrics/MethodLength
19
18
  def display_publish_ad(io)
20
19
  display_banner(
21
20
  [
@@ -59,7 +58,6 @@ module Cucumber
59
58
  io
60
59
  )
61
60
  end
62
- # rubocop:enable Metrics/MethodLength
63
61
 
64
62
  def highlight(text)
65
63
  [text, :cyan]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/formatter/errors'
2
4
 
3
5
  module Cucumber
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/formatter/errors'
2
4
 
3
5
  module Cucumber
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/formatter/errors'
2
4
 
3
5
  module Cucumber
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/formatter/errors'
2
4
 
3
5
  module Cucumber
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/formatter/errors'
2
4
 
3
5
  module Cucumber
@@ -14,7 +14,7 @@ module Cucumber
14
14
  config.on_event :test_case_finished do |event|
15
15
  test_case, result = *event.attributes
16
16
  if @config.strict.strict?(:flaky)
17
- next if result.ok?(@config.strict)
17
+ next if result.ok?(strict: @config.strict)
18
18
 
19
19
  add_to_failures(test_case)
20
20
  else
@@ -22,11 +22,11 @@ module Cucumber
22
22
  if @latest_failed_test_case != test_case
23
23
  add_to_failures(@latest_failed_test_case)
24
24
  @latest_failed_test_case = nil
25
- elsif result.ok?(@config.strict)
25
+ elsif result.ok?(strict: @config.strict)
26
26
  @latest_failed_test_case = nil
27
27
  end
28
28
  end
29
- @latest_failed_test_case = test_case unless result.ok?(@config.strict)
29
+ @latest_failed_test_case = test_case unless result.ok?(strict: @config.strict)
30
30
  end
31
31
  end
32
32
  config.on_event :test_run_finished do
@@ -10,13 +10,13 @@ if Cucumber::WINDOWS
10
10
  Cucumber::CODEPAGE = ENV['CUCUMBER_OUTPUT_ENCODING']
11
11
  elsif `cmd /c chcp` =~ /(\d+)/
12
12
  if [65_000, 65_001].include? Regexp.last_match(1).to_i
13
- Cucumber::CODEPAGE = 'UTF-8'.freeze
13
+ Cucumber::CODEPAGE = 'UTF-8'
14
14
  ENV['ANSICON_API'] = 'ruby'
15
15
  else
16
- Cucumber::CODEPAGE = "cp#{Regexp.last_match(1).to_i}".freeze
16
+ Cucumber::CODEPAGE = "cp#{Regexp.last_match(1).to_i}"
17
17
  end
18
18
  else
19
- Cucumber::CODEPAGE = 'cp1252'.freeze
19
+ Cucumber::CODEPAGE = 'cp1252'
20
20
  $stderr.puts("WARNING: Couldn't detect your output codepage. Assuming it is 1252. You may have to chcp 1252 or SET CUCUMBER_OUTPUT_ENCODING=cp1252.")
21
21
  end
22
22
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Cucumber
2
4
  module Formatter
3
5
  class URLReporter
@@ -11,7 +13,7 @@ module Cucumber
11
13
  end
12
14
 
13
15
  class NoReporter
14
- def report(banner); end
16
+ def report(_banner); end
15
17
  end
16
18
  end
17
19
  end
@@ -5,8 +5,7 @@ module Cucumber
5
5
  module Formatter
6
6
  # Defines aliases for ANSI coloured output. Default colours can be overridden by defining
7
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
8
+ # tweak the familiar POSIX command <tt>ls</tt> with $LSCOLORS: http://linux-sxs.org/housekeeping/lscolors.html
10
9
  #
11
10
  # The colours that you can change are:
12
11
  #
@@ -41,37 +40,36 @@ module Cucumber
41
40
  # Although not listed, you can also use <tt>grey</tt>
42
41
  module AnsiEscapes
43
42
  COLORS = {
44
- 'black' => "\e[30m",
45
- 'red' => "\e[31m",
46
- 'green' => "\e[32m",
47
- 'yellow' => "\e[33m",
48
- 'blue' => "\e[34m",
43
+ 'black' => "\e[30m",
44
+ 'red' => "\e[31m",
45
+ 'green' => "\e[32m",
46
+ 'yellow' => "\e[33m",
47
+ 'blue' => "\e[34m",
49
48
  'magenta' => "\e[35m",
50
- 'cyan' => "\e[36m",
51
- 'white' => "\e[37m",
52
- 'grey' => "\e[90m",
53
- 'bold' => "\e[1m"
49
+ 'cyan' => "\e[36m",
50
+ 'white' => "\e[37m",
51
+ 'grey' => "\e[90m",
52
+ 'bold' => "\e[1m"
54
53
  }.freeze
55
54
 
56
55
  ALIASES = Hash.new do |h, k|
57
56
  "#{h[Regexp.last_match(1)]},bold" if k.to_s =~ /(.*)_arg/
58
57
  end.merge(
59
58
  'undefined' => 'yellow',
60
- 'pending' => 'yellow',
59
+ 'pending' => 'yellow',
61
60
  'executing' => 'grey',
62
- 'failed' => 'red',
63
- 'passed' => 'green',
64
- 'outline' => 'cyan',
65
- 'skipped' => 'cyan',
66
- 'comments' => 'grey',
67
- 'tag' => 'cyan'
61
+ 'failed' => 'red',
62
+ 'passed' => 'green',
63
+ 'outline' => 'cyan',
64
+ 'skipped' => 'cyan',
65
+ 'comments' => 'grey',
66
+ 'tag' => 'cyan'
68
67
  )
69
68
 
70
- if ENV['GHERKIN_COLORS'] # Example: export GHERKIN_COLORS="passed=red:failed=yellow"
71
- ENV['GHERKIN_COLORS'].split(':').each do |pair|
72
- a = pair.split('=')
73
- ALIASES[a[0]] = a[1]
74
- end
69
+ # Example: export GHERKIN_COLORS="passed=red:failed=yellow"
70
+ ENV.fetch('GHERKIN_COLORS', '').split(':').each do |pair|
71
+ rule, colour = pair.split('=')
72
+ ALIASES[colour] = rule
75
73
  end
76
74
 
77
75
  ALIASES.each_key do |key|
@@ -88,8 +86,8 @@ module Cucumber
88
86
  "\e[0m"
89
87
  end
90
88
 
91
- def up(n)
92
- "\e[#{n}A"
89
+ def up(amount)
90
+ "\e[#{amount}A"
93
91
  end
94
92
  end
95
93
  end
@@ -28,7 +28,7 @@ module Cucumber
28
28
  if check_arity && !cucumber_compatible_arity?(args, block)
29
29
  world.instance_exec do
30
30
  ari = block.arity
31
- ari = ari < 0 ? "#{ari.abs - 1}+" : ari
31
+ ari = ari.negative? ? "#{ari.abs - 1}+" : ari
32
32
  s1 = ari == 1 ? '' : 's'
33
33
  s2 = args.length == 1 ? '' : 's'
34
34
  raise ArityMismatchError, "Your block takes #{ari} argument#{s1}, but the Regexp matched #{args.length} argument#{s2}."
@@ -48,7 +48,7 @@ module Cucumber
48
48
 
49
49
  def self.cucumber_run_with_backtrace_filtering(pseudo_method)
50
50
  yield
51
- rescue Exception => e # rubocop:disable Lint/RescueException
51
+ rescue Exception => e
52
52
  instance_exec_invocation_line = "#{__FILE__}:#{__LINE__ - 2}:in `cucumber_run_with_backtrace_filtering'"
53
53
  replace_instance_exec_invocation_line!((e.backtrace || []), instance_exec_invocation_line, pseudo_method)
54
54
  raise e
@@ -3,11 +3,11 @@
3
3
  require 'cucumber/gherkin/formatter/ansi_escapes'
4
4
  require 'cucumber/core/test/data_table'
5
5
  require 'cucumber/deprecate'
6
- require 'mime/types'
6
+ require 'mini_mime'
7
7
 
8
8
  module Cucumber
9
9
  module Glue
10
- # Defines the basic API methods availlable in all Cucumber step definitions.
10
+ # Defines the basic API methods available in all Cucumber step definitions.
11
11
  #
12
12
  # You can, and probably should, extend this API with your own methods that
13
13
  # make sense in your domain. For more on that, see {Cucumber::Glue::Dsl#World}
@@ -26,7 +26,7 @@ module Cucumber
26
26
  # @example Passing a multiline string
27
27
  # step "the email should contain:", "Dear sir,\nYou've won a prize!\n"
28
28
  # @param [String] name The name of the step
29
- # @param [String,Cucumber::Test::DocString,Cucumber::Ast::Table] multiline_argument
29
+ # @param [String, Cucumber::Test::DocString, Cucumber::Ast::Table] raw_multiline_arg
30
30
  def step(name, raw_multiline_arg = nil)
31
31
  super
32
32
  end
@@ -84,17 +84,19 @@ module Cucumber
84
84
 
85
85
  # Attach a file to the output
86
86
  # @param file [string|io] the file to attach.
87
- # It can be a string containing the file content itself,
88
- # the file path, or an IO ready to be read.
89
- # @param media_type [string] the media type. If file is a valid path,
90
- # media_type can be ommitted, it will then be inferred from the file name.
91
- def attach(file, media_type = nil)
87
+ # It can be a string containing the file content itself, the file path, or an IO ready to be read.
88
+ # @param media_type [string] the media type.
89
+ # If file is a valid path, media_type can be omitted, it will then be inferred from the file name.
90
+ # @param filename [string] the name of the file you wish to specify.
91
+ # This is only needed in situations where you want to rename a PDF download e.t.c. - In most situations
92
+ # you should not need to pass a filename
93
+ def attach(file, media_type = nil, filename = nil)
92
94
  return super unless File.file?(file)
93
95
 
94
96
  content = File.read(file, mode: 'rb')
95
- media_type = MIME::Types.type_for(file).first if media_type.nil?
97
+ media_type = MiniMime.lookup_by_filename(file)&.content_type if media_type.nil?
96
98
 
97
- super(content, media_type.to_s)
99
+ super(content, media_type.to_s, filename)
98
100
  rescue StandardError
99
101
  super
100
102
  end
@@ -103,12 +105,9 @@ module Cucumber
103
105
  def pending(message = 'TODO')
104
106
  raise Pending, message unless block_given?
105
107
 
106
- begin
107
- yield
108
- rescue Exception # rubocop:disable Lint/RescueException
109
- raise Pending, message
110
- end
111
- raise Pending, "Expected pending '#{message}' to fail. No Error was raised. No longer pending?"
108
+ yield
109
+ rescue Exception
110
+ raise Pending, message
112
111
  end
113
112
 
114
113
  # Skips this step and the remaining steps in the scenario
@@ -126,9 +125,9 @@ module Cucumber
126
125
  inspect
127
126
  end
128
127
 
129
- # Dynamially generate the API module, closuring the dependencies
130
- def self.for(runtime, language) # rubocop:disable Metrics/MethodLength,Metrics/AbcSize
131
- Module.new do # rubocop:disable Metrics/BlockLength
128
+ # Dynamically generate the API module, closuring the dependencies
129
+ def self.for(runtime, language)
130
+ Module.new do
132
131
  def self.extended(object)
133
132
  # wrap the dynamically generated module so that we can document the methods
134
133
  # for yardoc, which doesn't like define_method.
@@ -156,8 +155,8 @@ module Cucumber
156
155
  runtime.ask(question, timeout_seconds)
157
156
  end
158
157
 
159
- define_method(:attach) do |file, media_type|
160
- runtime.attach(file, media_type)
158
+ define_method(:attach) do |file, media_type, filename|
159
+ runtime.attach(file, media_type, filename)
161
160
  end
162
161
 
163
162
  # Prints the list of modules that are included in the World
@@ -172,14 +171,12 @@ module Cucumber
172
171
 
173
172
  private
174
173
 
175
- # @private
176
174
  def add_world_modules!(modules)
177
175
  modules.each do |world_module|
178
176
  extend(world_module)
179
177
  end
180
178
  end
181
179
 
182
- # @private
183
180
  def add_namespaced_modules!(modules)
184
181
  @__namespaced_modules = modules
185
182
  modules.each do |namespace, world_modules|
@@ -199,7 +196,6 @@ module Cucumber
199
196
  end
200
197
  end
201
198
 
202
- # @private
203
199
  def stringify_namespaced_modules
204
200
  return '' if @__namespaced_modules.nil?
205
201
 
@@ -208,7 +204,6 @@ module Cucumber
208
204
  end
209
205
  end
210
206
 
211
- # @private
212
207
  AnsiEscapes = Cucumber::Gherkin::Formatter::AnsiEscapes
213
208
  end
214
209
  end
@@ -29,7 +29,8 @@ module Cucumber
29
29
  # Raised if there are 2 or more World blocks.
30
30
  class MultipleWorld < StandardError
31
31
  def initialize(first_proc, second_proc)
32
- message = String.new # rubocop:disable Style/EmptyLiteral
32
+ # TODO: [LH] - Just use a heredoc here to fix this up
33
+ message = String.new
33
34
  message << "You can only pass a proc to #World once, but it's happening\n"
34
35
  message << "in 2 places:\n\n"
35
36
  message << Glue.backtrace_line(first_proc, 'World') << "\n"
@@ -197,16 +198,19 @@ module Cucumber
197
198
  private
198
199
 
199
200
  def parameter_type_envelope(parameter_type)
200
- # TODO: should me moved to Cucumber::Expression::ParameterType#to_envelope ?
201
+ # TODO: should this be moved to Cucumber::Expression::ParameterType#to_envelope ??
201
202
  # Note: that would mean that cucumber-expression would depend on cucumber-messages
202
-
203
203
  Cucumber::Messages::Envelope.new(
204
204
  parameter_type: Cucumber::Messages::ParameterType.new(
205
205
  id: @configuration.id_generator.new_id,
206
206
  name: parameter_type.name,
207
207
  regular_expressions: parameter_type.regexps.map(&:to_s),
208
- prefer_for_regular_expression_match: parameter_type.prefer_for_regexp_match?,
209
- use_for_snippets: parameter_type.use_for_snippets?
208
+ prefer_for_regular_expression_match: parameter_type.prefer_for_regexp_match,
209
+ use_for_snippets: parameter_type.use_for_snippets,
210
+ source_reference: Cucumber::Messages::SourceReference.new(
211
+ uri: parameter_type.transformer.source_location[0],
212
+ location: Cucumber::Messages::Location.new(line: parameter_type.transformer.source_location[1])
213
+ )
210
214
  )
211
215
  )
212
216
  end
@@ -61,7 +61,8 @@ module Cucumber
61
61
  end
62
62
 
63
63
  def do_block
64
- do_block = String.new # rubocop:disable Style/EmptyLiteral
64
+ # TODO: [LH] - Just use a heredoc here to fix this up
65
+ do_block = String.new
65
66
  do_block << "do#{parameters}\n"
66
67
  multiline_argument.append_comment_to(do_block)
67
68
  do_block << " pending # Write code here that turns the phrase above into concrete actions\n"
@@ -95,7 +96,8 @@ module Cucumber
95
96
  "#{prefix}#{code_keyword}('#{expr.source}') do#{parameters(expr)}"
96
97
  end.join("\n")
97
98
 
98
- body = String.new # rubocop:disable Style/EmptyLiteral
99
+ # TODO: [LH] - Just use a heredoc here to fix this up
100
+ body = String.new
99
101
  multiline_argument.append_comment_to(body)
100
102
  body << " pending # Write code here that turns the phrase above into concrete actions\n"
101
103
  body << 'end'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Cucumber
2
4
  module Glue
3
5
  class WorldFactory
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Cucumber
2
4
  module MultilineArgument
3
5
  class DataTable
@@ -27,7 +27,7 @@ module Cucumber
27
27
  # This will store <tt>[['a', 'b'], ['c', 'd']]</tt> in the <tt>data</tt> variable.
28
28
  #
29
29
  class DataTable
30
- def self.default_arg_name # :nodoc:
30
+ def self.default_arg_name
31
31
  'table'
32
32
  end
33
33
 
@@ -194,17 +194,17 @@ module Cucumber
194
194
  end
195
195
  end
196
196
 
197
- def column_names # :nodoc:
197
+ def column_names
198
198
  @column_names ||= cell_matrix[0].map(&:value)
199
199
  end
200
200
 
201
201
  def rows
202
202
  hashes.map do |hash|
203
- hash.values_at *headers
203
+ hash.values_at(*headers)
204
204
  end
205
205
  end
206
206
 
207
- def each_cells_row(&proc) # :nodoc:
207
+ def each_cells_row(&proc)
208
208
  cells_rows.each(&proc)
209
209
  end
210
210
 
@@ -340,7 +340,7 @@ module Cucumber
340
340
  cells_rows.map { |cells| cells.map(&:value) }
341
341
  end
342
342
 
343
- def cells_to_hash(cells) # :nodoc:
343
+ def cells_to_hash(cells)
344
344
  hash = Hash.new do |hash_inner, key|
345
345
  hash_inner[key.to_s] if key.is_a?(Symbol)
346
346
  end
@@ -350,51 +350,51 @@ module Cucumber
350
350
  hash
351
351
  end
352
352
 
353
- def index(cells) # :nodoc:
353
+ def index(cells)
354
354
  cells_rows.index(cells)
355
355
  end
356
356
 
357
- def verify_column(column_name) # :nodoc:
357
+ def verify_column(column_name)
358
358
  raise %(The column named "#{column_name}" does not exist) unless raw[0].include?(column_name)
359
359
  end
360
360
 
361
- def verify_table_width(width) # :nodoc:
361
+ def verify_table_width(width)
362
362
  raise %(The table must have exactly #{width} columns) unless raw[0].size == width
363
363
  end
364
364
 
365
365
  # TODO: remove the below function if it's not actually being used.
366
366
  # Nothing else in this repo calls it.
367
- def text?(text) # :nodoc:
367
+ def text?(text)
368
368
  raw.flatten.compact.detect { |cell_value| cell_value.index(text) }
369
369
  end
370
370
 
371
- def cells_rows # :nodoc:
372
- @rows ||= cell_matrix.map do |cell_row| # rubocop:disable Naming/MemoizedInstanceVariableName
371
+ def cells_rows
372
+ @rows ||= cell_matrix.map do |cell_row|
373
373
  Cells.new(self, cell_row)
374
374
  end
375
375
  end
376
376
 
377
- def headers # :nodoc:
377
+ def headers
378
378
  raw.first
379
379
  end
380
380
 
381
- def header_cell(col) # :nodoc:
381
+ def header_cell(col)
382
382
  cells_rows[0][col]
383
383
  end
384
384
 
385
385
  attr_reader :cell_matrix
386
386
 
387
- def col_width(col) # :nodoc:
387
+ def col_width(col)
388
388
  columns[col].__send__(:width)
389
389
  end
390
390
 
391
- def to_s(options = {}) # :nodoc:
391
+ def to_s(options = {})
392
392
  indentation = options.key?(:indent) ? options[:indent] : 2
393
393
  prefixes = options.key?(:prefixes) ? options[:prefixes] : TO_S_PREFIXES
394
394
  DataTablePrinter.new(self, indentation, prefixes).to_s
395
395
  end
396
396
 
397
- class DataTablePrinter # :nodoc:
397
+ class DataTablePrinter
398
398
  include Cucumber::Gherkin::Formatter::Escaping
399
399
  attr_reader :data_table, :indentation, :prefixes
400
400
  private :data_table, :indentation, :prefixes
@@ -433,7 +433,7 @@ module Cucumber
433
433
  end
434
434
  end
435
435
 
436
- def columns # :nodoc:
436
+ def columns
437
437
  @columns ||= cell_matrix.transpose.map do |cell_row|
438
438
  Cells.new(self, cell_row)
439
439
  end
@@ -456,7 +456,7 @@ module Cucumber
456
456
  cells_rows[1..].map(&:to_hash)
457
457
  end
458
458
 
459
- def create_cell_matrix(ast_table) # :nodoc:
459
+ def create_cell_matrix(ast_table)
460
460
  ast_table.raw.map do |raw_row|
461
461
  line = begin
462
462
  raw_row.line
@@ -469,7 +469,7 @@ module Cucumber
469
469
  end
470
470
  end
471
471
 
472
- def convert_columns! # :nodoc:
472
+ def convert_columns!
473
473
  @conversion_procs.each do |column_name, conversion_proc|
474
474
  verify_column(column_name) if conversion_proc[:strict]
475
475
  end
@@ -483,7 +483,7 @@ module Cucumber
483
483
  end
484
484
  end
485
485
 
486
- def convert_headers! # :nodoc:
486
+ def convert_headers!
487
487
  header_cells = cell_matrix[0]
488
488
 
489
489
  if @header_conversion_proc
@@ -501,12 +501,12 @@ module Cucumber
501
501
  end
502
502
  end
503
503
 
504
- def clear_cache! # :nodoc:
504
+ def clear_cache!
505
505
  @hashes = @rows_hash = @column_names = @rows = @columns = nil
506
506
  end
507
507
 
508
- def ensure_table(table_or_array) # :nodoc:
509
- return table_or_array if DataTable == table_or_array.class
508
+ def ensure_table(table_or_array)
509
+ return table_or_array if table_or_array.instance_of?(DataTable)
510
510
 
511
511
  DataTable.from(table_or_array)
512
512
  end
@@ -516,7 +516,7 @@ module Cucumber
516
516
  end
517
517
 
518
518
  # Represents a row of cells or columns of cells
519
- class Cells # :nodoc:
519
+ class Cells
520
520
  include Enumerable
521
521
  include Cucumber::Gherkin::Formatter::Escaping
522
522
 
@@ -536,21 +536,20 @@ module Cucumber
536
536
  nil
537
537
  end
538
538
 
539
- # For testing only
540
- def to_sexp # :nodoc:
539
+ def to_sexp
541
540
  [:row, line, *@cells.map(&:to_sexp)]
542
541
  end
543
542
 
544
- def to_hash # :nodoc:
543
+ def to_hash
545
544
  @to_hash ||= @table.cells_to_hash(self)
546
545
  end
547
546
 
548
- def value(n) # :nodoc:
549
- self[n].value
547
+ def value(index)
548
+ self[index].value
550
549
  end
551
550
 
552
- def [](n)
553
- @cells[n]
551
+ def [](index)
552
+ @cells[index]
554
553
  end
555
554
 
556
555
  def line
@@ -576,7 +575,7 @@ module Cucumber
576
575
  end
577
576
  end
578
577
 
579
- class Cell # :nodoc:
578
+ class Cell
580
579
  attr_reader :line, :table
581
580
  attr_accessor :status, :value
582
581
 
@@ -591,7 +590,7 @@ module Cucumber
591
590
  end
592
591
 
593
592
  def ==(other)
594
- SurplusCell == other.class || value == other.value
593
+ other.class == SurplusCell || value == other.value
595
594
  end
596
595
 
597
596
  def eql?(other)
@@ -603,12 +602,12 @@ module Cucumber
603
602
  end
604
603
 
605
604
  # For testing only
606
- def to_sexp # :nodoc:
605
+ def to_sexp
607
606
  [:cell, @value]
608
607
  end
609
608
  end
610
609
 
611
- class SurplusCell < Cell # :nodoc:
610
+ class SurplusCell < Cell
612
611
  def status
613
612
  :comment
614
613
  end