cucumber 5.3.0 → 7.1.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.
@@ -5,7 +5,6 @@ require 'base64'
5
5
  require 'cucumber/formatter/backtrace_filter'
6
6
  require 'cucumber/formatter/io'
7
7
  require 'cucumber/formatter/ast_lookup'
8
- require 'cucumber/deprecate'
9
8
 
10
9
  module Cucumber
11
10
  module Formatter
@@ -14,14 +13,6 @@ module Cucumber
14
13
  include Io
15
14
 
16
15
  def initialize(config)
17
- Cucumber::Deprecate::CliOption.deprecate(
18
- config.error_stream,
19
- '--format=json',
20
- "Please use --format=message and stand-alone json-formatter.\n" \
21
- 'json-formatter homepage: https://github.com/cucumber/cucumber/tree/master/json-formatter#cucumber-json-formatter',
22
- '6.0.0'
23
- )
24
-
25
16
  @io = ensure_io(config.out_stream, config.error_stream)
26
17
  @ast_lookup = AstLookup.new(config)
27
18
  @feature_hashes = []
@@ -41,21 +32,23 @@ module Cucumber
41
32
  @feature_hashes << @feature_hash
42
33
  end
43
34
  @test_case_hash = builder.test_case_hash
44
- if builder.background?
45
- @in_background = true
46
- feature_elements << builder.background_hash
47
- @element_hash = builder.background_hash
48
- else
49
- @in_background = false
50
- feature_elements << @test_case_hash
51
- @element_hash = @test_case_hash
52
- end
35
+
36
+ @element_hash = nil
37
+ @element_background_hash = builder.background_hash
38
+ @in_background = builder.background?
39
+
53
40
  @any_step_failed = false
54
41
  end
55
42
 
56
43
  def on_test_step_started(event)
57
44
  test_step = event.test_step
58
45
  return if internal_hook?(test_step)
46
+
47
+ if @element_hash.nil?
48
+ @element_hash = create_element_hash(test_step)
49
+ feature_elements << @element_hash
50
+ end
51
+
59
52
  if test_step.hook?
60
53
  @step_or_hook_hash = {}
61
54
  hooks_of_type(test_step) << @step_or_hook_hash
@@ -80,6 +73,8 @@ module Cucumber
80
73
  end
81
74
 
82
75
  def on_test_case_finished(event)
76
+ feature_elements << @test_case_hash if @in_background
77
+
83
78
  _test_case, result = *event.attributes
84
79
  result = result.with_filtered_backtrace(Cucumber::Formatter::BacktraceFilter)
85
80
  add_failed_around_hook(result) if result.failed? && !@any_step_failed
@@ -94,10 +89,7 @@ module Cucumber
94
89
  test_step_output << src
95
90
  return
96
91
  end
97
- if File.file?(src)
98
- content = File.open(src, 'rb', &:read)
99
- data = encode64(content)
100
- elsif mime_type =~ /;base64$/
92
+ if mime_type =~ /;base64$/
101
93
  mime_type = mime_type[0..-8]
102
94
  data = src
103
95
  else
@@ -169,6 +161,13 @@ module Cucumber
169
161
  @step_or_hook_hash[:embeddings] ||= []
170
162
  end
171
163
 
164
+ def create_element_hash(test_step)
165
+ return @element_background_hash if @in_background && !first_step_after_background?(test_step)
166
+
167
+ @in_background = false
168
+ @test_case_hash
169
+ end
170
+
172
171
  def create_step_hash(test_step)
173
172
  step_source = @ast_lookup.step_source(test_step).step
174
173
  step_hash = {
@@ -269,7 +268,8 @@ module Cucumber
269
268
  name: background.name,
270
269
  description: value_or_empty_string(background.description),
271
270
  line: background.location.line,
272
- type: 'background'
271
+ type: 'background',
272
+ steps: []
273
273
  }
274
274
  end
275
275
 
@@ -281,7 +281,8 @@ module Cucumber
281
281
  name: test_case.name,
282
282
  description: value_or_empty_string(scenario.description),
283
283
  line: test_case.location.lines.max,
284
- type: 'scenario'
284
+ type: 'scenario',
285
+ steps: []
285
286
  }
