From d7b9f9c2631730952bbbcdbfcaad9be1b56ce6e7 Mon Sep 17 00:00:00 2001 From: niceking Date: Fri, 29 Oct 2021 12:04:43 +1300 Subject: [PATCH 1/3] skip output check if output not defined on formatter --- lib/rspec/core/formatters.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/rspec/core/formatters.rb b/lib/rspec/core/formatters.rb index 8ca9112b8a..f0238f85cd 100644 --- a/lib/rspec/core/formatters.rb +++ b/lib/rspec/core/formatters.rb @@ -194,10 +194,16 @@ def register(formatter, notifications) def duplicate_formatter_exists?(new_formatter) @formatters.any? do |formatter| - formatter.class == new_formatter.class && formatter.output == new_formatter.output + formatter.class == new_formatter.class && + has_matching_output?(formatter, new_formatter) end end + def has_matching_output?(formatter, new_formatter) + return true unless formatter.respond_to?(:output) && new_formatter.respond_to?(:output) + formatter.output == new_formatter.output + end + def existing_formatter_implements?(notification) @reporter.registered_listeners(notification).any? end From c9cefaf4104428c7f07e44add90562f08eb7c937 Mon Sep 17 00:00:00 2001 From: niceking Date: Fri, 5 Nov 2021 11:17:09 +1300 Subject: [PATCH 2/3] add spec for output check --- spec/rspec/core/formatters_spec.rb | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/spec/rspec/core/formatters_spec.rb b/spec/rspec/core/formatters_spec.rb index 06c9bb664e..219e505934 100644 --- a/spec/rspec/core/formatters_spec.rb +++ b/spec/rspec/core/formatters_spec.rb @@ -144,6 +144,28 @@ module RSpec::Core::Formatters loader.add :documentation, path }.to change { loader.formatters.length } end + + context "formatters do not subclass BaseFormatter" do + before do + stub_const("CustomFormatter", Class.new) + stub_const("OtherCustomFormatter", Class.new) + Loader.formatters[CustomFormatter] = [] + Loader.formatters[OtherCustomFormatter] = [] + loader.add "CustomFormatter" + end + + it "adds different formatters" do + expect { + loader.add "OtherCustomFormatter" + }.to change { loader.formatters.length } + end + + it "doesn't add the same formatter" do + expect { + loader.add "CustomFormatter" + }.not_to change { loader.formatters.length } + end + end end context "When a custom formatter exists" do From d562c2707dc1f264d714dcfb419b7f14ca87f526 Mon Sep 17 00:00:00 2001 From: Jon Rowe Date: Fri, 10 Dec 2021 18:25:42 +0000 Subject: [PATCH 3/3] Add formatter spec using real classes --- spec/rspec/core/formatters_spec.rb | 32 +++++++++++++----------------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/spec/rspec/core/formatters_spec.rb b/spec/rspec/core/formatters_spec.rb index 219e505934..aee305da97 100644 --- a/spec/rspec/core/formatters_spec.rb +++ b/spec/rspec/core/formatters_spec.rb @@ -145,30 +145,26 @@ module RSpec::Core::Formatters }.to change { loader.formatters.length } end - context "formatters do not subclass BaseFormatter" do - before do - stub_const("CustomFormatter", Class.new) - stub_const("OtherCustomFormatter", Class.new) - Loader.formatters[CustomFormatter] = [] - Loader.formatters[OtherCustomFormatter] = [] - loader.add "CustomFormatter" - end + plain_old_formatter = Class.new do + RSpec::Core::Formatters.register self, :example_started - it "adds different formatters" do - expect { - loader.add "OtherCustomFormatter" - }.to change { loader.formatters.length } + def initialize(output) end + end - it "doesn't add the same formatter" do - expect { - loader.add "CustomFormatter" - }.not_to change { loader.formatters.length } - end + it "handles formatters which do not subclass our formatters" do + expect { + loader.add plain_old_formatter, output + }.to change { loader.formatters.length } + + # deliberate duplicate to ensure we can check for them correctly + expect { + loader.add plain_old_formatter, output + }.to_not change { loader.formatters.length } end end - context "When a custom formatter exists" do + context "when a custom formatter exists" do specific_formatter = RSpec::Core::Formatters::JsonFormatter generic_formatter = specific_formatter.superclass