mirror of
https://github.com/Shopify/liquid.git
synced 2026-10-03 00:55:11 -07:00
Merge pull request #731 from ismasan/duck_typed_maths_filters
Duck typed maths filters
This commit is contained in:
@@ -51,10 +51,14 @@ module Liquid
|
|||||||
obj
|
obj
|
||||||
when String
|
when String
|
||||||
(obj.strip =~ /\A\d+\.\d+\z/) ? BigDecimal.new(obj) : obj.to_i
|
(obj.strip =~ /\A\d+\.\d+\z/) ? BigDecimal.new(obj) : obj.to_i
|
||||||
|
else
|
||||||
|
if obj.respond_to?(:to_number)
|
||||||
|
obj.to_number
|
||||||
else
|
else
|
||||||
0
|
0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def self.to_date(obj)
|
def self.to_date(obj)
|
||||||
return obj if obj.respond_to?(:strftime)
|
return obj if obj.respond_to?(:strftime)
|
||||||
|
|||||||
@@ -41,6 +41,16 @@ class TestEnumerable < Liquid::Drop
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class NumberLikeThing < Liquid::Drop
|
||||||
|
def initialize(amount)
|
||||||
|
@amount = amount
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_number
|
||||||
|
@amount
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
class StandardFiltersTest < Minitest::Test
|
class StandardFiltersTest < Minitest::Test
|
||||||
include Liquid
|
include Liquid
|
||||||
|
|
||||||
@@ -364,11 +374,15 @@ class StandardFiltersTest < Minitest::Test
|
|||||||
def test_plus
|
def test_plus
|
||||||
assert_template_result "2", "{{ 1 | plus:1 }}"
|
assert_template_result "2", "{{ 1 | plus:1 }}"
|
||||||
assert_template_result "2.0", "{{ '1' | plus:'1.0' }}"
|
assert_template_result "2.0", "{{ '1' | plus:'1.0' }}"
|
||||||
|
|
||||||
|
assert_template_result "5", "{{ price | plus:'2' }}", 'price' => NumberLikeThing.new(3)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_minus
|
def test_minus
|
||||||
assert_template_result "4", "{{ input | minus:operand }}", 'input' => 5, 'operand' => 1
|
assert_template_result "4", "{{ input | minus:operand }}", 'input' => 5, 'operand' => 1
|
||||||
assert_template_result "2.3", "{{ '4.3' | minus:'2' }}"
|
assert_template_result "2.3", "{{ '4.3' | minus:'2' }}"
|
||||||
|
|
||||||
|
assert_template_result "5", "{{ price | minus:'2' }}", 'price' => NumberLikeThing.new(7)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_times
|
def test_times
|
||||||
@@ -378,6 +392,8 @@ class StandardFiltersTest < Minitest::Test
|
|||||||
assert_template_result "6", "{{ '2.1' | times:3 | replace: '.','-' | plus:0}}"
|
assert_template_result "6", "{{ '2.1' | times:3 | replace: '.','-' | plus:0}}"
|
||||||
|
|
||||||
assert_template_result "7.25", "{{ 0.0725 | times:100 }}"
|
assert_template_result "7.25", "{{ 0.0725 | times:100 }}"
|
||||||
|
|
||||||
|
assert_template_result "4", "{{ price | times:2 }}", 'price' => NumberLikeThing.new(2)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_divided_by
|
def test_divided_by
|
||||||
@@ -391,6 +407,8 @@ class StandardFiltersTest < Minitest::Test
|
|||||||
assert_raises(Liquid::ZeroDivisionError) do
|
assert_raises(Liquid::ZeroDivisionError) do
|
||||||
assert_template_result "4", "{{ 1 | modulo: 0 }}"
|
assert_template_result "4", "{{ 1 | modulo: 0 }}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
assert_template_result "5", "{{ price | divided_by:2 }}", 'price' => NumberLikeThing.new(10)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_modulo
|
def test_modulo
|
||||||
@@ -398,6 +416,8 @@ class StandardFiltersTest < Minitest::Test
|
|||||||
assert_raises(Liquid::ZeroDivisionError) do
|
assert_raises(Liquid::ZeroDivisionError) do
|
||||||
assert_template_result "4", "{{ 1 | modulo: 0 }}"
|
assert_template_result "4", "{{ 1 | modulo: 0 }}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
assert_template_result "1", "{{ price | modulo:2 }}", 'price' => NumberLikeThing.new(3)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_round
|
def test_round
|
||||||
@@ -407,6 +427,9 @@ class StandardFiltersTest < Minitest::Test
|
|||||||
assert_raises(Liquid::FloatDomainError) do
|
assert_raises(Liquid::FloatDomainError) do
|
||||||
assert_template_result "4", "{{ 1.0 | divided_by: 0.0 | round }}"
|
assert_template_result "4", "{{ 1.0 | divided_by: 0.0 | round }}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
assert_template_result "5", "{{ price | round }}", 'price' => NumberLikeThing.new(4.6)
|
||||||
|
assert_template_result "4", "{{ price | round }}", 'price' => NumberLikeThing.new(4.3)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_ceil
|
def test_ceil
|
||||||
@@ -415,6 +438,8 @@ class StandardFiltersTest < Minitest::Test
|
|||||||
assert_raises(Liquid::FloatDomainError) do
|
assert_raises(Liquid::FloatDomainError) do
|
||||||
assert_template_result "4", "{{ 1.0 | divided_by: 0.0 | ceil }}"
|
assert_template_result "4", "{{ 1.0 | divided_by: 0.0 | ceil }}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
assert_template_result "5", "{{ price | ceil }}", 'price' => NumberLikeThing.new(4.6)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_floor
|
def test_floor
|
||||||
@@ -423,6 +448,8 @@ class StandardFiltersTest < Minitest::Test
|
|||||||
assert_raises(Liquid::FloatDomainError) do
|
assert_raises(Liquid::FloatDomainError) do
|
||||||
assert_template_result "4", "{{ 1.0 | divided_by: 0.0 | floor }}"
|
assert_template_result "4", "{{ 1.0 | divided_by: 0.0 | floor }}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
assert_template_result "5", "{{ price | floor }}", 'price' => NumberLikeThing.new(5.4)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_append
|
def test_append
|
||||||
|
|||||||
Reference in New Issue
Block a user