286
287
  @test_case_hash[:tags] = create_tags_array_from_tags_array(test_case.tags) unless test_case.tags.empty?
287
288
  end
@@ -15,7 +15,8 @@ module Cucumber
15
15
  end
16
16
 
17
17
  def output_envelope(envelope)
18
- envelope.write_ndjson_to(@io)
18
+ @io.write(envelope.to_json)
19
+ @io.write("\n")
19
20
  end
20
21
  end
21
22
  end
@@ -48,12 +48,12 @@ module Cucumber
48
48
  }
49
49
 
50
50
  if media_type.start_with?('text/')
51
- attachment_data[:content_encoding] = Cucumber::Messages::Attachment::ContentEncoding::IDENTITY
51
+ attachment_data[:content_encoding] = Cucumber::Messages::AttachmentContentEncoding::IDENTITY
52
52
  attachment_data[:body] = src
53
53
  else
54
54
  body = src.respond_to?(:read) ? src.read : src
55
55
 
56
- attachment_data[:content_encoding] = Cucumber::Messages::Attachment::ContentEncoding::BASE64
56
+ attachment_data[:content_encoding] = Cucumber::Messages::AttachmentContentEncoding::BASE64
57
57
  attachment_data[:body] = Base64.strict_encode64(body)
58
58
  end
59
59
 
@@ -101,7 +101,7 @@ module Cucumber
101
101
  def test_step_to_message(step)
102
102
  return hook_step_to_message(step) if step.hook?
103
103
 
