Compare commits

...

8 Commits

Author SHA1 Message Date
Justin Li
5068fcae03 Bump version to 3.0.5 2015-07-23 17:04:50 -04:00
Justin Li
4095bfa9f8 Update history for 3.0.5 2015-07-23 17:04:30 -04:00
Justin Li
0148289b88 Update history for 2.6.3 2015-07-23 17:02:13 -04:00
Dylan Thacker-Smith
d891c2b7ab Fix a timezone test failure. 2015-07-23 16:37:26 -04:00
Florian Weingarten
ebbfb54de4 Bump version 2015-07-17 11:20:01 -04:00
Florian Weingarten
8f84ddb5ce Fix chained access to multi-dimensional hash 2015-07-17 11:19:38 -04:00
Justin Li
09de50dcb1 Bump version to 3.0.3 2015-05-28 16:39:10 -04:00
Justin Li
49f2af4209 Merge pull request #570 from Shopify/fix-strict-conditions
Fix condition parse order in strict mode
2015-05-28 16:37:43 -04:00
8 changed files with 77 additions and 16 deletions

View File

@@ -1,6 +1,18 @@
# Liquid Version History
## 3.0.2 / 2015-04-24 / branch "3-0-stable"
## 3.0.5 / 2015-07-23 / branch "3-0-stable"
* Fix test failure under certain timezones [Dylan Thacker-Smith]
## 3.0.4 / 2015-07-17
* Fix chained access to multi-dimensional hashes [Florian Weingarten]
## 3.0.3 / 2015-05-28
* Fix condition parse order in strict mode (#569) [Justin Li, pushrax]
## 3.0.2 / 2015-04-24
* Expose VariableLookup private members (#551) [Justin Li, pushrax]
* Documentation fixes
@@ -44,7 +56,15 @@
* Make map filter work on enumerable drops, see #233 [Florian Weingarten, fw42]
* Improved whitespace stripping for blank blocks, related to #216 [Florian Weingarten, fw42]
## 2.6.1 / 2014-01-10 / branch "2-6-stable"
## 2.6.3 / 2015-07-23 / branch "2-6-stable"
* Fix test failure under certain timezones [Dylan Thacker-Smith]
## 2.6.2 / 2015-01-23
* Remove duplicate hash key [Parker Moore]
## 2.6.1 / 2014-01-10
Security fix, cherry-picked from master (4e14a65):
* Don't call to_sym when creating conditions for security reasons, see #273 [Bouke van der Bijl, bouk]

View File

@@ -75,7 +75,7 @@ module Liquid
def variable_signature
str = consume(:id)
if look(:open_square)
while look(:open_square)
str << consume
str << expression
str << consume(:close_square)

View File

@@ -78,16 +78,16 @@ module Liquid
def strict_parse(markup)
p = Parser.new(markup)
condition = parse_comparison(p)
while op = (p.id?('and'.freeze) || p.id?('or'.freeze))
new_cond = parse_comparison(p)
new_cond.send(op, condition)
condition = new_cond
end
condition = parse_binary_comparison(p)
p.consume(:end_of_string)
condition
end
def parse_binary_comparison(p)
condition = parse_comparison(p)
if op = (p.id?('and'.freeze) || p.id?('or'.freeze))
condition.send(op, parse_binary_comparison(p))
end
condition
end

View File

@@ -1,4 +1,4 @@
# encoding: utf-8
module Liquid
VERSION = "3.0.2"
VERSION = "3.0.5"
end

View File

@@ -44,6 +44,14 @@ class OutputTest < Minitest::Test
assert_equal expected, Template.parse(text).render!(@assigns)
end
def test_variable_traversing_with_two_brackets
text = %({{ site.data.menu[include.menu][include.locale] }})
assert_equal "it works!", Template.parse(text).render!(
"site" => { "data" => { "menu" => { "foo" => { "bar" => "it works!" } } } },
"include" => { "menu" => "foo", "locale" => "bar" }
)
end
def test_variable_traversing
text = %| {{car.bmw}} {{car.gm}} {{car.bmw}} |

View File

@@ -252,8 +252,10 @@ class StandardFiltersTest < Minitest::Test
assert_equal nil, @filters.date(nil, "%B")
assert_equal "07/05/2006", @filters.date(1152098955, "%m/%d/%Y")
assert_equal "07/05/2006", @filters.date("1152098955", "%m/%d/%Y")
with_timezone("UTC") do
assert_equal "07/05/2006", @filters.date(1152098955, "%m/%d/%Y")
assert_equal "07/05/2006", @filters.date("1152098955", "%m/%d/%Y")
end
end
def test_first_last
@@ -376,4 +378,14 @@ class StandardFiltersTest < Minitest::Test
def test_cannot_access_private_methods
assert_template_result('a',"{{ 'a' | to_number }}")
end
private
def with_timezone(tz)
old_tz = ENV['TZ']
ENV['TZ'] = tz
yield
ensure
ENV['TZ'] = old_tz
end
end # StandardFiltersTest

View File

@@ -166,4 +166,25 @@ class IfElseTagTest < Minitest::Test
assert_template_result('', %({% if 1 or throw or or 1 %}yes{% endif %}))
end
end
def test_multiple_conditions
tpl = "{% if a or b and c %}true{% else %}false{% endif %}"
tests = {
[true, true, true] => true,
[true, true, false] => true,
[true, false, true] => true,
[true, false, false] => true,
[false, true, true] => true,
[false, true, false] => false,
[false, false, true] => false,
[false, false, false] => false,
}
tests.each do |vals, expected|
a, b, c = vals
assigns = { 'a' => a, 'b' => b, 'c' => c }
assert_template_result expected.to_s, tpl, assigns, assigns.to_s
end
end
end

View File

@@ -32,13 +32,13 @@ module Minitest
include Liquid
def assert_template_result(expected, template, assigns = {}, message = nil)
assert_equal expected, Template.parse(template).render!(assigns)
assert_equal expected, Template.parse(template).render!(assigns), message
end
def assert_template_result_matches(expected, template, assigns = {}, message = nil)
return assert_template_result(expected, template, assigns, message) unless expected.is_a? Regexp
assert_match expected, Template.parse(template).render!(assigns)
assert_match expected, Template.parse(template).render!(assigns), message
end
def assert_match_syntax_error(match, template, registers = {})