From fa7de4c67d6301ae3d3cb7cf3dc8c231377f984e Mon Sep 17 00:00:00 2001 From: Vincent Pretre Date: Wed, 16 Oct 2019 09:44:57 +0200 Subject: [PATCH 1/8] Use Gherkin 8 --- cucumber-core.gemspec | 2 +- lib/cucumber/core/gherkin/parser.rb | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/cucumber-core.gemspec b/cucumber-core.gemspec index 88dc62ef..8ad993bb 100644 --- a/cucumber-core.gemspec +++ b/cucumber-core.gemspec @@ -22,7 +22,7 @@ Gem::Specification.new do |s| 'source_code_uri' => 'https://github.com/cucumber/cucumber-ruby-core', } - s.add_dependency 'gherkin', '~> 7.0', '>= 7.0.3' + s.add_dependency 'gherkin', '~> 8.0', '>= 8.0.0' s.add_dependency 'cucumber-tag_expressions', '~> 2.0', '>= 2.0.2' s.add_dependency 'backports', '~> 3.15', '>= 3.15.0' diff --git a/lib/cucumber/core/gherkin/parser.rb b/lib/cucumber/core/gherkin/parser.rb index 54c0b046..04004fac 100644 --- a/lib/cucumber/core/gherkin/parser.rb +++ b/lib/cucumber/core/gherkin/parser.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true -require 'gherkin/gherkin' +require 'gherkin' module Cucumber module Core @@ -16,7 +16,7 @@ def initialize(receiver, event_bus) end def document(document) - messages = ::Gherkin::Gherkin.from_source(document.uri, document.body, {default_dialect: document.language, include_source: false}) + messages = ::Gherkin.from_source(document.uri, document.body, gherkin_options(document)) messages.each do |message| if !message.gherkinDocument.nil? event_bus.gherkin_source_parsed(message.gherkinDocument) @@ -31,6 +31,15 @@ def document(document) end end + def gherkin_options(document) + { + default_dialect: document.language, + include_source: false, + include_gherkin_document: true, + include_pickles: true + } + end + def done receiver.done self From 6d8c10cd972c8fb4373eed1b4cb53284916fde28 Mon Sep 17 00:00:00 2001 From: Vincent Pretre Date: Wed, 16 Oct 2019 14:03:47 +0200 Subject: [PATCH 2/8] Fix wrong indentation --- lib/cucumber/core/gherkin/parser.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cucumber/core/gherkin/parser.rb b/lib/cucumber/core/gherkin/parser.rb index 04004fac..2a5f0b91 100644 --- a/lib/cucumber/core/gherkin/parser.rb +++ b/lib/cucumber/core/gherkin/parser.rb @@ -38,7 +38,7 @@ def gherkin_options(document) include_gherkin_document: true, include_pickles: true } - end + end def done receiver.done From cd7d3aef72509d928b74dbada898ebea45dd8f1c Mon Sep 17 00:00:00 2001 From: Vincent Pretre Date: Mon, 28 Oct 2019 17:32:04 +0100 Subject: [PATCH 3/8] Add examples of tests using the Rule keyword Note: the writer tests is currently disabled, not sure this is really needed. --- lib/cucumber/core/gherkin/writer.rb | 20 +++++++++++- spec/cucumber/core/gherkin/parser_spec.rb | 38 +++++++++++++++++++++++ spec/cucumber/core/gherkin/writer_spec.rb | 21 +++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) diff --git a/lib/cucumber/core/gherkin/writer.rb b/lib/cucumber/core/gherkin/writer.rb index c63bea3d..1b255257 100644 --- a/lib/cucumber/core/gherkin/writer.rb +++ b/lib/cucumber/core/gherkin/writer.rb @@ -48,7 +48,7 @@ class Feature default_keyword 'Feature' - elements :background, :scenario, :scenario_outline + elements :background, :rule, :scenario, :scenario_outline def build(source = []) elements.inject(source + statements) { |acc, el| el.build(acc) + [NEW_LINE] } @@ -89,6 +89,24 @@ def statements end end + class Rule + include HasElements + include HasOptionsInitializer + include HasDescription + include Indentation.level 2 + + default_keyword 'Rule' + + elements :scenario + + private + def statements + prepare_statements comments_statement, + name_statement, + description_statement + end + end + class Scenario include HasElements include HasOptionsInitializer diff --git a/spec/cucumber/core/gherkin/parser_spec.rb b/spec/cucumber/core/gherkin/parser_spec.rb index 078da887..3692313e 100644 --- a/spec/cucumber/core/gherkin/parser_spec.rb +++ b/spec/cucumber/core/gherkin/parser_spec.rb @@ -89,6 +89,44 @@ def self.source(&block) end end + context "when scenario is inside a rule" do + source do + feature do + rule do + scenario do + step 'text' + end + end + end + end + + it "passes on the pickle" do + expect( receiver ).to receive(:pickle) + parse + end + end + + context "when there are multiple rules and scenarios" do + source do + feature do + rule do + scenario do + step 'text' + end + end + rule do + scenario do + step 'text' + end + end + end + end + + it "passes on the pickles" do + expect( receiver ).to receive(:pickle).twice + parse + end + end end end end diff --git a/spec/cucumber/core/gherkin/writer_spec.rb b/spec/cucumber/core/gherkin/writer_spec.rb index cf8f93c4..5774f21d 100644 --- a/spec/cucumber/core/gherkin/writer_spec.rb +++ b/spec/cucumber/core/gherkin/writer_spec.rb @@ -233,6 +233,27 @@ module Cucumber::Core::Gherkin end end end + + context 'with rules' do + xit 'can have a description' do + source = gherkin do + feature do + rule name: "Simple", description: "My castle, my rule" do + scenario name: "My scenario" + end + end + end + + expect( source.body ).to eq <<-END.unindent + Feature: + + Rule: Simple + My castle, my rules + + Scenario: My scenario + END + end + end end it 'generates a complex feature' do From 48e5d28c325449dbd4e92c8ba9d749c0a34ea14c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aslak=20Helles=C3=B8y?= Date: Tue, 29 Oct 2019 11:18:38 +0000 Subject: [PATCH 4/8] Upgrade gherkin --- cucumber-core.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cucumber-core.gemspec b/cucumber-core.gemspec index 8ad993bb..281bb3e1 100644 --- a/cucumber-core.gemspec +++ b/cucumber-core.gemspec @@ -22,7 +22,7 @@ Gem::Specification.new do |s| 'source_code_uri' => 'https://github.com/cucumber/cucumber-ruby-core', } - s.add_dependency 'gherkin', '~> 8.0', '>= 8.0.0' + s.add_dependency 'gherkin', '~> 8.1', '>= 8.1.1' s.add_dependency 'cucumber-tag_expressions', '~> 2.0', '>= 2.0.2' s.add_dependency 'backports', '~> 3.15', '>= 3.15.0' From b6f5aecd790030c98c88252392a65bff03b2e502 Mon Sep 17 00:00:00 2001 From: Vincent Pretre Date: Tue, 29 Oct 2019 12:47:02 +0100 Subject: [PATCH 5/8] Fix failing tests with Ruby < 2.5 Also remove writer test which is not super useful for now --- lib/cucumber/core/gherkin/writer.rb | 16 +++++++++--- spec/cucumber/core/gherkin/parser_spec.rb | 31 ++++++++++++++++------- spec/cucumber/core/gherkin/writer_spec.rb | 21 --------------- 3 files changed, 35 insertions(+), 33 deletions(-) diff --git a/lib/cucumber/core/gherkin/writer.rb b/lib/cucumber/core/gherkin/writer.rb index 1b255257..02564161 100644 --- a/lib/cucumber/core/gherkin/writer.rb +++ b/lib/cucumber/core/gherkin/writer.rb @@ -85,7 +85,10 @@ class Background private def statements - prepare_statements comments_statement, tag_statement, name_statement, description_statement + prepare_statements comments_statement, + tag_statement, + name_statement, + description_statement end end @@ -97,13 +100,14 @@ class Rule default_keyword 'Rule' - elements :scenario + elements :example, :scenario private def statements prepare_statements comments_statement, name_statement, - description_statement + description_statement, + NEW_LINE end end @@ -126,6 +130,12 @@ def statements end end + class Example < Scenario + include Indentation.level 4 + + default_keyword 'Example' + end + class ScenarioOutline include HasElements include HasOptionsInitializer diff --git a/spec/cucumber/core/gherkin/parser_spec.rb b/spec/cucumber/core/gherkin/parser_spec.rb index 3692313e..06a7bf21 100644 --- a/spec/cucumber/core/gherkin/parser_spec.rb +++ b/spec/cucumber/core/gherkin/parser_spec.rb @@ -92,10 +92,23 @@ def self.source(&block) context "when scenario is inside a rule" do source do feature do - rule do - scenario do - step 'text' - end + rule description: "My castle, my rules" do + scenario name: "My scenario" + end + end + end + + it "passes on the pickle" do + expect( receiver ).to receive(:pickle) + parse + end + end + + context "when example is inside a rule" do + source do + feature do + rule description: "My castle, my rules" do + example name: "My example" end end end @@ -106,16 +119,16 @@ def self.source(&block) end end - context "when there are multiple rules and scenarios" do + context "when there are multiple rules and scenarios or examples" do source do feature do - rule do - scenario do + rule description: "First rule" do + scenario name: "Do not talk about the fight club" do step 'text' end end - rule do - scenario do + rule description: "Second rule"do + example name: "Do not talk about the fight club" do step 'text' end end diff --git a/spec/cucumber/core/gherkin/writer_spec.rb b/spec/cucumber/core/gherkin/writer_spec.rb index 5774f21d..cf8f93c4 100644 --- a/spec/cucumber/core/gherkin/writer_spec.rb +++ b/spec/cucumber/core/gherkin/writer_spec.rb @@ -233,27 +233,6 @@ module Cucumber::Core::Gherkin end end end - - context 'with rules' do - xit 'can have a description' do - source = gherkin do - feature do - rule name: "Simple", description: "My castle, my rule" do - scenario name: "My scenario" - end - end - end - - expect( source.body ).to eq <<-END.unindent - Feature: - - Rule: Simple - My castle, my rules - - Scenario: My scenario - END - end - end end it 'generates a complex feature' do From cbae65f96a3b684463ed33801725e6edb62fc2f8 Mon Sep 17 00:00:00 2001 From: Vincent Pretre Date: Tue, 29 Oct 2019 14:36:47 +0100 Subject: [PATCH 6/8] Only force protobuf version for JRuby --- Gemfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index 62630760..82e3e1b0 100644 --- a/Gemfile +++ b/Gemfile @@ -4,7 +4,7 @@ gem 'gherkin', path: ENV['GHERKIN_RUBY'] if ENV['GHERKIN_RUBY'] gem 'cucumber-messages', path: ENV['CUCUMBER_MESSAGES_RUBY'] if ENV['CUCUMBER_MESSAGES_RUBY'] -# Use an older protobuf on JRuby and MRI < 2.5 -gem 'google-protobuf', '~> 3.2.0.2' if RbConfig::CONFIG['MAJOR'].to_i == 2 && RbConfig::CONFIG['MINOR'].to_i < 5 || RUBY_PLATFORM == 'java' +# Use an older protobuf on JRuby +gem 'google-protobuf', '~> 3.2.0.2' if RUBY_PLATFORM == 'java' gemspec From 38b479af1917ee55da8d3ad7ed96325fea899576 Mon Sep 17 00:00:00 2001 From: Vincent Pretre Date: Tue, 29 Oct 2019 15:07:27 +0100 Subject: [PATCH 7/8] Remove useless description for rules in parser_spec --- spec/cucumber/core/gherkin/parser_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/cucumber/core/gherkin/parser_spec.rb b/spec/cucumber/core/gherkin/parser_spec.rb index 06a7bf21..f5b3ae7d 100644 --- a/spec/cucumber/core/gherkin/parser_spec.rb +++ b/spec/cucumber/core/gherkin/parser_spec.rb @@ -92,7 +92,7 @@ def self.source(&block) context "when scenario is inside a rule" do source do feature do - rule description: "My castle, my rules" do + rule do scenario name: "My scenario" end end @@ -107,7 +107,7 @@ def self.source(&block) context "when example is inside a rule" do source do feature do - rule description: "My castle, my rules" do + rule do example name: "My example" end end From de246058d9cbce44e7a8e7fc7723c3b2fce570f8 Mon Sep 17 00:00:00 2001 From: Vincent Pretre Date: Wed, 30 Oct 2019 16:07:14 +0100 Subject: [PATCH 8/8] update Changelog before releasing --- CHANGELOG.md | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b91bd831..7806429e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,29 +4,13 @@ Please see [CONTRIBUTING.md](https://github.com/cucumber/cucumber/blob/master/CO ### Changed -* N/A - -### Added - -* N/A - -### Fixed - -* N/A - -### Removed - -* N/A - -### Improved - -* N/A +* Update to use Gherkin v8 ## [5.0.1](https://github.com/cucumber/cucumber-ruby-core/compare/v5.0.0...v5.0.1) ### Removed -* Remove support for ruby 2.2 and below. 2.3 or higher is required now. +* Remove support for ruby 2.2 and below. 2.3 or higher is required now. ## [5.0.0](https://github.com/cucumber/cucumber-ruby-core/compare/v4.0.0...v5.0.0)