cucumber 9.0.1 → 9.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -21
  3. data/VERSION +1 -1
  4. data/lib/cucumber/cli/options.rb +8 -8
  5. data/lib/cucumber/deprecate.rb +6 -47
  6. data/lib/cucumber/errors.rb +2 -1
  7. data/lib/cucumber/events/envelope.rb +2 -0
  8. data/lib/cucumber/events/gherkin_source_parsed.rb +2 -0
  9. data/lib/cucumber/events/gherkin_source_read.rb +2 -0
  10. data/lib/cucumber/events/test_case_finished.rb +2 -0
  11. data/lib/cucumber/events/test_case_started.rb +2 -0
  12. data/lib/cucumber/events/test_step_finished.rb +2 -0
  13. data/lib/cucumber/events/test_step_started.rb +2 -0
  14. data/lib/cucumber/events/undefined_parameter_type.rb +2 -0
  15. data/lib/cucumber/file_specs.rb +1 -1
  16. data/lib/cucumber/formatter/ast_lookup.rb +14 -6
  17. data/lib/cucumber/formatter/console.rb +9 -7
  18. data/lib/cucumber/formatter/console_counts.rb +3 -1
  19. data/lib/cucumber/formatter/console_issues.rb +2 -0
  20. data/lib/cucumber/formatter/errors.rb +2 -0
  21. data/lib/cucumber/formatter/html.rb +2 -0
  22. data/lib/cucumber/formatter/http_io.rb +2 -0
  23. data/lib/cucumber/formatter/json.rb +1 -1
  24. data/lib/cucumber/formatter/message_builder.rb +16 -5
  25. data/lib/cucumber/formatter/pretty.rb +7 -3
  26. data/lib/cucumber/formatter/publish_banner_printer.rb +0 -2
  27. data/lib/cucumber/formatter/query/hook_by_test_step.rb +2 -0
  28. data/lib/cucumber/formatter/query/pickle_by_test.rb +2 -0
  29. data/lib/cucumber/formatter/query/pickle_step_by_test_step.rb +2 -0
  30. data/lib/cucumber/formatter/query/step_definitions_by_test_step.rb +2 -0
  31. data/lib/cucumber/formatter/query/test_case_started_by_test_case.rb +2 -0
  32. data/lib/cucumber/formatter/unicode.rb +3 -3
  33. data/lib/cucumber/formatter/url_reporter.rb +2 -0
  34. data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +4 -5
  35. data/lib/cucumber/glue/invoke_in_world.rb +1 -1
  36. data/lib/cucumber/glue/proto_world.rb +18 -23
  37. data/lib/cucumber/glue/registry_and_more.rb +9 -5
  38. data/lib/cucumber/glue/snippet.rb +4 -2
  39. data/lib/cucumber/glue/world_factory.rb +2 -0
  40. data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +2 -0
  41. data/lib/cucumber/multiline_argument/data_table.rb +2 -2
  42. data/lib/cucumber/platform.rb +11 -16
  43. data/lib/cucumber/rake/task.rb +1 -5
  44. data/lib/cucumber/runtime/for_programming_languages.rb +1 -2
  45. data/lib/cucumber/runtime/meta_message_builder.rb +4 -2
  46. data/lib/cucumber/runtime/user_interface.rb +2 -2
  47. data/lib/cucumber/runtime.rb +3 -3
  48. data/lib/cucumber/step_match.rb +1 -1
  49. data/lib/cucumber/term/ansicolor.rb +1 -1
  50. data/lib/cucumber/term/banner.rb +2 -0
  51. metadata +61 -83
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ad3c44ae94fec4bd2debdacbc00a745da83659ca8f1580342c33da089137b7d1
4
- data.tar.gz: 4c62a3b49d680e3a79e7584e8a985a5c1fb327db9e4d9dcd227ea3c025129520
3
+ metadata.gz: 757154e702f016f75cb37fc68451c18a9a9e742957a197055e127cbe5ebefac6
4
+ data.tar.gz: '010178d0bb40315be3e1c0923c569ec9f5a8d4684da6446b7a396c45da03371c'
5
5
  SHA512:
6
- metadata.gz: 61a3cb620e77ea2f31e5261fa4c00e3051d812cad99795fe19ecd3374d4de8361e3312ad8bf9eae1e28ef103f399ab015188b0471530483c61665320c55d4b49
7
- data.tar.gz: 12dbf85b1b6e6e17b00746250ed00306b72b18e1e4bde4a3f559a650adb6a3be3998f8d28523cbe7db55b329643c7efb288e4874714cacd8c22a3d16bdea340a
6
+ metadata.gz: f9c2e02d96f40e5564643f994be4cb5ac6bc5f36849551d5a5f102225a4e62526efabf00d14b961f59a954fdf41345f06c45c4469913bfae93d775c33ac2f5e0
7
+ data.tar.gz: c20336a8e85dc299322e0a5cd92ba39fc7b5091195d7003b26ed014d58a3dfeb2ae8f0be6a88a6f26238589dc15acb40103049d49415431e075a1bcda4f86487
data/README.md CHANGED
@@ -1,15 +1,11 @@
1
- <p align="center">
2
- <img src="./.github/img/cucumber-open-logo.png" alt="Cucumber Open - Supported by Smartbear" width="428" />
3
- </p>
1
+ <img src="docs/img/cucumber-open-logo.png" alt="Cucumber Open - Supported by Smartbear" width="428" />
4
2
 
