cucumber-core 15.4.0 → 16.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +20 -1
  3. data/lib/cucumber/core/event.rb +2 -3
  4. data/lib/cucumber/core/event_bus.rb +2 -2
  5. data/lib/cucumber/core/events/envelope.rb +13 -0
  6. data/lib/cucumber/core/events/gherkin_source_parsed.rb +15 -0
  7. data/lib/cucumber/core/events/test_case_created.rb +18 -0
  8. data/lib/cucumber/core/events/test_case_finished.rb +18 -0
  9. data/lib/cucumber/core/events/test_case_started.rb +15 -0
  10. data/lib/cucumber/core/events/test_step_created.rb +18 -0
  11. data/lib/cucumber/core/events/test_step_finished.rb +18 -0
  12. data/lib/cucumber/core/events/test_step_started.rb +15 -0
  13. data/lib/cucumber/core/events.rb +14 -69
  14. data/lib/cucumber/core/gherkin/writer/background.rb +33 -0
  15. data/lib/cucumber/core/gherkin/writer/doc_string.rb +41 -0
  16. data/lib/cucumber/core/gherkin/writer/example.rb +18 -0
  17. data/lib/cucumber/core/gherkin/writer/examples.rb +39 -0
  18. data/lib/cucumber/core/gherkin/writer/feature.rb +49 -0
  19. data/lib/cucumber/core/gherkin/writer/gherkin.rb +39 -0
  20. data/lib/cucumber/core/gherkin/writer/rule.rb +35 -0
  21. data/lib/cucumber/core/gherkin/writer/scenario.rb +33 -0
  22. data/lib/cucumber/core/gherkin/writer/scenario_outline.rb +28 -0
  23. data/lib/cucumber/core/gherkin/writer/step.rb +37 -0
  24. data/lib/cucumber/core/gherkin/writer/table.rb +28 -0
  25. data/lib/cucumber/core/gherkin/writer.rb +17 -256
  26. data/lib/cucumber/core/test/action/defined.rb +2 -2
  27. data/lib/cucumber/core/test/action/unskippable.rb +2 -2
  28. data/lib/cucumber/core/test/around_hook.rb +2 -2
  29. data/lib/cucumber/core/test/data_table.rb +2 -2
  30. data/lib/cucumber/core/test/doc_string.rb +3 -3
  31. data/lib/cucumber/core/test/result.rb +22 -24
  32. data/lib/cucumber/core/test/runner.rb +6 -6
  33. data/lib/cucumber/core/test/step.rb +8 -8
  34. metadata +33 -14
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'helpers'
4
+
5
+ module Cucumber
6
+ module Core
7
+ module Gherkin
8
+ module Writer
9
+ class Table
10
+ include Indentation.level(6)
11
+ include HasRows
12
+
13
+ def initialize(*); end
14
+
15
+ def build(source)
16
+ source + statements
17
+ end
18
+
19
+ private
20
+
21
+ def statements
22
+ row_statements
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,266 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'cucumber/core/gherkin/writer/helpers'
4
- require 'cucumber/core/gherkin/document'
3
+ require_relative 'document'
4
+
5
+ require_relative 'writer/helpers'
6
+
7
+ require_relative 'writer/gherkin'
8
+ require_relative 'writer/feature'
9
+ require_relative 'writer/background'
10
+ require_relative 'writer/rule'
11
+ require_relative 'writer/scenario'
12
+ require_relative 'writer/example'
13
+ require_relative 'writer/scenario_outline'
14
+ require_relative 'writer/step'
15
+ require_relative 'writer/table'
16
+ require_relative 'writer/doc_string'
17
+ require_relative 'writer/examples'
5
18
 
6
19
  module Cucumber
7
20
  module Core
8
21
  module Gherkin
9
22
  module Writer
