liquid 4.0.3 → 5.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +54 -0
- data/README.md +6 -0
- data/lib/liquid/block.rb +31 -14
- data/lib/liquid/block_body.rb +166 -54
- data/lib/liquid/condition.rb +41 -20
- data/lib/liquid/context.rb +107 -52
- data/lib/liquid/document.rb +47 -9
- data/lib/liquid/drop.rb +4 -2
- data/lib/liquid/errors.rb +20 -18
- data/lib/liquid/expression.rb +29 -34
- data/lib/liquid/extensions.rb +2 -0
- data/lib/liquid/file_system.rb +6 -4
- data/lib/liquid/forloop_drop.rb +11 -4
- data/lib/liquid/i18n.rb +5 -3
- data/lib/liquid/interrupts.rb +3 -1
- data/lib/liquid/lexer.rb +30 -23
- data/lib/liquid/locales/en.yml +3 -1
- data/lib/liquid/parse_context.rb +20 -4
- data/lib/liquid/parse_tree_visitor.rb +2 -2
- data/lib/liquid/parser.rb +30 -18
- data/lib/liquid/parser_switching.rb +17 -3
- data/lib/liquid/partial_cache.rb +24 -0
- data/lib/liquid/profiler/hooks.rb +26 -14
- data/lib/liquid/profiler.rb +67 -86
- data/lib/liquid/range_lookup.rb +13 -3
- data/lib/liquid/register.rb +6 -0
- data/lib/liquid/resource_limits.rb +47 -8
- data/lib/liquid/standardfilters.rb +95 -46
- data/lib/liquid/static_registers.rb +44 -0
- data/lib/liquid/strainer_factory.rb +36 -0
- data/lib/liquid/strainer_template.rb +53 -0
- data/lib/liquid/tablerowloop_drop.rb +6 -4
- data/lib/liquid/tag/disableable.rb +22 -0
- data/lib/liquid/tag/disabler.rb +21 -0
- data/lib/liquid/tag.rb +28 -6
- data/lib/liquid/tags/assign.rb +24 -10
- data/lib/liquid/tags/break.rb +8 -3
- data/lib/liquid/tags/capture.rb +11 -8
- data/lib/liquid/tags/case.rb +40 -27
- data/lib/liquid/tags/comment.rb +5 -3
- data/lib/liquid/tags/continue.rb +8 -3
- data/lib/liquid/tags/cycle.rb +25 -14
- data/lib/liquid/tags/decrement.rb +6 -3
- data/lib/liquid/tags/echo.rb +34 -0
- data/lib/liquid/tags/for.rb +68 -44
- data/lib/liquid/tags/if.rb +39 -23
- data/lib/liquid/tags/ifchanged.rb +11 -10
- data/lib/liquid/tags/include.rb +34 -47
- data/lib/liquid/tags/increment.rb +7 -3
- data/lib/liquid/tags/raw.rb +14 -11
- data/lib/liquid/tags/render.rb +84 -0
- data/lib/liquid/tags/table_row.rb +23 -19
- data/lib/liquid/tags/unless.rb +23 -15
- data/lib/liquid/template.rb +53 -72
- data/lib/liquid/template_factory.rb +9 -0
- data/lib/liquid/tokenizer.rb +18 -10
- data/lib/liquid/usage.rb +8 -0
- data/lib/liquid/utils.rb +13 -3
- data/lib/liquid/variable.rb +46 -41
- data/lib/liquid/variable_lookup.rb +11 -6
- data/lib/liquid/version.rb +2 -1
- data/lib/liquid.rb +17 -5
- data/test/integration/assign_test.rb +74 -5
- data/test/integration/blank_test.rb +11 -8
- data/test/integration/block_test.rb +47 -1
- data/test/integration/capture_test.rb +18 -10
- data/test/integration/context_test.rb +609 -5
- data/test/integration/document_test.rb +4 -2
- data/test/integration/drop_test.rb +67 -83
- data/test/integration/error_handling_test.rb +73 -61
- data/test/integration/expression_test.rb +46 -0
- data/test/integration/filter_test.rb +53 -42
- data/test/integration/hash_ordering_test.rb +5 -3
- data/test/integration/output_test.rb +26 -24
- data/test/integration/parsing_quirks_test.rb +19 -7
- data/test/integration/{render_profiling_test.rb → profiler_test.rb} +84 -25
- data/test/integration/security_test.rb +30 -21
- data/test/integration/standard_filter_test.rb +385 -281
- data/test/integration/tag/disableable_test.rb +59 -0
- data/test/integration/tag_test.rb +45 -0
- data/test/integration/tags/break_tag_test.rb +4 -2
- data/test/integration/tags/continue_tag_test.rb +4 -2
- data/test/integration/tags/echo_test.rb +13 -0
- data/test/integration/tags/for_tag_test.rb +107 -51
- data/test/integration/tags/if_else_tag_test.rb +5 -3
- data/test/integration/tags/include_tag_test.rb +70 -54
- data/test/integration/tags/increment_tag_test.rb +4 -2
- data/test/integration/tags/liquid_tag_test.rb +116 -0
- data/test/integration/tags/raw_tag_test.rb +14 -11
- data/test/integration/tags/render_tag_test.rb +213 -0
- data/test/integration/tags/standard_tag_test.rb +38 -31
- data/test/integration/tags/statements_test.rb +23 -21
- data/test/integration/tags/table_row_test.rb +2 -0
- data/test/integration/tags/unless_else_tag_test.rb +4 -2
- data/test/integration/template_test.rb +132 -124
- data/test/integration/trim_mode_test.rb +78 -44
- data/test/integration/variable_test.rb +74 -32
- data/test/test_helper.rb +113 -22
- data/test/unit/block_unit_test.rb +19 -24
- data/test/unit/condition_unit_test.rb +79 -77
- data/test/unit/file_system_unit_test.rb +6 -4
- data/test/unit/i18n_unit_test.rb +7 -5
- data/test/unit/lexer_unit_test.rb +11 -9
- data/test/{integration → unit}/parse_tree_visitor_test.rb +16 -2
- data/test/unit/parser_unit_test.rb +37 -35
- data/test/unit/partial_cache_unit_test.rb +128 -0
- data/test/unit/regexp_unit_test.rb +17 -15
- data/test/unit/static_registers_unit_test.rb +156 -0
- data/test/unit/strainer_factory_unit_test.rb +100 -0
- data/test/unit/strainer_template_unit_test.rb +82 -0
- data/test/unit/tag_unit_test.rb +5 -3
- data/test/unit/tags/case_tag_unit_test.rb +3 -1
- data/test/unit/tags/for_tag_unit_test.rb +4 -2
- data/test/unit/tags/if_tag_unit_test.rb +3 -1
- data/test/unit/template_factory_unit_test.rb +12 -0
- data/test/unit/template_unit_test.rb +19 -10
- data/test/unit/tokenizer_unit_test.rb +26 -19
- data/test/unit/variable_unit_test.rb +51 -49
- metadata +76 -50
- data/lib/liquid/strainer.rb +0 -66
- data/lib/liquid/truffle.rb +0 -5
- data/test/truffle/truffle_test.rb +0 -9
- data/test/unit/context_unit_test.rb +0 -489
- data/test/unit/strainer_unit_test.rb +0 -164
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class TagDisableableTest < Minitest::Test
|
6
|
+
include Liquid
|
7
|
+
|
8
|
+
module RenderTagName
|
9
|
+
def render(_context)
|
10
|
+
tag_name
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Custom < Tag
|
15
|
+
prepend Liquid::Tag::Disableable
|
16
|
+
include RenderTagName
|
17
|
+
end
|
18
|
+
|
19
|
+
class Custom2 < Tag
|
20
|
+
prepend Liquid::Tag::Disableable
|
21
|
+
include RenderTagName
|
22
|
+
end
|
23
|
+
|
24
|
+
class DisableCustom < Block
|
25
|
+
disable_tags "custom"
|
26
|
+
end
|
27
|
+
|
28
|
+
class DisableBoth < Block
|
29
|
+
disable_tags "custom", "custom2"
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_block_tag_disabling_nested_tag
|
33
|
+
with_disableable_tags do
|
34
|
+
with_custom_tag('disable', DisableCustom) do
|
35
|
+
output = Template.parse('{% disable %}{% custom %};{% custom2 %}{% enddisable %}').render
|
36
|
+
assert_equal('Liquid error: custom usage is not allowed in this context;custom2', output)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_block_tag_disabling_multiple_nested_tags
|
42
|
+
with_disableable_tags do
|
43
|
+
with_custom_tag('disable', DisableBoth) do
|
44
|
+
output = Template.parse('{% disable %}{% custom %};{% custom2 %}{% enddisable %}').render
|
45
|
+
assert_equal('Liquid error: custom usage is not allowed in this context;Liquid error: custom2 usage is not allowed in this context', output)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def with_disableable_tags
|
53
|
+
with_custom_tag('custom', Custom) do
|
54
|
+
with_custom_tag('custom2', Custom2) do
|
55
|
+
yield
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class TagTest < Minitest::Test
|
6
|
+
include Liquid
|
7
|
+
|
8
|
+
def test_custom_tags_have_a_default_render_to_output_buffer_method_for_backwards_compatibility
|
9
|
+
klass1 = Class.new(Tag) do
|
10
|
+
def render(*)
|
11
|
+
'hello'
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
with_custom_tag('blabla', klass1) do
|
16
|
+
template = Liquid::Template.parse("{% blabla %}")
|
17
|
+
|
18
|
+
assert_equal('hello', template.render)
|
19
|
+
|
20
|
+
buf = +''
|
21
|
+
output = template.render({}, output: buf)
|
22
|
+
assert_equal('hello', output)
|
23
|
+
assert_equal('hello', buf)
|
24
|
+
assert_equal(buf.object_id, output.object_id)
|
25
|
+
end
|
26
|
+
|
27
|
+
klass2 = Class.new(klass1) do
|
28
|
+
def render(*)
|
29
|
+
'foo' + super + 'bar'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
with_custom_tag('blabla', klass2) do
|
34
|
+
template = Liquid::Template.parse("{% blabla %}")
|
35
|
+
|
36
|
+
assert_equal('foohellobar', template.render)
|
37
|
+
|
38
|
+
buf = +''
|
39
|
+
output = template.render({}, output: buf)
|
40
|
+
assert_equal('foohellobar', output)
|
41
|
+
assert_equal('foohellobar', buf)
|
42
|
+
assert_equal(buf.object_id, output.object_id)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
5
|
class BreakTagTest < Minitest::Test
|
@@ -6,8 +8,8 @@ class BreakTagTest < Minitest::Test
|
|
6
8
|
# tests that no weird errors are raised if break is called outside of a
|
7
9
|
# block
|
8
10
|
def test_break_with_no_block
|
9
|
-
assigns
|
10
|
-
markup
|
11
|
+
assigns = { 'i' => 1 }
|
12
|
+
markup = '{% break %}'
|
11
13
|
expected = ''
|
12
14
|
|
13
15
|
assert_template_result(expected, markup, assigns)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
5
|
class ContinueTagTest < Minitest::Test
|
@@ -6,8 +8,8 @@ class ContinueTagTest < Minitest::Test
|
|
6
8
|
# tests that no weird errors are raised if continue is called outside of a
|
7
9
|
# block
|
8
10
|
def test_continue_with_no_block
|
9
|
-
assigns
|
10
|
-
markup
|
11
|
+
assigns = {}
|
12
|
+
markup = '{% continue %}'
|
11
13
|
expected = ''
|
12
14
|
|
13
15
|
assert_template_result(expected, markup, assigns)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class EchoTest < Minitest::Test
|
6
|
+
include Liquid
|
7
|
+
|
8
|
+
def test_echo_outputs_its_input
|
9
|
+
assert_template_result('BAR', <<~LIQUID, 'variable-name' => 'bar')
|
10
|
+
{%- echo variable-name | upcase -%}
|
11
|
+
LIQUID
|
12
|
+
end
|
13
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
5
|
class ThingWithValue < Liquid::Drop
|
@@ -23,16 +25,16 @@ class ForTagTest < Minitest::Test
|
|
23
25
|
yo
|
24
26
|
|
25
27
|
HERE
|
26
|
-
template =
|
27
|
-
{%for item in array%}
|
28
|
-
|
29
|
-
{%endfor%}
|
30
|
-
HERE
|
28
|
+
template = <<~HERE
|
29
|
+
{%for item in array%}
|
30
|
+
yo
|
31
|
+
{%endfor%}
|
32
|
+
HERE
|
31
33
|
assert_template_result(expected, template, 'array' => [1, 2, 3])
|
32
34
|
end
|
33
35
|
|
34
36
|
def test_for_reversed
|
35
|
-
assigns = { 'array' => [
|
37
|
+
assigns = { 'array' => [1, 2, 3] }
|
36
38
|
assert_template_result('321', '{%for item in array reversed %}{{item}}{%endfor%}', assigns)
|
37
39
|
end
|
38
40
|
|
@@ -103,9 +105,37 @@ HERE
|
|
103
105
|
assert_template_result('3456', '{%for i in array limit: 4 offset: 2 %}{{ i }}{%endfor%}', assigns)
|
104
106
|
end
|
105
107
|
|
108
|
+
def test_limiting_with_invalid_limit
|
109
|
+
assigns = { 'array' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] }
|
110
|
+
template = <<-MKUP
|
111
|
+
{% for i in array limit: true offset: 1 %}
|
112
|
+
{{ i }}
|
113
|
+
{% endfor %}
|
114
|
+
MKUP
|
115
|
+
|
116
|
+
exception = assert_raises(Liquid::ArgumentError) do
|
117
|
+
Template.parse(template).render!(assigns)
|
118
|
+
end
|
119
|
+
assert_equal("Liquid error: invalid integer", exception.message)
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_limiting_with_invalid_offset
|
123
|
+
assigns = { 'array' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] }
|
124
|
+
template = <<-MKUP
|
125
|
+
{% for i in array limit: 1 offset: true %}
|
126
|
+
{{ i }}
|
127
|
+
{% endfor %}
|
128
|
+
MKUP
|
129
|
+
|
130
|
+
exception = assert_raises(Liquid::ArgumentError) do
|
131
|
+
Template.parse(template).render!(assigns)
|
132
|
+
end
|
133
|
+
assert_equal("Liquid error: invalid integer", exception.message)
|
134
|
+
end
|
135
|
+
|
106
136
|
def test_dynamic_variable_limiting
|
107
|
-
assigns
|
108
|
-
assigns['limit']
|
137
|
+
assigns = { 'array' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] }
|
138
|
+
assigns['limit'] = 2
|
109
139
|
assigns['offset'] = 2
|
110
140
|
|
111
141
|
assert_template_result('34', '{%for i in array limit: limit offset: offset %}{{ i }}{%endfor%}', assigns)
|
@@ -122,8 +152,8 @@ HERE
|
|
122
152
|
end
|
123
153
|
|
124
154
|
def test_pause_resume
|
125
|
-
assigns
|
126
|
-
markup
|
155
|
+
assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } }
|
156
|
+
markup = <<-MKUP
|
127
157
|
{%for i in array.items limit: 3 %}{{i}}{%endfor%}
|
128
158
|
next
|
129
159
|
{%for i in array.items offset:continue limit: 3 %}{{i}}{%endfor%}
|
@@ -141,8 +171,8 @@ HERE
|
|
141
171
|
end
|
142
172
|
|
143
173
|
def test_pause_resume_limit
|
144
|
-
assigns
|
145
|
-
markup
|
174
|
+
assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } }
|
175
|
+
markup = <<-MKUP
|
146
176
|
{%for i in array.items limit:3 %}{{i}}{%endfor%}
|
147
177
|
next
|
148
178
|
{%for i in array.items offset:continue limit:3 %}{{i}}{%endfor%}
|
@@ -160,8 +190,8 @@ HERE
|
|
160
190
|
end
|
161
191
|
|
162
192
|
def test_pause_resume_big_limit
|
163
|
-
assigns
|
164
|
-
markup
|
193
|
+
assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } }
|
194
|
+
markup = <<-MKUP
|
165
195
|
{%for i in array.items limit:3 %}{{i}}{%endfor%}
|
166
196
|
next
|
167
197
|
{%for i in array.items offset:continue limit:3 %}{{i}}{%endfor%}
|
@@ -179,8 +209,8 @@ HERE
|
|
179
209
|
end
|
180
210
|
|
181
211
|
def test_pause_resume_big_offset
|
182
|
-
assigns
|
183
|
-
markup
|
212
|
+
assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] } }
|
213
|
+
markup = '{%for i in array.items limit:3 %}{{i}}{%endfor%}
|
184
214
|
next
|
185
215
|
{%for i in array.items offset:continue limit:3 %}{{i}}{%endfor%}
|
186
216
|
next
|
@@ -196,26 +226,26 @@ HERE
|
|
196
226
|
def test_for_with_break
|
197
227
|
assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] } }
|
198
228
|
|
199
|
-
markup
|
229
|
+
markup = '{% for i in array.items %}{% break %}{% endfor %}'
|
200
230
|
expected = ""
|
201
231
|
assert_template_result(expected, markup, assigns)
|
202
232
|
|
203
|
-
markup
|
233
|
+
markup = '{% for i in array.items %}{{ i }}{% break %}{% endfor %}'
|
204
234
|
expected = "1"
|
205
235
|
assert_template_result(expected, markup, assigns)
|
206
236
|
|
207
|
-
markup
|
237
|
+
markup = '{% for i in array.items %}{% break %}{{ i }}{% endfor %}'
|
208
238
|
expected = ""
|
209
239
|
assert_template_result(expected, markup, assigns)
|
210
240
|
|
211
|
-
markup
|
241
|
+
markup = '{% for i in array.items %}{{ i }}{% if i > 3 %}{% break %}{% endif %}{% endfor %}'
|
212
242
|
expected = "1234"
|
213
243
|
assert_template_result(expected, markup, assigns)
|
214
244
|
|
215
245
|
# tests to ensure it only breaks out of the local for loop
|
216
246
|
# and not all of them.
|
217
|
-
assigns
|
218
|
-
markup
|
247
|
+
assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] }
|
248
|
+
markup = '{% for item in array %}' \
|
219
249
|
'{% for i in item %}' \
|
220
250
|
'{% if i == 1 %}' \
|
221
251
|
'{% break %}' \
|
@@ -227,8 +257,8 @@ HERE
|
|
227
257
|
assert_template_result(expected, markup, assigns)
|
228
258
|
|
229
259
|
# test break does nothing when unreached
|
230
|
-
assigns
|
231
|
-
markup
|
260
|
+
assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5] } }
|
261
|
+
markup = '{% for i in array.items %}{% if i == 9999 %}{% break %}{% endif %}{{ i }}{% endfor %}'
|
232
262
|
expected = '12345'
|
233
263
|
assert_template_result(expected, markup, assigns)
|
234
264
|
end
|
@@ -236,29 +266,29 @@ HERE
|
|
236
266
|
def test_for_with_continue
|
237
267
|
assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5] } }
|
238
268
|
|
239
|
-
markup
|
269
|
+
markup = '{% for i in array.items %}{% continue %}{% endfor %}'
|
240
270
|
expected = ""
|
241
271
|
assert_template_result(expected, markup, assigns)
|
242
272
|
|
243
|
-
markup
|
273
|
+
markup = '{% for i in array.items %}{{ i }}{% continue %}{% endfor %}'
|
244
274
|
expected = "12345"
|
245
275
|
assert_template_result(expected, markup, assigns)
|
246
276
|
|
247
|
-
markup
|
277
|
+
markup = '{% for i in array.items %}{% continue %}{{ i }}{% endfor %}'
|
248
278
|
expected = ""
|
249
279
|
assert_template_result(expected, markup, assigns)
|
250
280
|
|
251
|
-
markup
|
281
|
+
markup = '{% for i in array.items %}{% if i > 3 %}{% continue %}{% endif %}{{ i }}{% endfor %}'
|
252
282
|
expected = "123"
|
253
283
|
assert_template_result(expected, markup, assigns)
|
254
284
|
|
255
|
-
markup
|
285
|
+
markup = '{% for i in array.items %}{% if i == 3 %}{% continue %}{% else %}{{ i }}{% endif %}{% endfor %}'
|
256
286
|
expected = "1245"
|
257
287
|
assert_template_result(expected, markup, assigns)
|
258
288
|
|
259
289
|
# tests to ensure it only continues the local for loop and not all of them.
|
260
|
-
assigns
|
261
|
-
markup
|
290
|
+
assigns = { 'array' => [[1, 2], [3, 4], [5, 6]] }
|
291
|
+
markup = '{% for item in array %}' \
|
262
292
|
'{% for i in item %}' \
|
263
293
|
'{% if i == 1 %}' \
|
264
294
|
'{% continue %}' \
|
@@ -270,8 +300,8 @@ HERE
|
|
270
300
|
assert_template_result(expected, markup, assigns)
|
271
301
|
|
272
302
|
# test continue does nothing when unreached
|
273
|
-
assigns
|
274
|
-
markup
|
303
|
+
assigns = { 'array' => { 'items' => [1, 2, 3, 4, 5] } }
|
304
|
+
markup = '{% for i in array.items %}{% if i == 9999 %}{% continue %}{% endif %}{{ i }}{% endfor %}'
|
275
305
|
expected = '12345'
|
276
306
|
assert_template_result(expected, markup, assigns)
|
277
307
|
end
|
@@ -320,7 +350,7 @@ HERE
|
|
320
350
|
end
|
321
351
|
|
322
352
|
def test_inner_for_over_empty_input
|
323
|
-
assert_template_result
|
353
|
+
assert_template_result('oo', '{% for a in (1..2) %}o{% for b in empty %}{% endfor %}{% endfor %}')
|
324
354
|
end
|
325
355
|
|
326
356
|
def test_blank_string_not_iterable
|
@@ -359,41 +389,41 @@ HERE
|
|
359
389
|
end
|
360
390
|
|
361
391
|
def test_iterate_with_each_when_no_limit_applied
|
362
|
-
loader
|
363
|
-
assigns
|
392
|
+
loader = LoaderDrop.new([1, 2, 3, 4, 5])
|
393
|
+
assigns = { 'items' => loader }
|
364
394
|
expected = '12345'
|
365
395
|
template = '{% for item in items %}{{item}}{% endfor %}'
|
366
396
|
assert_template_result(expected, template, assigns)
|
367
|
-
assert
|
368
|
-
assert
|
397
|
+
assert(loader.each_called)
|
398
|
+
assert(!loader.load_slice_called)
|
369
399
|
end
|
370
400
|
|
371
401
|
def test_iterate_with_load_slice_when_limit_applied
|
372
|
-
loader
|
373
|
-
assigns
|
402
|
+
loader = LoaderDrop.new([1, 2, 3, 4, 5])
|
403
|
+
assigns = { 'items' => loader }
|
374
404
|
expected = '1'
|
375
405
|
template = '{% for item in items limit:1 %}{{item}}{% endfor %}'
|
376
406
|
assert_template_result(expected, template, assigns)
|
377
|
-
assert
|
378
|
-
assert
|
407
|
+
assert(!loader.each_called)
|
408
|
+
assert(loader.load_slice_called)
|
379
409
|
end
|
380
410
|
|
381
411
|
def test_iterate_with_load_slice_when_limit_and_offset_applied
|
382
|
-
loader
|
383
|
-
assigns
|
412
|
+
loader = LoaderDrop.new([1, 2, 3, 4, 5])
|
413
|
+
assigns = { 'items' => loader }
|
384
414
|
expected = '34'
|
385
415
|
template = '{% for item in items offset:2 limit:2 %}{{item}}{% endfor %}'
|
386
416
|
assert_template_result(expected, template, assigns)
|
387
|
-
assert
|
388
|
-
assert
|
417
|
+
assert(!loader.each_called)
|
418
|
+
assert(loader.load_slice_called)
|
389
419
|
end
|
390
420
|
|
391
421
|
def test_iterate_with_load_slice_returns_same_results_as_without
|
392
|
-
loader
|
422
|
+
loader = LoaderDrop.new([1, 2, 3, 4, 5])
|
393
423
|
loader_assigns = { 'items' => loader }
|
394
|
-
array_assigns
|
395
|
-
expected
|
396
|
-
template
|
424
|
+
array_assigns = { 'items' => [1, 2, 3, 4, 5] }
|
425
|
+
expected = '34'
|
426
|
+
template = '{% for item in items offset:2 limit:2 %}{{item}}{% endfor %}'
|
397
427
|
assert_template_result(expected, template, loader_assigns)
|
398
428
|
assert_template_result(expected, template, array_assigns)
|
399
429
|
end
|
@@ -405,6 +435,32 @@ HERE
|
|
405
435
|
Liquid::Template.parse('{% for i in (1..2) %}{{ standard_error }}{% endfor %}').render!(context)
|
406
436
|
end
|
407
437
|
|
408
|
-
assert
|
438
|
+
assert(context.registers[:for_stack].empty?)
|
439
|
+
end
|
440
|
+
|
441
|
+
def test_instrument_for_offset_continue
|
442
|
+
assert_usage_increment('for_offset_continue') do
|
443
|
+
Template.parse('{% for item in items offset:continue %}{{item}}{% endfor %}')
|
444
|
+
end
|
445
|
+
|
446
|
+
assert_usage_increment('for_offset_continue', times: 0) do
|
447
|
+
Template.parse('{% for item in items offset:2 %}{{item}}{% endfor %}')
|
448
|
+
end
|
449
|
+
end
|
450
|
+
|
451
|
+
def test_instrument_forloop_drop_name
|
452
|
+
assigns = { 'items' => [1, 2, 3, 4, 5] }
|
453
|
+
|
454
|
+
assert_usage_increment('forloop_drop_name', times: 5) do
|
455
|
+
Template.parse('{% for item in items %}{{forloop.name}}{% endfor %}').render!(assigns)
|
456
|
+
end
|
457
|
+
|
458
|
+
assert_usage_increment('forloop_drop_name', times: 0) do
|
459
|
+
Template.parse('{% for item in items %}{{forloop.index}}{% endfor %}').render!(assigns)
|
460
|
+
end
|
461
|
+
|
462
|
+
assert_usage_increment('forloop_drop_name', times: 0) do
|
463
|
+
Template.parse('{% for item in items %}{{item}}{% endfor %}').render!(assigns)
|
464
|
+
end
|
409
465
|
end
|
410
466
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
|
3
5
|
class IfElseTagTest < Minitest::Test
|
@@ -43,7 +45,7 @@ class IfElseTagTest < Minitest::Test
|
|
43
45
|
|
44
46
|
def test_comparison_of_strings_containing_and_or_or
|
45
47
|
awful_markup = "a == 'and' and b == 'or' and c == 'foo and bar' and d == 'bar or baz' and e == 'foo' and foo and bar"
|
46
|
-
assigns
|
48
|
+
assigns = { 'a' => 'and', 'b' => 'or', 'c' => 'foo and bar', 'd' => 'bar or baz', 'e' => 'foo', 'foo' => true, 'bar' => true }
|
47
49
|
assert_template_result(' YES ', "{% if #{awful_markup} %} YES {% endif %}", assigns)
|
48
50
|
end
|
49
51
|
|
@@ -132,7 +134,7 @@ class IfElseTagTest < Minitest::Test
|
|
132
134
|
end
|
133
135
|
|
134
136
|
def test_syntax_error_no_variable
|
135
|
-
assert_raises(SyntaxError){ assert_template_result('', '{% if jerry == 1 %}') }
|
137
|
+
assert_raises(SyntaxError) { assert_template_result('', '{% if jerry == 1 %}') }
|
136
138
|
end
|
137
139
|
|
138
140
|
def test_syntax_error_no_expression
|
@@ -182,7 +184,7 @@ class IfElseTagTest < Minitest::Test
|
|
182
184
|
tests.each do |vals, expected|
|
183
185
|
a, b, c = vals
|
184
186
|
assigns = { 'a' => a, 'b' => b, 'c' => c }
|
185
|
-
assert_template_result
|
187
|
+
assert_template_result(expected.to_s, tpl, assigns, assigns.to_s)
|
186
188
|
end
|
187
189
|
end
|
188
190
|
end
|