From d03c4ae8e860e20c27f46cf25ee83d2bbba14906 Mon Sep 17 00:00:00 2001 From: Ismael Celis Date: Wed, 30 Mar 2016 01:57:21 -0300 Subject: [PATCH] Allow Utils.to_number to work with anything that responds to #to_number --- lib/liquid/utils.rb | 6 +++++- test/integration/standard_filter_test.rb | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/liquid/utils.rb b/lib/liquid/utils.rb index 4e18138..f8f5d71 100644 --- a/lib/liquid/utils.rb +++ b/lib/liquid/utils.rb @@ -52,7 +52,11 @@ module Liquid when String (obj.strip =~ /\A\d+\.\d+\z/) ? BigDecimal.new(obj) : obj.to_i else - 0 + if obj.respond_to?(:to_number) + obj.to_number + else + 0 + end end end diff --git a/test/integration/standard_filter_test.rb b/test/integration/standard_filter_test.rb index eb88384..38a43b3 100644 --- a/test/integration/standard_filter_test.rb +++ b/test/integration/standard_filter_test.rb @@ -41,6 +41,16 @@ class TestEnumerable < Liquid::Drop end end +class NumberLikeThing < Liquid::Drop + def initialize(amount) + @amount = amount + end + + def to_number + @amount + end +end + class StandardFiltersTest < Minitest::Test include Liquid @@ -391,6 +401,8 @@ class StandardFiltersTest < Minitest::Test assert_raises(Liquid::ZeroDivisionError) do assert_template_result "4", "{{ 1 | modulo: 0 }}" end + + assert_template_result "5", "{{ price | divided_by:2 }}", 'price' => NumberLikeThing.new(10) end def test_modulo