cucumber 9.2.1 → 10.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f6b3938bfcfa22aba558e5ea44825ed2ee19e9c7d26c0a5613f7998095d5c287
4
- data.tar.gz: edc19d118e96175085722756b873b48c2ec319663edeedd81de027a48ac7d66c
3
+ metadata.gz: 2c0b8e35a28f81c7641e8ec04c2831c8884df1bb505d275f9a809cce801848d6
4
+ data.tar.gz: e28e2cb4ab3a3a3683ebf7ceaa1ff6dcb96b9a785ecb8ceb7d16d43f529678a4
5
5
  SHA512:
6
- metadata.gz: f1338b46610ebd6fff711400c0160294f451e3c98558ca155712d07040a06f9a55fcb99c6e9cd00e5df248a415928b2a7c70da76a7badcc461b832ec464b66a8
7
- data.tar.gz: b1c00b91c1055daf161482ba19b4cfa60089140af3212f9a1d71ef9a692d4dabd43fdb5fa3fa0bfcbcce018053f0ebc5460f1449bfaa32fa6afb0f532156c9d1
6
+ metadata.gz: 9a734880b62afa6292433b3c553a6956c3bdb0520a9dc81653cc194fe6e878a94579638b1891dce864871902828d675dff08a726de690e7828eb018d12220878
7
+ data.tar.gz: 951dc39cd2b6dee12a3e4528d14ecffd041e0d13f6d2d247f1637376fd0b117180783ec3bdc2b03b1b998645440107a1001f01a83f48875b63cb43a4f54d4c0a
data/LICENSE CHANGED
@@ -1,22 +1,21 @@
1
- The MIT License
1
+ MIT License
2
2
 
3
- Copyright (c) Aslak Hellesøy
3
+ Copyright (c) 2008 Aslak Hellesøy and contributors
4
4
 
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
12
11
 
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
15
14
 
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- <img src="docs/img/cucumber-open-logo.png" alt="Cucumber Open - Supported by Smartbear" width="428" />
1
+ <img src="docs/img/logo.svg" alt="" width="75" />
2
2
 
3
3
  # Cucumber
4
4
 
@@ -45,11 +45,12 @@ Later in this document, bundler is considered being used so all commands are usi
45
45
 
46
46
  ### Supported platforms
47
47
 
48
+ - Ruby 3.4
49
+ - Ruby 3.3
48
50
  - Ruby 3.2
49
51
  - Ruby 3.1
50
52
  - Ruby 3.0
