liquid 3.0.6 → 5.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/History.md +243 -58
- data/README.md +43 -4
- data/lib/liquid/block.rb +57 -123
- data/lib/liquid/block_body.rb +217 -85
- data/lib/liquid/condition.rb +92 -45
- data/lib/liquid/context.rb +154 -89
- data/lib/liquid/document.rb +57 -9
- data/lib/liquid/drop.rb +20 -17
- data/lib/liquid/errors.rb +27 -29
- data/lib/liquid/expression.rb +32 -20
- data/lib/liquid/extensions.rb +21 -7
- data/lib/liquid/file_system.rb +17 -15
- data/lib/liquid/forloop_drop.rb +92 -0
- data/lib/liquid/i18n.rb +10 -8
- data/lib/liquid/interrupts.rb +4 -3
- data/lib/liquid/lexer.rb +37 -26
- data/lib/liquid/locales/en.yml +13 -6
- data/lib/liquid/parse_context.rb +54 -0
- data/lib/liquid/parse_tree_visitor.rb +42 -0
- data/lib/liquid/parser.rb +30 -18
- data/lib/liquid/parser_switching.rb +20 -6
- data/lib/liquid/partial_cache.rb +24 -0
- data/lib/liquid/profiler/hooks.rb +26 -14
- data/lib/liquid/profiler.rb +72 -92
- data/lib/liquid/range_lookup.rb +28 -3
- data/lib/liquid/registers.rb +51 -0
- data/lib/liquid/resource_limits.rb +62 -0
- data/lib/liquid/standardfilters.rb +715 -132
- data/lib/liquid/strainer_factory.rb +41 -0
- data/lib/liquid/strainer_template.rb +62 -0
- data/lib/liquid/tablerowloop_drop.rb +121 -0
- data/lib/liquid/tag/disableable.rb +22 -0
- data/lib/liquid/tag/disabler.rb +21 -0
- data/lib/liquid/tag.rb +35 -12
- data/lib/liquid/tags/assign.rb +57 -18
- data/lib/liquid/tags/break.rb +15 -5
- data/lib/liquid/tags/capture.rb +24 -18
- data/lib/liquid/tags/case.rb +79 -30
- data/lib/liquid/tags/comment.rb +19 -4
- data/lib/liquid/tags/continue.rb +16 -12
- data/lib/liquid/tags/cycle.rb +47 -27
- data/lib/liquid/tags/decrement.rb +23 -24
- data/lib/liquid/tags/echo.rb +41 -0
- data/lib/liquid/tags/for.rb +155 -124
- data/lib/liquid/tags/if.rb +97 -63
- data/lib/liquid/tags/ifchanged.rb +11 -12
- data/lib/liquid/tags/include.rb +82 -73
- data/lib/liquid/tags/increment.rb +23 -17
- data/lib/liquid/tags/inline_comment.rb +43 -0
- data/lib/liquid/tags/raw.rb +50 -8
- data/lib/liquid/tags/render.rb +109 -0
- data/lib/liquid/tags/table_row.rb +57 -41
- data/lib/liquid/tags/unless.rb +38 -20
- data/lib/liquid/template.rb +71 -103
- data/lib/liquid/template_factory.rb +9 -0
- data/lib/liquid/tokenizer.rb +39 -0
- data/lib/liquid/usage.rb +8 -0
- data/lib/liquid/utils.rb +63 -9
- data/lib/liquid/variable.rb +74 -56
- data/lib/liquid/variable_lookup.rb +31 -15
- data/lib/liquid/version.rb +3 -1
- data/lib/liquid.rb +27 -12
- metadata +30 -106
- data/lib/liquid/module_ex.rb +0 -62
- data/lib/liquid/strainer.rb +0 -59
- data/lib/liquid/token.rb +0 -18
- data/test/fixtures/en_locale.yml +0 -9
- data/test/integration/assign_test.rb +0 -48
- data/test/integration/blank_test.rb +0 -106
- data/test/integration/capture_test.rb +0 -50
- data/test/integration/context_test.rb +0 -32
- data/test/integration/drop_test.rb +0 -271
- data/test/integration/error_handling_test.rb +0 -207
- data/test/integration/filter_test.rb +0 -138
- data/test/integration/hash_ordering_test.rb +0 -23
- data/test/integration/output_test.rb +0 -124
- data/test/integration/parsing_quirks_test.rb +0 -116
- data/test/integration/render_profiling_test.rb +0 -154
- data/test/integration/security_test.rb +0 -64
- data/test/integration/standard_filter_test.rb +0 -396
- data/test/integration/tags/break_tag_test.rb +0 -16
- data/test/integration/tags/continue_tag_test.rb +0 -16
- data/test/integration/tags/for_tag_test.rb +0 -375
- data/test/integration/tags/if_else_tag_test.rb +0 -190
- data/test/integration/tags/include_tag_test.rb +0 -234
- data/test/integration/tags/increment_tag_test.rb +0 -24
- data/test/integration/tags/raw_tag_test.rb +0 -25
- data/test/integration/tags/standard_tag_test.rb +0 -297
- data/test/integration/tags/statements_test.rb +0 -113
- data/test/integration/tags/table_row_test.rb +0 -63
- data/test/integration/tags/unless_else_tag_test.rb +0 -26
- data/test/integration/template_test.rb +0 -182
- data/test/integration/variable_test.rb +0 -82
- data/test/test_helper.rb +0 -89
- data/test/unit/block_unit_test.rb +0 -55
- data/test/unit/condition_unit_test.rb +0 -149
- data/test/unit/context_unit_test.rb +0 -492
- data/test/unit/file_system_unit_test.rb +0 -35
- data/test/unit/i18n_unit_test.rb +0 -37
- data/test/unit/lexer_unit_test.rb +0 -48
- data/test/unit/module_ex_unit_test.rb +0 -87
- data/test/unit/parser_unit_test.rb +0 -82
- data/test/unit/regexp_unit_test.rb +0 -44
- data/test/unit/strainer_unit_test.rb +0 -69
- data/test/unit/tag_unit_test.rb +0 -16
- data/test/unit/tags/case_tag_unit_test.rb +0 -10
- data/test/unit/tags/for_tag_unit_test.rb +0 -13
- data/test/unit/tags/if_tag_unit_test.rb +0 -8
- data/test/unit/template_unit_test.rb +0 -69
- data/test/unit/tokenizer_unit_test.rb +0 -38
- data/test/unit/variable_unit_test.rb +0 -145
- /data/{MIT-LICENSE → LICENSE} +0 -0
@@ -1,113 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class StatementsTest < Minitest::Test
|
4
|
-
include Liquid
|
5
|
-
|
6
|
-
def test_true_eql_true
|
7
|
-
text = ' {% if true == true %} true {% else %} false {% endif %} '
|
8
|
-
assert_template_result ' true ', text
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_true_not_eql_true
|
12
|
-
text = ' {% if true != true %} true {% else %} false {% endif %} '
|
13
|
-
assert_template_result ' false ', text
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_true_lq_true
|
17
|
-
text = ' {% if 0 > 0 %} true {% else %} false {% endif %} '
|
18
|
-
assert_template_result ' false ', text
|
19
|
-
end
|
20
|
-
|
21
|
-
def test_one_lq_zero
|
22
|
-
text = ' {% if 1 > 0 %} true {% else %} false {% endif %} '
|
23
|
-
assert_template_result ' true ', text
|
24
|
-
end
|
25
|
-
|
26
|
-
def test_zero_lq_one
|
27
|
-
text = ' {% if 0 < 1 %} true {% else %} false {% endif %} '
|
28
|
-
assert_template_result ' true ', text
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_zero_lq_or_equal_one
|
32
|
-
text = ' {% if 0 <= 0 %} true {% else %} false {% endif %} '
|
33
|
-
assert_template_result ' true ', text
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_zero_lq_or_equal_one_involving_nil
|
37
|
-
text = ' {% if null <= 0 %} true {% else %} false {% endif %} '
|
38
|
-
assert_template_result ' false ', text
|
39
|
-
|
40
|
-
|
41
|
-
text = ' {% if 0 <= null %} true {% else %} false {% endif %} '
|
42
|
-
assert_template_result ' false ', text
|
43
|
-
end
|
44
|
-
|
45
|
-
def test_zero_lqq_or_equal_one
|
46
|
-
text = ' {% if 0 >= 0 %} true {% else %} false {% endif %} '
|
47
|
-
assert_template_result ' true ', text
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_strings
|
51
|
-
text = " {% if 'test' == 'test' %} true {% else %} false {% endif %} "
|
52
|
-
assert_template_result ' true ', text
|
53
|
-
end
|
54
|
-
|
55
|
-
def test_strings_not_equal
|
56
|
-
text = " {% if 'test' != 'test' %} true {% else %} false {% endif %} "
|
57
|
-
assert_template_result ' false ', text
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_var_strings_equal
|
61
|
-
text = ' {% if var == "hello there!" %} true {% else %} false {% endif %} '
|
62
|
-
assert_template_result ' true ', text, 'var' => 'hello there!'
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_var_strings_are_not_equal
|
66
|
-
text = ' {% if "hello there!" == var %} true {% else %} false {% endif %} '
|
67
|
-
assert_template_result ' true ', text, 'var' => 'hello there!'
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_var_and_long_string_are_equal
|
71
|
-
text = " {% if var == 'hello there!' %} true {% else %} false {% endif %} "
|
72
|
-
assert_template_result ' true ', text, 'var' => 'hello there!'
|
73
|
-
end
|
74
|
-
|
75
|
-
|
76
|
-
def test_var_and_long_string_are_equal_backwards
|
77
|
-
text = " {% if 'hello there!' == var %} true {% else %} false {% endif %} "
|
78
|
-
assert_template_result ' true ', text, 'var' => 'hello there!'
|
79
|
-
end
|
80
|
-
|
81
|
-
#def test_is_nil
|
82
|
-
# text = %| {% if var != nil %} true {% else %} false {% end %} |
|
83
|
-
# @template.assigns = { 'var' => 'hello there!'}
|
84
|
-
# expected = %| true |
|
85
|
-
# assert_equal expected, @template.parse(text)
|
86
|
-
#end
|
87
|
-
|
88
|
-
def test_is_collection_empty
|
89
|
-
text = ' {% if array == empty %} true {% else %} false {% endif %} '
|
90
|
-
assert_template_result ' true ', text, 'array' => []
|
91
|
-
end
|
92
|
-
|
93
|
-
def test_is_not_collection_empty
|
94
|
-
text = ' {% if array == empty %} true {% else %} false {% endif %} '
|
95
|
-
assert_template_result ' false ', text, 'array' => [1,2,3]
|
96
|
-
end
|
97
|
-
|
98
|
-
def test_nil
|
99
|
-
text = ' {% if var == nil %} true {% else %} false {% endif %} '
|
100
|
-
assert_template_result ' true ', text, 'var' => nil
|
101
|
-
|
102
|
-
text = ' {% if var == null %} true {% else %} false {% endif %} '
|
103
|
-
assert_template_result ' true ', text, 'var' => nil
|
104
|
-
end
|
105
|
-
|
106
|
-
def test_not_nil
|
107
|
-
text = ' {% if var != nil %} true {% else %} false {% endif %} '
|
108
|
-
assert_template_result ' true ', text, 'var' => 1
|
109
|
-
|
110
|
-
text = ' {% if var != null %} true {% else %} false {% endif %} '
|
111
|
-
assert_template_result ' true ', text, 'var' => 1
|
112
|
-
end
|
113
|
-
end # StatementsTest
|
@@ -1,63 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class TableRowTest < Minitest::Test
|
4
|
-
include Liquid
|
5
|
-
|
6
|
-
class ArrayDrop < Liquid::Drop
|
7
|
-
include Enumerable
|
8
|
-
|
9
|
-
def initialize(array)
|
10
|
-
@array = array
|
11
|
-
end
|
12
|
-
|
13
|
-
def each(&block)
|
14
|
-
@array.each(&block)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_table_row
|
19
|
-
|
20
|
-
assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
|
21
|
-
'{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
|
22
|
-
'numbers' => [1,2,3,4,5,6])
|
23
|
-
|
24
|
-
assert_template_result("<tr class=\"row1\">\n</tr>\n",
|
25
|
-
'{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
|
26
|
-
'numbers' => [])
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_table_row_with_different_cols
|
30
|
-
assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td><td class=\"col4\"> 4 </td><td class=\"col5\"> 5 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 6 </td></tr>\n",
|
31
|
-
'{% tablerow n in numbers cols:5%} {{n}} {% endtablerow %}',
|
32
|
-
'numbers' => [1,2,3,4,5,6])
|
33
|
-
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_table_col_counter
|
37
|
-
assert_template_result("<tr class=\"row1\">\n<td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n<tr class=\"row2\"><td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n<tr class=\"row3\"><td class=\"col1\">1</td><td class=\"col2\">2</td></tr>\n",
|
38
|
-
'{% tablerow n in numbers cols:2%}{{tablerowloop.col}}{% endtablerow %}',
|
39
|
-
'numbers' => [1,2,3,4,5,6])
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_quoted_fragment
|
43
|
-
assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
|
44
|
-
"{% tablerow n in collections.frontpage cols:3%} {{n}} {% endtablerow %}",
|
45
|
-
'collections' => {'frontpage' => [1,2,3,4,5,6]})
|
46
|
-
assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
|
47
|
-
"{% tablerow n in collections['frontpage'] cols:3%} {{n}} {% endtablerow %}",
|
48
|
-
'collections' => {'frontpage' => [1,2,3,4,5,6]})
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_enumerable_drop
|
53
|
-
assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
|
54
|
-
'{% tablerow n in numbers cols:3%} {{n}} {% endtablerow %}',
|
55
|
-
'numbers' => ArrayDrop.new([1,2,3,4,5,6]))
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_offset_and_limit
|
59
|
-
assert_template_result("<tr class=\"row1\">\n<td class=\"col1\"> 1 </td><td class=\"col2\"> 2 </td><td class=\"col3\"> 3 </td></tr>\n<tr class=\"row2\"><td class=\"col1\"> 4 </td><td class=\"col2\"> 5 </td><td class=\"col3\"> 6 </td></tr>\n",
|
60
|
-
'{% tablerow n in numbers cols:3 offset:1 limit:6%} {{n}} {% endtablerow %}',
|
61
|
-
'numbers' => [0,1,2,3,4,5,6,7])
|
62
|
-
end
|
63
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class UnlessElseTagTest < Minitest::Test
|
4
|
-
include Liquid
|
5
|
-
|
6
|
-
def test_unless
|
7
|
-
assert_template_result(' ',' {% unless true %} this text should not go into the output {% endunless %} ')
|
8
|
-
assert_template_result(' this text should go into the output ',
|
9
|
-
' {% unless false %} this text should go into the output {% endunless %} ')
|
10
|
-
assert_template_result(' you rock ?','{% unless true %} you suck {% endunless %} {% unless false %} you rock {% endunless %}?')
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_unless_else
|
14
|
-
assert_template_result(' YES ','{% unless true %} NO {% else %} YES {% endunless %}')
|
15
|
-
assert_template_result(' YES ','{% unless false %} YES {% else %} NO {% endunless %}')
|
16
|
-
assert_template_result(' YES ','{% unless "foo" %} NO {% else %} YES {% endunless %}')
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_unless_in_loop
|
20
|
-
assert_template_result '23', '{% for i in choices %}{% unless i %}{{ forloop.index }}{% endunless %}{% endfor %}', 'choices' => [1, nil, false]
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_unless_else_in_loop
|
24
|
-
assert_template_result ' TRUE 2 3 ', '{% for i in choices %}{% unless i %} {{ forloop.index }} {% else %} TRUE {% endunless %}{% endfor %}', 'choices' => [1, nil, false]
|
25
|
-
end
|
26
|
-
end # UnlessElseTest
|
@@ -1,182 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class TemplateContextDrop < Liquid::Drop
|
4
|
-
def before_method(method)
|
5
|
-
method
|
6
|
-
end
|
7
|
-
|
8
|
-
def foo
|
9
|
-
'fizzbuzz'
|
10
|
-
end
|
11
|
-
|
12
|
-
def baz
|
13
|
-
@context.registers['lulz']
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class SomethingWithLength
|
18
|
-
def length
|
19
|
-
nil
|
20
|
-
end
|
21
|
-
|
22
|
-
liquid_methods :length
|
23
|
-
end
|
24
|
-
|
25
|
-
class ErroneousDrop < Liquid::Drop
|
26
|
-
def bad_method
|
27
|
-
raise 'ruby error in drop'
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
class TemplateTest < Minitest::Test
|
32
|
-
include Liquid
|
33
|
-
|
34
|
-
def test_instance_assigns_persist_on_same_template_object_between_parses
|
35
|
-
t = Template.new
|
36
|
-
assert_equal 'from instance assigns', t.parse("{% assign foo = 'from instance assigns' %}{{ foo }}").render!
|
37
|
-
assert_equal 'from instance assigns', t.parse("{{ foo }}").render!
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_instance_assigns_persist_on_same_template_parsing_between_renders
|
41
|
-
t = Template.new.parse("{{ foo }}{% assign foo = 'foo' %}{{ foo }}")
|
42
|
-
assert_equal 'foo', t.render!
|
43
|
-
assert_equal 'foofoo', t.render!
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_custom_assigns_do_not_persist_on_same_template
|
47
|
-
t = Template.new
|
48
|
-
assert_equal 'from custom assigns', t.parse("{{ foo }}").render!('foo' => 'from custom assigns')
|
49
|
-
assert_equal '', t.parse("{{ foo }}").render!
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_custom_assigns_squash_instance_assigns
|
53
|
-
t = Template.new
|
54
|
-
assert_equal 'from instance assigns', t.parse("{% assign foo = 'from instance assigns' %}{{ foo }}").render!
|
55
|
-
assert_equal 'from custom assigns', t.parse("{{ foo }}").render!('foo' => 'from custom assigns')
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_persistent_assigns_squash_instance_assigns
|
59
|
-
t = Template.new
|
60
|
-
assert_equal 'from instance assigns', t.parse("{% assign foo = 'from instance assigns' %}{{ foo }}").render!
|
61
|
-
t.assigns['foo'] = 'from persistent assigns'
|
62
|
-
assert_equal 'from persistent assigns', t.parse("{{ foo }}").render!
|
63
|
-
end
|
64
|
-
|
65
|
-
def test_lambda_is_called_once_from_persistent_assigns_over_multiple_parses_and_renders
|
66
|
-
t = Template.new
|
67
|
-
t.assigns['number'] = lambda { @global ||= 0; @global += 1 }
|
68
|
-
assert_equal '1', t.parse("{{number}}").render!
|
69
|
-
assert_equal '1', t.parse("{{number}}").render!
|
70
|
-
assert_equal '1', t.render!
|
71
|
-
@global = nil
|
72
|
-
end
|
73
|
-
|
74
|
-
def test_lambda_is_called_once_from_custom_assigns_over_multiple_parses_and_renders
|
75
|
-
t = Template.new
|
76
|
-
assigns = {'number' => lambda { @global ||= 0; @global += 1 }}
|
77
|
-
assert_equal '1', t.parse("{{number}}").render!(assigns)
|
78
|
-
assert_equal '1', t.parse("{{number}}").render!(assigns)
|
79
|
-
assert_equal '1', t.render!(assigns)
|
80
|
-
@global = nil
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_resource_limits_works_with_custom_length_method
|
84
|
-
t = Template.parse("{% assign foo = bar %}")
|
85
|
-
t.resource_limits = { :render_length_limit => 42 }
|
86
|
-
assert_equal "", t.render!("bar" => SomethingWithLength.new)
|
87
|
-
end
|
88
|
-
|
89
|
-
def test_resource_limits_render_length
|
90
|
-
t = Template.parse("0123456789")
|
91
|
-
t.resource_limits = { :render_length_limit => 5 }
|
92
|
-
assert_equal "Liquid error: Memory limits exceeded", t.render()
|
93
|
-
assert t.resource_limits[:reached]
|
94
|
-
t.resource_limits = { :render_length_limit => 10 }
|
95
|
-
assert_equal "0123456789", t.render!()
|
96
|
-
refute_nil t.resource_limits[:render_length_current]
|
97
|
-
end
|
98
|
-
|
99
|
-
def test_resource_limits_render_score
|
100
|
-
t = Template.parse("{% for a in (1..10) %} {% for a in (1..10) %} foo {% endfor %} {% endfor %}")
|
101
|
-
t.resource_limits = { :render_score_limit => 50 }
|
102
|
-
assert_equal "Liquid error: Memory limits exceeded", t.render()
|
103
|
-
assert t.resource_limits[:reached]
|
104
|
-
t = Template.parse("{% for a in (1..100) %} foo {% endfor %}")
|
105
|
-
t.resource_limits = { :render_score_limit => 50 }
|
106
|
-
assert_equal "Liquid error: Memory limits exceeded", t.render()
|
107
|
-
assert t.resource_limits[:reached]
|
108
|
-
t.resource_limits = { :render_score_limit => 200 }
|
109
|
-
assert_equal (" foo " * 100), t.render!()
|
110
|
-
refute_nil t.resource_limits[:render_score_current]
|
111
|
-
end
|
112
|
-
|
113
|
-
def test_resource_limits_assign_score
|
114
|
-
t = Template.parse("{% assign foo = 42 %}{% assign bar = 23 %}")
|
115
|
-
t.resource_limits = { :assign_score_limit => 1 }
|
116
|
-
assert_equal "Liquid error: Memory limits exceeded", t.render()
|
117
|
-
assert t.resource_limits[:reached]
|
118
|
-
t.resource_limits = { :assign_score_limit => 2 }
|
119
|
-
assert_equal "", t.render!()
|
120
|
-
refute_nil t.resource_limits[:assign_score_current]
|
121
|
-
end
|
122
|
-
|
123
|
-
def test_resource_limits_aborts_rendering_after_first_error
|
124
|
-
t = Template.parse("{% for a in (1..100) %} foo1 {% endfor %} bar {% for a in (1..100) %} foo2 {% endfor %}")
|
125
|
-
t.resource_limits = { :render_score_limit => 50 }
|
126
|
-
assert_equal "Liquid error: Memory limits exceeded", t.render()
|
127
|
-
assert t.resource_limits[:reached]
|
128
|
-
end
|
129
|
-
|
130
|
-
def test_resource_limits_hash_in_template_gets_updated_even_if_no_limits_are_set
|
131
|
-
t = Template.parse("{% for a in (1..100) %} {% assign foo = 1 %} {% endfor %}")
|
132
|
-
t.render!()
|
133
|
-
assert t.resource_limits[:assign_score_current] > 0
|
134
|
-
assert t.resource_limits[:render_score_current] > 0
|
135
|
-
assert t.resource_limits[:render_length_current] > 0
|
136
|
-
end
|
137
|
-
|
138
|
-
def test_default_resource_limits_unaffected_by_render_with_context
|
139
|
-
context = Context.new
|
140
|
-
t = Template.parse("{% for a in (1..100) %} {% assign foo = 1 %} {% endfor %}")
|
141
|
-
t.render!(context)
|
142
|
-
assert context.resource_limits[:assign_score_current] > 0
|
143
|
-
assert context.resource_limits[:render_score_current] > 0
|
144
|
-
assert context.resource_limits[:render_length_current] > 0
|
145
|
-
refute Template.default_resource_limits.key?(:assign_score_current)
|
146
|
-
refute Template.default_resource_limits.key?(:render_score_current)
|
147
|
-
refute Template.default_resource_limits.key?(:render_length_current)
|
148
|
-
end
|
149
|
-
|
150
|
-
def test_can_use_drop_as_context
|
151
|
-
t = Template.new
|
152
|
-
t.registers['lulz'] = 'haha'
|
153
|
-
drop = TemplateContextDrop.new
|
154
|
-
assert_equal 'fizzbuzz', t.parse('{{foo}}').render!(drop)
|
155
|
-
assert_equal 'bar', t.parse('{{bar}}').render!(drop)
|
156
|
-
assert_equal 'haha', t.parse("{{baz}}").render!(drop)
|
157
|
-
end
|
158
|
-
|
159
|
-
def test_render_bang_force_rethrow_errors_on_passed_context
|
160
|
-
context = Context.new({'drop' => ErroneousDrop.new})
|
161
|
-
t = Template.new.parse('{{ drop.bad_method }}')
|
162
|
-
|
163
|
-
e = assert_raises RuntimeError do
|
164
|
-
t.render!(context)
|
165
|
-
end
|
166
|
-
assert_equal 'ruby error in drop', e.message
|
167
|
-
end
|
168
|
-
|
169
|
-
def test_exception_handler_doesnt_reraise_if_it_returns_false
|
170
|
-
exception = nil
|
171
|
-
Template.parse("{{ 1 | divided_by: 0 }}").render({}, exception_handler: ->(e) { exception = e; false })
|
172
|
-
assert exception.is_a?(ZeroDivisionError)
|
173
|
-
end
|
174
|
-
|
175
|
-
def test_exception_handler_does_reraise_if_it_returns_true
|
176
|
-
exception = nil
|
177
|
-
assert_raises(ZeroDivisionError) do
|
178
|
-
Template.parse("{{ 1 | divided_by: 0 }}").render({}, exception_handler: ->(e) { exception = e; true })
|
179
|
-
end
|
180
|
-
assert exception.is_a?(ZeroDivisionError)
|
181
|
-
end
|
182
|
-
end
|
@@ -1,82 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class VariableTest < Minitest::Test
|
4
|
-
include Liquid
|
5
|
-
|
6
|
-
def test_simple_variable
|
7
|
-
template = Template.parse(%|{{test}}|)
|
8
|
-
assert_equal 'worked', template.render!('test' => 'worked')
|
9
|
-
assert_equal 'worked wonderfully', template.render!('test' => 'worked wonderfully')
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_variable_render_calls_to_liquid
|
13
|
-
assert_template_result 'foobar', '{{ foo }}', 'foo' => ThingWithToLiquid.new
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_simple_with_whitespaces
|
17
|
-
template = Template.parse(%| {{ test }} |)
|
18
|
-
assert_equal ' worked ', template.render!('test' => 'worked')
|
19
|
-
assert_equal ' worked wonderfully ', template.render!('test' => 'worked wonderfully')
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_ignore_unknown
|
23
|
-
template = Template.parse(%|{{ test }}|)
|
24
|
-
assert_equal '', template.render!
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_hash_scoping
|
28
|
-
template = Template.parse(%|{{ test.test }}|)
|
29
|
-
assert_equal 'worked', template.render!('test' => {'test' => 'worked'})
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_false_renders_as_false
|
33
|
-
assert_equal 'false', Template.parse("{{ foo }}").render!('foo' => false)
|
34
|
-
assert_equal 'false', Template.parse("{{ false }}").render!
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_nil_renders_as_empty_string
|
38
|
-
assert_equal '', Template.parse("{{ nil }}").render!
|
39
|
-
assert_equal 'cat', Template.parse("{{ nil | append: 'cat' }}").render!
|
40
|
-
end
|
41
|
-
|
42
|
-
def test_preset_assigns
|
43
|
-
template = Template.parse(%|{{ test }}|)
|
44
|
-
template.assigns['test'] = 'worked'
|
45
|
-
assert_equal 'worked', template.render!
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_reuse_parsed_template
|
49
|
-
template = Template.parse(%|{{ greeting }} {{ name }}|)
|
50
|
-
template.assigns['greeting'] = 'Goodbye'
|
51
|
-
assert_equal 'Hello Tobi', template.render!('greeting' => 'Hello', 'name' => 'Tobi')
|
52
|
-
assert_equal 'Hello ', template.render!('greeting' => 'Hello', 'unknown' => 'Tobi')
|
53
|
-
assert_equal 'Hello Brian', template.render!('greeting' => 'Hello', 'name' => 'Brian')
|
54
|
-
assert_equal 'Goodbye Brian', template.render!('name' => 'Brian')
|
55
|
-
assert_equal({'greeting'=>'Goodbye'}, template.assigns)
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_assigns_not_polluted_from_template
|
59
|
-
template = Template.parse(%|{{ test }}{% assign test = 'bar' %}{{ test }}|)
|
60
|
-
template.assigns['test'] = 'baz'
|
61
|
-
assert_equal 'bazbar', template.render!
|
62
|
-
assert_equal 'bazbar', template.render!
|
63
|
-
assert_equal 'foobar', template.render!('test' => 'foo')
|
64
|
-
assert_equal 'bazbar', template.render!
|
65
|
-
end
|
66
|
-
|
67
|
-
def test_hash_with_default_proc
|
68
|
-
template = Template.parse(%|Hello {{ test }}|)
|
69
|
-
assigns = Hash.new { |h,k| raise "Unknown variable '#{k}'" }
|
70
|
-
assigns['test'] = 'Tobi'
|
71
|
-
assert_equal 'Hello Tobi', template.render!(assigns)
|
72
|
-
assigns.delete('test')
|
73
|
-
e = assert_raises(RuntimeError) {
|
74
|
-
template.render!(assigns)
|
75
|
-
}
|
76
|
-
assert_equal "Unknown variable 'test'", e.message
|
77
|
-
end
|
78
|
-
|
79
|
-
def test_multiline_variable
|
80
|
-
assert_equal 'worked', Template.parse("{{\ntest\n}}").render!('test' => 'worked')
|
81
|
-
end
|
82
|
-
end
|
data/test/test_helper.rb
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
ENV["MT_NO_EXPECTATIONS"] = "1"
|
4
|
-
require 'minitest/autorun'
|
5
|
-
require 'spy/integration'
|
6
|
-
|
7
|
-
$:.unshift(File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib'))
|
8
|
-
require 'liquid.rb'
|
9
|
-
|
10
|
-
mode = :strict
|
11
|
-
if env_mode = ENV['LIQUID_PARSER_MODE']
|
12
|
-
puts "-- #{env_mode.upcase} ERROR MODE"
|
13
|
-
mode = env_mode.to_sym
|
14
|
-
end
|
15
|
-
Liquid::Template.error_mode = mode
|
16
|
-
|
17
|
-
if Minitest.const_defined?('Test')
|
18
|
-
# We're on Minitest 5+. Nothing to do here.
|
19
|
-
else
|
20
|
-
# Minitest 4 doesn't have Minitest::Test yet.
|
21
|
-
Minitest::Test = MiniTest::Unit::TestCase
|
22
|
-
end
|
23
|
-
|
24
|
-
module Minitest
|
25
|
-
class Test
|
26
|
-
def fixture(name)
|
27
|
-
File.join(File.expand_path(File.dirname(__FILE__)), "fixtures", name)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
module Assertions
|
32
|
-
include Liquid
|
33
|
-
|
34
|
-
def assert_template_result(expected, template, assigns = {}, message = nil)
|
35
|
-
assert_equal expected, Template.parse(template).render!(assigns), message
|
36
|
-
end
|
37
|
-
|
38
|
-
def assert_template_result_matches(expected, template, assigns = {}, message = nil)
|
39
|
-
return assert_template_result(expected, template, assigns, message) unless expected.is_a? Regexp
|
40
|
-
|
41
|
-
assert_match expected, Template.parse(template).render!(assigns), message
|
42
|
-
end
|
43
|
-
|
44
|
-
def assert_match_syntax_error(match, template, registers = {})
|
45
|
-
exception = assert_raises(Liquid::SyntaxError) {
|
46
|
-
Template.parse(template).render(assigns)
|
47
|
-
}
|
48
|
-
assert_match match, exception.message
|
49
|
-
end
|
50
|
-
|
51
|
-
def with_global_filter(*globals)
|
52
|
-
original_global_strainer = Liquid::Strainer.class_variable_get(:@@global_strainer)
|
53
|
-
Liquid::Strainer.class_variable_set(:@@global_strainer, Class.new(Liquid::Strainer) do
|
54
|
-
@filter_methods = Set.new
|
55
|
-
end)
|
56
|
-
Liquid::Strainer.class_variable_get(:@@strainer_class_cache).clear
|
57
|
-
|
58
|
-
globals.each do |global|
|
59
|
-
Liquid::Template.register_filter(global)
|
60
|
-
end
|
61
|
-
yield
|
62
|
-
ensure
|
63
|
-
Liquid::Strainer.class_variable_get(:@@strainer_class_cache).clear
|
64
|
-
Liquid::Strainer.class_variable_set(:@@global_strainer, original_global_strainer)
|
65
|
-
end
|
66
|
-
|
67
|
-
def with_taint_mode(mode)
|
68
|
-
old_mode = Liquid::Template.taint_mode
|
69
|
-
Liquid::Template.taint_mode = mode
|
70
|
-
yield
|
71
|
-
ensure
|
72
|
-
Liquid::Template.taint_mode = old_mode
|
73
|
-
end
|
74
|
-
|
75
|
-
def with_error_mode(mode)
|
76
|
-
old_mode = Liquid::Template.error_mode
|
77
|
-
Liquid::Template.error_mode = mode
|
78
|
-
yield
|
79
|
-
ensure
|
80
|
-
Liquid::Template.error_mode = old_mode
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
class ThingWithToLiquid
|
86
|
-
def to_liquid
|
87
|
-
'foobar'
|
88
|
-
end
|
89
|
-
end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class BlockUnitTest < Minitest::Test
|
4
|
-
include Liquid
|
5
|
-
|
6
|
-
def test_blankspace
|
7
|
-
template = Liquid::Template.parse(" ")
|
8
|
-
assert_equal [" "], template.root.nodelist
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_variable_beginning
|
12
|
-
template = Liquid::Template.parse("{{funk}} ")
|
13
|
-
assert_equal 2, template.root.nodelist.size
|
14
|
-
assert_equal Variable, template.root.nodelist[0].class
|
15
|
-
assert_equal String, template.root.nodelist[1].class
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_variable_end
|
19
|
-
template = Liquid::Template.parse(" {{funk}}")
|
20
|
-
assert_equal 2, template.root.nodelist.size
|
21
|
-
assert_equal String, template.root.nodelist[0].class
|
22
|
-
assert_equal Variable, template.root.nodelist[1].class
|
23
|
-
end
|
24
|
-
|
25
|
-
def test_variable_middle
|
26
|
-
template = Liquid::Template.parse(" {{funk}} ")
|
27
|
-
assert_equal 3, template.root.nodelist.size
|
28
|
-
assert_equal String, template.root.nodelist[0].class
|
29
|
-
assert_equal Variable, template.root.nodelist[1].class
|
30
|
-
assert_equal String, template.root.nodelist[2].class
|
31
|
-
end
|
32
|
-
|
33
|
-
def test_variable_many_embedded_fragments
|
34
|
-
template = Liquid::Template.parse(" {{funk}} {{so}} {{brother}} ")
|
35
|
-
assert_equal 7, template.root.nodelist.size
|
36
|
-
assert_equal [String, Variable, String, Variable, String, Variable, String],
|
37
|
-
block_types(template.root.nodelist)
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_with_block
|
41
|
-
template = Liquid::Template.parse(" {% comment %} {% endcomment %} ")
|
42
|
-
assert_equal [String, Comment, String], block_types(template.root.nodelist)
|
43
|
-
assert_equal 3, template.root.nodelist.size
|
44
|
-
end
|
45
|
-
|
46
|
-
def test_with_custom_tag
|
47
|
-
Liquid::Template.register_tag("testtag", Block)
|
48
|
-
assert Liquid::Template.parse( "{% testtag %} {% endtesttag %}")
|
49
|
-
end
|
50
|
-
|
51
|
-
private
|
52
|
-
def block_types(nodelist)
|
53
|
-
nodelist.collect { |node| node.class }
|
54
|
-
end
|
55
|
-
end # VariableTest
|