From 422bafd66a8084f0e037509b97c2a2f837c2c885 Mon Sep 17 00:00:00 2001 From: Justin Li Date: Wed, 12 Nov 2014 16:12:00 -0500 Subject: [PATCH 1/3] Fix #warnings taking exponential time to compute --- lib/liquid/block_body.rb | 2 +- test/integration/template_test.rb | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/liquid/block_body.rb b/lib/liquid/block_body.rb index 14a3696..c892d93 100644 --- a/lib/liquid/block_body.rb +++ b/lib/liquid/block_body.rb @@ -62,7 +62,7 @@ module Liquid def warnings all_warnings = [] nodelist.each do |node| - all_warnings.concat(node.warnings) if node.respond_to?(:warnings) && node.warnings + all_warnings.concat(node.warnings) if node.respond_to?(:warnings) end all_warnings end diff --git a/test/integration/template_test.rb b/test/integration/template_test.rb index 9a4c979..a754b3f 100644 --- a/test/integration/template_test.rb +++ b/test/integration/template_test.rb @@ -37,6 +37,16 @@ class TemplateTest < Minitest::Test assert_equal 'from instance assigns', t.parse("{{ foo }}").render! end + def test_warnings_is_not_exponential_time + str = "false" + 100.times do + str = "{% if true %}true{% else %}#{str}{% endif %}" + end + + t = Template.parse(str) + assert_equal [], t.warnings + end + def test_instance_assigns_persist_on_same_template_parsing_between_renders t = Template.new.parse("{{ foo }}{% assign foo = 'foo' %}{{ foo }}") assert_equal 'foo', t.render! From 1673098126236bae58b0926370b2353eb2787c0a Mon Sep 17 00:00:00 2001 From: Justin Li Date: Wed, 12 Nov 2014 16:46:10 -0500 Subject: [PATCH 2/3] Handle potential case where warnings returns nil --- lib/liquid/block_body.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/liquid/block_body.rb b/lib/liquid/block_body.rb index c892d93..5e8a965 100644 --- a/lib/liquid/block_body.rb +++ b/lib/liquid/block_body.rb @@ -62,7 +62,7 @@ module Liquid def warnings all_warnings = [] nodelist.each do |node| - all_warnings.concat(node.warnings) if node.respond_to?(:warnings) + all_warnings.concat(node.warnings || []) if node.respond_to?(:warnings) end all_warnings end From 737be1a0c108ca5a349a684db41516749529b402 Mon Sep 17 00:00:00 2001 From: Justin Li Date: Wed, 12 Nov 2014 17:03:48 -0500 Subject: [PATCH 3/3] Use Timeout#timeout for warnings tests --- test/integration/template_test.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/integration/template_test.rb b/test/integration/template_test.rb index a754b3f..e395206 100644 --- a/test/integration/template_test.rb +++ b/test/integration/template_test.rb @@ -1,4 +1,5 @@ require 'test_helper' +require 'timeout' class TemplateContextDrop < Liquid::Drop def before_method(method) @@ -44,7 +45,7 @@ class TemplateTest < Minitest::Test end t = Template.parse(str) - assert_equal [], t.warnings + assert_equal [], Timeout::timeout(1) { t.warnings } end def test_instance_assigns_persist_on_same_template_parsing_between_renders