cucumber-core 5.0.2 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +73 -0
  3. data/CONTRIBUTING.md +3 -3
  4. data/README.md +0 -2
  5. data/lib/cucumber/core.rb +8 -6
  6. data/lib/cucumber/core/compiler.rb +35 -14
  7. data/lib/cucumber/core/event.rb +3 -5
  8. data/lib/cucumber/core/event_bus.rb +1 -1
  9. data/lib/cucumber/core/events.rb +25 -1
  10. data/lib/cucumber/core/gherkin/parser.rb +10 -8
  11. data/lib/cucumber/core/gherkin/writer.rb +15 -5
  12. data/lib/cucumber/core/gherkin/writer/helpers.rb +2 -2
  13. data/lib/cucumber/core/test/action.rb +1 -2
  14. data/lib/cucumber/core/test/case.rb +5 -4
  15. data/lib/cucumber/core/test/data_table.rb +6 -10
  16. data/lib/cucumber/core/test/doc_string.rb +3 -6
  17. data/lib/cucumber/core/test/filters/activate_steps_for_self_test.rb +0 -1
  18. data/lib/cucumber/core/test/result.rb +68 -7
  19. data/lib/cucumber/core/test/step.rb +6 -5
  20. data/lib/cucumber/core/test/timer.rb +2 -2
  21. data/lib/cucumber/core/version.rb +1 -1
  22. data/spec/coverage.rb +1 -0
  23. data/spec/cucumber/core/compiler_spec.rb +66 -3
  24. data/spec/cucumber/core/event_bus_spec.rb +2 -2
  25. data/spec/cucumber/core/event_spec.rb +3 -3
  26. data/spec/cucumber/core/filter_spec.rb +2 -2
  27. data/spec/cucumber/core/gherkin/parser_spec.rb +18 -2
  28. data/spec/cucumber/core/gherkin/writer_spec.rb +0 -1
  29. data/spec/cucumber/core/test/action_spec.rb +1 -2
  30. data/spec/cucumber/core/test/case_spec.rb +3 -2
  31. data/spec/cucumber/core/test/data_table_spec.rb +10 -12
  32. data/spec/cucumber/core/test/doc_string_spec.rb +8 -11
  33. data/spec/cucumber/core/test/location_spec.rb +7 -7
  34. data/spec/cucumber/core/test/result_spec.rb +41 -11
  35. data/spec/cucumber/core/test/runner_spec.rb +23 -21
  36. data/spec/cucumber/core/test/step_spec.rb +10 -9
  37. data/spec/cucumber/core_spec.rb +2 -2
  38. metadata +91 -53
  39. data/spec/capture_warnings.rb +0 -74
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ab18c1635eeda0fbd575d01a83bafc96a0073a1ec0ba1249e4bf26b9c60f914
4
- data.tar.gz: 1dccc021f15d75d76c2c3974049f768ee926e0dd7ced151cc9b46a2b422b6906
3
+ metadata.gz: aeb7e9695298dfc63cddf549b2522341be7321f72fbd62b5d1c9f27aaf4209e5
4
+ data.tar.gz: d382bca49b619bede78e599748bf07b69c3041d1d4a0124ce77dde76d58865cf
5
5
  SHA512:
