mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-20 11:20:41 -07:00
Merge pull request #864 from chenxianyu2015/fix-strainer-add_filter-method
fix #861: duplicate inclusion condition logic error of Liquid::Strainer.add_filter method
This commit is contained in:
@@ -27,7 +27,7 @@ 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.include?(filter)
|
||||||
invokable_non_public_methods = (filter.private_instance_methods + filter.protected_instance_methods).select { |m| invokable?(m) }
|
invokable_non_public_methods = (filter.private_instance_methods + filter.protected_instance_methods).select { |m| invokable?(m) }
|
||||||
if invokable_non_public_methods.any?
|
if invokable_non_public_methods.any?
|
||||||
raise MethodOverrideError, "Filter overrides registered public methods as non public: #{invokable_non_public_methods.join(', ')}"
|
raise MethodOverrideError, "Filter overrides registered public methods as non public: #{invokable_non_public_methods.join(', ')}"
|
||||||
|
|||||||
@@ -145,4 +145,20 @@ class StrainerUnitTest < Minitest::Test
|
|||||||
Strainer.global_filter(LateAddedFilter)
|
Strainer.global_filter(LateAddedFilter)
|
||||||
assert_equal 'filtered', Strainer.create(nil).invoke('late_added_filter', 'input')
|
assert_equal 'filtered', Strainer.create(nil).invoke('late_added_filter', 'input')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_add_filter_does_not_include_already_included_module
|
||||||
|
mod = Module.new do
|
||||||
|
class << self
|
||||||
|
attr_accessor :include_count
|
||||||
|
def included(mod)
|
||||||
|
self.include_count += 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
self.include_count = 0
|
||||||
|
end
|
||||||
|
strainer = Context.new.strainer
|
||||||
|
strainer.class.add_filter(mod)
|
||||||
|
strainer.class.add_filter(mod)
|
||||||
|
assert_equal 1, mod.include_count
|
||||||
|
end
|
||||||
end # StrainerTest
|
end # StrainerTest
|
||||||
|
|||||||
Reference in New Issue
Block a user