mirror of
https://github.com/Shopify/liquid.git
synced 2026-10-03 00:55:11 -07:00
Back to filter instanciation
This commit is contained in:
@@ -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,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
|
||||||
|
|||||||
Reference in New Issue
Block a user