From f2e86946d9b74943491e7693df510da205a2b0ae Mon Sep 17 00:00:00 2001 From: rick olson Date: Thu, 17 Oct 2019 15:23:08 -0600 Subject: [PATCH 1/6] Teach proxy_class how to work with root-level superclasses --- lib/faraday/deprecate.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/faraday/deprecate.rb b/lib/faraday/deprecate.rb index 53a199563..b34365852 100644 --- a/lib/faraday/deprecate.rb +++ b/lib/faraday/deprecate.rb @@ -12,7 +12,7 @@ def self.proxy_class(new_klass) class << k extend Faraday::Deprecate # Make this more human readable than # - klass_name = superclass.to_s[/^#$/, 1] + klass_name = superclass.to_s[/^#$/, 1] deprecate :new, "#{klass_name}.new", '1.0' deprecate :inherited, klass_name, '1.0' end From ddab77c026f5a8f381e455f801e74dee0ac19e64 Mon Sep 17 00:00:00 2001 From: rick olson Date: Thu, 17 Oct 2019 15:26:03 -0600 Subject: [PATCH 2/6] allow deprecated exception classes to rescue the current exception class --- lib/faraday/deprecate.rb | 4 ++ spec/faraday/deprecate_spec.rb | 89 ++++++++++++++++++++++++++++++++++ spec/faraday/error_spec.rb | 40 ++++++++++++++- 3 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 spec/faraday/deprecate_spec.rb diff --git a/lib/faraday/deprecate.rb b/lib/faraday/deprecate.rb index b34365852..46c1ddf6f 100644 --- a/lib/faraday/deprecate.rb +++ b/lib/faraday/deprecate.rb @@ -15,6 +15,10 @@ class << k klass_name = superclass.to_s[/^#$/, 1] deprecate :new, "#{klass_name}.new", '1.0' deprecate :inherited, klass_name, '1.0' + + def ===(other) + superclass === other || super + end end end end diff --git a/spec/faraday/deprecate_spec.rb b/spec/faraday/deprecate_spec.rb new file mode 100644 index 000000000..93247b4c0 --- /dev/null +++ b/spec/faraday/deprecate_spec.rb @@ -0,0 +1,89 @@ +# frozen_string_literal: true + +RSpec.describe Faraday::DeprecatedClass do + class SampleClass < StandardError + attr_accessor :foo + + def initialize(foo = nil) + @foo = foo || :foo + end + end + + SampleDeprecatedClass = Faraday::DeprecatedClass.proxy_class(SampleClass) + + it 'does not raise error for deprecated classes but prints an error message' do + error_message, foobar = with_warn_squelching { SampleDeprecatedClass.new(:foo_bar) } + expect(foobar).to be_a(SampleClass) + expect(foobar.foo).to eq(:foo_bar) + expect(error_message).to match( + Regexp.new( + 'NOTE: SampleDeprecatedClass.new is deprecated; '\ + 'use SampleClass.new instead. It will be removed in or after version 1.0' + ) + ) + end + + it 'does not raise an error for inherited error-namespaced classes but prints an error message' do + error_message, = with_warn_squelching { Class.new(SampleDeprecatedClass) } + + expect(error_message).to match( + Regexp.new( + 'NOTE: Inheriting SampleDeprecatedClass is deprecated; '\ + 'use SampleClass instead. It will be removed in or after version 1.0' + ) + ) + end + + it 'allows backward-compatible class to be subclassed' do + expect { + with_warn_squelching { Class.new(SampleDeprecatedClass) } + }.not_to raise_error + end + + it 'allows rescuing of a current error with a deprecated error' do + begin + raise SampleClass, nil + rescue SampleDeprecatedClass + rescue StandardError => exc + fail "rescued #{exc.class.name} instead" + end + end + + it 'allows rescuing of a current error with a current error' do + begin + raise SampleClass, nil + rescue SampleClass + rescue StandardError => exc + fail "rescued #{exc.class.name} instead" + end + end + + it 'allows rescuing of a deprecated error with a deprecated error' do + begin + raise SampleDeprecatedClass, nil + rescue SampleDeprecatedClass + rescue StandardError => exc + fail "rescued #{exc.class.name} instead" + end + end + + it 'allows rescuing of a deprecated error with a current error' do + begin + raise SampleDeprecatedClass, nil + rescue SampleClass + rescue StandardError => exc + fail "rescued #{exc.class.name} instead" + end + end + + + def with_warn_squelching + stderr_catcher = StringIO.new + original_stderr = $stderr + $stderr = stderr_catcher + result = yield if block_given? + [stderr_catcher.tap(&:rewind).string, result] + ensure + $stderr = original_stderr + end +end diff --git a/spec/faraday/error_spec.rb b/spec/faraday/error_spec.rb index 9b3292ad6..761a337b5 100644 --- a/spec/faraday/error_spec.rb +++ b/spec/faraday/error_spec.rb @@ -56,7 +56,7 @@ end it 'does not raise an error for inherited error-namespaced classes but prints an error message' do - error_message, = with_warn_squelching { class E < Faraday::Error::ClientError; end } + error_message, = with_warn_squelching { Class.new(Faraday::Error::ClientError) } expect(error_message).to match( Regexp.new( @@ -67,7 +67,43 @@ end it 'allows backward-compatible class to be subclassed' do - expect { class CustomError < Faraday::Error::ClientError; end }.not_to raise_error + expect { Class.new(Faraday::Error::ClientError) }.not_to raise_error + end + + it 'allows rescuing of a current error with a deprecated error' do + begin + raise Faraday::ClientError, nil + rescue Faraday::Error::ClientError + rescue Faraday::Error => exc + fail "rescued #{exc.class.name} instead" + end + end + + it 'allows rescuing of a current error with a current error' do + begin + raise Faraday::ClientError, nil + rescue Faraday::ClientError + rescue Faraday::Error => exc + fail "rescued #{exc.class.name} instead" + end + end + + it 'allows rescuing of a deprecated error with a deprecated error' do + begin + raise Faraday::Error::ClientError, nil + rescue Faraday::Error::ClientError + rescue Faraday::Error => exc + fail "rescued #{exc.class.name} instead" + end + end + + it 'allows rescuing of a deprecated error with a current error' do + begin + raise Faraday::Error::ClientError, nil + rescue Faraday::ClientError + rescue Faraday::Error => exc + fail "rescued #{exc.class.name} instead" + end end end From 6198c755a7a6610ab8d7148e897a6054861da6d7 Mon Sep 17 00:00:00 2001 From: rick olson Date: Thu, 17 Oct 2019 15:44:15 -0600 Subject: [PATCH 3/6] squelch this --- spec/faraday/error_spec.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spec/faraday/error_spec.rb b/spec/faraday/error_spec.rb index 761a337b5..92bffe9a6 100644 --- a/spec/faraday/error_spec.rb +++ b/spec/faraday/error_spec.rb @@ -67,7 +67,9 @@ end it 'allows backward-compatible class to be subclassed' do - expect { Class.new(Faraday::Error::ClientError) }.not_to raise_error + expect { + with_warn_squelching { Class.new(Faraday::Error::ClientError) } + }.not_to raise_error end it 'allows rescuing of a current error with a deprecated error' do From 5b0ebf7ddd920d3cfc2a0d3009472561d4f6c7ab Mon Sep 17 00:00:00 2001 From: risk danger olson Date: Thu, 17 Oct 2019 19:27:56 -0600 Subject: [PATCH 4/6] Update lib/faraday/deprecate.rb Co-Authored-By: Bobby McDonald --- lib/faraday/deprecate.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/faraday/deprecate.rb b/lib/faraday/deprecate.rb index 46c1ddf6f..98f18dc1e 100644 --- a/lib/faraday/deprecate.rb +++ b/lib/faraday/deprecate.rb @@ -12,7 +12,7 @@ def self.proxy_class(new_klass) class << k extend Faraday::Deprecate # Make this more human readable than # - klass_name = superclass.to_s[/^#$/, 1] + klass_name = superclass.to_s[/^#$/, 1] deprecate :new, "#{klass_name}.new", '1.0' deprecate :inherited, klass_name, '1.0' From 620c4d12711bcd882ea93fe9e2e611f9b8e3d621 Mon Sep 17 00:00:00 2001 From: rick olson Date: Thu, 17 Oct 2019 19:29:28 -0600 Subject: [PATCH 5/6] remove unnecessary #tap --- lib/faraday/deprecate.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/faraday/deprecate.rb b/lib/faraday/deprecate.rb index 98f18dc1e..1e59b1894 100644 --- a/lib/faraday/deprecate.rb +++ b/lib/faraday/deprecate.rb @@ -8,8 +8,8 @@ module Faraday # @see Faraday::Deprecate module DeprecatedClass def self.proxy_class(new_klass) - Class.new(new_klass).tap do |k| - class << k + Class.new(new_klass) do + class << self extend Faraday::Deprecate # Make this more human readable than # klass_name = superclass.to_s[/^#$/, 1] From c4ebca8ac161f9f1d0334b71f0a6490adb205735 Mon Sep 17 00:00:00 2001 From: rick olson Date: Fri, 18 Oct 2019 09:16:08 -0600 Subject: [PATCH 6/6] use rspec expect syntax to test the error handling --- spec/faraday/deprecate_spec.rb | 28 ++++------------------------ spec/faraday/error_spec.rb | 28 ++++------------------------ 2 files changed, 8 insertions(+), 48 deletions(-) diff --git a/spec/faraday/deprecate_spec.rb b/spec/faraday/deprecate_spec.rb index 93247b4c0..a4a25c748 100644 --- a/spec/faraday/deprecate_spec.rb +++ b/spec/faraday/deprecate_spec.rb @@ -41,39 +41,19 @@ def initialize(foo = nil) end it 'allows rescuing of a current error with a deprecated error' do - begin - raise SampleClass, nil - rescue SampleDeprecatedClass - rescue StandardError => exc - fail "rescued #{exc.class.name} instead" - end + expect { raise SampleClass, nil }.to raise_error(SampleDeprecatedClass) end it 'allows rescuing of a current error with a current error' do - begin - raise SampleClass, nil - rescue SampleClass - rescue StandardError => exc - fail "rescued #{exc.class.name} instead" - end + expect { raise SampleClass, nil }.to raise_error(SampleClass) end it 'allows rescuing of a deprecated error with a deprecated error' do - begin - raise SampleDeprecatedClass, nil - rescue SampleDeprecatedClass - rescue StandardError => exc - fail "rescued #{exc.class.name} instead" - end + expect { raise SampleDeprecatedClass, nil }.to raise_error(SampleDeprecatedClass) end it 'allows rescuing of a deprecated error with a current error' do - begin - raise SampleDeprecatedClass, nil - rescue SampleClass - rescue StandardError => exc - fail "rescued #{exc.class.name} instead" - end + expect { raise SampleDeprecatedClass, nil }.to raise_error(SampleClass) end diff --git a/spec/faraday/error_spec.rb b/spec/faraday/error_spec.rb index 92bffe9a6..f99ae0071 100644 --- a/spec/faraday/error_spec.rb +++ b/spec/faraday/error_spec.rb @@ -73,39 +73,19 @@ end it 'allows rescuing of a current error with a deprecated error' do - begin - raise Faraday::ClientError, nil - rescue Faraday::Error::ClientError - rescue Faraday::Error => exc - fail "rescued #{exc.class.name} instead" - end + expect { raise Faraday::ClientError, nil }.to raise_error(Faraday::Error::ClientError) end it 'allows rescuing of a current error with a current error' do - begin - raise Faraday::ClientError, nil - rescue Faraday::ClientError - rescue Faraday::Error => exc - fail "rescued #{exc.class.name} instead" - end + expect { raise Faraday::ClientError, nil }.to raise_error(Faraday::ClientError) end it 'allows rescuing of a deprecated error with a deprecated error' do - begin - raise Faraday::Error::ClientError, nil - rescue Faraday::Error::ClientError - rescue Faraday::Error => exc - fail "rescued #{exc.class.name} instead" - end + expect { raise Faraday::Error::ClientError, nil }.to raise_error(Faraday::Error::ClientError) end it 'allows rescuing of a deprecated error with a current error' do - begin - raise Faraday::Error::ClientError, nil - rescue Faraday::ClientError - rescue Faraday::Error => exc - fail "rescued #{exc.class.name} instead" - end + expect { raise Faraday::Error::ClientError, nil }.to raise_error(Faraday::ClientError) end end