From 7eeb2b75090e1b9b9a2303ac60eb6ce1412cf777 Mon Sep 17 00:00:00 2001 From: Brian Dunn Date: Tue, 2 Mar 2021 15:34:06 -0600 Subject: [PATCH] ensure shared examples name is marshaled as string --- features/rspec.feature | 26 +++++++++++++++++++ lib/flatware/rspec/marshalable/example.rb | 15 ++++++++++- .../shared_group_inclusion_backtrace.rb | 11 ++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 lib/flatware/rspec/marshalable/shared_group_inclusion_backtrace.rb diff --git a/features/rspec.feature b/features/rspec.feature index 1f14165..e97b890 100644 --- a/features/rspec.feature +++ b/features/rspec.feature @@ -33,3 +33,29 @@ Feature: rspec task """ # ./spec/spec_spec.rb:2:in `block (2 levels) in ' """ + + Scenario: it behaves like + Given the following spec: + """ + class Rick + def drunk? + true + end + end + + class PickleRick < Rick + end + + shared_examples_for Rick do + it('drinks') { expect(subject).to be_drunk } + end + + describe PickleRick do + it_behaves_like Rick + end + """ + When I run flatware with "rspec" + Then the output contains the following: + """ + 1 example, 0 failures + """ diff --git a/lib/flatware/rspec/marshalable/example.rb b/lib/flatware/rspec/marshalable/example.rb index ec8b10d..3eb968f 100644 --- a/lib/flatware/rspec/marshalable/example.rb +++ b/lib/flatware/rspec/marshalable/example.rb @@ -1,6 +1,8 @@ module Flatware module RSpec module Marshalable + require 'flatware/rspec/marshalable/shared_group_inclusion_backtrace' + ## # a subset of the rspec example interface that can traverse drb Example = Struct.new( @@ -16,10 +18,21 @@ def initialize(rspec_example) rspec_example.public_send(attribute) end) - @metadata = rspec_example.metadata.slice(:extra_failure_lines, :shared_group_inclusion_backtrace) + @metadata = marshalable_metadata(rspec_example.metadata) end attr_reader :metadata + + private + + def marshalable_metadata(rspec_metadata) + rspec_metadata.slice(:extra_failure_lines).tap do |metadata| + if (backtraces = rspec_metadata[:shared_group_inclusion_backtrace]) + metadata[:shared_group_inclusion_backtrace] = + backtraces.map(&SharedGroupInclusionBacktrace.method(:from_rspec)) + end + end + end end end end diff --git a/lib/flatware/rspec/marshalable/shared_group_inclusion_backtrace.rb b/lib/flatware/rspec/marshalable/shared_group_inclusion_backtrace.rb new file mode 100644 index 0000000..ef33c6a --- /dev/null +++ b/lib/flatware/rspec/marshalable/shared_group_inclusion_backtrace.rb @@ -0,0 +1,11 @@ +module Flatware + module RSpec + module Marshalable + class SharedGroupInclusionBacktrace < ::RSpec::Core::SharedExampleGroupInclusionStackFrame + def self.from_rspec(backtrace) + new(backtrace.shared_group_name.to_s, backtrace.inclusion_location) + end + end + end + end +end