6
- metadata.gz: 81461cf45c9616e3e36fc70a25da1b3c0e30e709cc12e675994e6fd0f730ff4e68f9680453e31ecb4814d69a9a79a98ceeb0691a7365fc660fe9e4cad7462092
7
- data.tar.gz: 3a8cc3c74351d91f90c36f509a813b56cab9a333057de9b3b596de4b1feaa8dc912d87827d2682f1fc3f2b2eca2f82c75f38bd2f75204119eb21bcbcf0b8507a
6
+ metadata.gz: a0fbe65ed295c80bdea85ad91574edeefb12b4689ada4cad11aab513c7c5acc0f080f5872b9a733b22d005e3db7db32e06ff8a24fced4041bb5e334e50fd2bce
7
+ data.tar.gz: b143b5bbefc63fb2dc5b36595c46588a90dfc23dbeaa5847ef9388796597d0635847f78a76237393d5d7d7ac946f84976871c0043850f712dac770cb2e634697
data/CHANGELOG.md CHANGED
@@ -1,5 +1,78 @@
1
1
  Please see [CONTRIBUTING.md](https://github.com/cucumber/cucumber/blob/master/CONTRIBUTING.md) on how to contribute to Cucumber.
2
2
 
3
+ ## [In GIT](https://github.com/cucumber/cucumber-ruby-core/compare/v9.0.0...master)
4
+
5
+ ### Added
6
+
7
+ ### Changed
8
+
9
+ ### Deprecate
10
+
11
+ ### Removed
12
+
13
+ ### Fixed
14
+
15
+ ### Dependencies
16
+
17
+ ## [9.0.0](https://github.com/cucumber/cucumber-ruby-core/compare/v8.0.1...v9.0.0)
18
+
19
+ ### Dependencies
20
+
21
+ * Upgraded to gherkin v18 and messages v15
22
+ * Updated other dependencies (look at the diff for details)
23
+
24
+ ## [8.0.1](https://github.com/cucumber/cucumber-ruby-core/compare/v8.0.0...v8.0.1)
25
+
26
+ ### Fixed
27
+
28
+ * Make releases from docker using secrets from keybase
29
+
30
+ ## [8.0.0](https://github.com/cucumber/cucumber-ruby-core/compare/v7.1.0...v8.0.0)
31
+
32
+ This release failed
33
+
34
+ ### Dependencies
35
+
36
+ * Updated dependencies (look at the diff for details)
37
+
38
+ ## [7.1.0](https://github.com/cucumber/cucumber-ruby-core/compare/v7.0.0...v7.1.0)
39
+
40
+ ### Changed
41
+
42
+ * Updated gems:
43
+ * `cucumber-gherkin` ~> 14.0.1
44
+ * `cucumber-messages` ~> 12.2.0
45
+
46
+ ## [7.0.0](https://github.com/cucumber/cucumber-ruby-core/compare/v6.0.0...v7.0.0)
47
+
48
+ ### Changed
49
+
50
+ * Updated monorepo libraries:
51
+ - cucumber-gherkin ~> 13
52
+ - cucumber-messages ~> 12
53
+
54
+ ## [6.0.0](https://github.com/cucumber/cucumber-ruby-core/compare/v5.0.2...v6.0.0)
55
+
56
+ ### Changed
57
+
58
+ * Update to Gherkin 10
59
+
60
+ ### Added
61
+
62
+ * Add `envelope` event, which are used when emitting `Cucumber::Messages`
63
+ * Add `TestCaseCreated` and `TestStepCreated` events, emitted when compiling a `Pickle`
64
+ * Add `Id` field to `TestCase` and `TestStep`
65
+ * Added rubocop (with todo file), and removed backports gems
66
+ ([#186](https://github.com/cucumber/cucumber-ruby-core/pull/186),
67
+ [#182](https://github.com/cucumber/cucumber-ruby-core/issues/182)
68
+ [tas50](https://github.com/tas50),
69
+ [luke-hill](https://github.com/luke-hill))
70
+
71
+ ### Removed
72
+
73
+ * Remove location for MultiLine arguments
74
+
75
+
3
76
  ## [5.0.2](https://github.com/cucumber/cucumber-ruby-core/compare/v5.0.1...v5.0.2)
4
77
 
5
78
  ### Changed
data/CONTRIBUTING.md CHANGED
@@ -1,13 +1,13 @@
1
1
  Release Process
2
2
  ===============
3
3
 
4
+ * Upgrade gems with `scripts/update-gemspec`
4
5
  * Bump the version number in `lib/cucumber/core/version.rb`
5
6
  * Update `CHANGELOG.md` with the upcoming version number and create a new `In Git` section
7
+ * Remove empty sections from `CHANGELOG.md`
6
8
  * Now release it:
7
9
 
8
10
  ```
9
- bundle update
10
- bundle exec rake
11
11
  git commit -m "Release X.Y.Z"
12
- rake release
12
+ make release
13
13
  ```
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # cucumber-core
2
2
 
3
- [![Chat with us](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/cucumber/cucumber-ruby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
4
3
  [![CircleCI](https://circleci.com/gh/cucumber/cucumber-ruby-core.svg?style=svg)](https://circleci.com/gh/cucumber/cucumber-ruby-core)
5
- [![Build Status](https://travis-ci.org/cucumber/cucumber-ruby-core.svg?branch=master)](https://travis-ci.org/cucumber/cucumber-ruby-core)
6
4
  [![Code Climate](https://codeclimate.com/github/cucumber/cucumber-ruby-core.svg)](https://codeclimate.com/github/cucumber/cucumber-ruby-core)
7
5
  [![Coverage Status](https://coveralls.io/repos/cucumber/cucumber-ruby-core/badge.svg?branch=master)](https://coveralls.io/r/cucumber/cucumber-ruby-core?branch=master)
8
6
 
data/lib/cucumber/core.rb CHANGED
@@ -4,6 +4,8 @@ require 'cucumber/core/gherkin/parser'
4
4
  require 'cucumber/core/gherkin/document'
5
5
  require 'cucumber/core/compiler'
6
6
  require 'cucumber/core/test/runner'
7
+ require 'cucumber/messages'
8
+ require 'gherkin/query'
7
9
 
8
10
  module Cucumber
9
11
  module Core
@@ -11,21 +13,22 @@ module Cucumber
11
13
  def execute(gherkin_documents, filters = [], event_bus = EventBus.new)
12
14
  yield event_bus if block_given?
13
15
  receiver = Test::Runner.new(event_bus)
14
- compile gherkin_documents, receiver, filters
16
+ compile gherkin_documents, receiver, filters, event_bus
15
17
  self
16
18
  end
17
19
 
18
20
  def compile(gherkin_documents, last_receiver, filters = [], event_bus = EventBus.new)
19
21
  first_receiver = compose(filters, last_receiver)
20
- compiler = Compiler.new(first_receiver)
21
- parse gherkin_documents, compiler, event_bus
22
+ gherkin_query = ::Gherkin::Query.new
23
+ compiler = Compiler.new(first_receiver, gherkin_query, event_bus)
24
+ parse gherkin_documents, compiler, event_bus, gherkin_query
22
25
  self
23
26
  end
24
27
 
25
28
  private
26
29
 
27
- def parse(gherkin_documents, compiler, event_bus)
28
- parser = Core::Gherkin::Parser.new(compiler, event_bus)
30
+ def parse(gherkin_documents, compiler, event_bus, gherkin_query)
31
+ parser = Core::Gherkin::Parser.new(compiler, event_bus, gherkin_query)
29
32
  gherkin_documents.each do |document|
30
33
  parser.document document
31
34
  end
@@ -38,6 +41,5 @@ module Cucumber
38
41
  filter.with_receiver(receiver)
39
42
  end
40
43
  end
41
-
42
44
  end
43
45
  end
@@ -6,16 +6,20 @@ require 'cucumber/core/test/tag'
6
6
  require 'cucumber/core/test/doc_string'
7
7
  require 'cucumber/core/test/data_table'
8
8
  require 'cucumber/core/test/empty_multiline_argument'
9
+ require 'cucumber/messages'
9
10
 
10
11
  module Cucumber
11
12
  module Core
12
13
  # Compiles the Pickles into test cases
13
14
  class Compiler
14
- attr_reader :receiver
15
- private :receiver
15
+ attr_reader :receiver, :gherkin_query, :id_generator
16
+ private :receiver, :gherkin_query, :id_generator
16
17
 
17
- def initialize(receiver)
18
+ def initialize(receiver, gherkin_query, event_bus = nil)
18
19
  @receiver = receiver
20
+ @id_generator = Cucumber::Messages::IdGenerator::UUID.new
21
+ @gherkin_query = gherkin_query
22
+ @event_bus = event_bus
19
23
  end
20
24
 
21
25
  def pickle(pickle)
@@ -33,38 +37,55 @@ module Cucumber
33
37
  def create_test_case(pickle)
34
38
  uri = pickle.uri
35
39
  test_steps = pickle.steps.map { |step| create_test_step(step, uri) }
36
- lines = pickle.locations.map { |location| location.line }.sort.reverse
37
- tags = pickle.tags.map { |tag| Test::Tag.new(Test::Location.new(uri, tag.location.line), tag.name) }
38
- Test::Case.new(pickle.name, test_steps, Test::Location.new(uri, lines), tags, pickle.language)
40
+ lines = source_lines_for_pickle(pickle).sort.reverse
41
+ tags = pickle.tags.map { |tag| Test::Tag.new(Test::Location.new(uri, source_line_for_pickle_tag(tag)), tag.name) }
42
+ test_case = Test::Case.new(id_generator.new_id, pickle.name, test_steps, Test::Location.new(uri, lines), tags, pickle.language)
43
+ @event_bus&.test_case_created(test_case, pickle)
44
+ test_case
39
45
  end
40
46
 
41
47
  def create_test_step(pickle_step, uri)
42
- lines = pickle_step.locations.map { |location| location.line }.sort.reverse
48
+ lines = source_lines_for_pickle_step(pickle_step).sort.reverse
43
49
  multiline_arg = create_multiline_arg(pickle_step, uri)
44
- Test::Step.new(pickle_step.text, Test::Location.new(uri, lines), multiline_arg)
50
+ step = Test::Step.new(id_generator.new_id, pickle_step.text, Test::Location.new(uri, lines), multiline_arg)
51
+ @event_bus&.test_step_created(step, pickle_step)
52
+ step
45
53
  end
46
54
 
47
- def create_multiline_arg(pickle_step, uri)
55
+ def create_multiline_arg(pickle_step, _uri)
48
56
  if pickle_step.argument
49
57
  if pickle_step.argument.doc_string
50
58
  doc_string = pickle_step.argument.doc_string
51
59
  Test::DocString.new(
52
60
  doc_string.content,
53
- doc_string.contentType,
54
- Test::Location.new(uri, doc_string.location.line)
61
+ doc_string.media_type
55
62
  )
56
63
  elsif pickle_step.argument.data_table
57
64
  data_table = pickle_step.argument.data_table
58
- first_cell = data_table.rows.first.cells.first
59
65
  Test::DataTable.new(
60
- data_table.rows.map { |row| row.cells.map { |cell| cell.value } },
61
- Test::Location.new(uri, first_cell.location.line)
66
+ data_table.rows.map { |row| row.cells.map { |cell| cell.value } }
62
67
  )
63
68
  end
64
69
  else
65
70
  Test::EmptyMultilineArgument.new
66
71
  end
67
72
  end
73
+
74
+ def source_lines_for_pickle(pickle)
75
+ pickle.ast_node_ids.map { |id| source_line(id) }
76
+ end
77
+
78
+ def source_lines_for_pickle_step(pickle_step)
79
+ pickle_step.ast_node_ids.map { |id| source_line(id) }
80
+ end
81
+
82
+ def source_line_for_pickle_tag(tag)
83
+ source_line(tag.ast_node_id)
84
+ end
85
+
86
+ def source_line(id)
87
+ gherkin_query.location(id).line
88
+ end
68
89
  end
69
90
  end
70
91
  end
@@ -1,5 +1,3 @@
1
- require 'backports/2.1.0/array/to_h'
2
-
3
1
  module Cucumber
4
2
  module Core
5
3
  class Event
@@ -24,7 +22,7 @@ module Cucumber
24
22
  end
25
23
 
26
24
  define_method(:to_h) do
27
- attributes.reduce({}) { |result, attribute|
25
+ attributes.reduce({}) { |result, attribute|
28
26
  value = self.send(attribute)
29
27
  result[attribute] = value
30
28
  result
@@ -50,8 +48,8 @@ module Cucumber
50
48
 
51
49
  def underscore(string)
52
50
  string.to_s.gsub(/::/, '/').
53
- gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
54
- gsub(/([a-z\d])([A-Z])/,'\1_\2').
51
+ gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
52
+ gsub(/([a-z\d])([A-Z])/, '\1_\2').
55
53
  tr("-", "_").
56
54
  downcase
57
55
  end
@@ -44,7 +44,7 @@ module Cucumber
44
44
 
45
45
  def broadcast_queued_events_to(handler, event_type)
46
46
  @event_queue.select { |event|
47
- event.class == event_type
47
+ event.instance_of?(event_type)
48
48
  }.each { |event|
49
49
  handler.call(event)
50
50
  }
@@ -5,6 +5,10 @@ module Cucumber
5
5
  module Core
6
6
  module Events
7
7
 
8
+ class Envelope < Event.new(:envelope)
9
+ attr_reader :envelope
10
+ end
11
+
8
12
  # Signals that a gherkin source has been parsed
9
13
  class GherkinSourceParsed < Event.new(:gherkin_document)
10
14
  # @return [GherkinDocument] the GherkinDocument Ast Node
@@ -12,6 +16,24 @@ module Cucumber
12
16
 
13
17
  end
14
18
 
19
+ # Signals that a Test::Step was created from a PickleStep
20
+ class TestStepCreated < Event.new(:test_step, :pickle_step)
21
+ # The created test step
22
+ attr_reader :test_step
23
+
24
+ # The source pickle step
25
+ attr_reader :pickle_step
26
+ end
27
+
28
+ # Signals that a Test::Case was created from a Pickle
29
+ class TestCaseCreated < Event.new(:test_case, :pickle)
30
+ # The created test step
31
+ attr_reader :test_case
32
+
33
+ # The source pickle step
34
+ attr_reader :pickle
35
+ end
36
+
15
37
  # Signals that a {Test::Case} is about to be executed
16
38
  class TestCaseStarted < Event.new(:test_case)
17
39
 
@@ -39,7 +61,6 @@ module Cucumber
39
61
 
40
62
  end
41
63
 
42
-
43
64
  # Signals that a {Test::Case} has finished executing
44
65
  class TestCaseFinished < Event.new(:test_case, :result)
45
66
 
@@ -55,7 +76,10 @@ module Cucumber
55
76
  # that will be used by the {EventBus} by default.
56
77
  def self.registry
57
78
  build_registry(
79
+ Envelope,
58
80
  GherkinSourceParsed,
81
+ TestStepCreated,
82
+ TestCaseCreated,
59
83
  TestCaseStarted,
60
84
  TestStepStarted,
61
85
  TestStepFinished,
@@ -7,24 +7,26 @@ module Cucumber
7
7
  ParseError = Class.new(StandardError)
8
8
 
9
9
  class Parser
10
- attr_reader :receiver, :event_bus
11
- private :receiver, :event_bus
10
+ attr_reader :receiver, :event_bus, :gherkin_query
11
+ private :receiver, :event_bus, :gherkin_query
12
12
 
13
- def initialize(receiver, event_bus)
13
+ def initialize(receiver, event_bus, gherkin_query)
14
14
  @receiver = receiver
15
15
  @event_bus = event_bus
16
+ @gherkin_query = gherkin_query
16
17
  end
17
18
 
18
19
  def document(document)
19
20
  messages = ::Gherkin.from_source(document.uri, document.body, gherkin_options(document))
20
21
  messages.each do |message|
21
- if !message.gherkinDocument.nil?
22
- event_bus.gherkin_source_parsed(message.gherkinDocument)
22
+ event_bus.envelope(message)
23
+ gherkin_query.update(message)
24
+ if !message.gherkin_document.nil?
25
+ event_bus.gherkin_source_parsed(message.gherkin_document)
23
26
  elsif !message.pickle.nil?
24
27
  receiver.pickle(message.pickle)
25
- elsif !message.attachment.nil?
26
- # Parse error
27
- raise Core::Gherkin::ParseError.new("#{document.uri}: #{message.attachment.data}")
28
+ elsif message.parse_error
29
+ raise Core::Gherkin::ParseError.new("#{document.uri}: #{message.parse_error.message}")
28
30
  else
29
31
  raise "Unknown message: #{message.to_hash}"
30
32
  end
@@ -60,12 +60,14 @@ module Cucumber
60
60
  end
61
61
 
62
62
  def statements
63
- prepare_statements language_statement,
63
+ prepare_statements(
64
+ language_statement,
64
65
  comments_statement,
65
66
  tag_statement,
66
67
  name_statement,
67
68
  description_statement,
68
69
  NEW_LINE
70
+ )
69
71
  end
70
72
 
71
73
  def language_statement
@@ -85,10 +87,12 @@ module Cucumber
85
87
 
86
88
  private
87
89
  def statements
88
- prepare_statements comments_statement,
90
+ prepare_statements(
91
+ comments_statement,
89
92
  tag_statement,
90
93
  name_statement,
91
94
  description_statement
95
+ )
92
96
  end
93
97
  end
94
98
 
@@ -104,10 +108,12 @@ module Cucumber
104
108
 
105
109
  private
106
110
  def statements
107
- prepare_statements comments_statement,
111
+ prepare_statements(
112
+ comments_statement,
108
113
  name_statement,
109
114
  description_statement,
110
115
  NEW_LINE
116
+ )
111
117
  end
112
118
  end
113
119
 
@@ -123,10 +129,12 @@ module Cucumber
123
129
 
124
130
  private
125
131
  def statements
126
- prepare_statements comments_statement,
132
+ prepare_statements(
133
+ comments_statement,
127
134
  tag_statement,
128
135
  name_statement,
129
136
  description_statement
137
+ )
130
138
  end
131
139
  end
132
140
 
@@ -235,12 +243,14 @@ module Cucumber
235
243
 
236
244
  private
237
245
  def statements
238
- prepare_statements NEW_LINE,
246
+ prepare_statements(
247
+ NEW_LINE,
239
248
  comments_statement,
240
249
  tag_statement,
241
250
  name_statement,
242
251
  description_statement,
243
252
  row_statements(2)
253
+ )
244
254
  end
245
255
  end
246
256
  end