cucumber 6.0.0 → 8.0.0.rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +371 -168
  3. data/CONTRIBUTING.md +216 -55
  4. data/README.md +139 -21
  5. data/lib/autotest/cucumber_mixin.rb +5 -2
  6. data/lib/autotest/discover.rb +3 -2
  7. data/lib/cucumber/cli/configuration.rb +4 -1
  8. data/lib/cucumber/cli/main.rb +4 -3
  9. data/lib/cucumber/cli/options.rb +14 -4
  10. data/lib/cucumber/cli/profile_loader.rb +1 -5
  11. data/lib/cucumber/cli/rerun_file.rb +1 -1
  12. data/lib/cucumber/configuration.rb +5 -4
  13. data/lib/cucumber/constantize.rb +1 -1
  14. data/lib/cucumber/deprecate.rb +2 -1
  15. data/lib/cucumber/errors.rb +1 -1
  16. data/lib/cucumber/events/hook_test_step_created.rb +1 -2
  17. data/lib/cucumber/events/step_activated.rb +0 -6
  18. data/lib/cucumber/events/step_definition_registered.rb +0 -5
  19. data/lib/cucumber/events/test_case_created.rb +1 -2
  20. data/lib/cucumber/events/test_run_finished.rb +2 -1
  21. data/lib/cucumber/events/test_step_created.rb +1 -2
  22. data/lib/cucumber/events/undefined_parameter_type.rb +1 -2
  23. data/lib/cucumber/events.rb +2 -2
  24. data/lib/cucumber/file_specs.rb +2 -1
  25. data/lib/cucumber/filters/activate_steps.rb +1 -0
  26. data/lib/cucumber/filters/tag_limits/verifier.rb +1 -3
  27. data/lib/cucumber/filters/tag_limits.rb +1 -3
  28. data/lib/cucumber/formatter/ansicolor.rb +63 -70
  29. data/lib/cucumber/formatter/ast_lookup.rb +2 -2
  30. data/lib/cucumber/formatter/backtrace_filter.rb +1 -1
  31. data/lib/cucumber/formatter/console.rb +20 -4
  32. data/lib/cucumber/formatter/console_issues.rb +6 -1
  33. data/lib/cucumber/formatter/duration_extractor.rb +1 -0
  34. data/lib/cucumber/formatter/errors.rb +1 -0
  35. data/lib/cucumber/formatter/fanout.rb +1 -1
  36. data/lib/cucumber/formatter/http_io.rb +6 -1
  37. data/lib/cucumber/formatter/ignore_missing_messages.rb +1 -1
  38. data/lib/cucumber/formatter/io.rb +3 -1
  39. data/lib/cucumber/formatter/json.rb +32 -26
  40. data/lib/cucumber/formatter/junit.rb +6 -3
  41. data/lib/cucumber/formatter/message.rb +2 -1
  42. data/lib/cucumber/formatter/message_builder.rb +11 -10
  43. data/lib/cucumber/formatter/pretty.rb +34 -23
  44. data/lib/cucumber/formatter/progress.rb +1 -0
  45. data/lib/cucumber/formatter/publish_banner_printer.rb +1 -1
  46. data/lib/cucumber/formatter/query/hook_by_test_step.rb +1 -0
  47. data/lib/cucumber/formatter/query/test_case_started_by_test_case.rb +2 -0
  48. data/lib/cucumber/formatter/rerun.rb +2 -0
  49. data/lib/cucumber/formatter/steps.rb +5 -2
  50. data/lib/cucumber/formatter/summary.rb +1 -0
  51. data/lib/cucumber/formatter/unicode.rb +4 -4
  52. data/lib/cucumber/formatter/usage.rb +9 -7
  53. data/lib/cucumber/gherkin/data_table_parser.rb +2 -1
  54. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +2 -2
  55. data/lib/cucumber/gherkin/steps_parser.rb +1 -1
  56. data/lib/cucumber/glue/dsl.rb +19 -5
  57. data/lib/cucumber/glue/hook.rb +2 -1
  58. data/lib/cucumber/glue/invoke_in_world.rb +4 -4
  59. data/lib/cucumber/glue/proto_world.rb +12 -9
  60. data/lib/cucumber/glue/registry_and_more.rb +20 -5
  61. data/lib/cucumber/glue/registry_wrapper.rb +31 -0
  62. data/lib/cucumber/glue/step_definition.rb +9 -7
  63. data/lib/cucumber/hooks.rb +1 -0
  64. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +2 -1
  65. data/lib/cucumber/multiline_argument/data_table.rb +58 -71
  66. data/lib/cucumber/platform.rb +2 -2
  67. data/lib/cucumber/rake/task.rb +10 -7
  68. data/lib/cucumber/rspec/disable_option_parser.rb +6 -3
  69. data/lib/cucumber/running_test_case.rb +1 -0
  70. data/lib/cucumber/runtime/meta_message_builder.rb +106 -0
  71. data/lib/cucumber/runtime/support_code.rb +3 -0
  72. data/lib/cucumber/runtime/user_interface.rb +5 -4
  73. data/lib/cucumber/runtime.rb +42 -23
  74. data/lib/cucumber/step_match.rb +6 -10
  75. data/lib/cucumber/step_match_search.rb +3 -2
  76. data/lib/cucumber/term/ansicolor.rb +74 -50
  77. data/lib/cucumber/term/banner.rb +1 -0
  78. data/lib/cucumber/version +1 -1
  79. data/lib/cucumber.rb +2 -1
  80. data/lib/simplecov_setup.rb +1 -1
  81. metadata +90 -89
  82. data/lib/cucumber/core_ext/string.rb +0 -11
