From a3c367725ede6a2c3c3c641bad18d3e88059a0c6 Mon Sep 17 00:00:00 2001 From: Luke Hill Date: Wed, 15 Apr 2026 19:33:24 +0100 Subject: [PATCH 1/6] Massively simplify event to be much lighter --- lib/cucumber/core/event.rb | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/cucumber/core/event.rb b/lib/cucumber/core/event.rb index 93921fe3..bd6b775f 100644 --- a/lib/cucumber/core/event.rb +++ b/lib/cucumber/core/event.rb @@ -21,19 +21,20 @@ def self.new(*events) instance_variable_set(:"@#{name}", value) end end + end + end - define_method(:attributes) do - events.map { |var| instance_variable_get(:"@#{var}") } - end + def to_h + instance_variables.to_h { |variable_name| [variable_name[1..].to_sym, instance_variable_get(variable_name)] } + end - define_method(:to_h) do - events.zip(attributes).to_h - end + def event_id + self.class.event_id + end - def event_id - self.class.event_id - end - end + # Here just is an array of each method defined as your readers + def attributes + to_h.map { |_k, v| v } end class << self From 147fe9225015cbb9d16eb774cd9803d2686ca0e3 Mon Sep 17 00:00:00 2001 From: Luke Hill Date: Wed, 15 Apr 2026 19:35:06 +0100 Subject: [PATCH 2/6] Remove duplicate reader logic --- lib/cucumber/core/events/envelope.rb | 1 - lib/cucumber/core/events/gherkin_source_parsed.rb | 3 +-- lib/cucumber/core/events/test_case_created.rb | 6 +----- lib/cucumber/core/events/test_case_finished.rb | 3 --- lib/cucumber/core/events/test_case_started.rb | 1 - lib/cucumber/core/events/test_step_created.rb | 6 +----- lib/cucumber/core/events/test_step_finished.rb | 3 --- lib/cucumber/core/events/test_step_started.rb | 1 - 8 files changed, 3 insertions(+), 21 deletions(-) diff --git a/lib/cucumber/core/events/envelope.rb b/lib/cucumber/core/events/envelope.rb index 8300673b..80f0fba5 100644 --- a/lib/cucumber/core/events/envelope.rb +++ b/lib/cucumber/core/events/envelope.rb @@ -6,7 +6,6 @@ module Cucumber module Core module Events class Envelope < Event.new(:envelope) - attr_reader :envelope end end end diff --git a/lib/cucumber/core/events/gherkin_source_parsed.rb b/lib/cucumber/core/events/gherkin_source_parsed.rb index 937d1a06..82077302 100644 --- a/lib/cucumber/core/events/gherkin_source_parsed.rb +++ b/lib/cucumber/core/events/gherkin_source_parsed.rb @@ -7,8 +7,7 @@ module Core module Events # Signals that a gherkin source has been parsed class GherkinSourceParsed < Event.new(:gherkin_document) - # @return [GherkinDocument] the GherkinDocument Ast Node - attr_reader :gherkin_document + # @return [GherkinDocument] the GherkinDocument Ast Node that was parsed end end end diff --git a/lib/cucumber/core/events/test_case_created.rb b/lib/cucumber/core/events/test_case_created.rb index 80d1a2f6..fa6d5bf4 100644 --- a/lib/cucumber/core/events/test_case_created.rb +++ b/lib/cucumber/core/events/test_case_created.rb @@ -7,11 +7,7 @@ module Core module Events # Signals that a Test::Case was created from a Pickle class TestCaseCreated < Event.new(:test_case, :pickle) - # The created test step - attr_reader :test_case - - # The source pickle step - attr_reader :pickle + # The created test step & source pickle end end end diff --git a/lib/cucumber/core/events/test_case_finished.rb b/lib/cucumber/core/events/test_case_finished.rb index 8b00b2be..7d6b7c96 100644 --- a/lib/cucumber/core/events/test_case_finished.rb +++ b/lib/cucumber/core/events/test_case_finished.rb @@ -8,10 +8,7 @@ module Events # Signals that a {Test::Case} has finished executing class TestCaseFinished < Event.new(:test_case, :result) # @return [Test::Case] that was executed - attr_reader :test_case - # @return [Test::Result] the result of running the {Test::Step} - attr_reader :result end end end diff --git a/lib/cucumber/core/events/test_case_started.rb b/lib/cucumber/core/events/test_case_started.rb index 7a8651a6..0143e1e1 100644 --- a/lib/cucumber/core/events/test_case_started.rb +++ b/lib/cucumber/core/events/test_case_started.rb @@ -8,7 +8,6 @@ module Events # Signals that a {Test::Case} is about to be executed class TestCaseStarted < Event.new(:test_case) # @return [Test::Case] the test case to be executed - attr_reader :test_case end end end diff --git a/lib/cucumber/core/events/test_step_created.rb b/lib/cucumber/core/events/test_step_created.rb index 5186be1e..507b8c26 100644 --- a/lib/cucumber/core/events/test_step_created.rb +++ b/lib/cucumber/core/events/test_step_created.rb @@ -7,11 +7,7 @@ module Core module Events # Signals that a Test::Step was created from a PickleStep class TestStepCreated < Event.new(:test_step, :pickle_step) - # The created test step - attr_reader :test_step - - # The source pickle step - attr_reader :pickle_step + # The created test step & source pickle step end end end diff --git a/lib/cucumber/core/events/test_step_finished.rb b/lib/cucumber/core/events/test_step_finished.rb index 62c656e0..c2915b00 100644 --- a/lib/cucumber/core/events/test_step_finished.rb +++ b/lib/cucumber/core/events/test_step_finished.rb @@ -8,10 +8,7 @@ module Events # Signals that a {Test::Step} has finished executing class TestStepFinished < Event.new(:test_step, :result) # @return [Test::Step] the test step that was executed - attr_reader :test_step - # @return [Test::Result] the result of running the {Test::Step} - attr_reader :result end end end diff --git a/lib/cucumber/core/events/test_step_started.rb b/lib/cucumber/core/events/test_step_started.rb index ba76265a..bb952e33 100644 --- a/lib/cucumber/core/events/test_step_started.rb +++ b/lib/cucumber/core/events/test_step_started.rb @@ -8,7 +8,6 @@ module Events # Signals that a {Test::Step} is about to be executed class TestStepStarted < Event.new(:test_step) # @return [Test::Step] the test step to be executed - attr_reader :test_step end end end From 4c4b4c82b24929b7dc59d1d1d3f4463a07fb2dd5 Mon Sep 17 00:00:00 2001 From: Luke Hill Date: Wed, 15 Apr 2026 19:39:48 +0100 Subject: [PATCH 3/6] Make more individual and avoid reflexive bug --- lib/cucumber/core/event.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/cucumber/core/event.rb b/lib/cucumber/core/event.rb index bd6b775f..2916046b 100644 --- a/lib/cucumber/core/event.rb +++ b/lib/cucumber/core/event.rb @@ -25,16 +25,17 @@ def self.new(*events) end def to_h - instance_variables.to_h { |variable_name| [variable_name[1..].to_sym, instance_variable_get(variable_name)] } + instance_variables.to_h do |variable_name| + [variable_name.delete('@').to_sym, instance_variable_get(variable_name)] + end end def event_id self.class.event_id end - # Here just is an array of each method defined as your readers def attributes - to_h.map { |_k, v| v } + instance_variables.map { |var| instance_variable_get(var) } end class << self From 71f14b4b4441c41ff0cd91e7e0a71fcb601a08b9 Mon Sep 17 00:00:00 2001 From: Luke Hill Date: Wed, 15 Apr 2026 19:45:06 +0100 Subject: [PATCH 4/6] Add changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6992ce2c..80796d89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ This document is formatted according to the principles of [Keep A CHANGELOG](htt Please visit [cucumber/CONTRIBUTING.md](https://github.com/cucumber/cucumber/blob/master/CONTRIBUTING.md) for more info on how to contribute to Cucumber. ## [Unreleased] +### Changed +- Refactored the internal base `Event` class to reduce complexity and make it more flexible for future use (No user facing changes) ## [16.2.0] - 2026-02-06 ### Changed From f67585735fba0365ce59113b968bd39467465fe5 Mon Sep 17 00:00:00 2001 From: Luke Hill Date: Wed, 15 Apr 2026 19:49:10 +0100 Subject: [PATCH 5/6] Fix bug by ensuring that co-ercion works on the stringified var name before returning to symbol --- lib/cucumber/core/event.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/cucumber/core/event.rb b/lib/cucumber/core/event.rb index 2916046b..a0b5c660 100644 --- a/lib/cucumber/core/event.rb +++ b/lib/cucumber/core/event.rb @@ -26,18 +26,18 @@ def self.new(*events) def to_h instance_variables.to_h do |variable_name| - [variable_name.delete('@').to_sym, instance_variable_get(variable_name)] + [variable_name[1..].to_sym, instance_variable_get(variable_name)] end end - def event_id - self.class.event_id - end - def attributes instance_variables.map { |var| instance_variable_get(var) } end + def event_id + self.class.event_id + end + class << self # @return [Symbol] the underscored name of the class to be used as the key in an event registry def event_id From 7ab6ff66a628214a8fa55882f583ea6331baa79c Mon Sep 17 00:00:00 2001 From: Luke Hill Date: Wed, 15 Apr 2026 20:32:29 +0100 Subject: [PATCH 6/6] Use named reader methods to ensure the attributes dump is not compromised in JRuby --- spec/cucumber/core_spec.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/spec/cucumber/core_spec.rb b/spec/cucumber/core_spec.rb index 4ff754ee..50c9108f 100644 --- a/spec/cucumber/core_spec.rb +++ b/spec/cucumber/core_spec.rb @@ -118,7 +118,8 @@ observed_events << [:test_case_started, test_case.name] end event_bus.on(:test_case_finished) do |event| - test_case, result = *event.attributes + test_case = event.test_case + result = event.result observed_events << [:test_case_finished, test_case.name, result.to_sym] end event_bus.on(:test_step_started) do |event| @@ -126,7 +127,8 @@ observed_events << [:test_step_started, test_step.text] end event_bus.on(:test_step_finished) do |event| - test_step, result = *event.attributes + test_step = event.test_step + result = event.result observed_events << [:test_step_finished, test_step.text, result.to_sym] end end