From 52b6a024fda25885a81165ef6c4d6643bfa1f879 Mon Sep 17 00:00:00 2001 From: Kyrylo Silin Date: Thu, 6 Jun 2024 18:05:47 +0300 Subject: [PATCH 1/2] Add the WrappedError class --- lib/telebugs.rb | 1 + lib/telebugs/wrapped_error.rb | 22 +++++++++++++++++++ test/test_wrapped_error.rb | 41 +++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 lib/telebugs/wrapped_error.rb create mode 100644 test/test_wrapped_error.rb diff --git a/lib/telebugs.rb b/lib/telebugs.rb index 354872c..eb002ae 100644 --- a/lib/telebugs.rb +++ b/lib/telebugs.rb @@ -5,6 +5,7 @@ require_relative "telebugs/version" require_relative "telebugs/config" require_relative "telebugs/promise" +require_relative "telebugs/wrapped_error" module Telebugs # The general error that this library uses when it wants to raise. diff --git a/lib/telebugs/wrapped_error.rb b/lib/telebugs/wrapped_error.rb new file mode 100644 index 0000000..fa01c46 --- /dev/null +++ b/lib/telebugs/wrapped_error.rb @@ -0,0 +1,22 @@ +module Telebugs + # WrappedError unwraps an error and its causes up to a certain depth. + class WrappedError + MAX_NESTED_ERRORS = 3 + + def initialize(error) + @error = error + end + + def unwrap + error_list = [] + error = @error + + while error && error_list.size < MAX_NESTED_ERRORS + error_list << error + error = error.cause + end + + error_list + end + end +end diff --git a/test/test_wrapped_error.rb b/test/test_wrapped_error.rb new file mode 100644 index 0000000..8ebea61 --- /dev/null +++ b/test/test_wrapped_error.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +require "test_helper" + +class TestWrappedError < Minitest::Test + def test_unwraps_errors_without_a_cause + error = StandardError.new + wrapped = Telebugs::WrappedError.new(error) + + assert_equal [error], wrapped.unwrap + end + + def test_unwraps_no_more_than_3_nested_errors + begin + raise RuntimeError, "error 1" + rescue => e1 + begin + raise RuntimeError, "error 2" + rescue => e2 + begin + raise RuntimeError, "error 3" + rescue => e3 + begin + raise RuntimeError, "error 4" + rescue => e4 + begin + raise RuntimeError, "error 5" + rescue => e5 + end + end + end + end + end + + wrapped = Telebugs::WrappedError.new(e5) + unwrapped = wrapped.unwrap + + assert_equal 3, unwrapped.size + assert_equal [e5, e4, e3], unwrapped + end +end From 7d1aefa118b48b0760bd0ddfb266d439cc9cc6a4 Mon Sep 17 00:00:00 2001 From: Kyrylo Silin Date: Thu, 6 Jun 2024 18:07:36 +0300 Subject: [PATCH 2/2] fixup! Add the WrappedError class --- test/test_wrapped_error.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/test_wrapped_error.rb b/test/test_wrapped_error.rb index 8ebea61..8ccab82 100644 --- a/test/test_wrapped_error.rb +++ b/test/test_wrapped_error.rb @@ -12,19 +12,19 @@ def test_unwraps_errors_without_a_cause def test_unwraps_no_more_than_3_nested_errors begin - raise RuntimeError, "error 1" - rescue => e1 + raise "error 1" + rescue => _ begin - raise RuntimeError, "error 2" - rescue => e2 + raise "error 2" + rescue => _ begin - raise RuntimeError, "error 3" + raise "error 3" rescue => e3 begin - raise RuntimeError, "error 4" + raise "error 4" rescue => e4 begin - raise RuntimeError, "error 5" + raise "error 5" rescue => e5 end end