5
3
  # Cucumber
6
4
 
7
5
  [![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://vshymanskyy.github.io/StandWithUkraine)
8
6
  [![OpenCollective](https://opencollective.com/cucumber/backers/badge.svg)](https://opencollective.com/cucumber)
9
7
  [![OpenCollective](https://opencollective.com/cucumber/sponsors/badge.svg)](https://opencollective.com/cucumber)
10
- [![pull requests](https://oselvar.com/api/badge?label=pull%20requests&csvUrl=https%3A%2F%2Fraw.githubusercontent.com%2Fcucumber%2Foselvar-github-metrics%2Fmain%2Fdata%2Fcucumber%2Fcucumber-ruby%2FpullRequests.csv)](https://oselvar.com/github/cucumber/oselvar-github-metrics/main/cucumber/cucumber-ruby)
11
- [![issues](https://oselvar.com/api/badge?label=issues&csvUrl=https%3A%2F%2Fraw.githubusercontent.com%2Fcucumber%2Foselvar-github-metrics%2Fmain%2Fdata%2Fcucumber%2Fcucumber-ruby%2Fissues.csv)](https://oselvar.com/github/cucumber/oselvar-github-metrics/main/cucumber/cucumber-ruby)
12
- [![Test cucumber](https://github.com/cucumber/cucumber-ruby/actions/workflows/cucumber-ruby.yml/badge.svg)](https://github.com/cucumber/cucumber-ruby/actions/workflows/cucumber-ruby.yml)
8
+ [![Test cucumber](https://github.com/cucumber/cucumber-ruby/actions/workflows/test.yaml/badge.svg)](https://github.com/cucumber/cucumber-ruby/actions/workflows/test.yaml)
13
9
  [![Code Climate](https://codeclimate.com/github/cucumber/cucumber-ruby.svg)](https://codeclimate.com/github/cucumber/cucumber-ruby)
14
10
  [![Coverage Status](https://coveralls.io/repos/cucumber/cucumber-ruby/badge.svg?branch=main)](https://coveralls.io/r/cucumber/cucumber-ruby?branch=main)
15
11
 
@@ -18,9 +14,7 @@ written in plain language, they can be read by anyone on your team. Because they
18
14
  read by anyone, you can use them to help improve communication, collaboration and trust on
19
15
  your team.
20
16
 
21
- <p align="center">
22
- <img src="./.github/img/gherkin-example.png" alt="Cucumber Gherkin Example" width="728" />
23
- </p>
17
+ <img src="docs/img/gherkin-example.png" alt="Cucumber Gherkin Example" width="728" />
24
18
 
25
19
  This is the Ruby implementation of Cucumber. Cucumber is also available for [JavaScript](https://github.com/cucumber/cucumber-js),
26
20
  [Java](https://github.com/cucumber/cucumber-jvm), and a lot of other languages. You can find a list of implementations here: https://cucumber.io/docs/installation/.
@@ -56,13 +50,11 @@ Later in this document, bundler is considered being used so all commands are usi
56
50
  - Ruby 3.0
57
51
  - Ruby 2.7
58
52
  - TruffleRuby 22.0.0+
59
- - JRuby (with [some limitations](https://github.com/cucumber/cucumber-ruby/blob/main/docs/jruby-limitations.md))
60
- - 9.4
53
+ - JRuby 9.4+ (with [some limitations](https://github.com/cucumber/cucumber-ruby/blob/main/docs/jruby-limitations.md))
61
54
 
62
55
  ### Ruby on Rails
63
56
 
64
- Using Ruby on Rails? You can use [cucumber-rails](https://github.com/cucumber/cucumber-rails)
65
- to bring Cucumber into your Rails project.
57
+ Using Ruby on Rails? You can use [cucumber-rails](https://github.com/cucumber/cucumber-rails) to bring Cucumber into your Rails project.
66
58
 
67
59
  ## Usage
68
60
 
@@ -109,19 +101,20 @@ And a file named `steps.rb` in `features/step_definitions` with:
109
101
  ```ruby
110
102
  # features/step_definitions/steps.rb
111
103
 
112
- Given("this will pass") do
104
+ Given('this will pass') do
113
105
  @this_will_pass = true
114
106
  end
115
107
 
116
- Given("this will fail") do
108
+ Given('this will fail') do
117
109
  @this_will_pass = false
118
110
  end
119
111
 
120
- When("I do an action") do
112
+ When('I do an action') do
113
+ :no_op
121
114
  end
122
115
 
123
116
  Then("some results should be there") do
124
- expect(@this_will_pass)
117
+ expect(@this_will_pass).to be true
125
118
  end
126
119
  ```
127
120
 
@@ -135,9 +128,9 @@ To execute a single feature file:
135
128
 
136
129
  To execute a single example, indicates the line of the name of the example:
137
130
 
138
- $ bundle exec cucumber features/rule.feature:7
131
+ $ bundle exec cucumber features/rule.feature:5
139
132
 
140
- To summarize the results on the standard output, and writte a HTML report on disk:
133
+ To summarize the results on the standard output, and generate a HTML report on disk:
141
134
 
142
135
  $ bundle exec cucumber --format summary --format html --out report.html
143
136
 
@@ -145,8 +138,7 @@ For more command line options
145
138
 
146
139
  $ bundle exec cucumber --help
147
140
 
148
- You can also find documentation on the command line possibilities in
149
- [features/docs/cli](features/docs/cli).
141
+ You can also find documentation on the command line possibilities in [features/docs/cli](features/docs/cli).
150
142
 
151
143
  ## Documentation and support
152
144
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 9.0.1
1
+ 9.1.0
@@ -50,13 +50,13 @@ module Cucumber
50
50
  FORMAT_HELP = (BUILTIN_FORMATS.keys.sort.map do |key|
51
51
  " #{key}#{' ' * (max - key.length)} : #{BUILTIN_FORMATS[key][1]}"
52
52
  end) + FORMAT_HELP_MSG
53
- PROFILE_SHORT_FLAG = '-p'.freeze
54
- NO_PROFILE_SHORT_FLAG = '-P'.freeze
55
- PROFILE_LONG_FLAG = '--profile'.freeze
56
- NO_PROFILE_LONG_FLAG = '--no-profile'.freeze
57
- FAIL_FAST_FLAG = '--fail-fast'.freeze
58
- RETRY_FLAG = '--retry'.freeze
59
- RETRY_TOTAL_FLAG = '--retry-total'.freeze
53
+ PROFILE_SHORT_FLAG = '-p'
54
+ NO_PROFILE_SHORT_FLAG = '-P'
55
+ PROFILE_LONG_FLAG = '--profile'
56
+ NO_PROFILE_LONG_FLAG = '--no-profile'
57
+ FAIL_FAST_FLAG = '--fail-fast'
58
+ RETRY_FLAG = '--retry'
59
+ RETRY_TOTAL_FLAG = '--retry-total'
60
60
  OPTIONS_WITH_ARGS = [
61
61
  '-r', '--require', '--i18n-keywords', '-f', '--format', '-o',
62
62
  '--out', '-t', '--tags', '-n', '--name', '-e', '--exclude',
@@ -64,7 +64,7 @@ module Cucumber
64
64
  '-l', '--lines', '--port', '-I', '--snippet-type'
65
65
  ].freeze
66
66
  ORDER_TYPES = %w[defined random].freeze
67
- TAG_LIMIT_MATCHER = /(?<tag_name>@\w+):(?<limit>\d+)/x
67
+ TAG_LIMIT_MATCHER = /(?<tag_name>@\w+):(?<limit>\d+)/x.freeze
68
68
 
69
69
  def self.parse(args, out_stream, error_stream, options = {})
70
70
  new(out_stream, error_stream, options).parse!(args)
@@ -4,52 +4,11 @@ require 'cucumber/platform'
4
4
  require 'cucumber/gherkin/formatter/ansi_escapes'
5
5
 
6
6
  module Cucumber
7
- module Deprecate
8
- class AnsiString
9
- include Cucumber::Gherkin::Formatter::AnsiEscapes
10
-
11
- def self.failure_message(message)
12
- AnsiString.new.failure_message(message)
13
- end
14
-
15
- def failure_message(message)
16
- failed + message + reset
17
- end
18
- end
19
-
20
- class CliOption
21
- def self.deprecate(stream, option, message, remove_after_version)
22
- return if stream.nil?
23
-
24
- stream.puts(
25
- AnsiString.failure_message(
26
- "\nWARNING: #{option} is deprecated" \
27
- " and will be removed after version #{remove_after_version}.\n#{message}.\n"
28
- )
29
- )
30
- end
31
- end
32
-
33
- module ForUsers
34
- def self.call(message, method, remove_after_version)
35
- $stderr.puts AnsiString.failure_message(
36
- "\nWARNING: ##{method} is deprecated" \
37
- " and will be removed after version #{remove_after_version}. #{message}.\n" \
38
- "(Called from #{caller(3..3).first})"
39
- )
40
- end
41
- end
42
-
43
- module ForDevelopers
44
- def self.call(_message, _method, remove_after_version)
45
- raise "This method is due for removal after version #{remove_after_version}" if Cucumber::VERSION >= remove_after_version
46
- end
47
- end
48
-
49
- STRATEGY = $PROGRAM_NAME =~ /rspec$/ ? ForDevelopers : ForUsers
50
- end
51
-
52
- def self.deprecate(*args)
53
- Deprecate::STRATEGY.call(*args)
7
+ def self.deprecate(message, method, remove_after_version)
8
+ $stderr.puts(
9
+ "\nWARNING: ##{method} is deprecated" \
10
+ " and will be removed after version #{remove_after_version}. #{message}.\n" \
11
+ "(Called from #{caller(3..3).first})"
12
+ )
54
13
  end
55
14
  end
@@ -35,7 +35,8 @@ module Cucumber
35
35
  # Raised when a step matches 2 or more StepDefinitions
36
36
  class Ambiguous < StandardError
37
37
  def initialize(step_name, step_definitions, used_guess)
38
- message = String.new # rubocop:disable Style/EmptyLiteral
38
+ # TODO: [LH] - Just use a heredoc here to fix this up
39
+ message = String.new
39
40
  message << "Ambiguous match of \"#{step_name}\":\n\n"
40
41
  message << step_definitions.map(&:backtrace_line).join("\n")
41
42
  message << "\n\n"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/core/events'
2
4
 
3
5
  module Cucumber
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/core/events'
2
4
 
3
5
  module Cucumber
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/core/events'
2
4
 
3
5
  module Cucumber
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/core/events'
2
4
 
3
5
  module Cucumber
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/core/events'
2
4
 
3
5
  module Cucumber
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/core/events'
2
4
 
3
5
  module Cucumber
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/core/events'
2
4
 
3
5
  module Cucumber
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/core/events'
2
4
 
3
5
  module Cucumber
@@ -5,7 +5,7 @@ require 'cucumber/core/test/location'
5
5
 
6
6
  module Cucumber
7
7
  class FileSpecs
8
- FILE_COLON_LINE_PATTERN = /^([\w\W]*?)(?::([\d:]+))?$/ # :nodoc:
8
+ FILE_COLON_LINE_PATTERN = /^([\w\W]*?)(?::([\d:]+))?$/.freeze # :nodoc:
9
9
 
10
10
  def initialize(file_specs)
11
11
  Cucumber.logger.debug("Features:\n")
@@ -112,16 +112,24 @@ module Cucumber
112
112
  if child.respond_to?(:rule) && child.rule
113
113
  process_scenario_container(child.rule)
114
114
  elsif child.respond_to?(:scenario) && child.scenario
115
- child.scenario.steps.each do |step|
116
- @lookup_hash[step.location.line] = StepSource.new(:Step, step)
117
- end
115
+ store_scenario_source_steps(child.scenario)
118
116
  elsif !child.background.nil?
119
- child.background.steps.each do |step|
120
- @lookup_hash[step.location.line] = StepSource.new(:Step, step)
121
- end
117
+ store_background_source_steps(child.background)
122
118
  end
123
119
  end
124
120
  end
121
+
122
+ def store_scenario_source_steps(scenario)
123
+ scenario.steps.each do |step|
124
+ @lookup_hash[step.location.line] = StepSource.new(:Step, step)
125
+ end
126
+ end
127
+
128
+ def store_background_source_steps(background)
129
+ background.steps.each do |step|
130
+ @lookup_hash[step.location.line] = StepSource.new(:Step, step)
131
+ end
132
+ end
125
133
  end
126
134
 
127
135
  KeywordSearchNode = Struct.new(:keyword, :previous_node)
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Metrics/ModuleLength
4
-
5
3
  require 'cucumber/formatter/ansicolor'
6
4
  require 'cucumber/formatter/duration'
7
5
  require 'cucumber/gherkin/i18n'
@@ -48,7 +46,7 @@ module Cucumber
48
46
  def format_string(o, status)
49
47
  fmt = format_for(status)
50
48
  o.to_s.split("\n").map do |line|
51
- if Proc == fmt.class
49
+ if fmt.instance_of?(Proc)
52
50
  fmt.call(line)
53
51
  else
54
52
  fmt % line
@@ -108,7 +106,7 @@ module Cucumber
108
106
 
109
107
  # http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/10655
110
108
  def linebreaks(msg, max)
111
- return msg unless max && max > 0
109
+ return msg unless max.positive?
112
110
 
113
111
  msg.gsub(/.{1,#{max}}(?:\s|\Z)/) do
114
112
  (Regexp.last_match(0) + 5.chr).gsub(/\n\005/, "\n").gsub(/\005/, "\n")
@@ -171,12 +169,17 @@ module Cucumber
171
169
  end
172
170
  end
173
171
 
174
- def attach(src, media_type)
172
+ def attach(src, media_type, filename)
175
173
  return unless media_type == 'text/x.cucumber.log+plain'
176
174
  return unless @io
177
175
 
178
176
  @io.puts
179
- @io.puts(format_string(src, :tag))
177
+ if filename
178
+ @io.puts("#{filename}: #{format_string(src, :tag)}")
179
+ else
180
+ @io.puts(format_string(src, :tag))
181
+ end
182
+
180
183
  @io.flush
181
184
  end
182
185
 
@@ -262,4 +265,3 @@ module Cucumber
262
265
  end
263
266
  end
264
267
  end
265
- # rubocop:enable Metrics/ModuleLength
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/formatter/console'
2
4
 
3
5
  module Cucumber
@@ -30,7 +32,7 @@ module Cucumber
30
32
 
31
33
  def status_counts(summary)
32
34
  counts = Core::Test::Result::TYPES.map { |status| [status, summary.total(status)] }
33
- counts = counts.select { |_status, count| count > 0 }
35
+ counts = counts.select { |_status, count| count.positive? }
34
36
  counts = counts.map { |status, count| format_string("#{count} #{status}", status) }
35
37
  "(#{counts.join(', ')})" if counts.any?
36
38
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/formatter/console'
2
4
 
3
5
  module Cucumber
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Cucumber
2
4
  module Formatter
3
5
  class TestCaseUnknownError < StandardError; end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/formatter/io'
2
4
  require 'cucumber/html_formatter'
3
5
  require 'cucumber/formatter/message_builder'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'net/http'
2
4
  require 'tempfile'
3
5
  require 'shellwords'
@@ -85,7 +85,7 @@ module Cucumber
85
85
  @io.write(JSON.pretty_generate(@feature_hashes))
86
86
  end
87
87
 
88
- def attach(src, mime_type)
88
+ def attach(src, mime_type, _filename)
89
89
  if mime_type == 'text/x.cucumber.log+plain'
90
90
  test_step_output << src
91
91
  return
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'base64'
2
4
  require 'cucumber/formatter/backtrace_filter'
3
5
  require 'cucumber/formatter/query/hook_by_test_step'
@@ -40,11 +42,12 @@ module Cucumber
40
42
  raise 'To be implemented'
41
43
  end
42
44
 
43
- def attach(src, media_type)
45
+ def attach(src, media_type, filename)
44
46
  attachment_data = {
45
47
  test_step_id: @current_test_step_id,
46
48
  test_case_started_id: @current_test_case_started_id,
47
- media_type: media_type
49
+ media_type: media_type,
50
+ file_name: filename
48
51
  }
49
52
 
50
53
  if media_type.start_with?('text/')
@@ -190,10 +193,13 @@ module Cucumber
190
193
 
191
194
  result_message = result.to_message
192
195
  if result.failed? || result.pending?
196
+ message_element = result.failed? ? result.exception : result
197
+
193
198
  result_message = Cucumber::Messages::TestStepResult.new(
194
199
  status: result_message.status,
195
200
  duration: result_message.duration,
196
- message: create_error_message(result)
201
+ message: create_error_message(message_element),
202
+ exception: create_exception_object(result, message_element)
197
203
  )
198
204
  end
199
205
 
@@ -209,12 +215,17 @@ module Cucumber
209
215
  output_envelope(message)
210
216
  end
211
217
 
212
- def create_error_message(result)
213
- message_element = result.failed? ? result.exception : result
218
+ def create_error_message(message_element)
214
219
  message = "#{message_element.message} (#{message_element.class})"
215
220
  ([message] + message_element.backtrace).join("\n")
216
221
  end
217
222
 
223
+ def create_exception_object(result, message_element)
224
+ return unless result.failed?
225
+
226
+ Cucumber::Messages::Exception.from_h({ type: message_element.class, message: message_element.message })
227
+ end
228
+
218
229
  def on_test_case_finished(event)
219
230
  message = Cucumber::Messages::Envelope.new(
220
231
  test_case_finished: Cucumber::Messages::TestCaseFinished.new(
@@ -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,10 +140,14 @@ 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
@@ -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
@@ -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
@@ -67,11 +67,10 @@ module Cucumber
67
67
  'tag' => 'cyan'
68
68
  )
69
69
 
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
70
+ # Example: export GHERKIN_COLORS="passed=red:failed=yellow"
71
+ ENV.fetch('GHERKIN_COLORS', '').split(':').each do |pair|
72
+ rule, colour = pair.split('=')
73
+ ALIASES[colour] = rule
75
74
  end
76
75
 
77
76
  ALIASES.each_key do |key|
@@ -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}."
@@ -7,7 +7,7 @@ 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
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
@@ -506,7 +506,7 @@ module Cucumber
506
506
  end
507
507
 
508
508
  def ensure_table(table_or_array) # :nodoc:
509
- return table_or_array if DataTable == table_or_array.class
509
+ return table_or_array if table_or_array.instance_of?(DataTable)
510
510
 
511
511
  DataTable.from(table_or_array)
512
512
  end
@@ -591,7 +591,7 @@ module Cucumber
591
591
  end
592
592
 
593
593
  def ==(other)
594
- SurplusCell == other.class || value == other.value
594
+ other.class == SurplusCell || value == other.value
595
595
  end
596
596
 
597
597
  def eql?(other)
@@ -1,27 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Detect the platform we're running on so we can tweak behaviour
4
- # in various places.
3
+ # Detect the platform we're running on so we can tweak behaviour in various places.
5
4
  require 'rbconfig'
6
5
  require 'cucumber/core/platform'
7
6
 
8
7
  module Cucumber
9
- unless defined?(Cucumber::VERSION)
10
- VERSION = File.read(File.expand_path('../../VERSION', __dir__)).strip
11
- BINARY = File.expand_path("#{File.dirname(__FILE__)}/../../bin/cucumber")
12
- LIBDIR = File.expand_path("#{File.dirname(__FILE__)}/../../lib")
13
- RAILS = defined?(Rails)
14
- RUBY_BINARY = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
15
- RUBY = defined? RUBY_VERSION
8
+ VERSION = File.read(File.expand_path('../../VERSION', __dir__)).strip
9
+ BINARY = File.expand_path("#{File.dirname(__FILE__)}/../../bin/cucumber")
10
+ LIBDIR = File.expand_path("#{File.dirname(__FILE__)}/../../lib")
11
+ RUBY_BINARY = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
16
12
 
17
- class << self
18
- attr_accessor :use_full_backtrace
13
+ class << self
14
+ attr_accessor :use_full_backtrace
19
15
 
20
- # @private
21
- def file_mode(mode, encoding = 'UTF-8')
22
- "#{mode}:#{encoding}"
23
- end
16
+ # @private
17
+ def file_mode(mode, encoding = 'UTF-8')
18
+ "#{mode}:#{encoding}"
24
19
  end
25
- self.use_full_backtrace = false
26
20
  end
21
+ self.use_full_backtrace = false
27
22
  end
@@ -2,11 +2,7 @@
2
2
 
3
3
  require 'cucumber/platform'
4
4
  require 'cucumber/gherkin/formatter/ansi_escapes'
5
- begin
6
- # Support Rake > 0.8.7
7
- require 'rake/dsl_definition'
8
- rescue LoadError
9
- end
5
+ require 'rake/dsl_definition'
10
6
 
11
7
  module Cucumber
12
8
  module Rake
@@ -7,8 +7,7 @@ module Cucumber
7
7
  class Runtime
8
8
  # This is what a programming language will consider to be a runtime.
9
9
  #
10
- # It's a thin class that directs the handul of methods needed by the
11
- # programming languages to the right place.
10
+ # It's a thin class that directs the handful of methods needed by the programming languages to the right place
12
11
  class ForProgrammingLanguages
13
12
  extend Forwardable
14
13
 
@@ -1,16 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/messages'
2
4
  require 'cucumber/ci_environment'
3
5
 
4
6
  module Cucumber
5
7
  class Runtime
6
- # Builder to instanciate a Cucumber::Messages::Meta message filled-in with
8
+ # Builder to instantiate a Cucumber::Messages::Meta message filled-in with
7
9
  # the runtime meta-data:
8
10
  # - protocol version: the version of the Cucumber::Messages protocol
9
11
  # - implementation: the name and version of the implementation (e.g. cucumber-ruby 8.0.0)
10
12
  # - runtime: the name and version of the runtime (e.g. ruby 3.0.1)
11
13
  # - os: the name and version of the operating system (e.g. linux 3.13.0-45-generic)
12
14
  # - cpu: the name of the CPU (e.g. x86_64)
13
- # - ci: informtion about the CI environment if any, including:
15
+ # - ci: information about the CI environment if any, including:
14
16
  # - name: the name of the CI environment (e.g. Jenkins)
15
17
  # - url: the URL of the CI environment (e.g. https://ci.example.com)
16
18
  # - build_number: the build number of the CI environment (e.g. 123)
@@ -41,8 +41,8 @@ module Cucumber
41
41
  # be a path to a file, or if it's an image it may also be a Base64 encoded image.
42
42
  # The embedded data may or may not be ignored, depending on what kind of formatter(s) are active.
43
43
  #
44
- def attach(src, media_type)
45
- @visitor.attach(src, media_type)
44
+ def attach(src, media_type, filename)
45
+ @visitor.attach(src, media_type, filename)
46
46
  end
47
47
 
48
48
  private
@@ -112,7 +112,7 @@ module Cucumber
112
112
 
113
113
  def failure?
114
114
  if @configuration.wip?
115
- summary_report.test_cases.total_passed > 0
115
+ summary_report.test_cases.total_passed.positive?
116
116
  else
117
117
  !summary_report.ok?(@configuration.strict)
118
118
  end
@@ -150,8 +150,8 @@ module Cucumber
150
150
  end
151
151
 
152
152
  class NormalisedEncodingFile
153
- COMMENT_OR_EMPTY_LINE_PATTERN = /^\s*#|^\s*$/ # :nodoc:
154
- ENCODING_PATTERN = /^\s*#\s*encoding\s*:\s*([^\s]+)/ # :nodoc:
153
+ COMMENT_OR_EMPTY_LINE_PATTERN = /^\s*#|^\s*$/.freeze # :nodoc:
154
+ ENCODING_PATTERN = /^\s*#\s*encoding\s*:\s*([^\s]+)/.freeze # :nodoc:
155
155
 
156
156
  def self.read(path)
157
157
  new(path).read
@@ -78,7 +78,7 @@ module Cucumber
78
78
 
79
79
  replacement = if block_given?
80
80
  yield(group.value)
81
- elsif Proc == format.class
81
+ elsif format.instance_of?(Proc)
82
82
  format.call(group.value)
83
83
  else
84
84
  format % group.value
@@ -63,7 +63,7 @@ module Cucumber
63
63
 
64
64
  # Regular expression that is used to scan for ANSI-sequences while
65
65
  # uncoloring strings.
66
- COLORED_REGEXP = /\e\[(?:[34][0-7]|[0-9])?m/
66
+ COLORED_REGEXP = /\e\[(?:[34][0-7]|[0-9])?m/.freeze
67
67
 
68
68
  @coloring = true
69
69
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/term/ansicolor'
2
4
 
3
5
  module Cucumber
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.0.1
4
+ version: 9.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aslak Hellesøy
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2023-09-01 00:00:00.000000000 Z
13
+ date: 2023-11-14 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: builder
@@ -58,60 +58,48 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '11.0'
62
- - - ">="
63
- - !ruby/object:Gem::Version
64
- version: 11.0.0
61
+ version: '12.0'
65
62
  type: :runtime
66
63
  prerelease: false
67
64
  version_requirements: !ruby/object:Gem::Requirement
68
65
  requirements:
69
66
  - - "~>"
70
67
  - !ruby/object:Gem::Version
71
- version: '11.0'
72
- - - ">="
73
- - !ruby/object:Gem::Version
74
- version: 11.0.0
68
+ version: '12.0'
75
69
  - !ruby/object:Gem::Dependency
76
70
  name: cucumber-cucumber-expressions
77
71
  requirement: !ruby/object:Gem::Requirement
78
72
  requirements:
79
73
  - - "~>"
80
74
  - !ruby/object:Gem::Version
81
- version: '16.1'
82
- - - ">="
83
- - !ruby/object:Gem::Version
84
- version: 16.1.2
75
+ version: '17.0'
85
76
  type: :runtime
86
77
  prerelease: false
87
78
  version_requirements: !ruby/object:Gem::Requirement
88
79
  requirements:
89
80
  - - "~>"
90
81
  - !ruby/object:Gem::Version
91
- version: '16.1'
92
- - - ">="
93
- - !ruby/object:Gem::Version
94
- version: 16.1.2
82
+ version: '17.0'
95
83
  - !ruby/object:Gem::Dependency
96
84
  name: cucumber-gherkin
97
85
  requirement: !ruby/object:Gem::Requirement
98
86
  requirements:
99
87
  - - ">="
100
88
  - !ruby/object:Gem::Version
101
- version: 23.0.1
89
+ version: '24'
102
90
  - - "<"
103
91
  - !ruby/object:Gem::Version
104
- version: 26.2.1
92
+ version: '27'
105
93
  type: :runtime
106
94
  prerelease: false
107
95
  version_requirements: !ruby/object:Gem::Requirement
108
96
  requirements:
109
97
  - - ">="
110
98
  - !ruby/object:Gem::Version
111
- version: 23.0.1
99
+ version: '24'
112
100
  - - "<"
113
101
  - !ruby/object:Gem::Version
114
- version: 26.2.1
102
+ version: '27'
115
103
  - !ruby/object:Gem::Dependency
116
104
  name: cucumber-html-formatter
117
105
  requirement: !ruby/object:Gem::Requirement
@@ -138,7 +126,7 @@ dependencies:
138
126
  requirements:
139
127
  - - ">="
140
128
  - !ruby/object:Gem::Version
141
- version: '18'
129
+ version: '19'
142
130
  - - "<"
143
131
  - !ruby/object:Gem::Version
144
132
  version: '23'
@@ -148,7 +136,7 @@ dependencies:
148
136
  requirements:
149
137
  - - ">="
150
138
  - !ruby/object:Gem::Version
151
- version: '18'
139
+ version: '19'
152
140
  - - "<"
153
141
  - !ruby/object:Gem::Version
154
142
  version: '23'
@@ -238,20 +226,14 @@ dependencies:
238
226
  requirements:
239
227
  - - "~>"
240
228
  - !ruby/object:Gem::Version
241
- version: '9.2'
242
- - - ">="
243
- - !ruby/object:Gem::Version
244
- version: 9.2.1
229
+ version: '14.0'
245
230
  type: :development
246
231
  prerelease: false
247
232
  version_requirements: !ruby/object:Gem::Requirement
248
233
  requirements:
249
234
  - - "~>"
250
235
  - !ruby/object:Gem::Version
251
- version: '9.2'
252
- - - ">="
253
- - !ruby/object:Gem::Version
254
- version: 9.2.1
236
+ version: '14.0'
255
237
  - !ruby/object:Gem::Dependency
256
238
  name: nokogiri
257
239
  requirement: !ruby/object:Gem::Requirement
@@ -272,26 +254,6 @@ dependencies:
272
254
  - - ">="
273
255
  - !ruby/object:Gem::Version
274
256
  version: 1.13.6
275
- - !ruby/object:Gem::Dependency
276
- name: pry
277
- requirement: !ruby/object:Gem::Requirement
278
- requirements:
279
- - - "~>"
280
- - !ruby/object:Gem::Version
281
- version: '0.14'
282
- - - ">="
283
- - !ruby/object:Gem::Version
284
- version: 0.14.1
285
- type: :development
286
- prerelease: false
287
- version_requirements: !ruby/object:Gem::Requirement
288
- requirements:
289
- - - "~>"
290
- - !ruby/object:Gem::Version
291
- version: '0.14'
292
- - - ">="
293
- - !ruby/object:Gem::Version
294
- version: 0.14.1
295
257
  - !ruby/object:Gem::Dependency
296
258
  name: rake
297
259
  requirement: !ruby/object:Gem::Requirement
@@ -336,16 +298,30 @@ dependencies:
336
298
  name: rubocop
337
299
  requirement: !ruby/object:Gem::Requirement
338
300
  requirements:
339
- - - '='
301
+ - - "~>"
340
302
  - !ruby/object:Gem::Version
341
- version: 1.43.0
303
+ version: 1.56.4
342
304
  type: :development
343
305
  prerelease: false
344
306
  version_requirements: !ruby/object:Gem::Requirement
345
307
  requirements:
346
- - - '='
308
+ - - "~>"
309
+ - !ruby/object:Gem::Version
310
+ version: 1.56.4
311
+ - !ruby/object:Gem::Dependency
312
+ name: rubocop-capybara
313
+ requirement: !ruby/object:Gem::Requirement
314
+ requirements:
315
+ - - "~>"
316
+ - !ruby/object:Gem::Version
317
+ version: 2.19.0
318
+ type: :development
319
+ prerelease: false
320
+ version_requirements: !ruby/object:Gem::Requirement
321
+ requirements:
322
+ - - "~>"
347
323
  - !ruby/object:Gem::Version
348
- version: 1.43.0
324
+ version: 2.19.0
349
325
  - !ruby/object:Gem::Dependency
350
326
  name: rubocop-packaging
351
327
  requirement: !ruby/object:Gem::Requirement
@@ -361,23 +337,45 @@ dependencies:
361
337
  - !ruby/object:Gem::Version
362
338
  version: 0.5.2
363
339
  - !ruby/object:Gem::Dependency
364
- name: simplecov
340
+ name: rubocop-rake
365
341
  requirement: !ruby/object:Gem::Requirement
366
342
  requirements:
367
343
  - - "~>"
368
344
  - !ruby/object:Gem::Version
369
- version: '0.22'
370
- - - ">="
345
+ version: 0.6.0
346
+ type: :development
347
+ prerelease: false
348
+ version_requirements: !ruby/object:Gem::Requirement
349
+ requirements:
350
+ - - "~>"
371
351
  - !ruby/object:Gem::Version
372
- version: 0.22.0
352
+ version: 0.6.0
353
+ - !ruby/object:Gem::Dependency
354
+ name: rubocop-rspec
355
+ requirement: !ruby/object:Gem::Requirement
356
+ requirements:
357
+ - - "~>"
358
+ - !ruby/object:Gem::Version
359
+ version: 2.24.1
373
360
  type: :development
374
361
  prerelease: false
375
362
  version_requirements: !ruby/object:Gem::Requirement
376
363
  requirements:
377
364
  - - "~>"
378
365
  - !ruby/object:Gem::Version
379
- version: '0.22'
380
- - - ">="
366
+ version: 2.24.1
367
+ - !ruby/object:Gem::Dependency
368
+ name: simplecov
369
+ requirement: !ruby/object:Gem::Requirement
370
+ requirements:
371
+ - - "~>"
372
+ - !ruby/object:Gem::Version
373
+ version: 0.22.0
374
+ type: :development
375
+ prerelease: false
376
+ version_requirements: !ruby/object:Gem::Requirement
377
+ requirements:
378
+ - - "~>"
381
379
  - !ruby/object:Gem::Version
382
380
  version: 0.22.0
383
381
  - !ruby/object:Gem::Dependency
@@ -440,26 +438,6 @@ dependencies:
440
438
  - - ">="
441
439
  - !ruby/object:Gem::Version
442
440
  version: 1.8.1
443
- - !ruby/object:Gem::Dependency
444
- name: octokit
445
- requirement: !ruby/object:Gem::Requirement
446
- requirements:
447
- - - "~>"
448
- - !ruby/object:Gem::Version
449
- version: '6.0'
450
- - - ">="
451
- - !ruby/object:Gem::Version
452
- version: 6.1.0
453
- type: :development
454
- prerelease: false
455
- version_requirements: !ruby/object:Gem::Requirement
456
- requirements:
457
- - - "~>"
458
- - !ruby/object:Gem::Version
459
- version: '6.0'
460
- - - ">="
461
- - !ruby/object:Gem::Version
462
- version: 6.1.0
463
441
  - !ruby/object:Gem::Dependency
464
442
  name: capybara
465
443
  requirement: !ruby/object:Gem::Requirement
@@ -689,5 +667,5 @@ requirements: []
689
667
  rubygems_version: 3.3.5
690
668
  signing_key:
691
669
  specification_version: 4
692
- summary: cucumber-9.0.1
670
+ summary: cucumber-9.1.0
693
671
  test_files: []