Strainer#add_filter should raise when registered method is overriden as private

This commit is contained in:
Gaurav Chande
2016-02-24 20:03:17 +00:00
parent 3146d5c3f2
commit 8be38d1795
3 changed files with 37 additions and 2 deletions
+1
View File
@@ -59,4 +59,5 @@ module Liquid
UndefinedVariable = Class.new(Error)
UndefinedDropMethod = Class.new(Error)
UndefinedFilter = Class.new(Error)
MethodOverrideError = Class.new(Error)
end
+7 -2
View File
@@ -28,8 +28,13 @@ 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)
send(:include, filter)
@filter_methods.merge(filter.public_instance_methods.map(&:to_s))
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(', ')}"
else
send(:include, filter)
@filter_methods.merge(filter.public_instance_methods.map(&:to_s))
end
end
end