mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-27 06:05:11 -07:00
Make Strainer also raise when registered method is overriden as protected
This commit is contained in:
@@ -28,9 +28,9 @@ module Liquid
|
|||||||
def self.add_filter(filter)
|
def self.add_filter(filter)
|
||||||
raise ArgumentError, "Expected module but got: #{filter.class}" unless filter.is_a?(Module)
|
raise ArgumentError, "Expected module but got: #{filter.class}" unless filter.is_a?(Module)
|
||||||
unless self.class.include?(filter)
|
unless self.class.include?(filter)
|
||||||
invokable_private_methods = filter.private_instance_methods.select { |m| invokable?(m) }
|
invokable_non_public_methods = (filter.private_instance_methods + filter.protected_instance_methods).select { |m| invokable?(m) }
|
||||||
if invokable_private_methods.any?
|
if invokable_non_public_methods.any?
|
||||||
raise MethodOverrideError, "Filter overrides registered public methods as private: #{invokable_private_methods.join(', ')}"
|
raise MethodOverrideError, "Filter overrides registered public methods as non public: #{invokable_non_public_methods.join(', ')}"
|
||||||
else
|
else
|
||||||
send(:include, filter)
|
send(:include, filter)
|
||||||
@filter_methods.merge(filter.public_instance_methods.map(&:to_s))
|
@filter_methods.merge(filter.public_instance_methods.map(&:to_s))
|
||||||
|
|||||||
@@ -102,7 +102,24 @@ class StrainerUnitTest < Minitest::Test
|
|||||||
error = assert_raises(Liquid::MethodOverrideError) do
|
error = assert_raises(Liquid::MethodOverrideError) do
|
||||||
strainer.class.add_filter(PrivateMethodOverrideFilter)
|
strainer.class.add_filter(PrivateMethodOverrideFilter)
|
||||||
end
|
end
|
||||||
assert_equal 'Liquid error: Filter overrides registered public methods as private: public_filter', error.message
|
assert_equal 'Liquid error: Filter overrides registered public methods as non public: public_filter', error.message
|
||||||
|
end
|
||||||
|
|
||||||
|
module ProtectedMethodOverrideFilter
|
||||||
|
protected
|
||||||
|
|
||||||
|
def public_filter
|
||||||
|
"overriden as protected"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_add_filter_raises_when_module_overrides_registered_public_method_as_protected
|
||||||
|
strainer = Context.new.strainer
|
||||||
|
|
||||||
|
error = assert_raises(Liquid::MethodOverrideError) do
|
||||||
|
strainer.class.add_filter(ProtectedMethodOverrideFilter)
|
||||||
|
end
|
||||||
|
assert_equal 'Liquid error: Filter overrides registered public methods as non public: public_filter', error.message
|
||||||
end
|
end
|
||||||
|
|
||||||
module PublicMethodOverrideFilter
|
module PublicMethodOverrideFilter
|
||||||
|
|||||||
Reference in New Issue
Block a user