From d03742e994f6a73eeac1121815fc49706aefcbad Mon Sep 17 00:00:00 2001 From: Ashwin Maroli Date: Fri, 24 Mar 2023 14:29:18 +0530 Subject: [PATCH] Handle TypeError from `where` filter gracefully (#9292) Merge pull request 9292 --- lib/jekyll/filters.rb | 8 ++++++++ test/test_filters.rb | 12 ++++++++++++ 2 files changed, 20 insertions(+) diff --git a/lib/jekyll/filters.rb b/lib/jekyll/filters.rb index 5422d52a..7a79eec9 100644 --- a/lib/jekyll/filters.rb +++ b/lib/jekyll/filters.rb @@ -441,6 +441,14 @@ module Jekyll property.split(".").reduce(liquid_data) do |data, key| data.respond_to?(:[]) && data[key] end + rescue TypeError => e + msg = if liquid_data.is_a?(Array) + "Error accessing object (#{liquid_data.to_s[0...20]}) with given key. Expected an " \ + "integer but got #{property.inspect} instead." + else + e.message + end + raise e, msg end FLOAT_LIKE = %r!\A\s*-?(?:\d+\.?\d*|\.\d+)\s*\Z!.freeze diff --git a/test/test_filters.rb b/test/test_filters.rb index ee9b31af..8992e76f 100644 --- a/test/test_filters.rb +++ b/test/test_filters.rb @@ -958,6 +958,18 @@ class TestFilters < JekyllUnitTest results = @filter.where(SelectDummy.new, "obj", "1 == 1") assert_equal [], results end + + should "gracefully handle invalid property type" do + hash = { + "members" => { "name" => %w(John Jane Jimmy) }, + "roles" => %w(Admin Recruiter Manager), + } + err = assert_raises(TypeError) { @filter.where(hash, "name", "Jimmy") } + truncatd_arr_str = hash["roles"].to_liquid.to_s[0...20] + msg = "Error accessing object (#{truncatd_arr_str}) with given key. Expected an integer " \ + 'but got "name" instead.' + assert_equal msg, err.message + end end context "where_exp filter" do