From 2ed99dbfd444b4ce88f319b47a82c4141285078d Mon Sep 17 00:00:00 2001 From: Mamoru TASAKA Date: Fri, 4 Nov 2022 01:41:53 +0900 Subject: [PATCH] On Fedora 37, remove "Display keyword hashes" feature for now (On Fedora 38, this is effective) --- ....0-display_keyword_hashes-additional.patch | 12 ++ ...-mocks-3.12.0-display_keyword_hashes.patch | 109 ++++++++++++++++++ rubygem-rspec-mocks.spec | 16 ++- 3 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 rubygem-rspec-mocks-3.12.0-display_keyword_hashes-additional.patch create mode 100644 rubygem-rspec-mocks-3.12.0-display_keyword_hashes.patch diff --git a/rubygem-rspec-mocks-3.12.0-display_keyword_hashes-additional.patch b/rubygem-rspec-mocks-3.12.0-display_keyword_hashes-additional.patch new file mode 100644 index 0000000..500ad7e --- /dev/null +++ b/rubygem-rspec-mocks-3.12.0-display_keyword_hashes-additional.patch @@ -0,0 +1,12 @@ +diff -urp -x .git rspec-mocks-3.11.2/spec/rspec/mocks/verifying_doubles/expected_arg_verification_spec.rb rspec-mocks-3.12.0/spec/rspec/mocks/verifying_doubles/expected_arg_verification_spec.rb +--- rspec-mocks-3.11.2/spec/rspec/mocks/verifying_doubles/expected_arg_verification_spec.rb 2022-10-26 16:39:18.000000000 +0900 ++++ rspec-mocks-3.12.0/spec/rspec/mocks/verifying_doubles/expected_arg_verification_spec.rb 2022-10-27 14:34:37.000000000 +0900 +@@ -135,7 +135,7 @@ module RSpec + expect(dbl).to receive(:kw_args_method).with(1, :required_arg => 2, :optional_arg => 3) + expect do + dbl.kw_args_method(1, {:required_arg => 2, :optional_arg => 3}) +- end.to fail_with(a_string_including("expected: (1, {:optional_arg=>3, :required_arg=>2})", "got: (1, {:optional_arg=>3, :required_arg=>2})")) ++ end.to fail_with(a_string_including("expected: (1, {:optional_arg=>3, :required_arg=>2}) (keyword arguments)", "got: (1, {:optional_arg=>3, :required_arg=>2}) (options hash)")) + end + else + it "matches against a hash submitted as a positional argument and received as keyword arguments in Ruby 2.7 or before" do diff --git a/rubygem-rspec-mocks-3.12.0-display_keyword_hashes.patch b/rubygem-rspec-mocks-3.12.0-display_keyword_hashes.patch new file mode 100644 index 0000000..cc6ea7c --- /dev/null +++ b/rubygem-rspec-mocks-3.12.0-display_keyword_hashes.patch @@ -0,0 +1,109 @@ +From e931e818b577172b89fb4583fc336fbcd25df36b Mon Sep 17 00:00:00 2001 +From: Jean Boussier +Date: Fri, 18 Feb 2022 11:19:47 +0100 +Subject: [PATCH] Display keyword hashes in in expectation error messages + +Ref: https://github.com/vcr/vcr/pull/925 +Ref: https://github.com/rspec/rspec-mocks/pull/1394 + +I spent quite a lot of time figuring this error: + +``` + 2) VCR.turned_on passes options through to .turn_off! + Failure/Error: turn_off!(options) + + VCR received :turn_off! with unexpected arguments + expected: ({:ignore_cassettes=>true}) + got: ({:ignore_cassettes=>true}) + # ./lib/vcr.rb:317:in `turned_on' + # ./spec/lib/vcr_spec.rb:367:in `block (3 levels) in ' +``` + +I quickly suspected it was a keyword argument issue, but it's far from +obvious to everyone, and even when you are familair with the issue +it doesn't tell you what was expected and what was received. + +I doubt the way I implemented this is ok, but I think it's worth +opening the discussion + +``` + 2) VCR.turned_on passes options through to .turn_off! + Failure/Error: turn_off!(options) + + VCR received :turn_off! with unexpected arguments + expected: ({:ignore_cassettes=>true}) (keyword arguments) + got: ({:ignore_cassettes=>true}) (options hash) + # ./lib/vcr.rb:317:in `turned_on' + # ./spec/lib/vcr_spec.rb:367:in `block (3 levels) in ' +``` +--- + lib/rspec/mocks/error_generator.rb | 11 ++++++++++ + spec/rspec/mocks/diffing_spec.rb | 33 ++++++++++++++++++++++++++++++ + 2 files changed, 44 insertions(+) + +diff --git a/lib/rspec/mocks/error_generator.rb b/lib/rspec/mocks/error_generator.rb +index 9bf0984f3..42ff35283 100644 +--- a/lib/rspec/mocks/error_generator.rb ++++ b/lib/rspec/mocks/error_generator.rb +@@ -268,6 +268,17 @@ def unexpected_arguments_message(expected_args_string, actual_args_string) + def error_message(expectation, args_for_multiple_calls) + expected_args = format_args(expectation.expected_args) + actual_args = format_received_args(args_for_multiple_calls) ++ ++ if RSpec::Support::RubyFeatures.distincts_kw_args_from_positional_hash? && expected_args == actual_args ++ expected_hash = expectation.expected_args.last ++ actual_hash = args_for_multiple_calls.last.last ++ if Hash === expected_hash && Hash === actual_hash && ++ (Hash.ruby2_keywords_hash?(expected_hash) != Hash.ruby2_keywords_hash?(actual_hash)) ++ actual_args += Hash.ruby2_keywords_hash?(actual_hash) ? " (keyword arguments)" : " (options hash)" ++ expected_args += Hash.ruby2_keywords_hash?(expected_hash) ? " (keyword arguments)" : " (options hash)" ++ end ++ end ++ + message = default_error_message(expectation, expected_args, actual_args) + + if args_for_multiple_calls.one? +diff --git a/spec/rspec/mocks/diffing_spec.rb b/spec/rspec/mocks/diffing_spec.rb +index 3b1f91edf..e17aabcd3 100644 +--- a/spec/rspec/mocks/diffing_spec.rb ++++ b/spec/rspec/mocks/diffing_spec.rb +@@ -83,6 +83,39 @@ + end + end + ++ if RSpec::Support::RubyFeatures.distincts_kw_args_from_positional_hash? ++ eval <<-'RUBY', nil, __FILE__, __LINE__ + 1 ++ it "print a diff when keyword argument were expected but got an option hash (using splat)" do ++ with_unfulfilled_double do |d| ++ expect(d).to receive(:foo).with(**expected_hash) ++ expect { ++ d.foo(expected_hash) ++ }.to fail_with( ++ "# received :foo with unexpected arguments\n" \ ++ " expected: ({:baz=>:quz, :foo=>:bar}) (keyword arguments)\n" \ ++ " got: ({:baz=>:quz, :foo=>:bar}) (options hash)" ++ ) ++ end ++ end ++ RUBY ++ ++ eval <<-'RUBY', nil, __FILE__, __LINE__ + 1 ++ it "print a diff when keyword argument were expected but got an option hash (literal)" do ++ with_unfulfilled_double do |d| ++ expect(d).to receive(:foo).with(:positional, keyword: 1) ++ expect { ++ options = { keyword: 1 } ++ d.foo(:positional, options) ++ }.to fail_with( ++ "# received :foo with unexpected arguments\n" \ ++ " expected: (:positional, {:keyword=>1}) (keyword arguments)\n" \ ++ " got: (:positional, {:keyword=>1}) (options hash)" ++ ) ++ end ++ end ++ RUBY ++ end ++ + if RUBY_VERSION.to_f < 1.9 + # Ruby 1.8 hashes are not ordered, but `#inspect` on a particular unchanged + # hash instance should return consistent output. However, on Travis that does diff --git a/rubygem-rspec-mocks.spec b/rubygem-rspec-mocks.spec index 691662f..d43479d 100644 --- a/rubygem-rspec-mocks.spec +++ b/rubygem-rspec-mocks.spec @@ -3,7 +3,7 @@ %global rpmminorver .%(echo %preminorver | sed -e 's|^\\.\\.*||') %global fullver %{majorver}%{?preminorver} -%global fedorarel 1 +%global fedorarel 2 %global gem_name rspec-mocks @@ -22,6 +22,11 @@ Source0: https://rubygems.org/gems/%{gem_name}-%{fullver}.gem # %%{SOURCE2} %%{name} %%{version} Source1: rubygem-%{gem_name}-%{version}-full.tar.gz Source2: rspec-related-create-full-tarball.sh +# https://github.com/rspec/rspec-mocks/commit/e931e818b577172b89fb4583fc336fbcd25df36b +# The above is in 3.12.x branch, not in 3.11.x branch +Patch1: rubygem-rspec-mocks-3.12.0-display_keyword_hashes.patch +# ... and related to the above, and commit 66250dc1819f9435e5f584064067e7f05a9afe72 +Patch2: rubygem-rspec-mocks-3.12.0-display_keyword_hashes-additional.patch #BuildRequires: ruby(release) BuildRequires: rubygems-devel @@ -54,6 +59,11 @@ This package contains documentation for %{name}. gem unpack %{SOURCE0} %setup -q -D -T -n %{gem_name}-%{version} -b 1 +%if 0%{?fedora} <= 37 +# Revert "display_keyword_hashes" for now on Fedora 37 +%patch1 -p1 -R +%patch2 -p1 -R +%endif # Cucumber 7 syntax change sed -i cucumber.yml -e "s|~@wip|not @wip|" @@ -99,6 +109,10 @@ cucumber %{gem_docdir} %changelog +* Thu Nov 3 2022 Mamoru TASAKA - 3.12.0-2 +- On Fedora 37, remove "Display keyword hashes" feature for now + (On Fedora 38, this is effective) + * Thu Oct 27 2022 Mamoru TASAKA - 3.12.0-1 - 3.12.0