Handle TypeError from `where` filter gracefully (#9292)

Merge pull request 9292
This commit is contained in:
Ashwin Maroli 2023-03-24 14:29:18 +05:30 committed by GitHub
parent 052f1bd412
commit d03742e994
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 0 deletions

View File

@ -441,6 +441,14 @@ module Jekyll
property.split(".").reduce(liquid_data) do |data, key| property.split(".").reduce(liquid_data) do |data, key|
data.respond_to?(:[]) && data[key] data.respond_to?(:[]) && data[key]
end 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 end
FLOAT_LIKE = %r!\A\s*-?(?:\d+\.?\d*|\.\d+)\s*\Z!.freeze FLOAT_LIKE = %r!\A\s*-?(?:\d+\.?\d*|\.\d+)\s*\Z!.freeze

View File

@ -958,6 +958,18 @@ class TestFilters < JekyllUnitTest
results = @filter.where(SelectDummy.new, "obj", "1 == 1") results = @filter.where(SelectDummy.new, "obj", "1 == 1")
assert_equal [], results assert_equal [], results
end 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 end
context "where_exp filter" do context "where_exp filter" do