mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-12 23:40:45 -07:00
Use array instead of Hash to keep the registered filters
1.8.7 compatibility fix In Ruby 1.8.7, Hash does not preserve insertion ordering as Array does. This could cause a problem when registering filters which depend on others and the registration order is important. So, the @@filters variable was changed to array where the order of the filters is the same as the insertion order.
This commit is contained in:
@@ -8,7 +8,7 @@ module Liquid
|
|||||||
# The Strainer only allows method calls defined in filters given to it via Strainer.global_filter,
|
# The Strainer only allows method calls defined in filters given to it via Strainer.global_filter,
|
||||||
# Context#add_filters or Template.register_filter
|
# Context#add_filters or Template.register_filter
|
||||||
class Strainer #:nodoc:
|
class Strainer #:nodoc:
|
||||||
@@filters = {}
|
@@filters = []
|
||||||
@@known_filters = Set.new
|
@@known_filters = Set.new
|
||||||
@@known_methods = Set.new
|
@@known_methods = Set.new
|
||||||
|
|
||||||
@@ -19,7 +19,7 @@ module Liquid
|
|||||||
def self.global_filter(filter)
|
def self.global_filter(filter)
|
||||||
raise ArgumentError, "Passed filter is not a module" unless filter.is_a?(Module)
|
raise ArgumentError, "Passed filter is not a module" unless filter.is_a?(Module)
|
||||||
add_known_filter(filter)
|
add_known_filter(filter)
|
||||||
@@filters[filter.name] = filter
|
@@filters << filter unless @@filters.include?(filter)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.add_known_filter(filter)
|
def self.add_known_filter(filter)
|
||||||
@@ -34,7 +34,7 @@ module Liquid
|
|||||||
|
|
||||||
def self.create(context)
|
def self.create(context)
|
||||||
strainer = Strainer.new(context)
|
strainer = Strainer.new(context)
|
||||||
@@filters.each { |k,m| strainer.extend(m) }
|
@@filters.each { |m| strainer.extend(m) }
|
||||||
strainer
|
strainer
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
require 'test_helper'
|
||||||
|
|
||||||
|
module MoneyFilter
|
||||||
|
def money(input)
|
||||||
|
sprintf(' %d$ ', input)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
module CanadianMoneyFilter
|
||||||
|
def money(input)
|
||||||
|
sprintf(' %d$ CAD ', input)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class HashOrderingTest < Test::Unit::TestCase
|
||||||
|
include Liquid
|
||||||
|
|
||||||
|
def test_global_register_order
|
||||||
|
Template.register_filter(MoneyFilter)
|
||||||
|
Template.register_filter(CanadianMoneyFilter)
|
||||||
|
|
||||||
|
assert_equal " 1000$ CAD ", Template.parse("{{1000 | money}}").render(nil, nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user