@@ -1,9 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'cucumber/formatter/console'
4
+
3
5
  module Cucumber
4
6
  module Formatter
5
7
  # The formatter used for <tt>--format steps</tt>
6
8
  class Steps
9
+ include Console
7
10
  def initialize(runtime, path_or_io, options)
8
11
  @io = ensure_io(path_or_io, nil)
9
12
  @options = options
@@ -24,8 +27,8 @@ module Cucumber
24
27
  sources = @step_definition_files[step_definition_file]
25
28
  source_indent = source_indent(sources)
26
29
  sources.sort.each do |file_colon_line, regexp_source|
27
- @io.print regexp_source.indent(2)
28
- @io.print " # #{file_colon_line}".indent(source_indent - regexp_source.unpack('U*').length)
30
+ @io.print indent(regexp_source, 2)
31
+ @io.print indent(" # #{file_colon_line}", source_indent - regexp_source.unpack('U*').length)
29
32
  @io.puts
30
33
  end
31
34
  @io.puts
@@ -47,6 +47,7 @@ module Cucumber
47
47
  def print_feature(test_case)
48
48
  uri = test_case.location.file
49
49
  return if @current_feature_uri == uri
50
+
50
51
  feature_name = gherkin_document(uri).feature.name
51
52
  @io.puts unless @current_feature_uri.nil?
52
53
  @io.puts feature_name
@@ -17,7 +17,7 @@ if Cucumber::WINDOWS
17
17
  end
18
18
  else
19
19
  Cucumber::CODEPAGE = 'cp1252'.freeze
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.")
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
 
23
23
  module Cucumber
@@ -28,7 +28,7 @@ if Cucumber::WINDOWS
28
28
  def cucumber_preprocess_output(*out)
29
29
  out.map { |arg| arg.to_s.encode(Encoding.default_external) }
30
30
  rescue Encoding::UndefinedConversionError => e
31
- STDERR.cucumber_puts("WARNING: #{e.message}")
31
+ $stderr.cucumber_puts("WARNING: #{e.message}")
32
32
  out
33
33
  end
34
34
 
@@ -45,8 +45,8 @@ if Cucumber::WINDOWS
45
45
  end
46
46
 
47
47
  Kernel.extend(self)
