cucumber 9.0.1 → 9.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.
- checksums.yaml +4 -4
- data/README.md +13 -21
- data/VERSION +1 -1
- data/lib/cucumber/cli/options.rb +8 -8
- data/lib/cucumber/deprecate.rb +6 -47
- data/lib/cucumber/errors.rb +2 -1
- data/lib/cucumber/events/envelope.rb +2 -0
- data/lib/cucumber/events/gherkin_source_parsed.rb +2 -0
- data/lib/cucumber/events/gherkin_source_read.rb +2 -0
- data/lib/cucumber/events/test_case_finished.rb +2 -0
- data/lib/cucumber/events/test_case_started.rb +2 -0
- data/lib/cucumber/events/test_step_finished.rb +2 -0
- data/lib/cucumber/events/test_step_started.rb +2 -0
- data/lib/cucumber/events/undefined_parameter_type.rb +2 -0
- data/lib/cucumber/file_specs.rb +1 -1
- data/lib/cucumber/formatter/ast_lookup.rb +14 -6
- data/lib/cucumber/formatter/console.rb +9 -7
- data/lib/cucumber/formatter/console_counts.rb +3 -1
- data/lib/cucumber/formatter/console_issues.rb +2 -0
- data/lib/cucumber/formatter/errors.rb +2 -0
- data/lib/cucumber/formatter/html.rb +2 -0
- data/lib/cucumber/formatter/http_io.rb +2 -0
- data/lib/cucumber/formatter/json.rb +1 -1
- data/lib/cucumber/formatter/message_builder.rb +16 -5
- data/lib/cucumber/formatter/pretty.rb +7 -3
- data/lib/cucumber/formatter/publish_banner_printer.rb +0 -2
- data/lib/cucumber/formatter/query/hook_by_test_step.rb +2 -0
- data/lib/cucumber/formatter/query/pickle_by_test.rb +2 -0
- data/lib/cucumber/formatter/query/pickle_step_by_test_step.rb +2 -0
- data/lib/cucumber/formatter/query/step_definitions_by_test_step.rb +2 -0
- data/lib/cucumber/formatter/query/test_case_started_by_test_case.rb +2 -0
- data/lib/cucumber/formatter/unicode.rb +3 -3
- data/lib/cucumber/formatter/url_reporter.rb +2 -0
- data/lib/cucumber/gherkin/formatter/ansi_escapes.rb +4 -5
- data/lib/cucumber/glue/invoke_in_world.rb +1 -1
- data/lib/cucumber/glue/proto_world.rb +18 -23
- data/lib/cucumber/glue/registry_and_more.rb +9 -5
- data/lib/cucumber/glue/snippet.rb +4 -2
- data/lib/cucumber/glue/world_factory.rb +2 -0
- data/lib/cucumber/multiline_argument/data_table/diff_matrices.rb +2 -0
- data/lib/cucumber/multiline_argument/data_table.rb +2 -2
- data/lib/cucumber/platform.rb +11 -16
- data/lib/cucumber/rake/task.rb +1 -5
- data/lib/cucumber/runtime/for_programming_languages.rb +1 -2
- data/lib/cucumber/runtime/meta_message_builder.rb +4 -2
- data/lib/cucumber/runtime/user_interface.rb +2 -2
- data/lib/cucumber/runtime.rb +3 -3
- data/lib/cucumber/step_match.rb +1 -1
- data/lib/cucumber/term/ansicolor.rb +1 -1
- data/lib/cucumber/term/banner.rb +2 -0
- metadata +61 -83
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 757154e702f016f75cb37fc68451c18a9a9e742957a197055e127cbe5ebefac6
|
|
4
|
+
data.tar.gz: '010178d0bb40315be3e1c0923c569ec9f5a8d4684da6446b7a396c45da03371c'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f9c2e02d96f40e5564643f994be4cb5ac6bc5f36849551d5a5f102225a4e62526efabf00d14b961f59a954fdf41345f06c45c4469913bfae93d775c33ac2f5e0
|
|
7
|
+
data.tar.gz: c20336a8e85dc299322e0a5cd92ba39fc7b5091195d7003b26ed014d58a3dfeb2ae8f0be6a88a6f26238589dc15acb40103049d49415431e075a1bcda4f86487
|
data/README.md
CHANGED
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
<
|
|
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
|
[](https://vshymanskyy.github.io/StandWithUkraine)
|
|
8
6
|
[](https://opencollective.com/cucumber)
|
|
9
7
|
[](https://opencollective.com/cucumber)
|
|
10
|
-
[](https://oselvar.com/github/cucumber/oselvar-github-metrics/main/cucumber/cucumber-ruby)
|
|
12
|
-
[](https://github.com/cucumber/cucumber-ruby/actions/workflows/cucumber-ruby.yml)
|
|
8
|
+
[](https://github.com/cucumber/cucumber-ruby/actions/workflows/test.yaml)
|
|
13
9
|
[](https://codeclimate.com/github/cucumber/cucumber-ruby)
|
|
14
10
|
[](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
|
-
<
|
|
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(
|
|
104
|
+
Given('this will pass') do
|
|
113
105
|
@this_will_pass = true
|
|
114
106
|
end
|
|
115
107
|
|
|
116
|
-
Given(
|
|
108
|
+
Given('this will fail') do
|
|
117
109
|
@this_will_pass = false
|
|
118
110
|
end
|
|
119
111
|
|
|
120
|
-
When(
|
|
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:
|
|
131
|
+
$ bundle exec cucumber features/rule.feature:5
|
|
139
132
|
|
|
140
|
-
To summarize the results on the standard output, and
|
|
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
|
+
9.1.0
|
data/lib/cucumber/cli/options.rb
CHANGED
|
@@ -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'
|
|
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'
|
|
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)
|
data/lib/cucumber/deprecate.rb
CHANGED
|
@@ -4,52 +4,11 @@ require 'cucumber/platform'
|
|
|
4
4
|
require 'cucumber/gherkin/formatter/ansi_escapes'
|
|
5
5
|
|
|
6
6
|
module Cucumber
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
data/lib/cucumber/errors.rb
CHANGED
|
@@ -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
|
-
|
|
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"
|
data/lib/cucumber/file_specs.rb
CHANGED
|
@@ -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:]+))
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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 '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(
|
|
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(
|
|
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
|
|
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
|
-
|
|
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]
|
|
@@ -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'
|
|
13
|
+
Cucumber::CODEPAGE = 'UTF-8'
|
|
14
14
|
ENV['ANSICON_API'] = 'ruby'
|
|
15
15
|
else
|
|
16
|
-
Cucumber::CODEPAGE = "cp#{Regexp.last_match(1).to_i}"
|
|
16
|
+
Cucumber::CODEPAGE = "cp#{Regexp.last_match(1).to_i}"
|
|
17
17
|
end
|
|
18
18
|
else
|
|
19
|
-
Cucumber::CODEPAGE = 'cp1252'
|
|
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
|
|
|
@@ -67,11 +67,10 @@ module Cucumber
|
|
|
67
67
|
'tag' => 'cyan'
|
|
68
68
|
)
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
|
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
|
|
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]
|
|
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
|
-
#
|
|
89
|
-
#
|
|
90
|
-
#
|
|
91
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
#
|
|
130
|
-
def self.for(runtime, language)
|
|
131
|
-
Module.new do
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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'
|
|
@@ -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
|
|
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
|
-
|
|
594
|
+
other.class == SurplusCell || value == other.value
|
|
595
595
|
end
|
|
596
596
|
|
|
597
597
|
def eql?(other)
|
data/lib/cucumber/platform.rb
CHANGED
|
@@ -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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
18
|
-
|
|
13
|
+
class << self
|
|
14
|
+
attr_accessor :use_full_backtrace
|
|
19
15
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
data/lib/cucumber/rake/task.rb
CHANGED
|
@@ -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
|
|
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
|
|
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:
|
|
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
|
data/lib/cucumber/runtime.rb
CHANGED
|
@@ -112,7 +112,7 @@ module Cucumber
|
|
|
112
112
|
|
|
113
113
|
def failure?
|
|
114
114
|
if @configuration.wip?
|
|
115
|
-
summary_report.test_cases.total_passed
|
|
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
|
|
154
|
-
ENCODING_PATTERN = /^\s*#\s*encoding\s*:\s*([^\s]+)
|
|
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
|
data/lib/cucumber/step_match.rb
CHANGED
data/lib/cucumber/term/banner.rb
CHANGED
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
|
|
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-
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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:
|
|
89
|
+
version: '24'
|
|
102
90
|
- - "<"
|
|
103
91
|
- !ruby/object:Gem::Version
|
|
104
|
-
version:
|
|
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:
|
|
99
|
+
version: '24'
|
|
112
100
|
- - "<"
|
|
113
101
|
- !ruby/object:Gem::Version
|
|
114
|
-
version:
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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: '
|
|
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.
|
|
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:
|
|
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:
|
|
340
|
+
name: rubocop-rake
|
|
365
341
|
requirement: !ruby/object:Gem::Requirement
|
|
366
342
|
requirements:
|
|
367
343
|
- - "~>"
|
|
368
344
|
- !ruby/object:Gem::Version
|
|
369
|
-
version:
|
|
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.
|
|
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:
|
|
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
|
|
670
|
+
summary: cucumber-9.1.0
|
|
693
671
|
test_files: []
|