51
- - Ruby 2.7
52
- - TruffleRuby 22.0.0+
53
+ - TruffleRuby 24.0.0+
53
54
  - JRuby 9.4+ (with [some limitations](https://github.com/cucumber/cucumber-ruby/blob/main/docs/jruby-limitations.md))
54
55
 
55
56
  ### Ruby on Rails
@@ -91,12 +92,11 @@ Feature: Rule Sample
91
92
  Given this will fail
92
93
  When I do an action
93
94
  Then some results should be there
94
-
95
95
  ```
96
96
 
97
97
  ### Automate your specification
98
98
 
99
- And a file named `steps.rb` in `features/step_definitions` with:
99
+ And a file named `rule_steps.rb` in `features/step_definitions` with:
100
100
 
101
101
  ```ruby
102
102
  # features/step_definitions/steps.rb
@@ -144,9 +144,9 @@ You can also find documentation on the command line possibilities in [features/d
144
144
 
145
145
  - Getting started, writing features, step definitions, and more: https://cucumber.io/docs
146
146
  - Ruby API Documentation: http://www.rubydoc.info/github/cucumber/cucumber-ruby/
147
- - Community support forum: https://community.smartbear.com/t5/Cucumber-Open/bd-p/CucumberOS
148
- - Slack: [register for an account](https://cucumberbdd-slack-invite.herokuapp.com/) then head over to [#intro](https://cucumberbdd.slack.com/messages/C5WD8SA21/)
147
+ - Community support forum: https://github.com/orgs/cucumber/discussions
148
+ - Discord: [register for an account](https://cucumber.io/docs/community/get-in-touch#discord)
149
149
 
150
150
  ## Copyright
151
151
 
152
- Copyright (c) Cucumber Ltd. and Contributors. See LICENSE for details.
152
+ Copyright (c) Cucumber and Contributors. See LICENSE for details.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 9.2.1
1
+ 10.0.0
@@ -93,8 +93,7 @@ module Cucumber
93
93
  def runtime(existing_runtime)
94
94
  return Runtime.new(configuration) unless existing_runtime
95
95
 
96
- existing_runtime.configure(configuration)
97
- existing_runtime
96
+ existing_runtime.tap { |runtime| runtime.configure(configuration) }
98
97
  end
99
98
  end
100
99
  end
@@ -254,7 +254,7 @@ module Cucumber
254
254
  end
255
255
 
256
256
  def id_generator
257
- @id_generator ||= Cucumber::Messages::IdGenerator::UUID.new
257
+ @id_generator ||= Cucumber::Messages::Helpers::IdGenerator::UUID.new
258
258
  end
259
259
 
260
260
  private
@@ -6,7 +6,7 @@ require 'cucumber/gherkin/formatter/ansi_escapes'
6
6
  module Cucumber
7
7
  def self.deprecate(message, method, remove_after_version)
8
8
  $stderr.puts(
9
- "\nWARNING: ##{method} is deprecated" \
9
+ "\nWARNING: #{method} is deprecated" \
10
10
  " and will be removed after version #{remove_after_version}. #{message}.\n" \
11
11
  "(Called from #{caller(3..3).first})"
12
12
  )
@@ -4,7 +4,7 @@ module Cucumber
4
4
  module Filters
5
5
  class BroadcastTestCaseReadyEvent < Core::Filter.new(:config)
6
6
  def test_case(test_case)
7
- config.notify :test_case_ready, test_case
7
+ config.notify(:test_case_ready, test_case)
8
8
  test_case.describe_to(receiver)
9
9
  end
10
10
  end
@@ -4,52 +4,79 @@ require 'cucumber/platform'
4
4
 
5
5
  module Cucumber
6
6
  module Formatter
7
- @backtrace_filters = %w[
8
- /vendor/rails
9
- lib/cucumber
10
- bin/cucumber:
11
- lib/rspec
12
- gems/
13
- site_ruby/
14
- minitest
15
- test/unit
16
- .gem/ruby
17
- bin/bundle
18
- rdebug-ide
19
- ]
20
-
21
- @backtrace_filters << RbConfig::CONFIG['rubyarchdir'] if RbConfig::CONFIG['rubyarchdir']
22
- @backtrace_filters << RbConfig::CONFIG['rubylibdir'] if RbConfig::CONFIG['rubylibdir']
23
-
24
- @backtrace_filters << 'org/jruby/' if ::Cucumber::JRUBY
25
- @backtrace_filters << '<internal:' if RUBY_ENGINE == 'truffleruby'
26
-
27
- BACKTRACE_FILTER_PATTERNS = Regexp.new(@backtrace_filters.join('|'))
28
-
29
7
  class BacktraceFilter
30
8
  def initialize(exception)
31
9
  @exception = exception
10
+ @backtrace_filters = standard_ruby_paths + dynamic_ruby_paths
32
11
  end
33
12
 
34
13
  def exception
35
14
  return @exception if ::Cucumber.use_full_backtrace
36
15
 
37
- pwd_pattern = /#{::Regexp.escape(::Dir.pwd)}\//m
38
16
  backtrace = @exception.backtrace.map { |line| line.gsub(pwd_pattern, './') }
39
-
40
- filtered = (backtrace || []).reject do |line|
41
- line =~ BACKTRACE_FILTER_PATTERNS
42
- end
17
+ filtered = backtrace.reject { |line| line.match?(backtrace_filter_patterns) }
43
18
 
44
19
  if ::ENV['CUCUMBER_TRUNCATE_OUTPUT']
45
- # Strip off file locations
46
20
  filtered = filtered.map do |line|
47
- line =~ /(.*):in `/ ? Regexp.last_match(1) : line
21
+ # Strip off file locations
22
+ match = regexp_filter.match(line)
23
+ match ? match[1] : line
48
24
  end
49
25
  end
50
26
 
51
- @exception.set_backtrace(filtered)
52
- @exception
27
+ @exception.tap { |error_object| error_object.set_backtrace(filtered) }
28
+ end
29
+
30
+ private
31
+
32
+ def backtrace_filter_patterns
33
+ Regexp.new(@backtrace_filters.join('|'))
34
+ end
35
+
36
+ def dynamic_ruby_paths
37
+ [].tap do |paths|
38
+ paths << RbConfig::CONFIG['rubyarchdir'] if RbConfig::CONFIG['rubyarchdir']
39
+ paths << RbConfig::CONFIG['rubylibdir'] if RbConfig::CONFIG['rubylibdir']
40
+
41
+ paths << 'org/jruby/' if ::Cucumber::JRUBY
42
+ paths << '<internal:' if RUBY_ENGINE == 'truffleruby'
43
+ end
44
+ end
45
+
46
+ def pwd_pattern
47
+ /#{::Regexp.escape(::Dir.pwd)}\//m
48
+ end
49
+
50
+ def regexp_filter
51
+ ruby_greater_than_three_four? ? three_four_filter : three_three_filter
52
+ end
53
+
54
+ def ruby_greater_than_three_four?
55
+ RUBY_VERSION.to_f >= 3.4
56
+ end
57
+
58
+ def standard_ruby_paths
59
+ %w[
60
+ /vendor/rails
61
+ lib/cucumber
62
+ bin/cucumber:
63
+ lib/rspec
64
+ gems/
65
+ site_ruby/
66
+ minitest
67
+ test/unit
68
+ .gem/ruby
69
+ bin/bundle
70
+ rdebug-ide
71
+ ]
72
+ end
73
+
74
+ def three_four_filter
75
+ /(.*):in '/
76
+ end
77
+
78
+ def three_three_filter
79
+ /(.*):in `/
53
80
  end
54
81
  end
55
82
  end
@@ -31,7 +31,8 @@ module Cucumber
31
31
  [url, http_method, headers]
32
32
  end
33
33
 
34
- # TODO: [LH] -> Switch below methods to private
34
+ private
35
+
35
36
  def self.remove_arg_for(args, arg)
36
37
  return args.shift unless args.empty?
37
38
 
@@ -7,11 +7,12 @@ require 'cucumber/formatter/query/pickle_by_test'
7
7
  require 'cucumber/formatter/query/pickle_step_by_test_step'
8
8
  require 'cucumber/formatter/query/step_definitions_by_test_step'
9
9
  require 'cucumber/formatter/query/test_case_started_by_test_case'
10
+ require 'cucumber/formatter/query/test_run_started'
10
11
 
11
12
  module Cucumber
12
13
  module Formatter
13
14
  class MessageBuilder
14
- include Cucumber::Messages::TimeConversion
15
+ include Cucumber::Messages::Helpers::TimeConversion
15
16
 
16
17
  def initialize(config)
17
18
  @config = config
@@ -21,6 +22,7 @@ module Cucumber
21
22
  @pickle_step_by_test_step = Query::PickleStepByTestStep.new(config)
22
23
  @step_definitions_by_test_step = Query::StepDefinitionsByTestStep.new(config)
23
24
  @test_case_started_by_test_case = Query::TestCaseStartedByTestCase.new(config)
25
+ @test_run_started = Query::TestRunStarted.new(config)
24
26
 
25
27
  config.on_event :envelope, &method(:on_envelope)
26
28
  config.on_event :gherkin_source_read, &method(:on_gherkin_source_read)
@@ -34,6 +36,7 @@ module Cucumber
34
36
  config.on_event :undefined_parameter_type, &method(:on_undefined_parameter_type)
35
37
 
36
38
  @test_case_by_step_id = {}
39
+ @current_test_run_started_id = nil
37
40
  @current_test_case_started_id = nil
38
41
  @current_test_step_id = nil
39
42
  end
@@ -94,7 +97,8 @@ module Cucumber
94
97
  test_case: Cucumber::Messages::TestCase.new(
95
98
  id: event.test_case.id,
96
99
  pickle_id: @pickle_by_test.pickle_id(event.test_case),
97
- test_steps: event.test_case.test_steps.map { |step| test_step_to_message(step) }
100
+ test_steps: event.test_case.test_steps.map { |step| test_step_to_message(step) },
101
+ test_run_started_id: @current_test_run_started_id
98
102
  )
99
103
  )
100
104
 
@@ -150,9 +154,12 @@ module Cucumber
150
154
  end
151
155
 
152
156
  def on_test_run_started(*)
157
+ @current_test_run_started_id = @test_run_started.id
158
+
153
159
  message = Cucumber::Messages::Envelope.new(
154
160
  test_run_started: Cucumber::Messages::TestRunStarted.new(
155
- timestamp: time_to_timestamp(Time.now)
161
+ timestamp: time_to_timestamp(Time.now),
162
+ id: @current_test_run_started_id
156
163
  )
157
164
  )
158
165
 
@@ -245,7 +252,8 @@ module Cucumber
245
252
  message = Cucumber::Messages::Envelope.new(
246
253
  test_run_finished: Cucumber::Messages::TestRunFinished.new(
247
254
  timestamp: time_to_timestamp(Time.now),
248
- success: event.success
255
+ success: event.success,
256
+ test_run_started_id: @current_test_run_started_id
249
257
  )
250
258
  )
251
259
 
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cucumber
4
+ module Formatter
5
+ module Query
6
+ class TestRunStarted
7
+ def initialize(config)
8
+ @config = config
9
+ end
10
+
11
+ def id
12
+ @id ||= @config.id_generator.new_id
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'cucumber/cucumber_expressions/parameter_type'
4
- require 'cucumber/deprecate'
5
4
 
6
5
  module Cucumber
7
6
  module Glue
@@ -19,8 +18,8 @@ module Cucumber
19
18
  @rb_language.build_rb_world_factory(world_modules, namespaced_world_modules, proc)
20
19
  end
21
20
 
22
- def register_rb_hook(phase, tag_names, proc, name: nil)
23
- @rb_language.register_rb_hook(phase, tag_names, proc, name: name)
21
+ def register_rb_hook(type, tag_names, proc, name: nil)
22
+ @rb_language.register_rb_hook(type, tag_names, proc, name: name)
24
23
  end
25
24
 
26
25
  def define_parameter_type(parameter_type)
@@ -12,10 +12,9 @@ module Cucumber
12
12
  @id = id
13
13
  @registry = registry
14
14
  @name = name
15
- @tag_expressions = sanitize_tag_expressions(tag_expressions)
15
+ @tag_expressions = tag_expressions
16
16
  @proc = proc
17
17
  @location = Cucumber::Core::Test::Location.from_source_location(*@proc.source_location)
18
- fail_for_old_style_tag_expressions(@tag_expressions)
19
18
  end
20
19
 
21
20
  def invoke(pseudo_method, arguments, &block)
@@ -29,12 +28,13 @@ module Cucumber
29
28
  )
30
29
  end
31
30
 
32
- def to_envelope
31
+ def to_envelope(type)
33
32
  Cucumber::Messages::Envelope.new(
34
33
  hook: Cucumber::Messages::Hook.new(
35
34
  id: id,
36
35
  name: name,
37
36
  tag_expression: tag_expressions.empty? ? nil : tag_expressions.join(' '),
37
+ type: hook_type_to_enum_value[type.to_sym],
38
38
  source_reference: Cucumber::Messages::SourceReference.new(
39
39
  uri: location.file,
40
40
  location: Cucumber::Messages::Location.new(
@@ -47,23 +47,16 @@ module Cucumber
47
47
 
48
48
  private
49
49
 
50
- def sanitize_tag_expressions(tag_expressions)
51
- # TODO: remove when '~@no-clobber' has been changed to 'not @no-clobber' in aruba
52
- tag_expressions.map { |tag_expression| tag_expression == '~@no-clobber' ? 'not @no-clobber' : tag_expression }
53
- end
54
-
55
- def fail_for_old_style_tag_expressions(tag_expressions)
56
- tag_expressions.each do |tag_expression|
57
- if tag_expression.include?('~')
58
- raise("Found tagged hook with '#{tag_expression}'." \
59
- "'~@tag' is no longer supported, use 'not @tag' instead.")
60
- end
61
-
62
- next unless tag_expression.include?(',')
63
-
64
- warn("Found tagged hook with '#{tag_expression}'." \
65
- "'@tag1,@tag2' is no longer supported, use '@tag or @tag2' instead.")
66
- end
50
+ def hook_type_to_enum_value
51
+ {
52
+ before: 'BEFORE_TEST_CASE',
53
+ after: 'AFTER_TEST_CASE',
54
+ around: nil, # This needs deleting and removing from cucumber-ruby in v11
55
+ after_step: 'AFTER_TEST_STEP',
56
+ install_plugin: 'BEFORE_TEST_RUN',
57
+ before_all: 'BEFORE_TEST_RUN',
58
+ after_all: 'AFTER_TEST_RUN'
59
+ }
67
60
  end
68
61
  end
69
62
  end
@@ -14,7 +14,10 @@ module Cucumber
14
14
  return unless instance_exec_pos
15
15
 
16
16
  replacement_line = instance_exec_pos + INSTANCE_EXEC_OFFSET
17
- backtrace[replacement_line].gsub!(/`.*'/, "`#{pseudo_method}'") if pseudo_method
17
+ if pseudo_method
18
+ pattern = RUBY_VERSION >= '3.4' ? /'.*'/ : /`.*'/
19
+ backtrace[replacement_line].gsub!(pattern, "`#{pseudo_method}'")
20
+ end
18
21
 
19
22
  depth = backtrace.count { |line| line == instance_exec_invocation_line }
20
23
  end_pos = depth > 1 ? instance_exec_pos : -1
@@ -49,7 +52,13 @@ module Cucumber
49
52
  def self.cucumber_run_with_backtrace_filtering(pseudo_method)
50
53
  yield
51
54
  rescue Exception => e
52
- instance_exec_invocation_line = "#{__FILE__}:#{__LINE__ - 2}:in `cucumber_run_with_backtrace_filtering'"
55
+ yield_line_number = __LINE__ - 2
56
+ instance_exec_invocation_line =
57
+ if RUBY_VERSION >= '3.4'
58
+ "#{__FILE__}:#{yield_line_number}:in '#{name}.#{__method__}'"
59
+ else
60
+ "#{__FILE__}:#{yield_line_number}:in `#{__method__}'"
61
+ end
53
62
  replace_instance_exec_invocation_line!((e.backtrace || []), instance_exec_invocation_line, pseudo_method)
54
63
  raise e
55
64
  end
@@ -2,7 +2,6 @@
2
2
 
3
3
  require 'cucumber/gherkin/formatter/ansi_escapes'
4
4
  require 'cucumber/core/test/data_table'
5
- require 'cucumber/deprecate'
6
5
  require 'mini_mime'
7
6
 
8
7
  module Cucumber
@@ -19,6 +19,11 @@ require 'cucumber/events/step_definition_registered'
19
19
 
20
20
  module Cucumber
21
21
  module Glue
22
+ def self.backtrace_line(proc, name)
23
+ location = Cucumber::Core::Test::Location.from_source_location(*proc.source_location)
24
+ "#{location}:in `#{name}'"
25
+ end
26
+
22
27
  # Raised if a World block returns Nil.
23
28
  class NilWorld < StandardError
24
29
  def initialize
@@ -43,8 +48,7 @@ module Cucumber
43
48
 
44
49
  # TODO: This class has too many responsibilities, split off
45
50
  class RegistryAndMore
46
- attr_reader :current_world,
47
- :step_definitions
51
+ attr_reader :current_world, :step_definitions
48
52
 
49
53
  all_keywords = ::Gherkin::DIALECTS.keys.map do |dialect_name|
50
54
  dialect = ::Gherkin::Dialect.for(dialect_name)
@@ -54,6 +58,14 @@ module Cucumber
54
58
  Glue::Dsl.alias_adverb(adverb.strip)
55
59
  end
56
60
 
61
+ def self.cli_snippet_type_options
62
+ registry = CucumberExpressions::ParameterTypeRegistry.new
63
+ cucumber_expression_generator = CucumberExpressions::CucumberExpressionGenerator.new(registry)
64
+ Snippet::SNIPPET_TYPES.keys.sort_by(&:to_s).map do |type|
65
+ Snippet::SNIPPET_TYPES[type].cli_option_string(type, cucumber_expression_generator)
66
+ end
67
+ end
68
+
57
69
  def initialize(runtime, configuration)
58
70
  @runtime = runtime
59
71
  @configuration = configuration
@@ -73,9 +85,9 @@ module Cucumber
73
85
  end
74
86
  end
75
87
 
76
- def register_rb_hook(phase, tag_expressions, proc, name: nil)
77
- hook = add_hook(phase, Hook.new(@configuration.id_generator.new_id, self, tag_expressions, proc, name: name))
78
- @configuration.notify :envelope, hook.to_envelope
88
+ def register_rb_hook(type, tag_expressions, proc, name: nil)
89
+ hook = add_hook(type, Hook.new(@configuration.id_generator.new_id, self, tag_expressions, proc, name: name))
90
+ @configuration.notify(:envelope, hook.to_envelope(type))
79
91
  hook
80
92
  end
81
93
 
@@ -129,8 +141,7 @@ module Cucumber
129
141
  @current_world = WorldFactory.new(@world_proc).create_world
130
142
  @current_world.extend(ProtoWorld.for(@runtime, test_case.language))
131
143
  MultiTest.extend_with_best_assertion_library(@current_world)
132
- @current_world.add_modules!(@world_modules || [],
133
- @namespaced_world_modules || {})
144
+ @current_world.add_modules!(@world_modules || [], @namespaced_world_modules || {})
134
145
  end
135
146
 
136
147
  def end_scenario
@@ -155,8 +166,8 @@ module Cucumber
155
166
  end
156
167
  end
157
168
 
158
- def add_hook(phase, hook)
159
- hooks[phase.to_sym] << hook
169
+ def add_hook(type, hook)
170
+ hooks[type.to_sym] << hook
160
171
  hook
161
172
  end
162
173
 
@@ -164,20 +175,8 @@ module Cucumber
164
175
  @hooks = nil
165
176
  end
166
177
 
167
- def hooks_for(phase, scenario) # :nodoc:
168
- hooks[phase.to_sym].select { |hook| scenario.accept_hook?(hook) }
169
- end
170
-
171
- def unmatched_step_definitions
172
- available_step_definition_hash.keys - invoked_step_definition_hash.keys
173
- end
174
-
175
- def available_step_definition(regexp_source, file_colon_line)
176
- available_step_definition_hash[StepDefinitionLight.new(regexp_source, file_colon_line)] = nil
177
- end
178
-
179
- def invoked_step_definition(regexp_source, file_colon_line)
180
- invoked_step_definition_hash[StepDefinitionLight.new(regexp_source, file_colon_line)] = nil
178
+ def hooks_for(type, scenario) # :nodoc:
179
+ hooks[type.to_sym].select { |hook| scenario.accept_hook?(hook) }
181
180
  end
182
181
 
183
182
  def create_expression(string_or_regexp)
@@ -187,14 +186,6 @@ module Cucumber
187
186
  raise ArgumentError, 'Expression must be a String or Regexp'
188
187
  end
189
188
 
190
- def self.cli_snippet_type_options
191
- registry = CucumberExpressions::ParameterTypeRegistry.new
192
- cucumber_expression_generator = CucumberExpressions::CucumberExpressionGenerator.new(registry)
193
- Snippet::SNIPPET_TYPES.keys.sort_by(&:to_s).map do |type|
194
- Snippet::SNIPPET_TYPES[type].cli_option_string(type, cucumber_expression_generator)
195
- end
196
- end
197
-
198
189
  private
199
190
 
200
191
  def parameter_type_envelope(parameter_type)
@@ -215,22 +206,9 @@ module Cucumber
215
206
  )
216
207
  end
217
208
 
218
- def available_step_definition_hash
219
- @available_step_definition_hash ||= {}
220
- end
221
-
222
- def invoked_step_definition_hash
223
- @invoked_step_definition_hash ||= {}
224
- end
225
-
226
209
  def hooks
227
210
  @hooks ||= Hash.new { |h, k| h[k] = [] }
228
211
  end
229
212
  end
230
-
231
- def self.backtrace_line(proc, name)
232
- location = Cucumber::Core::Test::Location.from_source_location(*proc.source_location)
233
- "#{location}:in `#{name}'"
234
- end
235
213
  end
236
214
  end
@@ -61,13 +61,11 @@ module Cucumber
61
61
  end
62
62
 
63
63
  def do_block
64
- # TODO: [LH] - Just use a heredoc here to fix this up
65
- do_block = String.new
66
- do_block << "do#{parameters}\n"
67
- multiline_argument.append_comment_to(do_block)
68
- do_block << " pending # Write code here that turns the phrase above into concrete actions\n"
69
- do_block << 'end'
70
- do_block
64
+ <<~DOC.chomp
65
+ do#{parameters}
66
+ #{multiline_argument.comment}
67
+ end
68
+ DOC
71
69
  end
72
70
 
73
71
  def parameters
@@ -96,11 +94,10 @@ module Cucumber
96
94
  "#{prefix}#{code_keyword}('#{expr.source}') do#{parameters(expr)}"
97
95
  end.join("\n")
98
96
 
99
- # TODO: [LH] - Just use a heredoc here to fix this up
100
- body = String.new
101
- multiline_argument.append_comment_to(body)
102
- body << " pending # Write code here that turns the phrase above into concrete actions\n"
103
- body << 'end'
97
+ body = <<~DOC.chomp
98
+ #{multiline_argument.comment}
99
+ end
100
+ DOC
104
101
 
105
102
  "#{header}\n#{body}"
106
103
  end
@@ -179,7 +176,9 @@ module Cucumber
179
176
  array << 'doc_string'
180
177
  end
181
178
 
182
- def append_comment_to(string); end
179
+ def comment
180
+ 'pending # Write code here that turns the phrase above into concrete actions'
181
+ end
183
182
  end
184
183
 
185
184
  class DataTable
@@ -191,15 +190,19 @@ module Cucumber
191
190
  array << 'table'
192
191
  end
193
192
 
194
- def append_comment_to(string)
195
- string << " # table is a #{Cucumber::MultilineArgument::DataTable}\n"
193
+ def comment
194
+ <<~COMMENT.chomp
195
+ # table is a #{Cucumber::MultilineArgument::DataTable}
196
+ pending # Write code here that turns the phrase above into concrete actions
197
+ COMMENT
196
198
  end
197
199
  end
198
200
 
199
201
  class None
200
202
  def append_block_parameter_to(array); end
201
-
202
- def append_comment_to(string); end
203
+ def comment
204
+ 'pending # Write code here that turns the phrase above into concrete actions'
205
+ end
203
206
  end
204
207
  end
205
208
  end
@@ -73,7 +73,6 @@ module Cucumber
73
73
  @registry = registry
74
74
  @expression = expression
75
75
  @proc = proc
76
- # @registry.available_step_definition(regexp_source, location)
77
76
  end
78
77
 
79
78
  def to_envelope
@@ -10,17 +10,17 @@ module Cucumber
10
10
  module Hooks
11
11
  class << self
12
12
  def before_hook(id, location, &block)
13
- build_hook_step(id, location, block, BeforeHook, Core::Test::UnskippableAction)
13
+ build_hook_step(id, location, block, BeforeHook, Core::Test::Action::Unskippable)
14
14
  end
15
15
 
16
16
  def after_hook(id, location, &block)
17
- build_hook_step(id, location, block, AfterHook, Core::Test::UnskippableAction)
17
+ build_hook_step(id, location, block, AfterHook, Core::Test::Action::Unskippable)
18
18
  end
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
+ build_hook_step(id, location, block, AfterStepHook, Core::Test::Action::Defined)
24
24
  end
25
25
 
26
26
  def around_hook(&block)
@@ -4,6 +4,7 @@ require 'forwardable'
4
4
  require 'cucumber/gherkin/data_table_parser'
5
5
  require 'cucumber/gherkin/formatter/escaping'
6
6
  require 'cucumber/multiline_argument/data_table/diff_matrices'
7
+ require 'cucumber/deprecate'
7
8
 
8
9
  module Cucumber
9
10
  module MultilineArgument
@@ -75,8 +76,8 @@ module Cucumber
75
76
  def eof; end
76
77
  end
77
78
 
78
- # This is a Hash being initialized with a default value of a Hash, DO NOT REFORMAT TO REMOVE {}
79
- # Future versions [3.4.0+] of ruby will interpret these as keywords and break.
79
+ # This is a Hash being initialized with a default value of a Hash
80
+ # DO NOT REFORMAT TO REMOVE {} - Ruby 3.4+ will interpret these as keywords and cucumber will not work
80
81
  NULL_CONVERSIONS = Hash.new({ strict: false, proc: ->(cell_value) { cell_value } }).freeze
81
82
 
82
83
  # @param data [Core::Test::DataTable] the data for the table
@@ -367,6 +368,11 @@ module Cucumber
367
368
  # TODO: remove the below function if it's not actually being used.
368
369
  # Nothing else in this repo calls it.
369
370
  def text?(text)
371
+ Cucumber.deprecate(
372
+ 'This method is no longer supported for checking text',
373
+ '#text?',
374
+ '11.0.0'
375
+ )
370
376
  raw.flatten.compact.detect { |cell_value| cell_value.index(text) }
371
377
  end
372
378
 
@@ -11,9 +11,7 @@ module Cucumber
11
11
  end
12
12
 
13
13
  def apply_to(test_case)
14
- test_case.with_steps(
15
- test_case.test_steps + after_hooks.reverse
16
- )
14
+ test_case.with_steps(test_case.test_steps + after_hooks.reverse)
17
15
  end
18
16
 
19
17
  private
@@ -255,13 +255,13 @@ module Cucumber
255
255
  filters << Filters::ApplyBeforeHooks.new(@support_code)
256
256
  filters << Filters::ApplyAfterHooks.new(@support_code)
257
257
  filters << Filters::ApplyAroundHooks.new(@support_code)
258
+ filters << Filters::BroadcastTestRunStartedEvent.new(@configuration)
259
+ filters << Filters::Quit.new
258
260
  end
259
261
 
260
262
  filters << Filters::BroadcastTestCaseReadyEvent.new(@configuration)
261
263
 
262
264
  unless configuration.dry_run?
263
- filters << Filters::BroadcastTestRunStartedEvent.new(@configuration)
264
- filters << Filters::Quit.new
265
265
  filters << Filters::Retry.new(@configuration)
266
266
  # need to do this last so it becomes the first test step
267
267
  filters << Filters::PrepareWorld.new(self)
@@ -11,6 +11,11 @@ module Cucumber
11
11
  def initialize(regexp_source, location)
12
12
  @regexp_source = regexp_source
13
13
  @location = location
14
+ Cucumber.deprecate(
15
+ 'StepDefinitionLight class is no longer a supported part of cucumber',
16
+ '#initialize',
17
+ '11.0.0'
18
+ )
14
19
  end
15
20
 
16
21
  def eql?(other)
data/lib/cucumber.rb CHANGED
@@ -10,7 +10,8 @@ require 'cucumber/term/ansicolor'
10
10
 
11
11
  module Cucumber
12
12
  class << self
13
- attr_accessor :wants_to_quit, :use_legacy_autoloader
13
+ attr_accessor :wants_to_quit
14
+ attr_reader :use_legacy_autoloader
14
15
 
15
16
  def logger
16
17
  return @log if @log
@@ -23,5 +24,14 @@ module Cucumber
23
24
  def logger=(logger)
24
25
  @log = logger
25
26
  end
27
+
28
+ def use_legacy_autoloader=(value)
29
+ Cucumber.deprecate(
30
+ 'This will be phased out of cucumber and should not be used. It is only there to support legacy systems',
31
+ '.use_legacy_autoloader',
32
+ '11.0.0'
33
+ )
34
+ @use_legacy_autoloader = value
35
+ end
26
36
  end
27
37
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cucumber
3
3
  version: !ruby/object:Gem::Version
4
- version: 9.2.1
4
+ version: 10.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aslak Hellesøy
@@ -10,8 +10,22 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2025-01-12 00:00:00.000000000 Z
13
+ date: 2025-06-12 00:00:00.000000000 Z
14
14
  dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: base64
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '0.2'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '0.2'
15
29
  - !ruby/object:Gem::Dependency
16
30
  name: builder
17
31
  requirement: !ruby/object:Gem::Requirement
@@ -52,54 +66,40 @@ dependencies:
52
66
  requirements:
53
67
  - - ">"
54
68
  - !ruby/object:Gem::Version
55
- version: '13'
69
+ version: '15'
56
70
  - - "<"
57
71
  - !ruby/object:Gem::Version
58
- version: '14'
72
+ version: '17'
59
73
  type: :runtime
60
74
  prerelease: false
61
75
  version_requirements: !ruby/object:Gem::Requirement
62
76
  requirements:
63
77
  - - ">"
64
78
  - !ruby/object:Gem::Version
65
- version: '13'
79
+ version: '15'
66
80
  - - "<"
67
81
  - !ruby/object:Gem::Version
68
- version: '14'
82
+ version: '17'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: cucumber-cucumber-expressions
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '17.0'
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '17.0'
83
- - !ruby/object:Gem::Dependency
84
- name: cucumber-gherkin
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">"
88
88
  - !ruby/object:Gem::Version
89
- version: '24'
89
+ version: '17'
90
90
  - - "<"
91
91
  - !ruby/object:Gem::Version
92
- version: '28'
92
+ version: '19'
93
93
  type: :runtime
94
94
  prerelease: false
95
95
  version_requirements: !ruby/object:Gem::Requirement
96
96
  requirements:
97
97
  - - ">"
98
98
  - !ruby/object:Gem::Version
99
- version: '24'
99
+ version: '17'
100
100
  - - "<"
101
101
  - !ruby/object:Gem::Version
102
- version: '28'
102
+ version: '19'
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: cucumber-html-formatter
105
105
  requirement: !ruby/object:Gem::Requirement
@@ -121,39 +121,33 @@ dependencies:
121
121
  - !ruby/object:Gem::Version
122
122
  version: '22'
123
123
  - !ruby/object:Gem::Dependency
124
- name: cucumber-messages
124
+ name: diff-lcs
125
125
  requirement: !ruby/object:Gem::Requirement
126
126
  requirements:
127
- - - ">"
128
- - !ruby/object:Gem::Version
129
- version: '19'
130
- - - "<"
127
+ - - "~>"
131
128
  - !ruby/object:Gem::Version
132
- version: '25'
129
+ version: '1.5'
133
130
  type: :runtime
134
131
  prerelease: false
135
132
  version_requirements: !ruby/object:Gem::Requirement
136
133
  requirements:
137
- - - ">"
138
- - !ruby/object:Gem::Version
139
- version: '19'
140
- - - "<"
134
+ - - "~>"
141
135
  - !ruby/object:Gem::Version
142
- version: '25'
136
+ version: '1.5'
143
137
  - !ruby/object:Gem::Dependency
144
- name: diff-lcs
138
+ name: logger
145
139
  requirement: !ruby/object:Gem::Requirement
146
140
  requirements:
147
141
  - - "~>"
148
142
  - !ruby/object:Gem::Version
149
- version: '1.5'
143
+ version: '1.6'
150
144
  type: :runtime
151
145
  prerelease: false
152
146
  version_requirements: !ruby/object:Gem::Requirement
153
147
  requirements:
154
148
  - - "~>"
155
149
  - !ruby/object:Gem::Version
156
- version: '1.5'
150
+ version: '1.6'
157
151
  - !ruby/object:Gem::Dependency
158
152
  name: mini_mime
159
153
  requirement: !ruby/object:Gem::Requirement
@@ -188,98 +182,84 @@ dependencies:
188
182
  requirements:
189
183
  - - "~>"
190
184
  - !ruby/object:Gem::Version
191
- version: '1.2'
185
+ version: '1.3'
192
186
  type: :runtime
193
187
  prerelease: false
194
188
  version_requirements: !ruby/object:Gem::Requirement
195
189
  requirements:
196
190
  - - "~>"
197
191
  - !ruby/object:Gem::Version
198
- version: '1.2'
192
+ version: '1.3'
199
193
  - !ruby/object:Gem::Dependency
200
194
  name: cucumber-compatibility-kit
201
195
  requirement: !ruby/object:Gem::Requirement
202
196
  requirements:
203
197
  - - "~>"
204
198
  - !ruby/object:Gem::Version
205
- version: '15.0'
199
+ version: '18.0'
206
200
  type: :development
207
201
  prerelease: false
208
202
  version_requirements: !ruby/object:Gem::Requirement
209
203
  requirements:
210
204
  - - "~>"
211
205
  - !ruby/object:Gem::Version
212
- version: '15.0'
206
+ version: '18.0'
213
207
  - !ruby/object:Gem::Dependency
214
208
  name: nokogiri
215
209
  requirement: !ruby/object:Gem::Requirement
216
210
  requirements:
217
211
  - - "~>"
218
212
  - !ruby/object:Gem::Version
219
- version: '1.14'
213
+ version: '1.15'
220
214
  type: :development
221
215
  prerelease: false
222
216
  version_requirements: !ruby/object:Gem::Requirement
223
217
  requirements:
224
218
  - - "~>"
225
219
  - !ruby/object:Gem::Version
226
- version: '1.14'
220
+ version: '1.15'
227
221
  - !ruby/object:Gem::Dependency
228
222
  name: rake
229
223
  requirement: !ruby/object:Gem::Requirement
230
224
  requirements:
231
225
  - - "~>"
232
226
  - !ruby/object:Gem::Version
233
- version: '13.1'
227
+ version: '13.2'
234
228
  type: :development
235
229
  prerelease: false
236
230
  version_requirements: !ruby/object:Gem::Requirement
237
231
  requirements:
238
232
  - - "~>"
239
233
  - !ruby/object:Gem::Version
240
- version: '13.1'
234
+ version: '13.2'
241
235
  - !ruby/object:Gem::Dependency
242
236
  name: rspec
243
237
  requirement: !ruby/object:Gem::Requirement
244
238
  requirements:
245
239
  - - "~>"
246
240
  - !ruby/object:Gem::Version
247
- version: '3.12'
241
+ version: '3.13'
248
242
  type: :development
249
243
  prerelease: false
250
244
  version_requirements: !ruby/object:Gem::Requirement
251
245
  requirements:
252
246
  - - "~>"
253
247
  - !ruby/object:Gem::Version
254
- version: '3.12'
248
+ version: '3.13'
255
249
  - !ruby/object:Gem::Dependency
256
250
  name: rubocop
257
251
  requirement: !ruby/object:Gem::Requirement
258
252
  requirements:
259
253
  - - "~>"
260
254
  - !ruby/object:Gem::Version
261
- version: 1.56.4
262
- type: :development
263
- prerelease: false
264
- version_requirements: !ruby/object:Gem::Requirement
265
- requirements:
266
- - - "~>"
267
- - !ruby/object:Gem::Version
268
- version: 1.56.4
269
- - !ruby/object:Gem::Dependency
270
- name: rubocop-capybara
271
- requirement: !ruby/object:Gem::Requirement
272
- requirements:
273
- - - "~>"
274
- - !ruby/object:Gem::Version
275
- version: 2.19.0
255
+ version: 1.71.0
276
256
  type: :development
277
257
  prerelease: false
278
258
  version_requirements: !ruby/object:Gem::Requirement
279
259
  requirements:
280
260
  - - "~>"
281
261
  - !ruby/object:Gem::Version
282
- version: 2.19.0
262
+ version: 1.71.0
283
263
  - !ruby/object:Gem::Dependency
284
264
  name: rubocop-packaging
285
265
  requirement: !ruby/object:Gem::Requirement
@@ -314,14 +294,14 @@ dependencies:
314
294
  requirements:
315
295
  - - "~>"
316
296
  - !ruby/object:Gem::Version
317
- version: 2.25.0
297
+ version: 3.4.0
318
298
  type: :development
319
299
  prerelease: false
320
300
  version_requirements: !ruby/object:Gem::Requirement
321
301
  requirements:
322
302
  - - "~>"
323
303
  - !ruby/object:Gem::Version
324
- version: 2.25.0
304
+ version: 3.4.0
325
305
  - !ruby/object:Gem::Dependency
326
306
  name: simplecov
327
307
  requirement: !ruby/object:Gem::Requirement
@@ -436,6 +416,7 @@ files:
436
416
  - lib/cucumber/formatter/query/pickle_step_by_test_step.rb
437
417
  - lib/cucumber/formatter/query/step_definitions_by_test_step.rb
438
418
  - lib/cucumber/formatter/query/test_case_started_by_test_case.rb
419
+ - lib/cucumber/formatter/query/test_run_started.rb
439
420
  - lib/cucumber/formatter/rerun.rb
440
421
  - lib/cucumber/formatter/stepdefs.rb
441
422
  - lib/cucumber/formatter/steps.rb
@@ -494,6 +475,7 @@ metadata:
494
475
  documentation_uri: https://www.rubydoc.info/github/cucumber/cucumber-ruby/
495
476
  mailing_list_uri: https://groups.google.com/forum/#!forum/cukes
496
477
  source_code_uri: https://github.com/cucumber/cucumber-ruby
478
+ funding_uri: https://opencollective.com/cucumber
497
479
  post_install_message:
498
480
  rdoc_options:
499
481
  - "--charset=UTF-8"
@@ -503,15 +485,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
503
485
  requirements:
504
486
  - - ">="
505
487
  - !ruby/object:Gem::Version
506
- version: '2.7'
488
+ version: '3.1'
507
489
  required_rubygems_version: !ruby/object:Gem::Requirement
508
490
  requirements:
509
491
  - - ">="
510
492
  - !ruby/object:Gem::Version
511
- version: 3.0.1
493
+ version: 3.2.8
512
494
  requirements: []
513
495
  rubygems_version: 3.4.20
514
496
  signing_key:
515
497
  specification_version: 4
516
- summary: cucumber-9.2.1
498
+ summary: cucumber-10.0.0
517
499
  test_files: []