48
- STDOUT.extend(self)
49
- STDERR.extend(self)
48
+ $stdout.extend(self)
49
+ $stderr.extend(self)
50
50
  end
51
51
  end
52
52
  end
@@ -2,10 +2,12 @@
2
2
 
3
3
  require 'cucumber/formatter/progress'
4
4
  require 'cucumber/step_definition_light'
5
+ require 'cucumber/formatter/console'
5
6
 
6
7
  module Cucumber
7
8
  module Formatter
8
9
  class Usage < Progress
10
+ include Console
9
11
  class StepDefKey < StepDefinitionLight
10
12
  attr_accessor :mean_duration, :status
11
13
  end
@@ -76,7 +78,7 @@ module Cucumber
76
78
  if @stepdef_to_match[stepdef_key].any?
77
79
  print_steps(stepdef_key)
78
80
  else
79
- @io.puts(' ' + format_string('NOT MATCHED BY ANY STEPS', :failed))
81
+ @io.puts(" #{format_string('NOT MATCHED BY ANY STEPS', :failed)}")
80
82
  end
81
83
  end
82
84
  @io.puts
@@ -84,11 +86,11 @@ module Cucumber
84
86
  end
85
87
 
86
88
  def print_step_definition(stepdef_key)
87
- @io.print format_string(format('%<duration>.7f', duration: stepdef_key.mean_duration), :skipped) + ' ' unless config.dry_run?
89
+ @io.print "#{format_string(format('%<duration>.7f', duration: stepdef_key.mean_duration), :skipped)} " unless config.dry_run?
88
90
  @io.print format_string(stepdef_key.regexp_source, stepdef_key.status)
89
91
  if config.source?
90
- indent = max_length - stepdef_key.regexp_source.unpack('U*').length
91
- line_comment = " # #{stepdef_key.location}".indent(indent)
92
+ indent_amount = max_length - stepdef_key.regexp_source.unpack('U*').length
93
+ line_comment = indent(" # #{stepdef_key.location}", indent_amount)
92
94
  @io.print(format_string(line_comment, :comment))
93
95
  end
94
96
  @io.puts
@@ -97,11 +99,11 @@ module Cucumber
97
99
  def print_steps(stepdef_key)
98
100
  @stepdef_to_match[stepdef_key].each do |step|
99
101
  @io.print ' '
100
- @io.print format_string(format('%<duration>.7f', duration: step[:duration]), :skipped) + ' ' unless config.dry_run?
102
+ @io.print "#{format_string(format('%<duration>.7f', duration: step[:duration]), :skipped)} " unless config.dry_run?
101
103
  @io.print format_step(step[:keyword], step[:step_match], step[:status], nil)
102
104
  if config.source?
103
- indent = max_length - (step[:keyword].unpack('U*').length + step[:step_match].format_args.unpack('U*').length)
104
- line_comment = " # #{step[:location]}".indent(indent)
105
+ indent_amount = max_length - (step[:keyword].unpack('U*').length + step[:step_match].format_args.unpack('U*').length)
106
+ line_comment = indent(" # #{step[:location]}", indent_amount)
105
107
  @io.print(format_string(line_comment, :comment))
106
108
  end
107
109
  @io.puts
@@ -15,10 +15,11 @@ module Cucumber
15
15
  messages = ::Gherkin.from_source('dummy', feature_header + text, gherkin_options)
16
16
 
17
17
  messages.each do |message|
18
- gherkin_document = message.gherkin_document.to_hash unless message.gherkin_document.nil?
18
+ gherkin_document = message.gherkin_document.to_h unless message.gherkin_document.nil?
19
19
  end
20
20
 
21
21
  return if gherkin_document.nil?
22
+
22
23
  gherkin_document[:feature][:children][0][:scenario][:steps][0][:data_table][:rows].each do |row|
23
24
  @builder.row(row[:cells].map { |cell| cell[:value] })
24
25
  end
@@ -54,7 +54,7 @@ module Cucumber
54
54
  }.freeze
55
55
 
