Back to filter instanciation

This commit is contained in:
Thierry Joyal
2020-01-22 18:09:15 -05:00
parent 13936a24f1
commit 05c8214f7d
2 changed files with 30 additions and 21 deletions
+7 -1
View File
@@ -32,6 +32,12 @@ module Liquid
end end
end end
attr_accessor :context def initialize(context)
@context = context
end
private
attr_reader :context
end end
end end
+23 -20
View File
@@ -23,30 +23,25 @@ module Liquid
raise(ArgumentError, "wrong argument type Proc (expected Liquid::Filter)") raise(ArgumentError, "wrong argument type Proc (expected Liquid::Filter)")
end end
instance = filter.new
filter.invokable_methods.each do |method| filter.invokable_methods.each do |method|
filter_instances[method] = instance filter_method_map[method] = filter
end end
end end
def invokable?(method) def filter_for(method)
filter_instances.key?(method) filter_method_map[method]
end end
def invoke(method, context, *args) def invokable?(method)
instance = filter_instances.fetch(method) filter_method_map.key?(method)
instance.context = context
instance.public_send(method, *args)
end end
private private
def filter_instances def filter_method_map
@filter_instances ||= {} @filter_method_map ||= {}
end end
# Caching here is most likely not required anymore since we cache instances and there is only one instance per filter class.
def convert_mod_to_filter(mod) def convert_mod_to_filter(mod)
@filter_classes ||= {} @filter_classes ||= {}
@filter_classes[mod] ||= begin @filter_classes[mod] ||= begin
@@ -55,26 +50,34 @@ module Liquid
klass klass
end end
end end
def filter_class_by_methods
@filter_class_by_methods ||= {}
end
end end
def invoke(method, *args) def invoke(method, *args)
if self.class.invokable?(method) if self.class.invokable?(method)
self.class.invoke(method, @context, *args) begin
elsif @context.strict_filters instance = filter_instance_for(method)
instance.public_send(method, *args)
rescue ::ArgumentError => e
raise Liquid::ArgumentError, e.message, e.backtrace
end
elsif context.strict_filters
raise(Liquid::UndefinedFilter, "undefined filter #{method}") raise(Liquid::UndefinedFilter, "undefined filter #{method}")
else else
args.first args.first
end end
rescue ::ArgumentError => e
raise Liquid::ArgumentError, e.message, e.backtrace
end end
private private
def filter_instance_for(method)
@filter_instances ||= {}
@filter_instances.fetch(method) do
klass = self.class.filter_for(method)
klass.new(context)
end
end
attr_reader :context attr_reader :context
end end
end end