diff --git a/lib/liquid/strainer_template.rb b/lib/liquid/strainer_template.rb index ca0626dd..b4b15f7e 100644 --- a/lib/liquid/strainer_template.rb +++ b/lib/liquid/strainer_template.rb @@ -24,11 +24,11 @@ module Liquid include(filter) - filter_methods.merge(filter.public_instance_methods.map(&:to_s)) + filter_methods.merge(filter.public_instance_methods) end def invokable?(method) - filter_methods.include?(method.to_s) + filter_methods.include?(method.to_sym) end def inherited(subclass) @@ -36,6 +36,9 @@ module Liquid subclass.instance_variable_set(:@filter_methods, @filter_methods.dup) end + # Assuming the filter name is a string is deprecated, explicitly + # cast to_s or to_sym for compatibility with liquid 6, where it is + # planned to return as a symbol. def filter_method_names filter_methods.map(&:to_s).to_a end @@ -48,6 +51,7 @@ module Liquid end def invoke(method, *args) + method = method.to_sym if self.class.invokable?(method) send(method, *args) elsif @context.strict_filters diff --git a/lib/liquid/variable.rb b/lib/liquid/variable.rb index 1a4c0719..3af97a30 100644 --- a/lib/liquid/variable.rb +++ b/lib/liquid/variable.rb @@ -18,7 +18,7 @@ module Liquid JustTagAttributes = /\A#{TagAttributes}\z/o MarkupWithQuotedFragment = /(#{QuotedFragment})(.*)/om - attr_accessor :filters, :name, :line_number + attr_accessor :name, :line_number attr_reader :parse_context alias_method :options, :parse_context @@ -52,7 +52,7 @@ module Liquid filters = Regexp.last_match(1).scan(FilterParser) filters.each do |f| next unless f =~ /\w+/ - filtername = Regexp.last_match(0) + filtername = Regexp.last_match(0).to_sym filterargs = f.scan(FilterArgsRegex).flatten @filters << parse_filter_expressions(filtername, filterargs) end @@ -67,13 +67,21 @@ module Liquid @name = parse_context.parse_expression(p.expression) while p.consume?(:pipe) - filtername = p.consume(:id) + filtername = p.consume(:id).to_sym filterargs = p.consume?(:colon) ? parse_filterargs(p) : [] @filters << parse_filter_expressions(filtername, filterargs) end p.consume(:end_of_string) end + # Assuming the filter name is a string is deprecated, explicitly + # cast to_s or to_sym for compatibility with liquid 6, where it is + # planned to return as a symbol. + def filters + # Remove to_s in liquid 6.0 + @filters.map { |key, *args| [key.to_s, *args].freeze }.freeze + end + def parse_filterargs(p) # first argument filterargs = [p.argument] diff --git a/test/unit/strainer_template_unit_test.rb b/test/unit/strainer_template_unit_test.rb index fd6a5a3c..1a83332b 100644 --- a/test/unit/strainer_template_unit_test.rb +++ b/test/unit/strainer_template_unit_test.rb @@ -60,7 +60,7 @@ class StrainerTemplateUnitTest < Minitest::Test with_global_filter do strainer = Context.new.strainer strainer.class.add_filter(PublicMethodOverrideFilter) - assert(strainer.class.send(:filter_methods).include?('public_filter')) + assert(strainer.class.filter_method_names.include?('public_filter')) end end