56
56
  ALIASES = Hash.new do |h, k|
57
- h[Regexp.last_match(1)] + ',bold' if k.to_s =~ /(.*)_arg/
57
+ "#{h[Regexp.last_match(1)]},bold" if k.to_s =~ /(.*)_arg/
58
58
  end.merge(
59
59
  'undefined' => 'yellow',
60
60
  'pending' => 'yellow',
@@ -74,7 +74,7 @@ module Cucumber
74
74
  end
75
75
  end
76
76
 
77
- ALIASES.keys.each do |key|
77
+ ALIASES.each_key do |key|
78
78
  define_method(key) do
79
79
  ALIASES[key].split(',').map { |color| COLORS[color] }.join('')
80
80
  end
@@ -17,7 +17,7 @@ module Cucumber
17
17
  messages = ::Gherkin.from_source('dummy', feature_header(dialect) + text, gherkin_options)
18
18
 
19
19
  messages.each do |message|
20
- gherkin_document = message.gherkin_document.to_hash unless message.gherkin_document.nil?
20
+ gherkin_document = message.gherkin_document.to_h unless message.gherkin_document.nil?
21
21
  end
22
22
 
23
23
  @builder.steps(gherkin_document[:feature][:children][0][:scenario][:steps])
@@ -107,10 +107,21 @@ module Cucumber
107
107
  value.nil? ? default : value
108
108
  end
109
109
 
110
- # Registers a proc that will run after Cucumber is configured. You can register as
111
- # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
112
- def AfterConfiguration(&proc)
113
- Dsl.register_rb_hook('after_configuration', [], proc)
110
+ # Registers a proc that will run after Cucumber is configured in order to install an external plugin.
111
+ def InstallPlugin(&proc)
112
+ Dsl.register_rb_hook('install_plugin', [], proc)
113
+ end
114
+
115
+ # Registers a proc that will run before the execution of the scenarios.
116
+ # Use it for your final set-ups
117
+ def BeforeAll(&proc)
118
+ Dsl.register_rb_hook('before_all', [], proc)
119
+ end
120
+
121
+ # Registers a proc that will run after the execution of the scenarios.
122
+ # Use it for your final clean-ups
123
+ def AfterAll(&proc)
124
+ Dsl.register_rb_hook('after_all', [], proc)
114
125
  end
115
126
 
116
127
  # Registers a new Ruby StepDefinition. This method is aliased
@@ -136,5 +147,8 @@ module Cucumber
136
147
  end
137
148
  end
138
149
 
139
- # TODO: can we avoid adding methods to the global namespace (Kernel)
150
+ # rubocop:disable Style/MixinUsage
151
+ # This "should" always be present, because it allows users to write `Before` and `After`
152
+ # See. https://github.com/cucumber/cucumber-ruby/pull/1566#discussion_r683235396
140
153
  extend(Cucumber::Glue::Dsl)
154
+ # rubocop:enable Style/MixinUsage
@@ -32,7 +32,7 @@ module Cucumber
32
32
  Cucumber::Messages::Envelope.new(
33
33
  hook: Cucumber::Messages::Hook.new(
34
34
  id: id,
35
- tag_expression: tag_expressions.join(' '),
35
+ tag_expression: tag_expressions.empty? ? nil : tag_expressions.join(' '),
36
36
  source_reference: Cucumber::Messages::SourceReference.new(
37
37
  uri: location.file,
38
38
  location: Cucumber::Messages::Location.new(
@@ -58,6 +58,7 @@ module Cucumber
58
58
  end
59
59
 
60
60
  next unless tag_expression.include?(',')
61
+
61
62
  warn("Found tagged hook with '#{tag_expression}'." \
62
63
  "'@tag1,@tag2' is no longer supported, use '@tag or @tag2' instead.")
63
64
  end
@@ -12,6 +12,7 @@ module Cucumber
12
12
 
13
13
  instance_exec_pos = backtrace.index(instance_exec_invocation_line)
14
14
  return unless instance_exec_pos
15
+
15
16
  replacement_line = instance_exec_pos + INSTANCE_EXEC_OFFSET
16
17
  backtrace[replacement_line].gsub!(/`.*'/, "`#{pseudo_method}'") if pseudo_method
17
18
 
@@ -27,7 +28,7 @@ module Cucumber
27
28
  if check_arity && !cucumber_compatible_arity?(args, block)
28
29
  world.instance_exec do
29
30
  ari = block.arity
30
- ari = ari < 0 ? (ari.abs - 1).to_s + '+' : ari
31
+ ari = ari < 0 ? "#{ari.abs - 1}+" : ari
31
32
  s1 = ari == 1 ? '' : 's'
32
33
  s2 = args.length == 1 ? '' : 's'
33
34
  raise ArityMismatchError, "Your block takes #{ari} argument#{s1}, but the Regexp matched #{args.length} argument#{s2}."
@@ -40,9 +41,8 @@ module Cucumber
40
41
 
41
42
  def self.cucumber_compatible_arity?(args, block)
42
43
  return true if block.arity == args.length
43
- if block.arity < 0
44
- return true if args.length >= (block.arity.abs - 1)
45
- end
44
+ return true if block.arity.negative? && args.length >= (block.arity.abs - 1)
45
+
46
46
  false
47
47
  end
48
48
 
@@ -95,6 +95,8 @@ module Cucumber
95
95
  media_type = MIME::Types.type_for(file).first if media_type.nil?
96
96
 
97
97
  super(content, media_type.to_s)
98
+ rescue StandardError
99
+ super
98
100
  end
99
101
 
100
102
  # Mark the matched step as pending.
@@ -136,8 +138,8 @@ module Cucumber
136
138
  # TODO: pass these in when building the module, instead of mutating them later
137
139
  # Extend the World with user-defined modules
138
140
  def add_modules!(world_modules, namespaced_world_modules)
139
- add_world_modules!(world_modules)
140
- add_namespaced_modules!(namespaced_world_modules)
141
+ add_world_modules!(world_modules) if world_modules.any?
142
+ add_namespaced_modules!(namespaced_world_modules) if namespaced_world_modules.any?
141
143
  end
142
144
 
143
145
  define_method(:step) do |name, raw_multiline_arg = nil|
@@ -183,14 +185,13 @@ module Cucumber
183
185
  modules.each do |namespace, world_modules|
184
186
  world_modules.each do |world_module|
185
187
  variable_name = "@__#{namespace}_world"
188
+ inner_world = instance_variable_get(variable_name) || Object.new
189
+
190
+ instance_variable_set(
191
+ variable_name,
192
+ inner_world.extend(world_module)
193
+ )
186
194
 
187
- inner_world = if self.class.respond_to?(namespace)
188
- instance_variable_get(variable_name)
189
- else
190
- Object.new
191
- end
192
- instance_variable_set(variable_name,
193
- inner_world.extend(world_module))
194
195
  self.class.send(:define_method, namespace) do
195
196
  instance_variable_get(variable_name)
196
197
  end
@@ -200,6 +201,8 @@ module Cucumber
200
201
 
201
202
  # @private
202
203
  def stringify_namespaced_modules
204
+ return '' if @__namespaced_modules.nil?
205
+
203
206
  @__namespaced_modules.map { |k, v| "#{v.join(',')} (as #{k})" }.join('+')
204
207
  end
205
208
  end
@@ -4,6 +4,7 @@ require 'cucumber/cucumber_expressions/parameter_type_registry'
4
4
  require 'cucumber/cucumber_expressions/cucumber_expression'
5
5
  require 'cucumber/cucumber_expressions/regular_expression'
6
6
  require 'cucumber/cucumber_expressions/cucumber_expression_generator'
7
+ require 'cucumber/deprecate'
7
8
  require 'cucumber/glue/dsl'
8
9
  require 'cucumber/glue/snippet'
9
10
  require 'cucumber/glue/hook'
@@ -91,7 +92,7 @@ module Cucumber
91
92
  step_definition
92
93
  rescue Cucumber::CucumberExpressions::UndefinedParameterTypeError => e
93
94
  # TODO: add a way to extract the parameter type directly from the error.
94
- type_name = e.message.match(/^Undefined parameter type ['|\{](.*)['|\}].?$/)[1]
95
+ type_name = e.message.match(/^Undefined parameter type ['|{](.*)['|}].?$/)[1]
95
96
 
96
97
  @configuration.notify :undefined_parameter_type, type_name, string_or_regexp
97
98
  end
@@ -99,6 +100,7 @@ module Cucumber
99
100
  def build_rb_world_factory(world_modules, namespaced_world_modules, proc)
100
101
  if proc
101
102
  raise MultipleWorld.new(@world_proc, proc) if @world_proc
103
+
102
104
  @world_proc = proc
103
105
  end
104
106
  @world_modules ||= []
@@ -134,9 +136,21 @@ module Cucumber
134
136
  @current_world = nil
135
137
  end
136
138
 
137
- def after_configuration(configuration)
138
- hooks[:after_configuration].each do |hook|
139
- hook.invoke('AfterConfiguration', configuration)
139
+ def install_plugin(configuration, registry)
140
+ hooks[:install_plugin].each do |hook|
141
+ hook.invoke('InstallPlugin', [configuration, registry])
142
+ end
143
+ end
144
+
145
+ def before_all
146
+ hooks[:before_all].each do |hook|
147
+ hook.invoke('BeforeAll', [])
148
+ end
149
+ end
150
+
151
+ def after_all
152
+ hooks[:after_all].each do |hook|
153
+ hook.invoke('AfterAll', [])
140
154
  end
141
155
  end
142
156
 
@@ -149,7 +163,7 @@ module Cucumber
149
163
  @hooks = nil
150
164
  end
151
165
 
152
- def hooks_for(phase, scenario) #:nodoc:
166
+ def hooks_for(phase, scenario) # :nodoc:
153
167
  hooks[phase.to_sym].select { |hook| scenario.accept_hook?(hook) }
154
168
  end
155
169
 
@@ -168,6 +182,7 @@ module Cucumber
168
182
  def create_expression(string_or_regexp)
169
183
  return CucumberExpressions::CucumberExpression.new(string_or_regexp, @parameter_type_registry) if string_or_regexp.is_a?(String)
170
184
  return CucumberExpressions::RegularExpression.new(string_or_regexp, @parameter_type_registry) if string_or_regexp.is_a?(Regexp)
185
+
171
186
  raise ArgumentError, 'Expression must be a String or Regexp'
172
187
  end
173
188
 
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cucumber
4
+ module Glue
5
+ ##
6
+ # This class wraps some internals methods to expose them to external plugins.
7
+ class RegistryWrapper
8
+ def initialize(registry)
9
+ @registry = registry
10
+ end
11
+
12
+ ##
13
+ # Creates a new CucumberExpression from the given +string_or_regexp+.
14
+ #
15
+ # If +string_or_regexp+ is a string, it will return a new CucumberExpression::CucumberExpression
16
+ #
17
+ # If +string_or_regexp+ is a regexp, it will return a new CucumberExpressions::RegularExpression
18
+ #
19
+ # An ArgumentError is raised if +string_or_regexp+ is not a string or a regexp
20
+ def create_expression(string_or_regexp)
21
+ @registry.create_expression(string_or_regexp)
22
+ end
23
+
24
+ ##
25
+ # Return the current execution environment - AKA an isntance of World
26
+ def current_world
27
+ @registry.current_world
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'cucumber/step_match'
4
- require 'cucumber/core_ext/string'
5
4
  require 'cucumber/glue/invoke_in_world'
6
5
 
7
6
  module Cucumber
@@ -26,6 +25,7 @@ module Cucumber
26
25
  class << self
27
26
  def new(id, registry, string_or_regexp, proc_or_sym, options)
28
27
  raise MissingProc if proc_or_sym.nil?
28
+
29
29
  super id, registry, registry.create_expression(string_or_regexp), create_proc(proc_or_sym, options)
30
30
  end
31
31
 
@@ -34,6 +34,7 @@ module Cucumber
34
34
  def create_proc(proc_or_sym, options)
35
35
  return proc_or_sym if proc_or_sym.is_a?(Proc)
36
36
  raise ArgumentError unless proc_or_sym.is_a?(Symbol)
37
+
37
38
  message = proc_or_sym
38
39
  target_proc = parse_target_proc_from(options)
39
40
  patch_location_onto lambda { |*args|
@@ -50,6 +51,7 @@ module Cucumber
50
51
 
51
52
  def parse_target_proc_from(options)
52
53
  return -> { self } unless options.key?(:on)
54
+
53
55
  target = options[:on]
54
56
  case target
55
57
  when Proc
@@ -66,6 +68,7 @@ module Cucumber
66
68
 
67
69
  def initialize(id, registry, expression, proc)
68
70
  raise 'No regexp' if expression.is_a?(Regexp)
71
+
69
72
  @id = id
70
73
  @registry = registry
71
74
  @expression = expression
@@ -77,7 +80,7 @@ module Cucumber
77
80
  Cucumber::Messages::Envelope.new(
78
81
  step_definition: Cucumber::Messages::StepDefinition.new(
79
82
  id: id,
80
- pattern: Cucumber::Messages::StepDefinition::StepDefinitionPattern.new(
83
+ pattern: Cucumber::Messages::StepDefinitionPattern.new(
81
84
  source: expression.source.to_s,
82
85
  type: expression_type
83
86
  ),
@@ -92,8 +95,9 @@ module Cucumber
92
95
  end
93
96
 
94
97
  def expression_type
95
- return Cucumber::Messages::StepDefinition::StepDefinitionPattern::StepDefinitionPatternType::CUCUMBER_EXPRESSION if expression.is_a?(CucumberExpressions::CucumberExpression)
96
- Cucumber::Messages::StepDefinition::StepDefinitionPattern::StepDefinitionPatternType::REGULAR_EXPRESSION
98
+ return Cucumber::Messages::StepDefinitionPatternType::CUCUMBER_EXPRESSION if expression.is_a?(CucumberExpressions::CucumberExpression)
99
+
100
+ Cucumber::Messages::StepDefinitionPatternType::REGULAR_EXPRESSION
97
101
  end
98
102
 
99
103
  # @api private
@@ -123,9 +127,7 @@ module Cucumber
123
127
 
124
128
  # @api private
125
129
  def arguments_from(step_name)
126
- args = @expression.match(step_name)
127
- # @registry.invoked_step_definition(regexp_source, location) if args
128
- args
130
+ @expression.match(step_name)
129
131
  end
130
132
 
131
133
  # @api private
@@ -19,6 +19,7 @@ module Cucumber
19
19
 
20
20
  def after_step_hook(id, test_step, location, &block)
21
21
  raise ArgumentError if test_step.hook?
22
+
22
23
  build_hook_step(id, location, block, AfterStepHook, Core::Test::Action)
23
24
  end
24
25
 
@@ -1,7 +1,7 @@
1
1
  module Cucumber
2
2
  module MultilineArgument
3
3
  class DataTable
4
- class DiffMatrices #:nodoc:
4
+ class DiffMatrices # :nodoc:
5
5
  attr_accessor :cell_matrix, :other_table_cell_matrix, :options
6
6
 
7
7
  def initialize(cell_matrix, other_table_cell_matrix, options)
@@ -113,6 +113,7 @@ module Cucumber
113
113
  row_index = row_indices.index(i)
114
114
  row = cell_matrix[row_index] if row_index
115
115
  next unless row
116
+
116
117
  (original_width..padded_width).each do |col_index|
117
118
  surplus_cell = other_row[col_index]
118
119
  row[col_index].value = surplus_cell.value if row[col_index]