10
- NEW_LINE = ''
11
- def gherkin(uri = nil, &source)
12
- uri ||= 'features/test.feature'
13
- builder = Gherkin.new(uri, &source)
14
- builder.build
15
- end
16
-
17
- class Gherkin
18
- def initialize(uri, &source)
19
- @uri = uri
20
- @source = source
21
- end
22
-
23
- def comment(line)
24
- comment_lines << "# #{line}"
25
- end
26
-
27
- def comment_lines
28
- @comment_lines ||= []
29
- end
30
-
31
- def feature(*args, &source)
32
- @feature = Feature.new(comment_lines, *args).tap do |builder|
33
- builder.instance_exec(&source) if source
34
- end
35
- self
36
- end
37
-
38
- def build
39
- instance_exec(&@source)
40
- Document.new(@uri, @feature.build.join("\n"))
41
- end
42
- end
43
-
44
- class Feature
45
- include HasElements
46
- include HasOptionsInitializer
47
- include HasDescription
48
- include Indentation.level(0)
49
-
50
- default_keyword 'Feature'
51
-
52
- elements :background, :rule, :scenario, :scenario_outline
53
-
54
- def build(source = [])
55
- elements.inject(source + statements) { |acc, el| el.build(acc) + [NEW_LINE] }
56
- end
57
-
58
- private
59
-
60
- def language
61
- options[:language]
62
- end
63
-
64
- def statements
65
- prepare_statements(
66
- language_statement,
67
- comments_statement,
68
- tag_statement,
69
- name_statement,
70
- description_statement,
71
- NEW_LINE
72
- )
73
- end
74
-
75
- def language_statement
76
- "# language: #{language}" if language
77
- end
78
- end
79
-
80
- class Background
81
- include HasElements
82
- include HasOptionsInitializer
83
- include HasDescription
84
- include Indentation.level 2
85
-
86
- default_keyword 'Background'
87
-
88
- elements :step
89
-
90
- private
91
-
92
- def statements
93
- prepare_statements(
94
- comments_statement,
95
- tag_statement,
96
- name_statement,
97
- description_statement
98
- )
99
- end
100
- end
101
-
102
- class Rule
103
- include HasElements
104
- include HasOptionsInitializer
105
- include HasDescription
106
- include Indentation.level 2
107
-
108
- default_keyword 'Rule'
109
-
110
- elements :example, :scenario
111
-
112
- private
113
-
114
- def statements
115
- prepare_statements(
116
- comments_statement,
117
- name_statement,
118
- description_statement,
119
- NEW_LINE
120
- )
121
- end
122
- end
123
-
124
- class Scenario
125
- include HasElements
126
- include HasOptionsInitializer
127
- include HasDescription
128
- include Indentation.level 2
129
-
130
- default_keyword 'Scenario'
131
-
132
- elements :step
133
-
134
- private
135
-
136
- def statements
137
- prepare_statements(
138
- comments_statement,
139
- tag_statement,
140
- name_statement,
141
- description_statement
142
- )
143
- end
144
- end
145
-
146
- class Example < Scenario
147
- include Indentation.level 4
148
-
149
- default_keyword 'Example'
150
- end
151
-
152
- class ScenarioOutline
153
- include HasElements
154
- include HasOptionsInitializer
155
- include HasDescription
156
- include Indentation.level 2
157
-
158
- default_keyword 'Scenario Outline'
159
-
160
- elements :step, :examples
161
-
162
- private
163
-
164
- def statements
165
- prepare_statements comments_statement, tag_statement, name_statement, description_statement
166
- end
167
- end
168
-
169
- class Step
170
- include HasElements
171
- include HasOptionsInitializer
172
- include Indentation.level 4
173
-
174
- default_keyword 'Given'
175
-
176
- elements :table
177
-
178
- def doc_string(string, content_type = '')
179
- elements << DocString.new(string, content_type)
180
- end
181
-
182
- private
183
-
184
- def statements
185
- prepare_statements comments_statement, name_statement
186
- end
187
-
188
- def name_statement
189
- "#{keyword} #{name}"
190
- end
191
- end
192
-
193
- class Table
194
- include Indentation.level(6)
195
- include HasRows
196
-
197
- def initialize(*); end
198
-
199
- def build(source)
200
- source + statements
201
- end
202
-
203
- private
204
-
205
- def statements
206
- row_statements
207
- end
208
- end
209
-
210
- class DocString
211
- include Indentation.level(6)
212
-
213
- attr_reader :strings, :content_type
214
- private :strings, :content_type
215
-
216
- def initialize(string, content_type)
217
- @strings = string.split("\n").map(&:strip)
218
- @content_type = content_type
219
- end
220
-
221
- def build(source)
222
- source + statements
223
- end
224
-
225
- private
226
-
227
- def statements
228
- prepare_statements doc_string_statement
229
- end
230
-
231
- def doc_string_statement
232
- [
233
- %("""#{content_type}),
234
- strings,
235
- '"""'
236
- ]
237
- end
238
- end
239
-
240
- class Examples
241
- include HasOptionsInitializer
242
- include HasRows
243
- include HasDescription
244
- include Indentation.level(4)
245
-
246
- default_keyword 'Examples'
247
-
248
- def build(source)
249
- source + statements
250
- end
251
-
252
- private
253
-
254
- def statements
255
- prepare_statements(
256
- NEW_LINE,
257
- comments_statement,
258
- tag_statement,
259
- name_statement,
260
- description_statement,
261
- row_statements(2)
262
- )
263
- end
23
+ def gherkin(uri = 'features/test.feature', &)
24
+ Gherkin.new(uri, &).build
264
25
  end
265
26
  end
266
27
  end
@@ -19,9 +19,9 @@ module Cucumber
19
19
  @timer = Timer.new
20
20
  end
21
21
 
22
- def execute(*args)
22
+ def execute(*)
23
23
  @timer.start
24
- @block.call(*args)
24
+ @block.call(*)
25
25
  passed
26
26
  rescue Result::Raisable => e
27
27
  e.with_duration(@timer.duration)
@@ -8,8 +8,8 @@ module Cucumber
8
8
  module Test
9
9
  module Action
10
10
  class Unskippable < Defined
11
- def skip(*args)
12
- execute(*args)
11
+ def skip(*)
12
+ execute(*)
13
13
  end
14
14
  end
15
15
  end
@@ -9,8 +9,8 @@ module Cucumber
9
9
  @timer = Timer.new
10
10
  end
11
11
 
12
- def describe_to(visitor, *args, &continue)
13
- visitor.around_hook(self, *args, &continue)
12
+ def describe_to(visitor, *, &)
13
+ visitor.around_hook(self, *, &)
14
14
  end
15
15
 
16
16
  def hook?
@@ -35,8 +35,8 @@ module Cucumber
35
35
  end
36
36
  attr_reader :raw
37
37
 
38
- def describe_to(visitor, *args)
39
- visitor.data_table(self, *args)
38
+ def describe_to(visitor, *)
39
+ visitor.data_table(self, *)
40
40
  end
41
41
 
42
42
  def to_step_definition_arg
@@ -26,11 +26,11 @@ module Cucumber
26
26
  def initialize(content, content_type)
27
27
  @content = content
28
28
  @content_type = content_type
29
- super @content
29
+ super(@content)
30
30
  end
31
31
 
32
- def describe_to(visitor, *args)
33
- visitor.doc_string(self, *args)
32
+ def describe_to(visitor, *)
33
+ visitor.doc_string(self, *)
34
34
  end
35
35
 
36
36
  def data_table?
@@ -67,9 +67,9 @@ module Cucumber
67
67
  @duration = duration
68
68
  end
69
69
 
70
- def describe_to(visitor, *args)
71
- visitor.passed(*args)
72
- visitor.duration(duration, *args)
70
+ def describe_to(visitor, *)
71
+ visitor.passed(*)
72
+ visitor.duration(duration, *)
73
73
  self
74
74
  end
75
75
 
@@ -114,10 +114,10 @@ module Cucumber
114
114
  @exception = exception
115
115
  end
116
116
 
117
- def describe_to(visitor, *args)
118
- visitor.failed(*args)
119
- visitor.duration(duration, *args)
120
- visitor.exception(exception, *args) if exception
117
+ def describe_to(visitor, *)
118
+ visitor.failed(*)
119
+ visitor.duration(duration, *)
120
+ visitor.exception(exception, *) if exception
121
121
  self
122
122
  end
123
123
 
@@ -211,9 +211,9 @@ module Cucumber
211
211
  !strict
212
212
  end
213
213
 
214
- def describe_to(visitor, *args)
215
- visitor.undefined(*args)
216
- visitor.duration(duration, *args)
214
+ def describe_to(visitor, *)
215
+ visitor.undefined(*)
216
+ visitor.duration(duration, *)
217
217
  self
218
218
  end
219
219
 
@@ -236,9 +236,9 @@ module Cucumber
236
236
  true
237
237
  end
238
238
 
239
- def describe_to(visitor, *args)
240
- visitor.skipped(*args)
241
- visitor.duration(duration, *args)
239
+ def describe_to(visitor, *)
240
+ visitor.skipped(*)
241
+ visitor.duration(duration, *)
242
242
  self
243
243
  end
244
244
 
@@ -261,9 +261,9 @@ module Cucumber
261
261
  !strict
262
262
  end
263
263
 
264
- def describe_to(visitor, *args)
265
- visitor.pending(self, *args)
266
- visitor.duration(duration, *args)
264
+ def describe_to(visitor, *)
265
+ visitor.pending(self, *)
266
+ visitor.duration(duration, *)
267
267
  self
268
268
  end
269
269
 
@@ -409,19 +409,17 @@ module Cucumber
409
409
 
410
410
  def to_message_duration
411
411
  duration_hash = seconds_to_duration(nanoseconds.to_f / NANOSECONDS_PER_SECOND)
412
- duration_hash.transform_keys! do |key|
413
- key.to_sym
414
- rescue Error
415
- return key
416
- end
412
+ Cucumber::Messages::Duration.new(seconds: duration_hash[:seconds], nanos: duration_hash[:nanos])
413
+ end
417
414
 
418
- Cucumber::Messages::Duration.from_h(duration_hash)
415
+ def seconds_to_duration(seconds_float)
416
+ seconds, second_modulus = seconds_float.divmod(1)
417
+ nanos = second_modulus * NANOSECONDS_PER_SECOND
418
+ { seconds: seconds, nanos: nanos.to_i }
419
419
  end
420
420
  end
421
421
 
422
422
  class UnknownDuration
423
- include Cucumber::Messages::Helpers::TimeConversion
424
-
425
423
  def tap
426
424
  self
427
425
  end
@@ -33,8 +33,8 @@ module Cucumber
33
33
  self
34
34
  end
35
35
 
36
- def around_hook(hook, &continue)
37
- result = running_test_case.execute(hook, &continue)
36
+ def around_hook(hook, &)
37
+ result = running_test_case.execute(hook, &)
38
38
  event_bus.test_step_finished running_test_step, result if running_test_step
39
39
  @running_test_step = nil
40
40
  self
@@ -50,8 +50,8 @@ module Cucumber
50
50
  @status = Status::Unknown.new(Result::Unknown.new)
51
51
  end
52
52
 
53
- def execute(test_step, &continue)
54
- status.execute(test_step, self, &continue)
53
+ def execute(test_step, &)
54
+ status.execute(test_step, self, &)
55
55
  end
56
56
 
57
57
  def result
@@ -103,8 +103,8 @@ module Cucumber
103
103
  @step_result = step_result
104
104
  end
105
105
 
106
- def execute(test_step, monitor, &continue)
107
- result = test_step.execute(monitor.result, &continue)
106
+ def execute(test_step, monitor, &)
107
+ result = test_step.execute(monitor.result, &)
108
108
  result = result.with_message(%(Undefined step: "#{test_step.text}")) if result.undefined?
109
109
  result = result.with_appended_backtrace(test_step) unless test_step.hook?
110
110
  result.describe_to(monitor, result)
@@ -20,24 +20,24 @@ module Cucumber
20
20
  @action = action
21
21
  end
22
22
 
23
- def describe_to(visitor, *args)
24
- visitor.test_step(self, *args)
23
+ def describe_to(visitor, *)
24
+ visitor.test_step(self, *)
25
25
  end
26
26
 
27
27
  def hook?
28
28
  false
29
29
  end
30
30
 
31
- def skip(*args)
32
- @action.skip(*args)
31
+ def skip(*)
32
+ @action.skip(*)
33
33
  end
34
34
 
35
- def execute(*args)
36
- @action.execute(*args)
35
+ def execute(*)
36
+ @action.execute(*)
37
37
  end
38
38
 
39
- def with_action(action_location = nil, &block)
40
- self.class.new(id, text, location, multiline_arg, Test::Action::Defined.new(action_location, &block))
39
+ def with_action(action_location = nil, &)
40
+ self.class.new(id, text, location, multiline_arg, Test::Action::Defined.new(action_location, &))
41
41
  end
42
42
 
43
43
  def backtrace_line
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cucumber-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 15.4.0
4
+ version: 16.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aslak Hellesøy
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2025-12-10 00:00:00.000000000 Z
15
+ date: 2025-12-24 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: cucumber-gherkin
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ">"
22
22
  - !ruby/object:Gem::Version
23
- version: '27'
23
+ version: '36'
24
24
  - - "<"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '40'
@@ -30,7 +30,7 @@ dependencies:
30
30
  requirements:
31
31
  - - ">"
32
32
  - !ruby/object:Gem::Version
33
- version: '27'
33
+ version: '36'
34
34
  - - "<"
35
35
  - !ruby/object:Gem::Version
36
36
  version: '40'
@@ -40,7 +40,7 @@ dependencies:
40
40
  requirements:
41
41
  - - ">"
42
42
  - !ruby/object:Gem::Version
43
- version: '26'
43
+ version: '31'
44
44
  - - "<"
45
45
  - !ruby/object:Gem::Version
46
46
  version: '33'
@@ -50,7 +50,7 @@ dependencies:
50
50
  requirements:
51
51
  - - ">"
52
52
  - !ruby/object:Gem::Version
53
- version: '26'
53
+ version: '31'
54
54
  - - "<"
55
55
  - !ruby/object:Gem::Version
56
56
  version: '33'
@@ -60,7 +60,7 @@ dependencies:
60
60
  requirements:
61
61
  - - ">"
62
62
  - !ruby/object:Gem::Version
63
- version: '5'
63
+ version: '6'
64
64
  - - "<"
65
65
  - !ruby/object:Gem::Version
66
66
  version: '9'
@@ -70,7 +70,7 @@ dependencies:
70
70
  requirements:
71
71
  - - ">"
72
72
  - !ruby/object:Gem::Version
73
- version: '5'
73
+ version: '6'
74
74
  - - "<"
75
75
  - !ruby/object:Gem::Version
76
76
  version: '9'
@@ -108,14 +108,14 @@ dependencies:
108
108
  requirements:
109
109
  - - "~>"
110
110
  - !ruby/object:Gem::Version
111
- version: 1.80.0
111
+ version: 1.81.0
112
112
  type: :development
113
113
  prerelease: false
114
114
  version_requirements: !ruby/object:Gem::Requirement
115
115
  requirements:
116
116
  - - "~>"
117
117
  - !ruby/object:Gem::Version
118
- version: 1.80.0
118
+ version: 1.81.0
119
119
  - !ruby/object:Gem::Dependency
120
120
  name: rubocop-packaging
121
121
  requirement: !ruby/object:Gem::Requirement
@@ -150,14 +150,14 @@ dependencies:
150
150
  requirements:
151
151
  - - "~>"
152
152
  - !ruby/object:Gem::Version
153
- version: 3.6.0
153
+ version: 3.8.0
154
154
  type: :development
155
155
  prerelease: false
156
156
  version_requirements: !ruby/object:Gem::Requirement
157
157
  requirements:
158
158
  - - "~>"
159
159
  - !ruby/object:Gem::Version
160
- version: 3.6.0
160
+ version: 3.8.0
161
161
  description: Core library for the Cucumber BDD app
162
162
  email: cukes@googlegroups.com
163
163
  executables: []
@@ -172,11 +172,30 @@ files:
172
172
  - lib/cucumber/core/event.rb
173
173
  - lib/cucumber/core/event_bus.rb
174
174
  - lib/cucumber/core/events.rb
175
+ - lib/cucumber/core/events/envelope.rb
176
+ - lib/cucumber/core/events/gherkin_source_parsed.rb
177
+ - lib/cucumber/core/events/test_case_created.rb
178
+ - lib/cucumber/core/events/test_case_finished.rb
179
+ - lib/cucumber/core/events/test_case_started.rb
180
+ - lib/cucumber/core/events/test_step_created.rb
181
+ - lib/cucumber/core/events/test_step_finished.rb
182
+ - lib/cucumber/core/events/test_step_started.rb
175
183
  - lib/cucumber/core/filter.rb
176
184
  - lib/cucumber/core/gherkin/document.rb
177
185
  - lib/cucumber/core/gherkin/parser.rb
178
186
  - lib/cucumber/core/gherkin/writer.rb
187
+ - lib/cucumber/core/gherkin/writer/background.rb
188
+ - lib/cucumber/core/gherkin/writer/doc_string.rb
189
+ - lib/cucumber/core/gherkin/writer/example.rb
190
+ - lib/cucumber/core/gherkin/writer/examples.rb
191
+ - lib/cucumber/core/gherkin/writer/feature.rb
192
+ - lib/cucumber/core/gherkin/writer/gherkin.rb
179
193
  - lib/cucumber/core/gherkin/writer/helpers.rb
194
+ - lib/cucumber/core/gherkin/writer/rule.rb
195
+ - lib/cucumber/core/gherkin/writer/scenario.rb
196
+ - lib/cucumber/core/gherkin/writer/scenario_outline.rb
197
+ - lib/cucumber/core/gherkin/writer/step.rb
198
+ - lib/cucumber/core/gherkin/writer/table.rb
180
199
  - lib/cucumber/core/platform.rb
181
200
  - lib/cucumber/core/report/summary.rb
182
201
  - lib/cucumber/core/test/action.rb
@@ -218,7 +237,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
218
237
  requirements:
219
238
  - - ">="
220
239
  - !ruby/object:Gem::Version
221
- version: '3.0'
240
+ version: '3.2'
222
241
  required_rubygems_version: !ruby/object:Gem::Requirement
223
242
  requirements:
224
243
  - - ">="
@@ -228,5 +247,5 @@ requirements: []
228
247
  rubygems_version: 3.4.20
229
248
  signing_key:
230
249
  specification_version: 4
231
- summary: cucumber-core-15.4.0
250
+ summary: cucumber-core-16.1.1
232
251
  test_files: []