104
- Cucumber::Messages::TestCase::TestStep.new(
104
+ Cucumber::Messages::TestStep.new(
105
105
  id: step.id,
106
106
  pickle_step_id: @pickle_step_by_test_step.pickle_step_id(step),
107
107
  step_definition_ids: @step_definitions_by_test_step.step_definition_ids(step),
@@ -110,7 +110,7 @@ module Cucumber
110
110
  end
111
111
 
112
112
  def hook_step_to_message(step)
113
- Cucumber::Messages::TestCase::TestStep.new(
113
+ Cucumber::Messages::TestStep.new(
114
114
  id: step.id,
115
115
  hook_id: @hook_by_test_step.hook_id(step)
116
116
  )
@@ -118,7 +118,7 @@ module Cucumber
118
118
 
119
119
  def step_match_arguments_lists(step)
120
120
  match_arguments = step_match_arguments(step)
121
- [Cucumber::Messages::TestCase::TestStep::StepMatchArgumentsList.new(
121
+ [Cucumber::Messages::StepMatchArgumentsList.new(
122
122
  step_match_arguments: match_arguments
123
123
  )]
124
124
  rescue Cucumber::Formatter::TestStepUnknownError
@@ -127,7 +127,7 @@ module Cucumber
127
127
 
128
128
  def step_match_arguments(step)
129
129
  @step_definitions_by_test_step.step_match_arguments(step).map do |argument|
130
- Cucumber::Messages::TestCase::TestStep::StepMatchArgumentsList::StepMatchArgument.new(
130
+ Cucumber::Messages::StepMatchArgument.new(
131
131
  group: argument_group_to_message(argument.group),
132
132
  parameter_type_name: argument.parameter_type.name
133
133
  )
@@ -135,7 +135,7 @@ module Cucumber
135
135
  end
136
136
 
137
137
  def argument_group_to_message(group)
138
- Cucumber::Messages::TestCase::TestStep::StepMatchArgumentsList::StepMatchArgument::Group.new(
138
+ Cucumber::Messages::Group.new(
139
139
  start: group.start,
140
140
  value: group.value,
141
141
  children: group.children.map { |child| argument_group_to_message(child) }
@@ -190,7 +190,7 @@ module Cucumber
190
190
 
191
191
  result_message = result.to_message
192
192
  if result.failed? || result.pending?
193
- result_message = Cucumber::Messages::TestStepFinished::TestStepResult.new(
193
+ result_message = Cucumber::Messages::TestStepResult.new(
194
194
  status: result_message.status,
195
195
  duration: result_message.duration,
196
196
  message: create_error_message(result)
@@ -181,7 +181,7 @@ module Cucumber
181
181
  end
182
182
 
183
183
  def print_step_output
184
- @test_step_output.each { |message| @io.puts(format_string(message, :tag).indent(6)) }
184
+ @test_step_output.each { |message| @io.puts(indent(format_string(message, :tag), 6)) }
185
185
  @test_step_output = []
186
186
  end
187
187
 
@@ -259,33 +259,34 @@ module Cucumber
259
259
  end
260
260
  end
261
261
 
262
- def print_comments(up_to_line, indent)
262
+ def print_comments(up_to_line, indent_amount)
263
263
  comments = gherkin_document.comments
264
264
  return if comments.empty? || comments.length <= @next_comment_to_be_printed
265
265
  comments[@next_comment_to_be_printed..-1].each do |comment|
266
266
  if comment.location.line <= up_to_line
267
- @io.puts(format_string(comment.text.strip, :comment).indent(indent))
267
+ @io.puts(indent(format_string(comment.text.strip, :comment), indent_amount))
268
268
  @next_comment_to_be_printed += 1
269
269
  end
270
270
  break if @next_comment_to_be_printed >= comments.length
271
271
  end
272
272
  end
273
273
 
274
- def print_tags(tags, indent)
274
+ def print_tags(tags, indent_amount)
275
275
  return if !tags || tags.empty?
276
- @io.puts(tags.map { |tag| format_string(tag.name, :tag) }.join(' ').indent(indent))
276
+
277
+ @io.puts(indent(tags.map { |tag| format_string(tag.name, :tag) }.join(' '), indent_amount))
277
278
  end
278
279
 
279
280
  def print_feature_line(feature)
280
281
  print_keyword_name(feature.keyword, feature.name, 0)
281
282
  end
282
283
 
283
- def print_keyword_name(keyword, name, indent, location = nil)
284
+ def print_keyword_name(keyword, name, indent_amount, location = nil)
284
285
  line = "#{keyword}:"
285
286
  line += " #{name}"
286
- @io.print(line.indent(indent))
287
+ @io.print(indent(line, indent_amount))
287
288
  if location && options[:source]
288
- line_comment = format_string("# #{location}", :comment).indent(@source_indent - line.length - indent)
289
+ line_comment = indent(format_string("# #{location}", :comment), @source_indent - line.length - indent_amount)
289
290
  @io.print(line_comment)
290
291
  end
291
292
  @io.puts
@@ -339,7 +340,7 @@ module Cucumber
339
340
  indent = options[:source] ? @source_indent - step_keyword.length - test_step.text.length - base_indent : nil
340
341
  print_comments(test_step.location.lines.max, base_indent)
341
342
  name_to_report = format_step(step_keyword, @step_matches.fetch(test_step.to_s) { NoStepMatch.new(test_step, test_step.text) }, result.to_sym, indent)
342
- @io.puts(name_to_report.indent(base_indent))
343
+ @io.puts(indent(name_to_report, base_indent))
343
344
  print_multiline_argument(test_step, result, base_indent + 2) unless options[:no_multiline]
344
345
  @io.flush
345
346
  end
@@ -374,10 +375,10 @@ module Cucumber
374
375
  end
375
376
  end
376
377
 
377
- def print_data_table(data_table, status, indent)
378
+ def print_data_table(data_table, status, indent_amount)
378
379
  data_table.rows.each do |row|
379
- print_comments(row.location.line, indent)
380
- @io.puts format_string(gherkin_source.split("\n")[row.location.line - 1].strip, status).indent(indent)
380
+ print_comments(row.location.line, indent_amount)
381
+ @io.puts indent(format_string(gherkin_source.split("\n")[row.location.line - 1].strip, status), indent_amount)
381
382
  end
382
383
  end
383
384
 
@@ -393,7 +394,7 @@ module Cucumber
393
394
  @io.print(format_string(step_line, :skipped))
394
395
  if options[:source]
395
396
  comment_line = format_string("# #{current_feature_uri}:#{step.location.line}", :comment)
396
- @io.print(comment_line.indent(@source_indent - step_line.length))
397
+ @io.print(indent(comment_line, @source_indent - step_line.length))
397
398
  end
398
399
  @io.puts
399
400
  next if options[:no_multiline]
@@ -403,8 +404,8 @@ module Cucumber
403
404
  @io.flush
404
405
  end
405
406
 
406
- def print_doc_string(content, status, indent)
407
- s = %("""\n#{content}\n""").indent(indent)
407
+ def print_doc_string(content, status, indent_amount)
408
+ s = indent(%("""\n#{content}\n"""), indent_amount)
408
409
  s = s.split("\n").map { |l| l =~ /^\s+$/ ? '' : l }.join("\n")
409
410
  @io.puts(format_string(s, status))
410
411
  end
@@ -416,15 +417,15 @@ module Cucumber
416
417
  print_description(examples.description)
417
418
  unless options[:expand]
418
419
  print_comments(examples.table_header.location.line, 6)
419
- @io.puts(gherkin_source.split("\n")[examples.table_header.location.line - 1].strip.indent(6))
420
+ @io.puts(indent(gherkin_source.split("\n")[examples.table_header.location.line - 1].strip, 6))
420
421
  end
421
422
  @io.flush
422
423
  end
423
424
 
424
425
  def print_row_data(test_case, result)
425
426
  print_comments(test_case.location.lines.max, 6)
426
- @io.print(format_string(gherkin_source.split("\n")[test_case.location.lines.max - 1].strip, result.to_sym).indent(6))
427
- @io.print(format_string(@test_step_output.join(', '), :tag).indent(2)) unless @test_step_output.empty?
427
+ @io.print(indent(format_string(gherkin_source.split("\n")[test_case.location.lines.max - 1].strip, result.to_sym), 6))
428
+ @io.print(indent(format_string(@test_step_output.join(', '), :tag), 2)) unless @test_step_output.empty?
428
429
  @test_step_output = []
429
430
  @io.puts
430
431
  if result.failed? || result.pending?
@@ -41,7 +41,7 @@ module Cucumber
41
41
  '',
42
42
  [
43
43
  'More information at ',
44
- link('https://reports.cucumber.io/docs/cucumber-ruby')
44
+ link('https://cucumber.io/docs/cucumber/environment-variables/')
45
45
  ],
46
46
  '',
47
47
  [
@@ -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
@@ -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
@@ -87,8 +89,8 @@ module Cucumber
87
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
@@ -100,8 +102,8 @@ module Cucumber
100
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,7 +15,7 @@ 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?
@@ -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])
@@ -109,10 +109,29 @@ module Cucumber
109
109
 
110
110
  # Registers a proc that will run after Cucumber is configured. You can register as
111
111
  # as you want (typically from ruby scripts under <tt>support/hooks.rb</tt>).
112
+ #
113
+ # DEPRECATED: please use InstallPlugin or BeforeAll instead
112
114
  def AfterConfiguration(&proc)
113
115
  Dsl.register_rb_hook('after_configuration', [], proc)
114
116
  end
115
117
 
118
+ # Registers a proc that will run after Cucumber is configured in order to install an external plugin.
119
+ def InstallPlugin(&proc)
120
+ Dsl.register_rb_hook('install_plugin', [], proc)
121
+ end
122
+
123
+ # Registers a proc that will run before the execution of the scenarios.
124
+ # Use it for your final set-ups
125
+ def BeforeAll(&proc)
126
+ Dsl.register_rb_hook('before_all', [], proc)
127
+ end
128
+
129
+ # Registers a proc that will run after the execution of the scenarios.
130
+ # Use it for your final clean-ups
131
+ def AfterAll(&proc)
132
+ Dsl.register_rb_hook('after_all', [], proc)
133
+ end
134
+
116
135
  # Registers a new Ruby StepDefinition. This method is aliased
117
136
  # to <tt>Given</tt>, <tt>When</tt> and <tt>Then</tt>, and
118
137
  # also to the i18n translations whenever a feature of a
@@ -3,6 +3,7 @@
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
7
 
7
8
  module Cucumber
8
9
  module Glue
@@ -72,46 +73,29 @@ module Cucumber
72
73
  MultilineArgument::DataTable.from(text_or_table)
73
74
  end
74
75
 
75
- # Print a message to the output.
76
- #
77
- # @note Cucumber might surprise you with the behaviour of this method. Instead
78
- # of sending the output directly to STDOUT, Cucumber will intercept and cache
79
- # the message until the current step has finished, and then display it.
80
- #
81
- # If you'd prefer to see the message immediately, call {Kernel.puts} instead.
82
- def puts(*messages)
83
- Cucumber.deprecate(
84
- 'Messages emitted with "puts" will no longer be caught by Cucumber ' \
85
- 'and sent to the formatter. If you want message to be in the formatted output, ' \
86
- "please use log(message) instead.\n" \
87
- 'If you simply want it in the console, '\
88
- 'keep using "puts" (or Kernel.puts to avoid this message)',
89
- 'puts(message)',
90
- '6.0.0'
91
- )
92
- messages.each { |message| log(message.to_s) }
93
- end
94
-
95
76
  # Pause the tests and ask the operator for input
96
77
  def ask(question, timeout_seconds = 60)
97
78
  super
98
79
  end
99
80
 
100
- # Embed an image in the output
101
- def embed(file, mime_type, _label = 'Screenshot')
102
- Cucumber.deprecate(
103
- 'Please use attach(file, media_type) instead',
104
- 'embed(file, mime_type, label)',
105
- '6.0.0'
106
- )
107
- attach(file, mime_type)
108
- end
109
-
110
81
  def log(*messages)
111
82
  messages.each { |message| attach(message.to_s.dup, 'text/x.cucumber.log+plain') }
112
83
  end
113
84
 
114
- def attach(file, media_type)
85
+ # Attach a file to the output
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)
92
+ return super unless File.file?(file)
93
+
94
+ content = File.read(file, mode: 'rb')
95
+ media_type = MIME::Types.type_for(file).first if media_type.nil?
96
+
97
+ super(content, media_type.to_s)
98
+ rescue StandardError
115
99
  super
116
100
  end
117
101
 
@@ -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
@@ -135,11 +136,31 @@ module Cucumber
135
136
  end
136
137
 
137
138
  def after_configuration(configuration)
139
+ deprecate_after_configuration_hook if hooks[:after_configuration].any?
140
+
138
141
  hooks[:after_configuration].each do |hook|
139
142
  hook.invoke('AfterConfiguration', configuration)
140
143
  end
141
144
  end
142
145
 
146
+ def install_plugin(configuration, registry)
147
+ hooks[:install_plugin].each do |hook|
148
+ hook.invoke('InstallPlugin', [configuration, registry])
149
+ end
150
+ end
151
+
152
+ def before_all
153
+ hooks[:before_all].each do |hook|
154
+ hook.invoke('BeforeAll', [])
155
+ end
156
+ end
157
+
158
+ def after_all
159
+ hooks[:after_all].each do |hook|
160
+ hook.invoke('AfterAll', [])
161
+ end
162
+ end
163
+
143
164
  def add_hook(phase, hook)
144
165
  hooks[phase.to_sym] << hook
145
166
  hook
@@ -207,6 +228,14 @@ module Cucumber
207
228
  def hooks
208
229
  @hooks ||= Hash.new { |h, k| h[k] = [] }
209
230
  end
231
+
232
+ def deprecate_after_configuration_hook
233
+ Cucumber.deprecate(
234
+ 'See https://github.com/cucumber/cucumber-ruby/blob/main/UPGRADING.md#upgrading-to-710 for more info',
235
+ ' AfterConfiguration hook',
236
+ '8.0.0'
237
+ )
238
+ end
210
239
  end
211
240
 
212
241
  def self.backtrace_line(proc, name)
@@ -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
@@ -77,7 +76,7 @@ module Cucumber
77
76
  Cucumber::Messages::Envelope.new(
78
77
  step_definition: Cucumber::Messages::StepDefinition.new(
79
78
  id: id,
80
- pattern: Cucumber::Messages::StepDefinition::StepDefinitionPattern.new(
79
+ pattern: Cucumber::Messages::StepDefinitionPattern.new(
81
80
  source: expression.source.to_s,
82
81
  type: expression_type
83
82
  ),
@@ -92,8 +91,8 @@ module Cucumber
92
91
  end
93
92
 
94
93
  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
94
+ return Cucumber::Messages::StepDefinitionPatternType::CUCUMBER_EXPRESSION if expression.is_a?(CucumberExpressions::CucumberExpression)
95
+ Cucumber::Messages::StepDefinitionPatternType::REGULAR_EXPRESSION
97
96
  end
98
97
 
99
98
  # @api private