diff --git a/lib/rspec/support/differ.rb b/lib/rspec/support/differ.rb index dd437399..2ef5d437 100644 --- a/lib/rspec/support/differ.rb +++ b/lib/rspec/support/differ.rb @@ -18,12 +18,10 @@ def diff(actual, expected) if any_multiline_strings?(actual, expected) diff = diff_as_string(coerce_to_string(actual), coerce_to_string(expected)) end - elsif no_procs_and_no_numbers?(actual, expected) - if (RUBY_VERSION.to_f > 1.8) && hash_with_anything?(expected) - diff = diff_as_object_with_anything(actual, expected) - else - diff = diff_as_object(actual, expected) - end + elsif all_hashes?(actual, expected) + diff = diff_hashes_as_object(actual, expected) + elsif no_procs?(actual, expected) && no_numbers?(actual, expected) + diff = diff_as_object(actual, expected) end end @@ -60,7 +58,7 @@ def diff_as_string(actual, expected) end # rubocop:enable Metrics/MethodLength - def diff_as_object_with_anything(actual, expected) + def diff_hashes_as_object(actual, expected) expected.select { |_, v| RSpec::Mocks::ArgumentMatchers::AnyArgMatcher === v }.each_key do |k| expected[k] = actual[k] end @@ -84,16 +82,12 @@ def initialize(opts={}) private - def hash_with_anything?(arg) - Hash === arg && safely_flatten(arg).any? { |a| RSpec::Mocks::ArgumentMatchers::AnyArgMatcher === a } - end - - def no_procs_and_no_numbers?(*args) - no_procs?(args) && no_numbers?(args) + def no_procs?(*args) + safely_flatten(args).none? { |a| Proc === a } end - def no_procs?(args) - safely_flatten(args).none? { |a| Proc === a } + def all_hashes?(actual, expected) + defined?(RSpec::Mocks::ArgumentMatchers::AnyArgMatcher) && (Hash === actual) && (Hash === expected) end def all_strings?(*args) @@ -104,7 +98,7 @@ def any_multiline_strings?(*args) all_strings?(*args) && safely_flatten(args).any? { |a| multiline?(a) } end - def no_numbers?(args) + def no_numbers?(*args) safely_flatten(args).none? { |a| Numeric === a } end diff --git a/spec/rspec/support/differ_spec.rb b/spec/rspec/support/differ_spec.rb index 90f6bb94..04f1422e 100644 --- a/spec/rspec/support/differ_spec.rb +++ b/spec/rspec/support/differ_spec.rb @@ -556,24 +556,21 @@ def inspect; ""; end end end - unless RUBY_VERSION == '1.8.7' - describe "fuzzy matcher anything" do - it "outputs only key value pair that triggered diff, anything_key should absorb actual value" do - actual = { :fixed => "fixed", :trigger => "trigger", :anything_key => "bcdd0399-1cfe-4de1-a481-ca6b17d41ed8" } - expected = { :fixed => "fixed", :trigger => "wrong", :anything_key => anything } - diff = differ.diff(actual, expected) - expected_diff = dedent(<<-'EOD') - | - |@@ -1,4 +1,4 @@ - | :anything_key => "bcdd0399-1cfe-4de1-a481-ca6b17d41ed8", - | :fixed => "fixed", - |-:trigger => "wrong", - |+:trigger => "trigger", - | - EOD - # puts diff - expect(diff).to be_diffed_as(expected_diff) - end + describe "fuzzy matcher anything" do + it "outputs only key value pair that triggered diff, anything_key should absorb actual value" do + actual = { :fixed => "fixed", :trigger => "trigger", :anything_key => "bcdd0399-1cfe-4de1-a481-ca6b17d41ed8" } + expected = { :fixed => "fixed", :trigger => "wrong", :anything_key => anything } + diff = differ.diff(actual, expected) + expected_diff = dedent(<<-'EOD') + | + |@@ -1,4 +1,4 @@ + | :anything_key => "bcdd0399-1cfe-4de1-a481-ca6b17d41ed8", + | :fixed => "fixed", + |-:trigger => "wrong", + |+:trigger => "trigger", + | + EOD + expect(diff).to be_diffed_as(expected_diff) end end end