cucumber-core 5.0.2 → 9.0.0

Sign up to get free protection for your applications and to get access to all the features.
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