diff --git a/lib/liquid/strainer.rb b/lib/liquid/strainer.rb index 7ecb31a..441e335 100644 --- a/lib/liquid/strainer.rb +++ b/lib/liquid/strainer.rb @@ -28,9 +28,9 @@ module Liquid def self.add_filter(filter) raise ArgumentError, "Expected module but got: #{filter.class}" unless filter.is_a?(Module) unless self.class.include?(filter) - invokable_private_methods = filter.private_instance_methods.select { |m| invokable?(m) } - if invokable_private_methods.any? - raise MethodOverrideError, "Filter overrides registered public methods as private: #{invokable_private_methods.join(', ')}" + invokable_non_public_methods = (filter.private_instance_methods + filter.protected_instance_methods).select { |m| invokable?(m) } + if invokable_non_public_methods.any? + raise MethodOverrideError, "Filter overrides registered public methods as non public: #{invokable_non_public_methods.join(', ')}" else send(:include, filter) @filter_methods.merge(filter.public_instance_methods.map(&:to_s)) diff --git a/test/unit/strainer_unit_test.rb b/test/unit/strainer_unit_test.rb index ef32c5f..5cdf2e8 100644 --- a/test/unit/strainer_unit_test.rb +++ b/test/unit/strainer_unit_test.rb @@ -102,7 +102,24 @@ class StrainerUnitTest < Minitest::Test error = assert_raises(Liquid::MethodOverrideError) do strainer.class.add_filter(PrivateMethodOverrideFilter) 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 module PublicMethodOverrideFilter